diff --git a/.github/workflows/alauda-auto-tag.yaml b/.github/workflows/alauda-auto-tag.yaml index 01d35d9cf4..f3b08279a7 100644 --- a/.github/workflows/alauda-auto-tag.yaml +++ b/.github/workflows/alauda-auto-tag.yaml @@ -31,18 +31,18 @@ jobs: PREFIX="${BRANCH_NAME%%-*}" # alauda BASE_VERSION="${BRANCH_NAME#${PREFIX}-}" # v0.62.1 - + VERSION_NO_V="${BASE_VERSION#v}" # 0.62.1 MAJOR=$(echo "$VERSION_NO_V" | cut -d. -f1) MINOR=$(echo "$VERSION_NO_V" | cut -d. -f2) PATCH=$(echo "$VERSION_NO_V" | cut -d. -f3) - + echo "MAJOR: $MAJOR, MINOR: $MINOR, PATCH: $PATCH" - + # PATCH + 1 NEXT_PATCH=$((PATCH + 1)) echo "NEXT_PATCH=$NEXT_PATCH" - + NEXT_VERSION="v${MAJOR}.${MINOR}.${NEXT_PATCH}" # v0.62.2 echo "NEXT_VERSION=$NEXT_VERSION" diff --git a/.github/workflows/chatops_retest.yaml b/.github/workflows/chatops_retest.yaml index f428dd76a1..cec157c14a 100644 --- a/.github/workflows/chatops_retest.yaml +++ b/.github/workflows/chatops_retest.yaml @@ -3,7 +3,7 @@ name: Rerun Failed Actions permissions: contents: read -on: +on: # yamllint disable-line rule:truthy repository_dispatch: types: [retest-command] diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index eb5ad50858..1a3a9a5da5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,6 +1,6 @@ name: ci -on: [pull_request] # yamllint disable-line rule:truthy +on: [pull_request] # yamllint disable-line rule:truthy concurrency: group: ${{ github.workflow }}-${{ github.event.pull-request.number || github.ref }} @@ -12,15 +12,15 @@ defaults: permissions: contents: read - checks: write # Used to annotate code in the PR + checks: write # Used to annotate code in the PR jobs: build: name: build runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 with: go-version-file: "go.mod" - name: build @@ -31,8 +31,8 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 with: go-version-file: "go.mod" - name: gofmt @@ -43,14 +43,14 @@ jobs: fi echo "$gofmt_out" - name: golangci-lint - uses: golangci/golangci-lint-action@0a35821d5c230e903fcfe077583637dea1b27b47 # v9.0.0 + uses: golangci/golangci-lint-action@0a35821d5c230e903fcfe077583637dea1b27b47 # v9.0.0 with: - version: v2.1.6 + version: latest only-new-issues: true args: --timeout=10m - name: yamllint run: | - apt update && apt install -y yamllint + sudo apt update && sudo apt install -y yamllint yamllint -c .yamllint $(find . -path ./vendor -prune -o -type f -regex ".*y[a]ml" -print | tr '\n' ' ') - name: check-license run: | @@ -61,8 +61,8 @@ jobs: name: test runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 with: go-version-file: "go.mod" - name: build @@ -73,21 +73,21 @@ jobs: name: Check generated code runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 with: go-version-file: "go.mod" - name: generated run: | - go install github.com/google/go-licenses@v1.0.0 # Not sure why it is needed here + go install github.com/google/go-licenses@v1.0.0 # Not sure why it is needed here ./hack/verify-codegen.sh multi-arch-build: needs: [build] name: Multi-arch build runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 with: go-version-file: "go.mod" - name: Free disk space diff --git a/.github/workflows/e2e-matrix.yml b/.github/workflows/e2e-matrix.yml index 6232144bed..52758554a0 100644 --- a/.github/workflows/e2e-matrix.yml +++ b/.github/workflows/e2e-matrix.yml @@ -30,6 +30,7 @@ jobs: KO_DOCKER_REPO: registry.local:5000/tekton CLUSTER_DOMAIN: c${{ github.run_id }}.local ARTIFACTS: ${{ github.workspace }}/artifacts + GOTOOLCHAIN: auto steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -52,6 +53,8 @@ jobs: echo "${GOPATH}/bin" >> "$GITHUB_PATH" - name: Run tests + env: + GOTOOLCHAIN: auto run: | ./hack/setup-kind.sh \ --registry-url $(echo ${KO_DOCKER_REPO} | cut -d'/' -f 1) \ diff --git a/.github/workflows/release-alauda.yaml b/.github/workflows/release-alauda.yaml index 8898f8d740..bf8bac70c6 100644 --- a/.github/workflows/release-alauda.yaml +++ b/.github/workflows/release-alauda.yaml @@ -1,10 +1,10 @@ name: Release Alauda -on: +on: # yamllint disable-line rule:truthy push: tags: - "v*-alauda-*" - workflow_dispatch: + workflow_dispatch: {} permissions: contents: write # create releases diff --git a/.github/workflows/reusable-release-alauda.yaml b/.github/workflows/reusable-release-alauda.yaml index 5749df851d..d8f3b3acf0 100644 --- a/.github/workflows/reusable-release-alauda.yaml +++ b/.github/workflows/reusable-release-alauda.yaml @@ -1,7 +1,7 @@ name: Release Alauda -on: - workflow_call: +on: # yamllint disable-line rule:truthy + workflow_call: {} permissions: contents: write diff --git a/.github/workflows/scan-alauda.yaml b/.github/workflows/scan-alauda.yaml index cc39489233..7acd47de2b 100644 --- a/.github/workflows/scan-alauda.yaml +++ b/.github/workflows/scan-alauda.yaml @@ -1,8 +1,8 @@ name: Scan vulnerabilities for Alauda -on: +on: # yamllint disable-line rule:truthy schedule: - cron: '0 0 * * *' - workflow_dispatch: + workflow_dispatch: {} jobs: build: diff --git a/.github/workflows/test-alauda.yaml b/.github/workflows/test-alauda.yaml index c42c879363..94c2081822 100644 --- a/.github/workflows/test-alauda.yaml +++ b/.github/workflows/test-alauda.yaml @@ -1,10 +1,10 @@ name: Go Test For Alauda -on: +on: # yamllint disable-line rule:truthy push: - branches: [ alauda-v* ] + branches: [alauda-v*] pull_request: - branches: [ alauda-v* ] + branches: [alauda-v*] jobs: test: diff --git a/Makefile b/Makefile index 7f52735537..3f9eb2c336 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,10 @@ vendor: @$(GO) mod vendor .PHONY: cross -cross: amd64 386 arm arm64 s390x ppc64le ## build cross platform binaries +cross: ## build cross platform binaries + # Linux-only build matrix for CI; other architectures live under amd64/arm/arm64/386/s390x/ppc64le targets. + GOOS=linux GOARCH=amd64 go build -mod=vendor $(LDFLAGS) -o bin/tkn-linux-amd64 ./cmd/tkn + GOOS=linux GOARCH=arm64 go build -mod=vendor $(LDFLAGS) -o bin/tkn-linux-arm64 ./cmd/tkn .PHONY: amd64 amd64: @@ -76,6 +79,7 @@ arm64: GOOS=linux GOARCH=arm64 go build -mod=vendor $(LDFLAGS) -o bin/tkn-linux-arm64 ./cmd/tkn GOOS=darwin GOARCH=arm64 go build -mod=vendor $(LDFLAGS) -o bin/tkn-darwin-arm64 ./cmd/tkn + .PHONY: s390x s390x: GOOS=linux GOARCH=s390x go build -mod=vendor $(LDFLAGS) -o bin/tkn-linux-s390x ./cmd/tkn diff --git a/go.mod b/go.mod index 5504826c79..3d7426b534 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ktr0731/go-fuzzyfinder v0.9.0 github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 - github.com/sigstore/cosign/v2 v2.6.1 + github.com/sigstore/cosign/v2 v2.6.2 github.com/sigstore/sigstore v1.10.3 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 @@ -48,16 +48,15 @@ replace github.com/alibabacloud-go/cr-20160607 => github.com/vdemeester/cr-20160 require ( cel.dev/expr v0.24.0 // indirect cloud.google.com/go v0.121.6 // indirect - cloud.google.com/go/auth v0.17.0 // indirect + cloud.google.com/go/auth v0.18.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/firestore v1.18.0 // indirect - cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/firestore v1.20.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/kms v1.23.2 // indirect - cloud.google.com/go/longrunning v0.6.7 // indirect - cloud.google.com/go/monitoring v1.24.2 // indirect - cloud.google.com/go/spanner v1.84.1 // indirect - cloud.google.com/go/storage v1.56.1 // indirect + cloud.google.com/go/longrunning v0.7.0 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.57.1 // indirect contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect filippo.io/edwards25519 v1.1.0 // indirect @@ -78,10 +77,9 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect - github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 // indirect github.com/IBM/sarama v1.45.2 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect @@ -159,27 +157,27 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.23.0 // indirect - github.com/go-openapi/errors v0.22.2 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/loads v0.22.0 // indirect - github.com/go-openapi/runtime v0.28.0 // indirect - github.com/go-openapi/spec v0.21.0 // indirect - github.com/go-openapi/strfmt v0.23.0 // indirect - github.com/go-openapi/swag v0.24.1 // indirect - github.com/go-openapi/swag/cmdutils v0.24.0 // indirect - github.com/go-openapi/swag/conv v0.24.0 // indirect - github.com/go-openapi/swag/fileutils v0.24.0 // indirect - github.com/go-openapi/swag/jsonname v0.24.0 // indirect - github.com/go-openapi/swag/jsonutils v0.24.0 // indirect - github.com/go-openapi/swag/loading v0.24.0 // indirect - github.com/go-openapi/swag/mangling v0.24.0 // indirect - github.com/go-openapi/swag/netutils v0.24.0 // indirect - github.com/go-openapi/swag/stringutils v0.24.0 // indirect - github.com/go-openapi/swag/typeutils v0.24.0 // indirect - github.com/go-openapi/swag/yamlutils v0.24.0 // indirect - github.com/go-openapi/validate v0.24.0 // indirect + github.com/go-openapi/analysis v0.24.1 // indirect + github.com/go-openapi/errors v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.22.1 // indirect + github.com/go-openapi/jsonreference v0.21.3 // indirect + github.com/go-openapi/loads v0.23.2 // indirect + github.com/go-openapi/runtime v0.29.2 // indirect + github.com/go-openapi/spec v0.22.1 // indirect + github.com/go-openapi/strfmt v0.25.0 // indirect + github.com/go-openapi/swag v0.25.4 // indirect + github.com/go-openapi/swag/cmdutils v0.25.4 // indirect + github.com/go-openapi/swag/conv v0.25.4 // indirect + github.com/go-openapi/swag/fileutils v0.25.4 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect + github.com/go-openapi/swag/jsonutils v0.25.4 // indirect + github.com/go-openapi/swag/loading v0.25.4 // indirect + github.com/go-openapi/swag/mangling v0.25.4 // indirect + github.com/go-openapi/swag/netutils v0.25.4 // indirect + github.com/go-openapi/swag/stringutils v0.25.4 // indirect + github.com/go-openapi/swag/typeutils v0.25.4 // indirect + github.com/go-openapi/swag/yamlutils v0.25.4 // indirect + github.com/go-openapi/validate v0.25.1 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect @@ -200,11 +198,11 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/google/wire v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect - github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/googleapis/gax-go/v2 v2.16.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/grafeas/grafeas v0.2.3 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -215,7 +213,6 @@ require ( github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/hashicorp/vault/api v1.22.0 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -233,19 +230,18 @@ require ( github.com/jellydator/ttlcache/v3 v3.4.0 // indirect github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 // indirect github.com/joho/godotenv v1.5.1 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/klauspost/compress v1.18.1 // indirect github.com/ktr0731/go-ansisgr v0.1.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/letsencrypt/boulder v0.20251110.0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mailru/easyjson v0.9.0 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect @@ -259,11 +255,9 @@ require ( github.com/natefinch/atomic v1.0.1 // indirect github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect github.com/nsf/termbox-go v1.1.1 // indirect - github.com/nxadm/tail v1.4.11 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect @@ -273,8 +267,8 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.4 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect github.com/rivo/uniseg v0.4.7 // indirect @@ -284,16 +278,16 @@ require ( github.com/sassoftware/relic v7.2.1+incompatible // indirect github.com/secure-systems-lab/go-securesystemslib v0.9.1 // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect - github.com/sigstore/fulcio v1.8.4 // indirect + github.com/sigstore/fulcio v1.8.5 // indirect github.com/sigstore/protobuf-specs v0.5.0 // indirect - github.com/sigstore/rekor v1.4.2 // indirect - github.com/sigstore/rekor-tiles v0.1.11 // indirect - github.com/sigstore/sigstore-go v1.1.3 // indirect + github.com/sigstore/rekor v1.4.3 // indirect + github.com/sigstore/rekor-tiles/v2 v2.0.1 // indirect + github.com/sigstore/sigstore-go v1.1.4 // indirect github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.3 // indirect github.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.3 // indirect github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.3 // indirect github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.3 // indirect - github.com/sigstore/timestamp-authority v1.2.9 // indirect + github.com/sigstore/timestamp-authority/v2 v2.0.3 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect @@ -304,15 +298,15 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thales-e-security/pool v0.0.2 // indirect - github.com/theupdateframework/go-tuf/v2 v2.2.0 // indirect + github.com/theupdateframework/go-tuf/v2 v2.3.0 // indirect github.com/tidwall/gjson v1.14.2 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/sjson v1.2.5 // indirect + github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect - github.com/transparency-dev/formats v0.0.0-20250421220931-bb8ad4d07c26 // indirect + github.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c // indirect github.com/transparency-dev/merkle v0.0.2 // indirect - github.com/transparency-dev/tessera v1.0.0-rc3 // indirect github.com/vbatts/tar-split v0.12.2 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -321,7 +315,7 @@ require ( github.com/xlab/treeprint v1.2.0 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect gitlab.com/gitlab-org/api/client-go v0.143.3 // indirect - go.mongodb.org/mongo-driver v1.17.4 // indirect + go.mongodb.org/mongo-driver v1.17.6 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect @@ -343,24 +337,23 @@ require ( golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/mod v0.31.0 // indirect golang.org/x/net v0.48.0 // indirect - golang.org/x/oauth2 v0.33.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.39.0 // indirect golang.org/x/text v0.32.0 // indirect golang.org/x/time v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/api v0.257.0 // indirect - google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251213004720-97cd9d5aeac2 // indirect - google.golang.org/grpc v1.77.0 // indirect + google.golang.org/api v0.259.0 // indirect + google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b // indirect + google.golang.org/grpc v1.78.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiextensions-apiserver v0.32.9 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect diff --git a/go.sum b/go.sum index d67a0ab6cf..6a97d470b1 100644 --- a/go.sum +++ b/go.sum @@ -7,7 +7,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -20,7 +19,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -32,603 +30,53 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4= -cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ= +cloud.google.com/go/auth v0.18.0 h1:wnqy5hrv7p3k7cShwAU/Br3nzod7fxoqG+k0VZ+/Pk0= +cloud.google.com/go/auth v0.18.0/go.mod h1:wwkPM1AgE1f2u6dG443MiWoD8C3BtOywNsUMcUTVDRo= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s= -cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= -cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/firestore v1.20.0 h1:JLlT12QP0fM2SJirKVyu2spBCO8leElaW0OOtPm6HEo= +cloud.google.com/go/firestore v1.20.0/go.mod h1:jqu4yKdBmDN5srneWzx3HlKrHFWFdlkgjgQ6BKIOFQo= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/kms v1.23.2 h1:4IYDQL5hG4L+HzJBhzejUySoUOheh3Lk5YT4PCyyW6k= cloud.google.com/go/kms v1.23.2/go.mod h1:rZ5kK0I7Kn9W4erhYVoIRPtpizjunlrfU4fUkumUp8g= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= -cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= -cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= -cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= +cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.50.0 h1:hnYpOIxVlgVD1Z8LN7est4DQZK3K6tvZNurZjIVjUe0= -cloud.google.com/go/pubsub v1.50.0/go.mod h1:Di2Y+nqXBpIS+dXUEJPQzLh8PbIQZMLE9IVUFhf2zmM= -cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= -cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.84.1 h1:ShH4Y3YeDtmHa55dFiSS3YtQ0dmCuP0okfAoHp/d68w= -cloud.google.com/go/spanner v1.84.1/go.mod h1:3GMEIjOcXINJSvb42H3M6TdlGCDzaCFpiiNQpjHPlCM= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= +cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= +cloud.google.com/go/pubsub/v2 v2.3.0 h1:DgAN907x+sP0nScYfBzneRiIhWoXcpCD8ZAut8WX9vs= +cloud.google.com/go/pubsub/v2 v2.3.0/go.mod h1:O5f0KHG9zDheZAd3z5rlCRhxt2JQtB+t/IYLKK3Bpvw= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.56.1 h1:n6gy+yLnHn0hTwBFzNn8zJ1kqWfR91wzdM8hjRF4wP0= -cloud.google.com/go/storage v1.56.1/go.mod h1:C9xuCZgFl3buo2HZU/1FncgvvOgTAs/rnh4gF4lMg0s= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= -cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/storage v1.57.1 h1:gzao6odNJ7dR3XXYvAgPK+Iw4fVPPznEPPyNjbaVkq8= +cloud.google.com/go/storage v1.57.1/go.mod h1:329cwlpzALLgJuu8beyJ/uvQznDHpa2U5lGjWednkzg= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4= code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= @@ -642,8 +90,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= fortio.org/safecast v1.0.0 h1:dr3131WPX8iS1pTf76+39WeXbTrerDYLvi9s7Oi3wiY= fortio.org/safecast v1.0.0/go.mod h1:xZmcPk3vi4kuUFf+tq4SvnlVdwViqf6ZSZl91Jr9Jdg= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA= github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY= github.com/ActiveState/vt10x v1.3.1 h1:7qi8BGXUEBghzBxfXSY0J77etO+L95PZQlwD7ay2mn0= @@ -703,19 +149,16 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgv github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 h1:2afWGsMzkIcN8Qm4mgPJKZWyroE5QBszMiDMYEBrnfw= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0 h1:xfK3bbi6F2RDtaZFtUdKO3osOBIhNb+xTs8lFW6yx9o= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/IBM/sarama v1.45.2 h1:8m8LcMCu3REcwpa7fCP6v2fuPuzVwXDAM2DOv3CBrKw= github.com/IBM/sarama v1.45.2/go.mod h1:ppaoTcVdGv186/z6MEKsMm70A5fwJfRTpstI37kVn3Y= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -734,12 +177,6 @@ github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/ github.com/ThalesIgnite/crypto11 v1.2.5 h1:1IiIIEqYmBvUYFeMnHqRft4bwf/O36jryEUpY+9ef8E= github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210420163308-c1402a70e2f1/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alaudadevops/timestamp-authority v1.2.10-alauda.3 h1:zgUw+j4N9Mp4HU5Ss84UeiLla58QlwGf+5Ieb+n1AOk= -github.com/alaudadevops/timestamp-authority v1.2.10-alauda.3/go.mod h1:F4954EgtjDHzkO2GfufB8mgfvAihkDtMFxlYjRPQhSg= github.com/alecthomas/jsonschema v0.0.0-20180308105923-f2c93856175a/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -787,14 +224,10 @@ github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCE github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= github.com/aliyun/credentials-go v1.3.2 h1:L4WppI9rctC8PdlMgyTkF8bBsy9pyKQEzBD1bHMRl+g= github.com/aliyun/credentials-go v1.3.2/go.mod h1:tlpz4uys4Rn7Ik4/piGRrTbXy2uLKvePgQJJduE+Y5c= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211221011931-643d94fcab96/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -856,8 +289,6 @@ github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox github.com/bluekeyes/go-gitdiff v0.8.0 h1:Nn1wfw3/XeKoc3lWk+2bEXGUHIx36kj80FM1gVcBk+o= github.com/bluekeyes/go-gitdiff v0.8.0/go.mod h1:WWAk1Mc6EgWarCrPFO+xeYlujPu98VuLW3Tu+B/85AE= github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= @@ -872,7 +303,6 @@ github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4= @@ -895,15 +325,10 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= @@ -999,9 +424,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= @@ -1009,9 +431,6 @@ github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= @@ -1028,8 +447,6 @@ github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/ github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -1040,7 +457,6 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z 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.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= @@ -1058,11 +474,6 @@ github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxI github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -1074,8 +485,6 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -1091,61 +500,65 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= -github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= -github.com/go-openapi/errors v0.22.2 h1:rdxhzcBUazEcGccKqbY1Y7NS8FDcMyIRr0934jrYnZg= -github.com/go-openapi/errors v0.22.2/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0= +github.com/go-openapi/analysis v0.24.1 h1:Xp+7Yn/KOnVWYG8d+hPksOYnCYImE3TieBa7rBOesYM= +github.com/go-openapi/analysis v0.24.1/go.mod h1:dU+qxX7QGU1rl7IYhBC8bIfmWQdX4Buoea4TGtxXY84= +github.com/go-openapi/errors v0.22.4 h1:oi2K9mHTOb5DPW2Zjdzs/NIvwi2N3fARKaTJLdNabaM= +github.com/go-openapi/errors v0.22.4/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= +github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= -github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= -github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= -github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= +github.com/go-openapi/jsonreference v0.21.3 h1:96Dn+MRPa0nYAR8DR1E03SblB5FJvh7W6krPI0Z7qMc= +github.com/go-openapi/jsonreference v0.21.3/go.mod h1:RqkUP0MrLf37HqxZxrIAtTWW4ZJIK1VzduhXYBEeGc4= +github.com/go-openapi/loads v0.23.2 h1:rJXAcP7g1+lWyBHC7iTY+WAF0rprtM+pm8Jxv1uQJp4= +github.com/go-openapi/loads v0.23.2/go.mod h1:IEVw1GfRt/P2Pplkelxzj9BYFajiWOtY2nHZNj4UnWY= +github.com/go-openapi/runtime v0.29.2 h1:UmwSGWNmWQqKm1c2MGgXVpC2FTGwPDQeUsBMufc5Yj0= +github.com/go-openapi/runtime v0.29.2/go.mod h1:biq5kJXRJKBJxTDJXAa00DOTa/anflQPhT0/wmjuy+0= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= -github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= -github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= -github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= +github.com/go-openapi/spec v0.22.1 h1:beZMa5AVQzRspNjvhe5aG1/XyBSMeX1eEOs7dMoXh/k= +github.com/go-openapi/spec v0.22.1/go.mod h1:c7aeIQT175dVowfp7FeCvXXnjN/MrpaONStibD2WtDA= +github.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ= +github.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.24.1 h1:DPdYTZKo6AQCRqzwr/kGkxJzHhpKxZ9i/oX0zag+MF8= -github.com/go-openapi/swag v0.24.1/go.mod h1:sm8I3lCPlspsBBwUm1t5oZeWZS0s7m/A+Psg0ooRU0A= -github.com/go-openapi/swag/cmdutils v0.24.0 h1:KlRCffHwXFI6E5MV9n8o8zBRElpY4uK4yWyAMWETo9I= -github.com/go-openapi/swag/cmdutils v0.24.0/go.mod h1:uxib2FAeQMByyHomTlsP8h1TtPd54Msu2ZDU/H5Vuf8= -github.com/go-openapi/swag/conv v0.24.0 h1:ejB9+7yogkWly6pnruRX45D1/6J+ZxRu92YFivx54ik= -github.com/go-openapi/swag/conv v0.24.0/go.mod h1:jbn140mZd7EW2g8a8Y5bwm8/Wy1slLySQQ0ND6DPc2c= -github.com/go-openapi/swag/fileutils v0.24.0 h1:U9pCpqp4RUytnD689Ek/N1d2N/a//XCeqoH508H5oak= -github.com/go-openapi/swag/fileutils v0.24.0/go.mod h1:3SCrCSBHyP1/N+3oErQ1gP+OX1GV2QYFSnrTbzwli90= -github.com/go-openapi/swag/jsonname v0.24.0 h1:2wKS9bgRV/xB8c62Qg16w4AUiIrqqiniJFtZGi3dg5k= -github.com/go-openapi/swag/jsonname v0.24.0/go.mod h1:GXqrPzGJe611P7LG4QB9JKPtUZ7flE4DOVechNaDd7Q= -github.com/go-openapi/swag/jsonutils v0.24.0 h1:F1vE1q4pg1xtO3HTyJYRmEuJ4jmIp2iZ30bzW5XgZts= -github.com/go-openapi/swag/jsonutils v0.24.0/go.mod h1:vBowZtF5Z4DDApIoxcIVfR8v0l9oq5PpYRUuteVu6f0= -github.com/go-openapi/swag/loading v0.24.0 h1:ln/fWTwJp2Zkj5DdaX4JPiddFC5CHQpvaBKycOlceYc= -github.com/go-openapi/swag/loading v0.24.0/go.mod h1:gShCN4woKZYIxPxbfbyHgjXAhO61m88tmjy0lp/LkJk= -github.com/go-openapi/swag/mangling v0.24.0 h1:PGOQpViCOUroIeak/Uj/sjGAq9LADS3mOyjznmHy2pk= -github.com/go-openapi/swag/mangling v0.24.0/go.mod h1:Jm5Go9LHkycsz0wfoaBDkdc4CkpuSnIEf62brzyCbhc= -github.com/go-openapi/swag/netutils v0.24.0 h1:Bz02HRjYv8046Ycg/w80q3g9QCWeIqTvlyOjQPDjD8w= -github.com/go-openapi/swag/netutils v0.24.0/go.mod h1:WRgiHcYTnx+IqfMCtu0hy9oOaPR0HnPbmArSRN1SkZM= -github.com/go-openapi/swag/stringutils v0.24.0 h1:i4Z/Jawf9EvXOLUbT97O0HbPUja18VdBxeadyAqS1FM= -github.com/go-openapi/swag/stringutils v0.24.0/go.mod h1:5nUXB4xA0kw2df5PRipZDslPJgJut+NjL7D25zPZ/4w= -github.com/go-openapi/swag/typeutils v0.24.0 h1:d3szEGzGDf4L2y1gYOSSLeK6h46F+zibnEas2Jm/wIw= -github.com/go-openapi/swag/typeutils v0.24.0/go.mod h1:q8C3Kmk/vh2VhpCLaoR2MVWOGP8y7Jc8l82qCTd1DYI= -github.com/go-openapi/swag/yamlutils v0.24.0 h1:bhw4894A7Iw6ne+639hsBNRHg9iZg/ISrOVr+sJGp4c= -github.com/go-openapi/swag/yamlutils v0.24.0/go.mod h1:DpKv5aYuaGm/sULePoeiG8uwMpZSfReo1HR3Ik0yaG8= -github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= -github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU= +github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ= +github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4= +github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= +github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= +github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= +github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y= +github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= +github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= +github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= +github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= +github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48= +github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= +github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0= +github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= +github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= +github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= +github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= +github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-openapi/validate v0.25.1 h1:sSACUI6Jcnbo5IWqbYHgjibrhhmt3vR6lCzKZnmAgBw= +github.com/go-openapi/validate v0.25.1/go.mod h1:RMVyVFYte0gbSTaZ0N4KmTn6u/kClvAFp+mAVfS/DQc= github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA= github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg= github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= @@ -1160,7 +573,6 @@ github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncV github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobuffalo/flect v0.2.4/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/kpoward v0.1.0 h1:UcrLMG9rq7NwrMiUc0h+qUyIlvqPzqLiPb+zQEqH8cE= github.com/goccy/kpoward v0.1.0/go.mod h1:m13lkcWSvNXtYC9yrXzguwrt/YTDAGioPusndMdQ+eA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -1180,10 +592,7 @@ github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXe github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1200,8 +609,6 @@ github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= -github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -1219,7 +626,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -1245,7 +651,6 @@ github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= github.com/google/certificate-transparency-go v1.3.2 h1:9ahSNZF2o7SYMaKaXhAumVEzXB2QaayzII9C8rv7v+A= github.com/google/certificate-transparency-go v1.3.2/go.mod h1:H5FpMUaGa5Ab2+KCYsxg6sELw3Flkl7pGZzWdBoYLXs= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -1260,9 +665,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I= @@ -1293,7 +696,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -1305,7 +707,6 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -1329,31 +730,17 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.3.7 h1:zrn2Ee/nWmHulBx5sAVrGgAa0f2/R35S4DJwfFaUPFQ= github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= -github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= +github.com/googleapis/gax-go/v2 v2.16.0 h1:iHbQmKLLZrexmb0OSsNGTeSTS0HO4YvFOG8g5E4Zd0Y= +github.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -1377,10 +764,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 h1:kEISI/Gx67NzH3nJxAmY/dGac80kKZgZt134u7Y/k1s= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4/go.mod h1:6Nz966r3vQYCqIzWsuEl9d7cf7mRhtDmm++sOxlnfxI= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= @@ -1446,7 +831,6 @@ github.com/hinshun/vt10x v0.0.0-20220228203356-1ab2cad5fd82/go.mod h1:Q48J4R4Dvx github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -1499,13 +883,14 @@ github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= +github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -1518,8 +903,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= @@ -1530,20 +913,15 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 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.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -1558,14 +936,13 @@ github.com/ktr0731/go-fuzzyfinder v0.9.0 h1:JV8S118RABzRl3Lh/RsPhXReJWc2q0rbuipz github.com/ktr0731/go-fuzzyfinder v0.9.0/go.mod h1:uybx+5PZFCgMCSDHJDQ9M3nNKx/vccPmGffsXPn2ad8= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/letsencrypt/boulder v0.20251110.0 h1:J8MnKICeilO91dyQ2n5eBbab24neHzUpYMUIOdOtbjc= +github.com/letsencrypt/boulder v0.20251110.0/go.mod h1:ogKCJQwll82m7OVHWyTuf8eeFCjuzdRQlgnZcCl0V+8= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1575,22 +952,17 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= +github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -1602,8 +974,6 @@ github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/4 github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -1688,8 +1058,6 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= @@ -1702,24 +1070,17 @@ github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8 github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1741,7 +1102,6 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1: github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1753,8 +1113,8 @@ github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc= -github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1762,8 +1122,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= @@ -1773,7 +1133,6 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rickb777/date v1.13.0/go.mod h1:GZf3LoGnxPWjX+/1TXOuzHefZFDovTyNLHDMd3qH70k= github.com/rickb777/plural v1.2.1/go.mod h1:j058+3M5QQFgcZZ2oKIOekcygoZUL8gKW5yRO14BuAw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1783,8 +1142,6 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1792,8 +1149,6 @@ github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3V github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= @@ -1815,20 +1170,20 @@ github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iL github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f h1:tygelZueB1EtXkPI6mQ4o9DQ0+FKW41hTbunoXZCTqk= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sigstore/cosign/v2 v2.6.1 h1:7Wf67ENNCjg+1fLqHRPgKUNaCCnCavnEfCe1LApOoIo= -github.com/sigstore/cosign/v2 v2.6.1/go.mod h1:L37doL+7s6IeCXFODV2J7kds5Po/srlVzA//++YqAJ8= -github.com/sigstore/fulcio v1.8.4 h1:awmmItiPwteo8t8sVOoIAPnmbDfLb1JGW0LPY8SNCdY= -github.com/sigstore/fulcio v1.8.4/go.mod h1:2jh+uWOfWroKHlhUzr81AFqnAYeZiIi3NC/vegCbiYw= +github.com/sigstore/cosign/v2 v2.6.2 h1:mi6EAUJoPZ+yuyooU7m06a1DZWJouwYgh9a67L9tm2M= +github.com/sigstore/cosign/v2 v2.6.2/go.mod h1:g+P/LgYyJkC85WGGDho7yySl3C6xTJzzpLm21ZV+E6s= +github.com/sigstore/fulcio v1.8.5 h1:HYTD1/L5wlBp8JxsWxUf8hmfaNBBF/x3r3p5l6tZwbA= +github.com/sigstore/fulcio v1.8.5/go.mod h1:tSLYK3JsKvJpDW1BsIsVHZgHj+f8TjXARzqIUWSsSPQ= github.com/sigstore/protobuf-specs v0.5.0 h1:F8YTI65xOHw70NrvPwJ5PhAzsvTnuJMGLkA4FIkofAY= github.com/sigstore/protobuf-specs v0.5.0/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc= -github.com/sigstore/rekor v1.4.2 h1:Lx2xby7loviFYdg2C9pB1mESk2QU/LqcYSGsqqZwmg8= -github.com/sigstore/rekor v1.4.2/go.mod h1:nX/OYaLqpTeCOuMEt7ELE0+5cVjZWFnFKM+cZ+3hQRA= -github.com/sigstore/rekor-tiles v0.1.11 h1:0NAJ2EhD1r6DH95FUuDTqUDd+c31LSKzoXGW5ZCzFq0= -github.com/sigstore/rekor-tiles v0.1.11/go.mod h1:eGIeqASh52pgWpmp/j5KZDjmKdVwob7eTYskVVRCu5k= +github.com/sigstore/rekor v1.4.3 h1:2+aw4Gbgumv8vYM/QVg6b+hvr4x4Cukur8stJrVPKU0= +github.com/sigstore/rekor v1.4.3/go.mod h1:o0zgY087Q21YwohVvGwV9vK1/tliat5mfnPiVI3i75o= +github.com/sigstore/rekor-tiles/v2 v2.0.1 h1:1Wfz15oSRNGF5Dzb0lWn5W8+lfO50ork4PGIfEKjZeo= +github.com/sigstore/rekor-tiles/v2 v2.0.1/go.mod h1:Pjsbhzj5hc3MKY8FfVTYHBUHQEnP0ozC4huatu4x7OU= github.com/sigstore/sigstore v1.10.3 h1:s7fBYYOzW/2Vd0nND2ZdpWySb5vRF2u9eix/NZMHJm0= github.com/sigstore/sigstore v1.10.3/go.mod h1:T26vXIkpnGEg391v3TaZ8EERcXbnjtZb/1erh5jbIQk= -github.com/sigstore/sigstore-go v1.1.3 h1:5lKcbXZa5JC7wb/UVywyCulccfYTUju1D5h4tkn+fXE= -github.com/sigstore/sigstore-go v1.1.3/go.mod h1:3jKC4IDh7TEVtCSJCjx0lpq5YfJbDJmfp65WsMvY2mg= +github.com/sigstore/sigstore-go v1.1.4 h1:wTTsgCHOfqiEzVyBYA6mDczGtBkN7cM8mPpjJj5QvMg= +github.com/sigstore/sigstore-go v1.1.4/go.mod h1:2U/mQOT9cjjxrtIUeKDVhL+sHBKsnWddn8URlswdBsg= github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.3 h1:D/FRl5J9UYAJPGZRAJbP0dH78pfwWnKsyCSBwFBU8CI= github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.3/go.mod h1:2GIWuNvTRMvrzd0Nl8RNqxrt9H7X0OBStwOSzGYRjYw= github.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.3 h1:k5VMLf/ms7hh6MLgVoorM0K+hSMwZLXoywlxh4CXqP8= @@ -1837,6 +1192,8 @@ github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.3 h1:AVWs0E6rVZMoDTE0Iy github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.3/go.mod h1:nxQYF0D6u7mVtiP1azj1YVDIrtz7S0RYCVTqUG8IcCk= github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.3 h1:lJSdaC/aOlFHlvqmmV696n1HdXLMLEKGwpNZMV0sKts= github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.3/go.mod h1:b2rV9qPbt/jv/Yy75AIOZThP8j+pe1ZdLEjOwmjPdoA= +github.com/sigstore/timestamp-authority/v2 v2.0.3 h1:sRyYNtdED/ttLCMdaYnwpf0zre1A9chvjTnCmWWxN8Y= +github.com/sigstore/timestamp-authority/v2 v2.0.3/go.mod h1:mDaHxkt3HmZYoIlwYj4QWo0RUr7VjYU52aVO5f5Qb3I= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -1854,9 +1211,6 @@ github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cw github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1905,7 +1259,6 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= @@ -1928,8 +1281,8 @@ github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gt github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI= github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug= -github.com/theupdateframework/go-tuf/v2 v2.2.0 h1:Hmb+Azgd7IKOZeNJFT2C91y+YZ+F+TeloSIvQIaXCQw= -github.com/theupdateframework/go-tuf/v2 v2.2.0/go.mod h1:CubcJiJlBHQ2YkA5j9hlBO4B+tHFlLjRbWCJCT7EIKU= +github.com/theupdateframework/go-tuf/v2 v2.3.0 h1:gt3X8xT8qu/HT4w+n1jgv+p7koi5ad8XEkLXXZqG9AA= +github.com/theupdateframework/go-tuf/v2 v2.3.0/go.mod h1:xW8yNvgXRncmovMLvBxKwrKpsOwJZu/8x+aB0KtFcdw= github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -1946,17 +1299,17 @@ github.com/tink-crypto/tink-go-hcvault/v2 v2.3.0 h1:6nAX1aRGnkg2SEUMwO5toB2tQkP0 github.com/tink-crypto/tink-go-hcvault/v2 v2.3.0/go.mod h1:HOC5NWW1wBI2Vke1FGcRBvDATkEYE7AUDiYbXqi2sBw= github.com/tink-crypto/tink-go/v2 v2.6.0 h1:+KHNBHhWH33Vn+igZWcsgdEPUxKwBMEe0QC60t388v4= github.com/tink-crypto/tink-go/v2 v2.6.0/go.mod h1:2WbBA6pfNsAfBwDCggboaHeB2X29wkU8XHtGwh2YIk8= +github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= +github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/transparency-dev/formats v0.0.0-20250421220931-bb8ad4d07c26 h1:YTbkeFbzcer+42bIgo6Za2194nKwhZPgaZKsP76QffE= -github.com/transparency-dev/formats v0.0.0-20250421220931-bb8ad4d07c26/go.mod h1:ODywn0gGarHMMdSkWT56ULoK8Hk71luOyRseKek9COw= +github.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c h1:5a2XDQ2LiAUV+/RjckMyq9sXudfrPSuCY4FuPC1NyAw= +github.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c/go.mod h1:g85IafeFJZLxlzZCDRu4JLpfS7HKzR+Hw9qRh3bVzDI= github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4= github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= -github.com/transparency-dev/tessera v1.0.0-rc3 h1:v385KqMekDUKI3ZVJHCHE5MAz8LBrWsEKa6OzYLrz0k= -github.com/transparency-dev/tessera v1.0.0-rc3/go.mod h1:aaLlvG/sEPMzT96iIF4hua6Z9pLzkfDtkbaUAR4IL8I= github.com/tsenart/go-tsz v0.0.0-20180814232043-cdeb9e1e981e/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -2004,8 +1357,6 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s= github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= gitlab.com/gitlab-org/api/client-go v0.143.3 h1:4Q4zumLVUnxn/s06RD9U3fyibD1/zr43gTDDtRkjqbA= gitlab.com/gitlab-org/api/client-go v0.143.3/go.mod h1:rw89Kl9AsKmxRhzkfUSfZ+1jpTewwueKvAYwoYmUoQ8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -2017,8 +1368,8 @@ go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lL go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= -go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss= +go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -2065,8 +1416,6 @@ go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16g go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= @@ -2108,7 +1457,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2118,10 +1466,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -2133,35 +1479,20 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= 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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 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-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -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-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2185,12 +1516,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= @@ -2236,7 +1564,6 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -2244,30 +1571,16 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -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.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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= @@ -2293,20 +1606,8 @@ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/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-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/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.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= -golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= 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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2320,8 +1621,6 @@ 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-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-20220819030929-7fc1605a5dde/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -2355,7 +1654,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2384,15 +1682,12 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2401,41 +1696,22 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2448,12 +1724,7 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/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-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -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/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= @@ -2472,10 +1743,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= @@ -2487,9 +1755,6 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2498,7 +1763,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2514,7 +1778,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2549,13 +1812,11 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2563,11 +1824,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8/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.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.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= @@ -2576,27 +1834,16 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T 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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2629,35 +1876,8 @@ google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.257.0 h1:8Y0lzvHlZps53PEaw+G29SsQIkuKrumGWs9puiexNAA= -google.golang.org/api v0.257.0/go.mod h1:4eJrr+vbVaZSqs7vovFd1Jb/A6ml6iw2e6FBYf3GAO4= +google.golang.org/api v0.259.0 h1:90TaGVIxScrh1Vn/XI2426kRpBqHwWIzVBzJsVZ5XrQ= +google.golang.org/api v0.259.0/go.mod h1:LC2ISWGWbRoyQVpxGntWwLWN/vLNxxKBK9KuJRI8Te4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2703,13 +1923,10 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -2731,84 +1948,12 @@ google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79 h1:Nt6z9UHqSlIdIGJdz6KhTIs2VRx/iOsA5iE8bmQNcxs= -google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79/go.mod h1:kTmlBHMPqR5uCZPBvwa2B18mvubkjyY3CRLI0c6fj0s= -google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 h1:mepRgnBZa07I4TRuomDE4sTIYieg/osKmzIf4USdWS4= -google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251213004720-97cd9d5aeac2 h1:2I6GHUeJ/4shcDpoUlLs/2WPnhg7yJwvXtqcMJt9liA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251213004720-97cd9d5aeac2/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 h1:GvESR9BIyHUahIb0NcTum6itIWtdoglGX+rnGxm2934= +google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:yJ2HH4EHEDTd3JiLmhds6NkJ17ITVYOdV3m3VKOnws0= +google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b h1:uA40e2M6fYRBf0+8uN5mLlqUtV192iiksiICIBkYJ1E= +google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:Xa7le7qx2vmqB/SzWUBa7KdMjpdpAHlh5QCSnjessQk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -2835,25 +1980,10 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= -google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2870,8 +2000,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -2926,7 +2054,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY= k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw= @@ -2977,43 +2104,8 @@ knative.dev/pkg v0.0.0-20250415155312-ed3e2158b883/go.mod h1:ptwLYr04MAyeoRvhnhh knative.dev/reconciler-test v0.0.0-20220303141206-84821d26ed1f/go.mod h1:K5pZJkenonlT9o+MtRaNsBP7BazGwjhqYPepuV1zdnU= knative.dev/serving v0.39.4 h1:9IlFE7GsORKhI92DIZbF88hplQYM73T1l4W50UxZwF8= knative.dev/serving v0.39.4/go.mod h1:bWylSgwnRZeL659qy7m3/TZioYk25TIfusPUEeR695A= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= diff --git a/vendor/cloud.google.com/go/auth/CHANGES.md b/vendor/cloud.google.com/go/auth/CHANGES.md index 4deca44353..36c7db49c5 100644 --- a/vendor/cloud.google.com/go/auth/CHANGES.md +++ b/vendor/cloud.google.com/go/auth/CHANGES.md @@ -1,3 +1,13 @@ +# Changes + +## [0.18.0](https://github.com/googleapis/google-cloud-go/releases/tag/auth%2Fv0.18.0) (2025-12-15) + +### Features + +* Support scopes field from impersonated credential json (#13308) ([e3f62e1](https://github.com/googleapis/google-cloud-go/commit/e3f62e102840127a0058f5cced4c9738f2bf45f2)) +* add support for parsing EC private key (#13317) ([ea6bc62](https://github.com/googleapis/google-cloud-go/commit/ea6bc62ffe2cc0a6d607d698a181b37fa46c340d)) +* deprecate unsafe credentials JSON loading options (#13397) ([0dd2a3b](https://github.com/googleapis/google-cloud-go/commit/0dd2a3bdece9a85ee7216a737559fa9f5a869545)) + ## [0.17.0](https://github.com/googleapis/google-cloud-go/releases/tag/auth%2Fv0.17.0) (2025-10-02) ### Features @@ -5,8 +15,6 @@ * Add trust boundary support for service accounts and impersonation (HTTP/gRPC) (#11870) ([5c2b665](https://github.com/googleapis/google-cloud-go/commit/5c2b665f392e6dd90192f107188720aa1357e7da)) * add trust boundary support for external accounts (#12864) ([a67a146](https://github.com/googleapis/google-cloud-go/commit/a67a146a6a88a6f1ba10c409dfce8015ecd60a64)) -# Changelog - ## [0.16.5](https://github.com/googleapis/google-cloud-go/compare/auth/v0.16.4...auth/v0.16.5) (2025-08-14) diff --git a/vendor/cloud.google.com/go/auth/credentials/detect.go b/vendor/cloud.google.com/go/auth/credentials/detect.go index 6700e33e14..c9d7600e03 100644 --- a/vendor/cloud.google.com/go/auth/credentials/detect.go +++ b/vendor/cloud.google.com/go/auth/credentials/detect.go @@ -52,6 +52,44 @@ var ( allowOnGCECheck = true ) +// CredType specifies the type of JSON credentials being provided +// to a loading function such as [NewCredentialsFromFile] or +// [NewCredentialsFromJSON]. +type CredType string + +const ( + // ServiceAccount represents a service account file type. + ServiceAccount CredType = "service_account" + // AuthorizedUser represents a user credentials file type. + AuthorizedUser CredType = "authorized_user" + // ExternalAccount represents an external account file type. + // + // IMPORTANT: + // This credential type does not validate the credential configuration. A security + // risk occurs when a credential configuration configured with malicious urls + // is used. + // You should validate credential configurations provided by untrusted sources. + // See [Security requirements when using credential configurations from an external + // source] https://cloud.google.com/docs/authentication/external/externally-sourced-credentials + // for more details. + ExternalAccount CredType = "external_account" + // ImpersonatedServiceAccount represents an impersonated service account file type. + // + // IMPORTANT: + // This credential type does not validate the credential configuration. A security + // risk occurs when a credential configuration configured with malicious urls + // is used. + // You should validate credential configurations provided by untrusted sources. + // See [Security requirements when using credential configurations from an external + // source] https://cloud.google.com/docs/authentication/external/externally-sourced-credentials + // for more details. + ImpersonatedServiceAccount CredType = "impersonated_service_account" + // GDCHServiceAccount represents a GDCH service account credentials. + GDCHServiceAccount CredType = "gdch_service_account" + // ExternalAccountAuthorizedUser represents an external account authorized user credentials. + ExternalAccountAuthorizedUser CredType = "external_account_authorized_user" +) + // TokenBindingType specifies the type of binding used when requesting a token // whether to request a hard-bound token using mTLS or an instance identity // bound token using ALTS. @@ -92,6 +130,14 @@ func OnGCE() bool { // - On Google Compute Engine, Google App Engine standard second generation // runtimes, and Google App Engine flexible environment, it fetches // credentials from the metadata server. +// +// Important: If you accept a credential configuration (credential +// JSON/File/Stream) from an external source for authentication to Google +// Cloud Platform, you must validate it before providing it to any Google +// API or library. Providing an unvalidated credential configuration to +// Google APIs can compromise the security of your systems and data. For +// more information, refer to [Validate credential configurations from +// external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). func DetectDefault(opts *DetectOptions) (*auth.Credentials, error) { if err := opts.validate(); err != nil { return nil, err @@ -189,25 +235,61 @@ type DetectOptions struct { // from the provided filepath. If provided, CredentialsJSON must not be. // Optional. // - // Important: If you accept a credential configuration (credential - // JSON/File/Stream) from an external source for authentication to Google - // Cloud Platform, you must validate it before providing it to any Google - // API or library. Providing an unvalidated credential configuration to - // Google APIs can compromise the security of your systems and data. For - // more information, refer to [Validate credential configurations from - // external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). + // Deprecated: This field is deprecated because of a potential security risk. + // It does not validate the credential configuration. The security risk occurs + // when a credential configuration is accepted from a source that is not + // under your control and used without validation on your side. + // + // If you know that you will be loading credential configurations of a + // specific type, it is recommended to use a credential-type-specific + // NewCredentialsFromFile method. This will ensure that an unexpected + // credential type with potential for malicious intent is not loaded + // unintentionally. You might still have to do validation for certain + // credential types. Please follow the recommendation for that method. For + // example, if you want to load only service accounts, you can use + // + // creds, err := credentials.NewCredentialsFromFile(ctx, credentials.ServiceAccount, filename, opts) + // + // If you are loading your credential configuration from an untrusted source + // and have not mitigated the risks (e.g. by validating the configuration + // yourself), make these changes as soon as possible to prevent security + // risks to your environment. + // + // Regardless of the method used, it is always your responsibility to + // validate configurations received from external sources. + // + // For more details see: + // https://cloud.google.com/docs/authentication/external/externally-sourced-credentials CredentialsFile string // CredentialsJSON overrides detection logic and uses the JSON bytes as the // source for the credential. If provided, CredentialsFile must not be. // Optional. // - // Important: If you accept a credential configuration (credential - // JSON/File/Stream) from an external source for authentication to Google - // Cloud Platform, you must validate it before providing it to any Google - // API or library. Providing an unvalidated credential configuration to - // Google APIs can compromise the security of your systems and data. For - // more information, refer to [Validate credential configurations from - // external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). + // Deprecated: This field is deprecated because of a potential security risk. + // It does not validate the credential configuration. The security risk occurs + // when a credential configuration is accepted from a source that is not + // under your control and used without validation on your side. + // + // If you know that you will be loading credential configurations of a + // specific type, it is recommended to use a credential-type-specific + // NewCredentialsFromJSON method. This will ensure that an unexpected + // credential type with potential for malicious intent is not loaded + // unintentionally. You might still have to do validation for certain + // credential types. Please follow the recommendation for that method. For + // example, if you want to load only service accounts, you can use + // + // creds, err := credentials.NewCredentialsFromJSON(ctx, credentials.ServiceAccount, json, opts) + // + // If you are loading your credential configuration from an untrusted source + // and have not mitigated the risks (e.g. by validating the configuration + // yourself), make these changes as soon as possible to prevent security + // risks to your environment. + // + // Regardless of the method used, it is always your responsibility to + // validate configurations received from external sources. + // + // For more details see: + // https://cloud.google.com/docs/authentication/external/externally-sourced-credentials CredentialsJSON []byte // UseSelfSignedJWT directs service account based credentials to create a // self-signed JWT with the private key found in the file, skipping any @@ -227,6 +309,61 @@ type DetectOptions struct { Logger *slog.Logger } +// NewCredentialsFromFile creates a [cloud.google.com/go/auth.Credentials] from +// the provided file. The credType argument specifies the expected credential +// type. If the file content does not match the expected type, an error is +// returned. +// +// Important: If you accept a credential configuration (credential +// JSON/File/Stream) from an external source for authentication to Google +// Cloud Platform, you must validate it before providing it to any Google +// API or library. Providing an unvalidated credential configuration to +// Google APIs can compromise the security of your systems and data. For +// more information, refer to [Validate credential configurations from +// external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). +func NewCredentialsFromFile(credType CredType, filename string, opts *DetectOptions) (*auth.Credentials, error) { + b, err := os.ReadFile(filename) + if err != nil { + return nil, err + } + return NewCredentialsFromJSON(credType, b, opts) +} + +// NewCredentialsFromJSON creates a [cloud.google.com/go/auth.Credentials] from +// the provided JSON bytes. The credType argument specifies the expected +// credential type. If the JSON does not match the expected type, an error is +// returned. +// +// Important: If you accept a credential configuration (credential +// JSON/File/Stream) from an external source for authentication to Google +// Cloud Platform, you must validate it before providing it to any Google +// API or library. Providing an unvalidated credential configuration to +// Google APIs can compromise the security of your systems and data. For +// more information, refer to [Validate credential configurations from +// external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). +func NewCredentialsFromJSON(credType CredType, b []byte, opts *DetectOptions) (*auth.Credentials, error) { + if err := checkCredentialType(b, credType); err != nil { + return nil, err + } + // We can't use readCredentialsFileJSON because it does auto-detection + // for client_credentials.json which we don't support here (no type field). + // Instead, we call fileCredentials just as readCredentialsFileJSON does + // when it doesn't detect client_credentials.json. + return fileCredentials(b, opts) +} + +func checkCredentialType(b []byte, expected CredType) error { + + fileType, err := credsfile.ParseFileType(b) + if err != nil { + return err + } + if CredType(fileType) != expected { + return fmt.Errorf("credentials: expected type %q, found %q", expected, fileType) + } + return nil +} + func (o *DetectOptions) validate() error { if o == nil { return errors.New("credentials: options must be provided") diff --git a/vendor/cloud.google.com/go/auth/credentials/filetypes.go b/vendor/cloud.google.com/go/auth/credentials/filetypes.go index d2a0424702..f3737a5e8c 100644 --- a/vendor/cloud.google.com/go/auth/credentials/filetypes.go +++ b/vendor/cloud.google.com/go/auth/credentials/filetypes.go @@ -28,18 +28,21 @@ import ( "cloud.google.com/go/auth/internal/trustboundary" ) +const cloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform" + func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { fileType, err := credsfile.ParseFileType(b) if err != nil { return nil, err } + if fileType == "" { + return nil, errors.New("credentials: unsupported unidentified file type") + } var projectID, universeDomain string var tp auth.TokenProvider - switch fileType { - case credsfile.UnknownCredType: - return nil, errors.New("credentials: unsupported unidentified file type") - case credsfile.ServiceAccountKey: + switch CredType(fileType) { + case ServiceAccount: f, err := credsfile.ParseServiceAccount(b) if err != nil { return nil, err @@ -50,7 +53,7 @@ func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { } projectID = f.ProjectID universeDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) - case credsfile.UserCredentialsKey: + case AuthorizedUser: f, err := credsfile.ParseUserCredentials(b) if err != nil { return nil, err @@ -60,7 +63,7 @@ func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { return nil, err } universeDomain = f.UniverseDomain - case credsfile.ExternalAccountKey: + case ExternalAccount: f, err := credsfile.ParseExternalAccount(b) if err != nil { return nil, err @@ -70,7 +73,7 @@ func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { return nil, err } universeDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) - case credsfile.ExternalAccountAuthorizedUserKey: + case ExternalAccountAuthorizedUser: f, err := credsfile.ParseExternalAccountAuthorizedUser(b) if err != nil { return nil, err @@ -80,7 +83,7 @@ func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { return nil, err } universeDomain = f.UniverseDomain - case credsfile.ImpersonatedServiceAccountKey: + case ImpersonatedServiceAccount: f, err := credsfile.ParseImpersonatedServiceAccount(b) if err != nil { return nil, err @@ -90,7 +93,7 @@ func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { return nil, err } universeDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) - case credsfile.GDCHServiceAccountKey: + case GDCHServiceAccount: f, err := credsfile.ParseGDCHServiceAccount(b) if err != nil { return nil, err @@ -275,14 +278,24 @@ func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFil return nil, errors.New("missing 'source_credentials' field or 'service_account_impersonation_url' in credentials") } - sourceTP, err := fileCredentials(f.CredSource, opts) + sourceOpts := *opts + + // Source credential needs IAM or Cloud Platform scope to call the + // iamcredentials endpoint. The scopes provided by the user are for the + // impersonated credentials. + sourceOpts.Scopes = []string{cloudPlatformScope} + sourceTP, err := fileCredentials(f.CredSource, &sourceOpts) if err != nil { return nil, err } ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) + scopes := opts.scopes() + if len(scopes) == 0 { + scopes = f.Scopes + } impOpts := &impersonate.Options{ URL: f.ServiceAccountImpersonationURL, - Scopes: opts.scopes(), + Scopes: scopes, Tp: sourceTP, Delegates: f.Delegates, Client: opts.client(), diff --git a/vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go b/vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go index 9cd4bed61b..84aab8472a 100644 --- a/vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go +++ b/vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go @@ -32,50 +32,6 @@ const ( userCredsFilename = "application_default_credentials.json" ) -// CredentialType represents different credential filetypes Google credentials -// can be. -type CredentialType int - -const ( - // UnknownCredType is an unidentified file type. - UnknownCredType CredentialType = iota - // UserCredentialsKey represents a user creds file type. - UserCredentialsKey - // ServiceAccountKey represents a service account file type. - ServiceAccountKey - // ImpersonatedServiceAccountKey represents a impersonated service account - // file type. - ImpersonatedServiceAccountKey - // ExternalAccountKey represents a external account file type. - ExternalAccountKey - // GDCHServiceAccountKey represents a GDCH file type. - GDCHServiceAccountKey - // ExternalAccountAuthorizedUserKey represents a external account authorized - // user file type. - ExternalAccountAuthorizedUserKey -) - -// parseCredentialType returns the associated filetype based on the parsed -// typeString provided. -func parseCredentialType(typeString string) CredentialType { - switch typeString { - case "service_account": - return ServiceAccountKey - case "authorized_user": - return UserCredentialsKey - case "impersonated_service_account": - return ImpersonatedServiceAccountKey - case "external_account": - return ExternalAccountKey - case "external_account_authorized_user": - return ExternalAccountAuthorizedUserKey - case "gdch_service_account": - return GDCHServiceAccountKey - default: - return UnknownCredType - } -} - // GetFileNameFromEnv returns the override if provided or detects a filename // from the environment. func GetFileNameFromEnv(override string) string { diff --git a/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go b/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go index 606347304c..cbba2eb977 100644 --- a/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go +++ b/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go @@ -140,6 +140,7 @@ type ImpersonatedServiceAccountFile struct { Type string `json:"type"` ServiceAccountImpersonationURL string `json:"service_account_impersonation_url"` Delegates []string `json:"delegates"` + Scopes []string `json:"scopes"` CredSource json.RawMessage `json:"source_credentials"` UniverseDomain string `json:"universe_domain"` } diff --git a/vendor/cloud.google.com/go/auth/internal/credsfile/parse.go b/vendor/cloud.google.com/go/auth/internal/credsfile/parse.go index a02b9f5df7..f2cedb731c 100644 --- a/vendor/cloud.google.com/go/auth/internal/credsfile/parse.go +++ b/vendor/cloud.google.com/go/auth/internal/credsfile/parse.go @@ -89,10 +89,11 @@ type fileTypeChecker struct { } // ParseFileType determines the [CredentialType] based on bytes provided. -func ParseFileType(b []byte) (CredentialType, error) { +// Only returns error for json.Unmarshal. +func ParseFileType(b []byte) (string, error) { var f fileTypeChecker if err := json.Unmarshal(b, &f); err != nil { - return 0, err + return "", err } - return parseCredentialType(f.Type), nil + return f.Type, nil } diff --git a/vendor/cloud.google.com/go/auth/internal/internal.go b/vendor/cloud.google.com/go/auth/internal/internal.go index 72a8a6b7a5..48e9bd9ece 100644 --- a/vendor/cloud.google.com/go/auth/internal/internal.go +++ b/vendor/cloud.google.com/go/auth/internal/internal.go @@ -88,12 +88,13 @@ func ParseKey(key []byte) (crypto.Signer, error) { key = block.Bytes } var parsedKey crypto.PrivateKey - var err error - parsedKey, err = x509.ParsePKCS8PrivateKey(key) - if err != nil { - parsedKey, err = x509.ParsePKCS1PrivateKey(key) - if err != nil { - return nil, fmt.Errorf("private key should be a PEM or plain PKCS1 or PKCS8: %w", err) + + var errPKCS8, errPKCS1, errEC error + if parsedKey, errPKCS8 = x509.ParsePKCS8PrivateKey(key); errPKCS8 != nil { + if parsedKey, errPKCS1 = x509.ParsePKCS1PrivateKey(key); errPKCS1 != nil { + if parsedKey, errEC = x509.ParseECPrivateKey(key); errEC != nil { + return nil, fmt.Errorf("failed to parse private key. Tried PKCS8, PKCS1, and EC formats. Errors: [PKCS8: %v], [PKCS1: %v], [EC: %v]", errPKCS8, errPKCS1, errEC) + } } } parsed, ok := parsedKey.(crypto.Signer) diff --git a/vendor/cloud.google.com/go/auth/internal/version.go b/vendor/cloud.google.com/go/auth/internal/version.go index e2f56cf4d8..702a6840d4 100644 --- a/vendor/cloud.google.com/go/auth/internal/version.go +++ b/vendor/cloud.google.com/go/auth/internal/version.go @@ -17,4 +17,4 @@ package internal // Version is the current tagged release of the library. -const Version = "0.17.0" +const Version = "0.18.0" diff --git a/vendor/cloud.google.com/go/civil/civil.go b/vendor/cloud.google.com/go/civil/civil.go deleted file mode 100644 index 8a7a1fa4b2..0000000000 --- a/vendor/cloud.google.com/go/civil/civil.go +++ /dev/null @@ -1,500 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package civil implements types for civil time, a time-zone-independent -// representation of time that follows the rules of the proleptic -// Gregorian calendar with exactly 24-hour days, 60-minute hours, and 60-second -// minutes. -// -// Because they lack location information, these types do not represent unique -// moments or intervals of time. Use time.Time for that purpose. -package civil - -import ( - "database/sql/driver" - "fmt" - "time" -) - -// A Date represents a date (year, month, day). -// -// This type does not include location information, and therefore does not -// describe a unique 24-hour timespan. -type Date struct { - Year int // Year (e.g., 2014). - Month time.Month // Month of the year (January = 1, ...). - Day int // Day of the month, starting at 1. -} - -// DateOf returns the Date in which a time occurs in that time's location. -func DateOf(t time.Time) Date { - var d Date - d.Year, d.Month, d.Day = t.Date() - return d -} - -// ParseDate parses a string in RFC3339 full-date format and returns the date value it represents. -func ParseDate(s string) (Date, error) { - t, err := time.Parse("2006-01-02", s) - if err != nil { - return Date{}, err - } - return DateOf(t), nil -} - -// String returns the date in RFC3339 full-date format. -func (d Date) String() string { - return fmt.Sprintf("%04d-%02d-%02d", d.Year, d.Month, d.Day) -} - -// IsValid reports whether the date is valid. -func (d Date) IsValid() bool { - return DateOf(d.In(time.UTC)) == d -} - -// In returns the time corresponding to time 00:00:00 of the date in the location. -// -// In is always consistent with time.Date, even when time.Date returns a time -// on a different day. For example, if loc is America/Indiana/Vincennes, then both -// -// time.Date(1955, time.May, 1, 0, 0, 0, 0, loc) -// -// and -// -// civil.Date{Year: 1955, Month: time.May, Day: 1}.In(loc) -// -// return 23:00:00 on April 30, 1955. -// -// In panics if loc is nil. -func (d Date) In(loc *time.Location) time.Time { - return time.Date(d.Year, d.Month, d.Day, 0, 0, 0, 0, loc) -} - -// AddDays returns the date that is n days in the future. -// n can also be negative to go into the past. -func (d Date) AddDays(n int) Date { - return DateOf(d.In(time.UTC).AddDate(0, 0, n)) -} - -// AddMonths returns the date that is n months in the future. -// n can also be negative to go into the past. -func (d Date) AddMonths(n int) Date { - return DateOf(d.In(time.UTC).AddDate(0, n, 0)) -} - -// AddYears returns the date that is n years in the future. -// n can also be negative to go into the past. -func (d Date) AddYears(n int) Date { - return DateOf(d.In(time.UTC).AddDate(n, 0, 0)) -} - -// DaysSince returns the signed number of days between the date and s, not including the end day. -// This is the inverse operation to AddDays. -func (d Date) DaysSince(s Date) (days int) { - // We convert to Unix time so we do not have to worry about leap seconds: - // Unix time increases by exactly 86400 seconds per day. - deltaUnix := d.In(time.UTC).Unix() - s.In(time.UTC).Unix() - return int(deltaUnix / 86400) -} - -// Before reports whether d occurs before d2. -func (d Date) Before(d2 Date) bool { - if d.Year != d2.Year { - return d.Year < d2.Year - } - if d.Month != d2.Month { - return d.Month < d2.Month - } - return d.Day < d2.Day -} - -// After reports whether d occurs after d2. -func (d Date) After(d2 Date) bool { - return d2.Before(d) -} - -// Compare compares d and d2. If d is before d2, it returns -1; -// if d is after d2, it returns +1; otherwise it returns 0. -func (d Date) Compare(d2 Date) int { - if d.Before(d2) { - return -1 - } else if d.After(d2) { - return +1 - } - return 0 -} - -// IsZero reports whether date fields are set to their default value. -func (d Date) IsZero() bool { - return (d.Year == 0) && (int(d.Month) == 0) && (d.Day == 0) -} - -// Weekday returns the day of the week for the date. -func (d Date) Weekday() time.Weekday { - return d.In(time.UTC).Weekday() -} - -// MarshalText implements the encoding.TextMarshaler interface. -// The output is the result of d.String(). -func (d Date) MarshalText() ([]byte, error) { - return []byte(d.String()), nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// The date is expected to be a string in a format accepted by ParseDate. -func (d *Date) UnmarshalText(data []byte) error { - var err error - *d, err = ParseDate(string(data)) - return err -} - -// Value implements the database/sql/driver Valuer interface. -func (d Date) Value() (driver.Value, error) { - return d.String(), nil -} - -// Scan implements the database/sql Scanner interface. -func (d *Date) Scan(v any) error { - switch vt := v.(type) { - case time.Time: - *d = DateOf(vt) - case *time.Time: - if vt != nil { - *d = DateOf(*vt) - } - case string: - var err error - *d, err = ParseDate(vt) - return err - case *string: - var err error - if vt != nil { - *d, err = ParseDate(*vt) - } - return err - case []byte: - var err error - *d, err = ParseDate(string(vt)) - return err - case *[]byte: - var err error - if vt != nil { - *d, err = ParseDate(string(*vt)) - } - return err - case Date: - *d = vt - case *Date: - *d = *vt - default: - return fmt.Errorf("unsupported scan type for Date: %T", v) - } - return nil -} - -// A Time represents a time with nanosecond precision. -// -// This type does not include location information, and therefore does not -// describe a unique moment in time. -// -// This type exists to represent the TIME type in storage-based APIs like BigQuery. -// Most operations on Times are unlikely to be meaningful. Prefer the DateTime type. -type Time struct { - Hour int // The hour of the day in 24-hour format; range [0-23] - Minute int // The minute of the hour; range [0-59] - Second int // The second of the minute; range [0-59] - Nanosecond int // The nanosecond of the second; range [0-999999999] -} - -// TimeOf returns the Time representing the time of day in which a time occurs -// in that time's location. It ignores the date. -func TimeOf(t time.Time) Time { - var tm Time - tm.Hour, tm.Minute, tm.Second = t.Clock() - tm.Nanosecond = t.Nanosecond() - return tm -} - -// ParseTime parses a string and returns the time value it represents. -// ParseTime accepts an extended form of the RFC3339 partial-time format. After -// the HH:MM:SS part of the string, an optional fractional part may appear, -// consisting of a decimal point followed by one to nine decimal digits. -// (RFC3339 admits only one digit after the decimal point). -func ParseTime(s string) (Time, error) { - t, err := time.Parse("15:04:05.999999999", s) - if err != nil { - return Time{}, err - } - return TimeOf(t), nil -} - -// String returns the date in the format described in ParseTime. If Nanoseconds -// is zero, no fractional part will be generated. Otherwise, the result will -// end with a fractional part consisting of a decimal point and nine digits. -func (t Time) String() string { - s := fmt.Sprintf("%02d:%02d:%02d", t.Hour, t.Minute, t.Second) - if t.Nanosecond == 0 { - return s - } - return s + fmt.Sprintf(".%09d", t.Nanosecond) -} - -// IsValid reports whether the time is valid. -func (t Time) IsValid() bool { - // Construct a non-zero time. - tm := time.Date(2, 2, 2, t.Hour, t.Minute, t.Second, t.Nanosecond, time.UTC) - return TimeOf(tm) == t -} - -// IsZero reports whether time fields are set to their default value. -func (t Time) IsZero() bool { - return (t.Hour == 0) && (t.Minute == 0) && (t.Second == 0) && (t.Nanosecond == 0) -} - -// Before reports whether t occurs before t2. -func (t Time) Before(t2 Time) bool { - if t.Hour != t2.Hour { - return t.Hour < t2.Hour - } - if t.Minute != t2.Minute { - return t.Minute < t2.Minute - } - if t.Second != t2.Second { - return t.Second < t2.Second - } - - return t.Nanosecond < t2.Nanosecond -} - -// After reports whether t occurs after t2. -func (t Time) After(t2 Time) bool { - return t2.Before(t) -} - -// Compare compares t and t2. If t is before t2, it returns -1; -// if t is after t2, it returns +1; otherwise it returns 0. -func (t Time) Compare(t2 Time) int { - if t.Before(t2) { - return -1 - } else if t.After(t2) { - return +1 - } - return 0 -} - -// MarshalText implements the encoding.TextMarshaler interface. -// The output is the result of t.String(). -func (t Time) MarshalText() ([]byte, error) { - return []byte(t.String()), nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// The time is expected to be a string in a format accepted by ParseTime. -func (t *Time) UnmarshalText(data []byte) error { - var err error - *t, err = ParseTime(string(data)) - return err -} - -// Value implements the database/sql/driver Valuer interface. -func (t Time) Value() (driver.Value, error) { - return t.String(), nil -} - -// Scan implements the database/sql Scanner interface. -func (t *Time) Scan(v any) error { - switch vt := v.(type) { - case time.Time: - *t = TimeOf(vt) - case *time.Time: - if vt != nil { - *t = TimeOf(*vt) - } - case string: - var err error - *t, err = ParseTime(vt) - return err - case *string: - var err error - if vt != nil { - *t, err = ParseTime(*vt) - } - return err - case []byte: - var err error - *t, err = ParseTime(string(vt)) - return err - case *[]byte: - var err error - if vt != nil { - *t, err = ParseTime(string(*vt)) - } - return err - case Time: - *t = vt - case *Time: - *t = *vt - default: - return fmt.Errorf("unsupported scan type for Time: %T", v) - } - return nil -} - -// A DateTime represents a date and time. -// -// This type does not include location information, and therefore does not -// describe a unique moment in time. -type DateTime struct { - Date Date - Time Time -} - -// Note: We deliberately do not embed Date into DateTime, to avoid promoting AddDays and Sub. - -// DateTimeOf returns the DateTime in which a time occurs in that time's location. -func DateTimeOf(t time.Time) DateTime { - return DateTime{ - Date: DateOf(t), - Time: TimeOf(t), - } -} - -// ParseDateTime parses a string and returns the DateTime it represents. -// ParseDateTime accepts a variant of the RFC3339 date-time format that omits -// the time offset but includes an optional fractional time, as described in -// ParseTime. Informally, the accepted format is -// -// YYYY-MM-DDTHH:MM:SS[.FFFFFFFFF] -// -// where the 'T' may be a lower-case 't'. -func ParseDateTime(s string) (DateTime, error) { - t, err := time.Parse("2006-01-02T15:04:05.999999999", s) - if err != nil { - t, err = time.Parse("2006-01-02t15:04:05.999999999", s) - if err != nil { - return DateTime{}, err - } - } - return DateTimeOf(t), nil -} - -// String returns the date in the format described in ParseDate. -func (dt DateTime) String() string { - return dt.Date.String() + "T" + dt.Time.String() -} - -// IsValid reports whether the datetime is valid. -func (dt DateTime) IsValid() bool { - return dt.Date.IsValid() && dt.Time.IsValid() -} - -// In returns the time corresponding to the DateTime in the given location. -// -// If the time is missing or ambigous at the location, In returns the same -// result as time.Date. For example, if loc is America/Indiana/Vincennes, then -// both -// -// time.Date(1955, time.May, 1, 0, 30, 0, 0, loc) -// -// and -// -// civil.DateTime{ -// civil.Date{Year: 1955, Month: time.May, Day: 1}}, -// civil.Time{Minute: 30}}.In(loc) -// -// return 23:30:00 on April 30, 1955. -// -// In panics if loc is nil. -func (dt DateTime) In(loc *time.Location) time.Time { - return time.Date(dt.Date.Year, dt.Date.Month, dt.Date.Day, dt.Time.Hour, dt.Time.Minute, dt.Time.Second, dt.Time.Nanosecond, loc) -} - -// Before reports whether dt occurs before dt2. -func (dt DateTime) Before(dt2 DateTime) bool { - return dt.In(time.UTC).Before(dt2.In(time.UTC)) -} - -// After reports whether dt occurs after dt2. -func (dt DateTime) After(dt2 DateTime) bool { - return dt2.Before(dt) -} - -// Compare compares dt and dt2. If dt is before dt2, it returns -1; -// if dt is after dt2, it returns +1; otherwise it returns 0. -func (dt DateTime) Compare(dt2 DateTime) int { - return dt.In(time.UTC).Compare(dt2.In(time.UTC)) -} - -// IsZero reports whether datetime fields are set to their default value. -func (dt DateTime) IsZero() bool { - return dt.Date.IsZero() && dt.Time.IsZero() -} - -// MarshalText implements the encoding.TextMarshaler interface. -// The output is the result of dt.String(). -func (dt DateTime) MarshalText() ([]byte, error) { - return []byte(dt.String()), nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// The datetime is expected to be a string in a format accepted by ParseDateTime -func (dt *DateTime) UnmarshalText(data []byte) error { - var err error - *dt, err = ParseDateTime(string(data)) - return err -} - -// Value implements the database/sql/driver Valuer interface. -func (dt DateTime) Value() (driver.Value, error) { - return dt.String(), nil -} - -// Scan implements the database/sql Scanner interface. -func (dt *DateTime) Scan(v any) error { - switch vt := v.(type) { - case time.Time: - *dt = DateTimeOf(vt) - case *time.Time: - if vt != nil { - *dt = DateTimeOf(*vt) - } - case string: - var err error - *dt, err = ParseDateTime(vt) - return err - case *string: - var err error - if vt != nil { - *dt, err = ParseDateTime(*vt) - } - return err - case []byte: - var err error - *dt, err = ParseDateTime(string(vt)) - return err - case *[]byte: - var err error - if vt != nil { - *dt, err = ParseDateTime(string(*vt)) - } - return err - case DateTime: - *dt = vt - case *DateTime: - *dt = *vt - default: - return fmt.Errorf("unsupported scan type for DateTime: %T", v) - } - return nil -} diff --git a/vendor/cloud.google.com/go/firestore/apiv1/auxiliary.go b/vendor/cloud.google.com/go/firestore/apiv1/auxiliary.go index 4db7d07056..e0ed132331 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/auxiliary.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/auxiliary.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/cloud.google.com/go/firestore/apiv1/auxiliary_go123.go b/vendor/cloud.google.com/go/firestore/apiv1/auxiliary_go123.go index 9b9a20e0ce..cd9fca0278 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/auxiliary_go123.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/auxiliary_go123.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/cloud.google.com/go/firestore/apiv1/doc.go b/vendor/cloud.google.com/go/firestore/apiv1/doc.go index a32a78ae83..eb775d0215 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/doc.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/doc.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestore_client.go b/vendor/cloud.google.com/go/firestore/apiv1/firestore_client.go index 551ba8ecec..18a77ecf5d 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestore_client.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestore_client.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -793,7 +793,7 @@ func (c *gRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *gRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } @@ -868,7 +868,7 @@ func defaultRESTClientOptions() []option.ClientOption { // use by Google-written clients. func (c *restClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN") + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN", "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } @@ -1662,7 +1662,7 @@ func (c *restClient) BatchGetDocuments(ctx context.Context, req *firestorepb.Bat hds = append(c.xGoogHeaders, hds...) hds = append(hds, "Content-Type", "application/json") headers := gax.BuildHeaders(ctx, hds...) - var streamClient *batchGetDocumentsRESTClient + var streamClient *batchGetDocumentsRESTStreamClient e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { if settings.Path != "" { baseUrl.Path = settings.Path @@ -1679,7 +1679,7 @@ func (c *restClient) BatchGetDocuments(ctx context.Context, req *firestorepb.Bat return err } - streamClient = &batchGetDocumentsRESTClient{ + streamClient = &batchGetDocumentsRESTStreamClient{ ctx: ctx, md: metadata.MD(httpRsp.Header), stream: gax.NewProtoJSONStreamReader(httpRsp.Body, (&firestorepb.BatchGetDocumentsResponse{}).ProtoReflect().Type()), @@ -1690,15 +1690,15 @@ func (c *restClient) BatchGetDocuments(ctx context.Context, req *firestorepb.Bat return streamClient, e } -// batchGetDocumentsRESTClient is the stream client used to consume the server stream created by +// batchGetDocumentsRESTStreamClient is the stream client used to consume the server stream created by // the REST implementation of BatchGetDocuments. -type batchGetDocumentsRESTClient struct { +type batchGetDocumentsRESTStreamClient struct { ctx context.Context md metadata.MD stream *gax.ProtoJSONStream } -func (c *batchGetDocumentsRESTClient) Recv() (*firestorepb.BatchGetDocumentsResponse, error) { +func (c *batchGetDocumentsRESTStreamClient) Recv() (*firestorepb.BatchGetDocumentsResponse, error) { if err := c.ctx.Err(); err != nil { defer c.stream.Close() return nil, err @@ -1712,29 +1712,29 @@ func (c *batchGetDocumentsRESTClient) Recv() (*firestorepb.BatchGetDocumentsResp return res, nil } -func (c *batchGetDocumentsRESTClient) Header() (metadata.MD, error) { +func (c *batchGetDocumentsRESTStreamClient) Header() (metadata.MD, error) { return c.md, nil } -func (c *batchGetDocumentsRESTClient) Trailer() metadata.MD { +func (c *batchGetDocumentsRESTStreamClient) Trailer() metadata.MD { return c.md } -func (c *batchGetDocumentsRESTClient) CloseSend() error { +func (c *batchGetDocumentsRESTStreamClient) CloseSend() error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented for a server-stream") } -func (c *batchGetDocumentsRESTClient) Context() context.Context { +func (c *batchGetDocumentsRESTStreamClient) Context() context.Context { return c.ctx } -func (c *batchGetDocumentsRESTClient) SendMsg(m interface{}) error { +func (c *batchGetDocumentsRESTStreamClient) SendMsg(m interface{}) error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented for a server-stream") } -func (c *batchGetDocumentsRESTClient) RecvMsg(m interface{}) error { +func (c *batchGetDocumentsRESTStreamClient) RecvMsg(m interface{}) error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented, use Recv") } @@ -1917,7 +1917,7 @@ func (c *restClient) RunQuery(ctx context.Context, req *firestorepb.RunQueryRequ hds = append(c.xGoogHeaders, hds...) hds = append(hds, "Content-Type", "application/json") headers := gax.BuildHeaders(ctx, hds...) - var streamClient *runQueryRESTClient + var streamClient *runQueryRESTStreamClient e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { if settings.Path != "" { baseUrl.Path = settings.Path @@ -1934,7 +1934,7 @@ func (c *restClient) RunQuery(ctx context.Context, req *firestorepb.RunQueryRequ return err } - streamClient = &runQueryRESTClient{ + streamClient = &runQueryRESTStreamClient{ ctx: ctx, md: metadata.MD(httpRsp.Header), stream: gax.NewProtoJSONStreamReader(httpRsp.Body, (&firestorepb.RunQueryResponse{}).ProtoReflect().Type()), @@ -1945,15 +1945,15 @@ func (c *restClient) RunQuery(ctx context.Context, req *firestorepb.RunQueryRequ return streamClient, e } -// runQueryRESTClient is the stream client used to consume the server stream created by +// runQueryRESTStreamClient is the stream client used to consume the server stream created by // the REST implementation of RunQuery. -type runQueryRESTClient struct { +type runQueryRESTStreamClient struct { ctx context.Context md metadata.MD stream *gax.ProtoJSONStream } -func (c *runQueryRESTClient) Recv() (*firestorepb.RunQueryResponse, error) { +func (c *runQueryRESTStreamClient) Recv() (*firestorepb.RunQueryResponse, error) { if err := c.ctx.Err(); err != nil { defer c.stream.Close() return nil, err @@ -1967,29 +1967,29 @@ func (c *runQueryRESTClient) Recv() (*firestorepb.RunQueryResponse, error) { return res, nil } -func (c *runQueryRESTClient) Header() (metadata.MD, error) { +func (c *runQueryRESTStreamClient) Header() (metadata.MD, error) { return c.md, nil } -func (c *runQueryRESTClient) Trailer() metadata.MD { +func (c *runQueryRESTStreamClient) Trailer() metadata.MD { return c.md } -func (c *runQueryRESTClient) CloseSend() error { +func (c *runQueryRESTStreamClient) CloseSend() error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented for a server-stream") } -func (c *runQueryRESTClient) Context() context.Context { +func (c *runQueryRESTStreamClient) Context() context.Context { return c.ctx } -func (c *runQueryRESTClient) SendMsg(m interface{}) error { +func (c *runQueryRESTStreamClient) SendMsg(m interface{}) error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented for a server-stream") } -func (c *runQueryRESTClient) RecvMsg(m interface{}) error { +func (c *runQueryRESTStreamClient) RecvMsg(m interface{}) error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented, use Recv") } @@ -2026,7 +2026,7 @@ func (c *restClient) RunAggregationQuery(ctx context.Context, req *firestorepb.R hds = append(c.xGoogHeaders, hds...) hds = append(hds, "Content-Type", "application/json") headers := gax.BuildHeaders(ctx, hds...) - var streamClient *runAggregationQueryRESTClient + var streamClient *runAggregationQueryRESTStreamClient e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { if settings.Path != "" { baseUrl.Path = settings.Path @@ -2043,7 +2043,7 @@ func (c *restClient) RunAggregationQuery(ctx context.Context, req *firestorepb.R return err } - streamClient = &runAggregationQueryRESTClient{ + streamClient = &runAggregationQueryRESTStreamClient{ ctx: ctx, md: metadata.MD(httpRsp.Header), stream: gax.NewProtoJSONStreamReader(httpRsp.Body, (&firestorepb.RunAggregationQueryResponse{}).ProtoReflect().Type()), @@ -2054,15 +2054,15 @@ func (c *restClient) RunAggregationQuery(ctx context.Context, req *firestorepb.R return streamClient, e } -// runAggregationQueryRESTClient is the stream client used to consume the server stream created by +// runAggregationQueryRESTStreamClient is the stream client used to consume the server stream created by // the REST implementation of RunAggregationQuery. -type runAggregationQueryRESTClient struct { +type runAggregationQueryRESTStreamClient struct { ctx context.Context md metadata.MD stream *gax.ProtoJSONStream } -func (c *runAggregationQueryRESTClient) Recv() (*firestorepb.RunAggregationQueryResponse, error) { +func (c *runAggregationQueryRESTStreamClient) Recv() (*firestorepb.RunAggregationQueryResponse, error) { if err := c.ctx.Err(); err != nil { defer c.stream.Close() return nil, err @@ -2076,29 +2076,29 @@ func (c *runAggregationQueryRESTClient) Recv() (*firestorepb.RunAggregationQuery return res, nil } -func (c *runAggregationQueryRESTClient) Header() (metadata.MD, error) { +func (c *runAggregationQueryRESTStreamClient) Header() (metadata.MD, error) { return c.md, nil } -func (c *runAggregationQueryRESTClient) Trailer() metadata.MD { +func (c *runAggregationQueryRESTStreamClient) Trailer() metadata.MD { return c.md } -func (c *runAggregationQueryRESTClient) CloseSend() error { +func (c *runAggregationQueryRESTStreamClient) CloseSend() error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented for a server-stream") } -func (c *runAggregationQueryRESTClient) Context() context.Context { +func (c *runAggregationQueryRESTStreamClient) Context() context.Context { return c.ctx } -func (c *runAggregationQueryRESTClient) SendMsg(m interface{}) error { +func (c *runAggregationQueryRESTStreamClient) SendMsg(m interface{}) error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented for a server-stream") } -func (c *runAggregationQueryRESTClient) RecvMsg(m interface{}) error { +func (c *runAggregationQueryRESTStreamClient) RecvMsg(m interface{}) error { // This is a no-op to fulfill the interface. return errors.New("this method is not implemented, use Recv") } diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/aggregation_result.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/aggregation_result.pb.go index 15ee3158e6..775babbb4c 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/aggregation_result.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/aggregation_result.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,17 +15,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/aggregation_result.proto package firestorepb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/bloom_filter.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/bloom_filter.pb.go index 216481e4a2..d1c1bb8526 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/bloom_filter.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/bloom_filter.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,17 +15,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/bloom_filter.proto package firestorepb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/common.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/common.pb.go index cac0c2b76f..20b50723f9 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/common.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/common.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/common.proto package firestorepb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/document.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/document.pb.go index ff68f7fd49..783b3a7b6c 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/document.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/document.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,21 +15,20 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/document.proto package firestorepb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" latlng "google.golang.org/genproto/googleapis/type/latlng" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore.pb.go index 211b40f0a2..7047f9116f 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,26 +15,21 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/firestore.proto package firestorepb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" status "google.golang.org/genproto/googleapis/rpc/status" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status1 "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" ) const ( @@ -3215,708 +3210,710 @@ var file_google_firestore_v1_firestore_proto_rawDesc = []byte{ 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x74, 0x6f, 0x1a, 0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xdb, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, + 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, + 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, + 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x22, 0x99, 0x03, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, + 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x6d, 0x61, + 0x73, 0x6b, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x68, 0x6f, 0x77, 0x4d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x7c, 0x0a, 0x15, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x08, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, + 0x41, 0x02, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x04, + 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, + 0x61, 0x73, 0x6b, 0x22, 0xa0, 0x02, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, + 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, + 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, + 0x6b, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, + 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x4c, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7e, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, - 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x16, - 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x99, 0x03, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0d, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, - 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x08, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, - 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x3a, 0x0a, 0x04, - 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, - 0x41, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, - 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, - 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x68, 0x6f, 0x77, 0x5f, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, - 0x68, 0x6f, 0x77, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, - 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x22, 0x7c, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, - 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xdb, 0x02, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, - 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xa0, 0x02, 0x0a, 0x15, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, - 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x4c, - 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7e, 0x0a, 0x15, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, - 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xdb, 0x02, 0x0a, - 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, - 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xd3, 0x01, 0x0a, 0x19, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, - 0x1a, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, - 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, - 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x7d, 0x0a, 0x17, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x3c, 0x0a, 0x18, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x86, 0x01, - 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x32, 0x0a, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0d, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x59, 0x0a, - 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xad, 0x03, 0x0a, 0x0f, 0x52, 0x75, 0x6e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x48, 0x01, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x51, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03, 0xe0, - 0x41, 0x01, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xce, 0x02, 0x0a, 0x10, 0x52, 0x75, 0x6e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x39, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x61, 0x73, 0x6b, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, + 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x16, 0x0a, 0x14, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x22, 0xd3, 0x01, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x6b, - 0x69, 0x70, 0x70, 0x65, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x04, - 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x64, 0x6f, - 0x6e, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x42, 0x17, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xda, 0x03, 0x0a, 0x1a, 0x52, 0x75, - 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x73, 0x0a, 0x1c, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x64, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x1a, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, - 0x01, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, - 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x48, 0x00, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x7d, 0x0a, 0x17, 0x42, 0x65, + 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x48, 0x01, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3c, 0x0a, 0x18, 0x42, 0x65, 0x67, + 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x20, + 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x94, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xad, 0x03, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x0b, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, + 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x01, 0x52, 0x0e, + 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, + 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, + 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0f, 0x65, 0x78, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x65, 0x78, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0c, 0x0a, 0x0a, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, + 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x22, 0xce, 0x02, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x4c, 0x0a, 0x0f, + 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, + 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x22, 0xda, 0x03, 0x0a, 0x1a, 0x52, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, + 0x73, 0x0a, 0x1c, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, + 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x01, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x08, 0x72, + 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x22, 0x86, 0x02, 0x0a, 0x1b, 0x52, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, - 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, - 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, - 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x16, - 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x86, 0x02, 0x0a, 0x1b, 0x52, 0x75, 0x6e, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x67, - 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, + 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x15, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x12, 0x51, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x7d, 0x0a, 0x16, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa5, 0x02, 0x0a, 0x0c, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x45, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xd3, 0x01, 0x0a, 0x0d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x45, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x64, 0x64, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x64, + 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, + 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x46, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0x9b, 0x03, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x4e, 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, + 0x0e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x4e, 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, + 0x0e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x4e, 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x48, 0x00, 0x52, + 0x0e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, + 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x0f, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x22, 0xc3, 0x04, 0x0a, 0x06, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3f, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, - 0x0e, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, - 0xcd, 0x02, 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x39, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x72, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x01, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, + 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, - 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0x7d, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa5, - 0x02, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x32, 0x0a, - 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x45, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd3, 0x01, 0x0a, 0x0d, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x45, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, - 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x3c, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, + 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x2f, + 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x86, 0x01, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe5, 0x02, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x60, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x61, 0x64, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, - 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x9b, 0x03, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc3, 0x04, 0x0a, 0x06, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x3f, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x4b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x23, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x54, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x4e, + 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, + 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, + 0x54, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x22, 0xc6, + 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6f, 0x6e, 0x63, 0x65, - 0x12, 0x42, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x2f, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x86, 0x01, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, - 0x10, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, - 0x0f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x42, 0x0c, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0d, - 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0d, 0x0a, - 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe5, 0x02, 0x0a, - 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x60, 0x0a, - 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x05, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x28, - 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x75, - 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x72, - 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x54, 0x69, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x43, - 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, - 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, - 0x45, 0x54, 0x10, 0x04, 0x22, 0xc6, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x6a, 0x0a, - 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, - 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xef, 0x01, 0x0a, 0x11, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x32, 0x0a, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x87, 0x01, 0x0a, 0x12, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xda, 0x19, 0x0a, 0x09, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x32, 0x12, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xf5, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x85, 0x01, 0x5a, 0x3f, 0x12, 0x3d, 0x2f, 0x76, 0x31, 0x2f, - 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x2f, 0x7b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xbf, 0x01, - 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x62, 0xda, 0x41, 0x14, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x32, 0x39, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, + 0x16, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x6a, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xef, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x4a, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x87, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0d, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, + 0xda, 0x19, 0x0a, 0x09, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x8f, 0x01, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, 0x30, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, - 0x95, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3f, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x2a, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0xf5, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x85, 0x01, 0x5a, 0x3f, 0x12, 0x3d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x7d, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x7d, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xb9, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2d, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, + 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xbf, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x62, 0xda, 0x41, 0x14, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x32, 0x39, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0x95, 0x01, 0x0a, 0x0e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, - 0x74, 0x30, 0x01, 0x12, 0xc7, 0x01, 0x0a, 0x10, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, - 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0xda, 0x41, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x01, 0x2a, 0x22, 0x40, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x3f, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x2a, + 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xa6, 0x01, - 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x53, 0xda, 0x41, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x22, 0x36, - 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0xa4, 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x5a, 0xda, 0x41, 0x14, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, - 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0xdf, 0x01, - 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, + 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, + 0x7d, 0x12, 0xb9, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, + 0x2a, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x30, 0x01, 0x12, 0xc7, 0x01, + 0x0a, 0x10, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x56, 0xda, 0x41, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x45, 0x3a, 0x01, 0x2a, 0x22, 0x40, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xa6, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0xda, 0x41, 0x0f, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x22, 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x12, 0xa4, 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x5a, 0xda, 0x41, 0x14, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, + 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x72, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0xdf, 0x01, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7d, - 0x3a, 0x01, 0x2a, 0x5a, 0x40, 0x3a, 0x01, 0x2a, 0x22, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, - 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x72, 0x75, 0x6e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x7d, 0x3a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, - 0x97, 0x02, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, + 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x83, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x7d, 0x3a, 0x01, 0x2a, 0x5a, 0x40, 0x3a, + 0x01, 0x2a, 0x22, 0x3b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x3a, 0x72, + 0x75, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x97, 0x02, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x93, 0x01, 0x3a, 0x01, 0x2a, 0x5a, 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, 0x2f, 0x76, - 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, - 0x3a, 0x72, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x22, 0x41, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x79, 0x12, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x93, 0x01, 0x3a, 0x01, + 0x2a, 0x5a, 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x72, 0x75, 0x6e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x41, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, + 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x3a, 0x72, 0x75, + 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x30, 0x01, 0x12, 0xfc, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x90, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x89, 0x01, 0x3a, 0x01, 0x2a, 0x5a, 0x46, 0x3a, 0x01, + 0x2a, 0x22, 0x41, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x7d, 0x3a, 0x72, 0x75, 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0xfc, 0x01, 0x0a, 0x0e, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x2e, 0x67, + 0x74, 0x73, 0x7d, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x94, 0x01, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x89, 0x01, 0x3a, - 0x01, 0x2a, 0x5a, 0x46, 0x3a, 0x01, 0x2a, 0x22, 0x41, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x2f, - 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x94, 0x01, 0x0a, 0x05, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x98, 0x01, 0x0a, 0x06, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x22, 0x36, + 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x28, 0x01, 0x30, 0x01, 0x12, 0x94, 0x02, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, - 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x9f, 0x01, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x8f, 0x01, 0x3a, 0x01, 0x2a, 0x5a, 0x49, 0x3a, 0x01, 0x2a, 0x22, 0x44, 0x2f, 0x76, 0x31, 0x2f, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x98, 0x01, 0x0a, 0x06, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x22, 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x94, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9f, 0x01, 0xda, 0x41, 0x06, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x8f, 0x01, 0x3a, 0x01, 0x2a, 0x5a, + 0x49, 0x3a, 0x01, 0x2a, 0x22, 0x44, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x6c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, - 0x22, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x3a, - 0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x73, 0x12, 0xa4, 0x01, 0x0a, 0x0a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, - 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, - 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x62, 0x61, - 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0xaf, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x08, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x40, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, - 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x1a, 0x76, 0xca, 0x41, 0x18, 0x66, - 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x58, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, - 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, - 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0xbf, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0e, - 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x70, - 0x62, 0x3b, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x70, 0x62, 0xaa, 0x02, 0x19, - 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x46, 0x69, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, - 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0xa4, 0x01, 0x0a, 0x0a, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3f, 0x3a, 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, + 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x12, 0xaf, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, + 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x40, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x2a, 0x2a, 0x7d, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x7d, 0x1a, 0x76, 0xca, 0x41, 0x18, 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x6d, 0xd2, 0x41, 0x58, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, + 0x74, 0x68, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0xbf, 0x01, 0x0a, + 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, + 0x66, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x70, 0x62, 0x3b, 0x66, 0x69, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x70, 0x62, 0xaa, 0x02, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x5c, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x56, 0x31, 0xea, + 0x02, 0x1c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, + 0x3a, 0x46, 0x69, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4182,857 +4179,3 @@ func file_google_firestore_v1_firestore_proto_init() { file_google_firestore_v1_firestore_proto_goTypes = nil file_google_firestore_v1_firestore_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// FirestoreClient is the client API for Firestore service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type FirestoreClient interface { - // Gets a single document. - GetDocument(ctx context.Context, in *GetDocumentRequest, opts ...grpc.CallOption) (*Document, error) - // Lists documents. - ListDocuments(ctx context.Context, in *ListDocumentsRequest, opts ...grpc.CallOption) (*ListDocumentsResponse, error) - // Updates or inserts a document. - UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*Document, error) - // Deletes a document. - DeleteDocument(ctx context.Context, in *DeleteDocumentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Gets multiple documents. - // - // Documents returned by this method are not guaranteed to be returned in the - // same order that they were requested. - BatchGetDocuments(ctx context.Context, in *BatchGetDocumentsRequest, opts ...grpc.CallOption) (Firestore_BatchGetDocumentsClient, error) - // Starts a new transaction. - BeginTransaction(ctx context.Context, in *BeginTransactionRequest, opts ...grpc.CallOption) (*BeginTransactionResponse, error) - // Commits a transaction, while optionally updating documents. - Commit(ctx context.Context, in *CommitRequest, opts ...grpc.CallOption) (*CommitResponse, error) - // Rolls back a transaction. - Rollback(ctx context.Context, in *RollbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Runs a query. - RunQuery(ctx context.Context, in *RunQueryRequest, opts ...grpc.CallOption) (Firestore_RunQueryClient, error) - // Runs an aggregation query. - // - // Rather than producing [Document][google.firestore.v1.Document] results like - // [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery], this API - // allows running an aggregation to produce a series of - // [AggregationResult][google.firestore.v1.AggregationResult] server-side. - // - // High-Level Example: - // - // ``` - // -- Return the number of documents in table given a filter. - // SELECT COUNT(*) FROM ( SELECT * FROM k where a = true ); - // ``` - RunAggregationQuery(ctx context.Context, in *RunAggregationQueryRequest, opts ...grpc.CallOption) (Firestore_RunAggregationQueryClient, error) - // Partitions a query by returning partition cursors that can be used to run - // the query in parallel. The returned partition cursors are split points that - // can be used by RunQuery as starting/end points for the query results. - PartitionQuery(ctx context.Context, in *PartitionQueryRequest, opts ...grpc.CallOption) (*PartitionQueryResponse, error) - // Streams batches of document updates and deletes, in order. This method is - // only available via gRPC or WebChannel (not REST). - Write(ctx context.Context, opts ...grpc.CallOption) (Firestore_WriteClient, error) - // Listens to changes. This method is only available via gRPC or WebChannel - // (not REST). - Listen(ctx context.Context, opts ...grpc.CallOption) (Firestore_ListenClient, error) - // Lists all the collection IDs underneath a document. - ListCollectionIds(ctx context.Context, in *ListCollectionIdsRequest, opts ...grpc.CallOption) (*ListCollectionIdsResponse, error) - // Applies a batch of write operations. - // - // The BatchWrite method does not apply the write operations atomically - // and can apply them out of order. Method does not allow more than one write - // per document. Each write succeeds or fails independently. See the - // [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for the - // success status of each write. - // - // If you require an atomically applied set of writes, use - // [Commit][google.firestore.v1.Firestore.Commit] instead. - BatchWrite(ctx context.Context, in *BatchWriteRequest, opts ...grpc.CallOption) (*BatchWriteResponse, error) - // Creates a new document. - CreateDocument(ctx context.Context, in *CreateDocumentRequest, opts ...grpc.CallOption) (*Document, error) -} - -type firestoreClient struct { - cc grpc.ClientConnInterface -} - -func NewFirestoreClient(cc grpc.ClientConnInterface) FirestoreClient { - return &firestoreClient{cc} -} - -func (c *firestoreClient) GetDocument(ctx context.Context, in *GetDocumentRequest, opts ...grpc.CallOption) (*Document, error) { - out := new(Document) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/GetDocument", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) ListDocuments(ctx context.Context, in *ListDocumentsRequest, opts ...grpc.CallOption) (*ListDocumentsResponse, error) { - out := new(ListDocumentsResponse) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/ListDocuments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*Document, error) { - out := new(Document) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/UpdateDocument", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) DeleteDocument(ctx context.Context, in *DeleteDocumentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/DeleteDocument", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) BatchGetDocuments(ctx context.Context, in *BatchGetDocumentsRequest, opts ...grpc.CallOption) (Firestore_BatchGetDocumentsClient, error) { - stream, err := c.cc.NewStream(ctx, &_Firestore_serviceDesc.Streams[0], "/google.firestore.v1.Firestore/BatchGetDocuments", opts...) - if err != nil { - return nil, err - } - x := &firestoreBatchGetDocumentsClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Firestore_BatchGetDocumentsClient interface { - Recv() (*BatchGetDocumentsResponse, error) - grpc.ClientStream -} - -type firestoreBatchGetDocumentsClient struct { - grpc.ClientStream -} - -func (x *firestoreBatchGetDocumentsClient) Recv() (*BatchGetDocumentsResponse, error) { - m := new(BatchGetDocumentsResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *firestoreClient) BeginTransaction(ctx context.Context, in *BeginTransactionRequest, opts ...grpc.CallOption) (*BeginTransactionResponse, error) { - out := new(BeginTransactionResponse) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/BeginTransaction", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) Commit(ctx context.Context, in *CommitRequest, opts ...grpc.CallOption) (*CommitResponse, error) { - out := new(CommitResponse) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/Commit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) Rollback(ctx context.Context, in *RollbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/Rollback", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) RunQuery(ctx context.Context, in *RunQueryRequest, opts ...grpc.CallOption) (Firestore_RunQueryClient, error) { - stream, err := c.cc.NewStream(ctx, &_Firestore_serviceDesc.Streams[1], "/google.firestore.v1.Firestore/RunQuery", opts...) - if err != nil { - return nil, err - } - x := &firestoreRunQueryClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Firestore_RunQueryClient interface { - Recv() (*RunQueryResponse, error) - grpc.ClientStream -} - -type firestoreRunQueryClient struct { - grpc.ClientStream -} - -func (x *firestoreRunQueryClient) Recv() (*RunQueryResponse, error) { - m := new(RunQueryResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *firestoreClient) RunAggregationQuery(ctx context.Context, in *RunAggregationQueryRequest, opts ...grpc.CallOption) (Firestore_RunAggregationQueryClient, error) { - stream, err := c.cc.NewStream(ctx, &_Firestore_serviceDesc.Streams[2], "/google.firestore.v1.Firestore/RunAggregationQuery", opts...) - if err != nil { - return nil, err - } - x := &firestoreRunAggregationQueryClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Firestore_RunAggregationQueryClient interface { - Recv() (*RunAggregationQueryResponse, error) - grpc.ClientStream -} - -type firestoreRunAggregationQueryClient struct { - grpc.ClientStream -} - -func (x *firestoreRunAggregationQueryClient) Recv() (*RunAggregationQueryResponse, error) { - m := new(RunAggregationQueryResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *firestoreClient) PartitionQuery(ctx context.Context, in *PartitionQueryRequest, opts ...grpc.CallOption) (*PartitionQueryResponse, error) { - out := new(PartitionQueryResponse) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/PartitionQuery", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) Write(ctx context.Context, opts ...grpc.CallOption) (Firestore_WriteClient, error) { - stream, err := c.cc.NewStream(ctx, &_Firestore_serviceDesc.Streams[3], "/google.firestore.v1.Firestore/Write", opts...) - if err != nil { - return nil, err - } - x := &firestoreWriteClient{stream} - return x, nil -} - -type Firestore_WriteClient interface { - Send(*WriteRequest) error - Recv() (*WriteResponse, error) - grpc.ClientStream -} - -type firestoreWriteClient struct { - grpc.ClientStream -} - -func (x *firestoreWriteClient) Send(m *WriteRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *firestoreWriteClient) Recv() (*WriteResponse, error) { - m := new(WriteResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *firestoreClient) Listen(ctx context.Context, opts ...grpc.CallOption) (Firestore_ListenClient, error) { - stream, err := c.cc.NewStream(ctx, &_Firestore_serviceDesc.Streams[4], "/google.firestore.v1.Firestore/Listen", opts...) - if err != nil { - return nil, err - } - x := &firestoreListenClient{stream} - return x, nil -} - -type Firestore_ListenClient interface { - Send(*ListenRequest) error - Recv() (*ListenResponse, error) - grpc.ClientStream -} - -type firestoreListenClient struct { - grpc.ClientStream -} - -func (x *firestoreListenClient) Send(m *ListenRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *firestoreListenClient) Recv() (*ListenResponse, error) { - m := new(ListenResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *firestoreClient) ListCollectionIds(ctx context.Context, in *ListCollectionIdsRequest, opts ...grpc.CallOption) (*ListCollectionIdsResponse, error) { - out := new(ListCollectionIdsResponse) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/ListCollectionIds", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) BatchWrite(ctx context.Context, in *BatchWriteRequest, opts ...grpc.CallOption) (*BatchWriteResponse, error) { - out := new(BatchWriteResponse) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/BatchWrite", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *firestoreClient) CreateDocument(ctx context.Context, in *CreateDocumentRequest, opts ...grpc.CallOption) (*Document, error) { - out := new(Document) - err := c.cc.Invoke(ctx, "/google.firestore.v1.Firestore/CreateDocument", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// FirestoreServer is the server API for Firestore service. -type FirestoreServer interface { - // Gets a single document. - GetDocument(context.Context, *GetDocumentRequest) (*Document, error) - // Lists documents. - ListDocuments(context.Context, *ListDocumentsRequest) (*ListDocumentsResponse, error) - // Updates or inserts a document. - UpdateDocument(context.Context, *UpdateDocumentRequest) (*Document, error) - // Deletes a document. - DeleteDocument(context.Context, *DeleteDocumentRequest) (*emptypb.Empty, error) - // Gets multiple documents. - // - // Documents returned by this method are not guaranteed to be returned in the - // same order that they were requested. - BatchGetDocuments(*BatchGetDocumentsRequest, Firestore_BatchGetDocumentsServer) error - // Starts a new transaction. - BeginTransaction(context.Context, *BeginTransactionRequest) (*BeginTransactionResponse, error) - // Commits a transaction, while optionally updating documents. - Commit(context.Context, *CommitRequest) (*CommitResponse, error) - // Rolls back a transaction. - Rollback(context.Context, *RollbackRequest) (*emptypb.Empty, error) - // Runs a query. - RunQuery(*RunQueryRequest, Firestore_RunQueryServer) error - // Runs an aggregation query. - // - // Rather than producing [Document][google.firestore.v1.Document] results like - // [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery], this API - // allows running an aggregation to produce a series of - // [AggregationResult][google.firestore.v1.AggregationResult] server-side. - // - // High-Level Example: - // - // ``` - // -- Return the number of documents in table given a filter. - // SELECT COUNT(*) FROM ( SELECT * FROM k where a = true ); - // ``` - RunAggregationQuery(*RunAggregationQueryRequest, Firestore_RunAggregationQueryServer) error - // Partitions a query by returning partition cursors that can be used to run - // the query in parallel. The returned partition cursors are split points that - // can be used by RunQuery as starting/end points for the query results. - PartitionQuery(context.Context, *PartitionQueryRequest) (*PartitionQueryResponse, error) - // Streams batches of document updates and deletes, in order. This method is - // only available via gRPC or WebChannel (not REST). - Write(Firestore_WriteServer) error - // Listens to changes. This method is only available via gRPC or WebChannel - // (not REST). - Listen(Firestore_ListenServer) error - // Lists all the collection IDs underneath a document. - ListCollectionIds(context.Context, *ListCollectionIdsRequest) (*ListCollectionIdsResponse, error) - // Applies a batch of write operations. - // - // The BatchWrite method does not apply the write operations atomically - // and can apply them out of order. Method does not allow more than one write - // per document. Each write succeeds or fails independently. See the - // [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for the - // success status of each write. - // - // If you require an atomically applied set of writes, use - // [Commit][google.firestore.v1.Firestore.Commit] instead. - BatchWrite(context.Context, *BatchWriteRequest) (*BatchWriteResponse, error) - // Creates a new document. - CreateDocument(context.Context, *CreateDocumentRequest) (*Document, error) -} - -// UnimplementedFirestoreServer can be embedded to have forward compatible implementations. -type UnimplementedFirestoreServer struct { -} - -func (*UnimplementedFirestoreServer) GetDocument(context.Context, *GetDocumentRequest) (*Document, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetDocument not implemented") -} -func (*UnimplementedFirestoreServer) ListDocuments(context.Context, *ListDocumentsRequest) (*ListDocumentsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListDocuments not implemented") -} -func (*UnimplementedFirestoreServer) UpdateDocument(context.Context, *UpdateDocumentRequest) (*Document, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateDocument not implemented") -} -func (*UnimplementedFirestoreServer) DeleteDocument(context.Context, *DeleteDocumentRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteDocument not implemented") -} -func (*UnimplementedFirestoreServer) BatchGetDocuments(*BatchGetDocumentsRequest, Firestore_BatchGetDocumentsServer) error { - return status1.Errorf(codes.Unimplemented, "method BatchGetDocuments not implemented") -} -func (*UnimplementedFirestoreServer) BeginTransaction(context.Context, *BeginTransactionRequest) (*BeginTransactionResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method BeginTransaction not implemented") -} -func (*UnimplementedFirestoreServer) Commit(context.Context, *CommitRequest) (*CommitResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method Commit not implemented") -} -func (*UnimplementedFirestoreServer) Rollback(context.Context, *RollbackRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method Rollback not implemented") -} -func (*UnimplementedFirestoreServer) RunQuery(*RunQueryRequest, Firestore_RunQueryServer) error { - return status1.Errorf(codes.Unimplemented, "method RunQuery not implemented") -} -func (*UnimplementedFirestoreServer) RunAggregationQuery(*RunAggregationQueryRequest, Firestore_RunAggregationQueryServer) error { - return status1.Errorf(codes.Unimplemented, "method RunAggregationQuery not implemented") -} -func (*UnimplementedFirestoreServer) PartitionQuery(context.Context, *PartitionQueryRequest) (*PartitionQueryResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method PartitionQuery not implemented") -} -func (*UnimplementedFirestoreServer) Write(Firestore_WriteServer) error { - return status1.Errorf(codes.Unimplemented, "method Write not implemented") -} -func (*UnimplementedFirestoreServer) Listen(Firestore_ListenServer) error { - return status1.Errorf(codes.Unimplemented, "method Listen not implemented") -} -func (*UnimplementedFirestoreServer) ListCollectionIds(context.Context, *ListCollectionIdsRequest) (*ListCollectionIdsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListCollectionIds not implemented") -} -func (*UnimplementedFirestoreServer) BatchWrite(context.Context, *BatchWriteRequest) (*BatchWriteResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method BatchWrite not implemented") -} -func (*UnimplementedFirestoreServer) CreateDocument(context.Context, *CreateDocumentRequest) (*Document, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateDocument not implemented") -} - -func RegisterFirestoreServer(s *grpc.Server, srv FirestoreServer) { - s.RegisterService(&_Firestore_serviceDesc, srv) -} - -func _Firestore_GetDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetDocumentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).GetDocument(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/GetDocument", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).GetDocument(ctx, req.(*GetDocumentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_ListDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListDocumentsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).ListDocuments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/ListDocuments", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).ListDocuments(ctx, req.(*ListDocumentsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_UpdateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateDocumentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).UpdateDocument(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/UpdateDocument", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).UpdateDocument(ctx, req.(*UpdateDocumentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_DeleteDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteDocumentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).DeleteDocument(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/DeleteDocument", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).DeleteDocument(ctx, req.(*DeleteDocumentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_BatchGetDocuments_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(BatchGetDocumentsRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(FirestoreServer).BatchGetDocuments(m, &firestoreBatchGetDocumentsServer{stream}) -} - -type Firestore_BatchGetDocumentsServer interface { - Send(*BatchGetDocumentsResponse) error - grpc.ServerStream -} - -type firestoreBatchGetDocumentsServer struct { - grpc.ServerStream -} - -func (x *firestoreBatchGetDocumentsServer) Send(m *BatchGetDocumentsResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Firestore_BeginTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BeginTransactionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).BeginTransaction(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/BeginTransaction", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).BeginTransaction(ctx, req.(*BeginTransactionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CommitRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).Commit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/Commit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).Commit(ctx, req.(*CommitRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_Rollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RollbackRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).Rollback(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/Rollback", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).Rollback(ctx, req.(*RollbackRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_RunQuery_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(RunQueryRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(FirestoreServer).RunQuery(m, &firestoreRunQueryServer{stream}) -} - -type Firestore_RunQueryServer interface { - Send(*RunQueryResponse) error - grpc.ServerStream -} - -type firestoreRunQueryServer struct { - grpc.ServerStream -} - -func (x *firestoreRunQueryServer) Send(m *RunQueryResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Firestore_RunAggregationQuery_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(RunAggregationQueryRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(FirestoreServer).RunAggregationQuery(m, &firestoreRunAggregationQueryServer{stream}) -} - -type Firestore_RunAggregationQueryServer interface { - Send(*RunAggregationQueryResponse) error - grpc.ServerStream -} - -type firestoreRunAggregationQueryServer struct { - grpc.ServerStream -} - -func (x *firestoreRunAggregationQueryServer) Send(m *RunAggregationQueryResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Firestore_PartitionQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PartitionQueryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).PartitionQuery(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/PartitionQuery", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).PartitionQuery(ctx, req.(*PartitionQueryRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_Write_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(FirestoreServer).Write(&firestoreWriteServer{stream}) -} - -type Firestore_WriteServer interface { - Send(*WriteResponse) error - Recv() (*WriteRequest, error) - grpc.ServerStream -} - -type firestoreWriteServer struct { - grpc.ServerStream -} - -func (x *firestoreWriteServer) Send(m *WriteResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *firestoreWriteServer) Recv() (*WriteRequest, error) { - m := new(WriteRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _Firestore_Listen_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(FirestoreServer).Listen(&firestoreListenServer{stream}) -} - -type Firestore_ListenServer interface { - Send(*ListenResponse) error - Recv() (*ListenRequest, error) - grpc.ServerStream -} - -type firestoreListenServer struct { - grpc.ServerStream -} - -func (x *firestoreListenServer) Send(m *ListenResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *firestoreListenServer) Recv() (*ListenRequest, error) { - m := new(ListenRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _Firestore_ListCollectionIds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListCollectionIdsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).ListCollectionIds(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/ListCollectionIds", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).ListCollectionIds(ctx, req.(*ListCollectionIdsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_BatchWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BatchWriteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).BatchWrite(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/BatchWrite", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).BatchWrite(ctx, req.(*BatchWriteRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Firestore_CreateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateDocumentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(FirestoreServer).CreateDocument(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.firestore.v1.Firestore/CreateDocument", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FirestoreServer).CreateDocument(ctx, req.(*CreateDocumentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Firestore_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.firestore.v1.Firestore", - HandlerType: (*FirestoreServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetDocument", - Handler: _Firestore_GetDocument_Handler, - }, - { - MethodName: "ListDocuments", - Handler: _Firestore_ListDocuments_Handler, - }, - { - MethodName: "UpdateDocument", - Handler: _Firestore_UpdateDocument_Handler, - }, - { - MethodName: "DeleteDocument", - Handler: _Firestore_DeleteDocument_Handler, - }, - { - MethodName: "BeginTransaction", - Handler: _Firestore_BeginTransaction_Handler, - }, - { - MethodName: "Commit", - Handler: _Firestore_Commit_Handler, - }, - { - MethodName: "Rollback", - Handler: _Firestore_Rollback_Handler, - }, - { - MethodName: "PartitionQuery", - Handler: _Firestore_PartitionQuery_Handler, - }, - { - MethodName: "ListCollectionIds", - Handler: _Firestore_ListCollectionIds_Handler, - }, - { - MethodName: "BatchWrite", - Handler: _Firestore_BatchWrite_Handler, - }, - { - MethodName: "CreateDocument", - Handler: _Firestore_CreateDocument_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "BatchGetDocuments", - Handler: _Firestore_BatchGetDocuments_Handler, - ServerStreams: true, - }, - { - StreamName: "RunQuery", - Handler: _Firestore_RunQuery_Handler, - ServerStreams: true, - }, - { - StreamName: "RunAggregationQuery", - Handler: _Firestore_RunAggregationQuery_Handler, - ServerStreams: true, - }, - { - StreamName: "Write", - Handler: _Firestore_Write_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "Listen", - Handler: _Firestore_Listen_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, - Metadata: "google/firestore/v1/firestore.proto", -} diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore_grpc.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore_grpc.pb.go new file mode 100644 index 0000000000..0ed2eeee36 --- /dev/null +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/firestore_grpc.pb.go @@ -0,0 +1,911 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/firestore/v1/firestore.proto + +package firestorepb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Firestore_GetDocument_FullMethodName = "/google.firestore.v1.Firestore/GetDocument" + Firestore_ListDocuments_FullMethodName = "/google.firestore.v1.Firestore/ListDocuments" + Firestore_UpdateDocument_FullMethodName = "/google.firestore.v1.Firestore/UpdateDocument" + Firestore_DeleteDocument_FullMethodName = "/google.firestore.v1.Firestore/DeleteDocument" + Firestore_BatchGetDocuments_FullMethodName = "/google.firestore.v1.Firestore/BatchGetDocuments" + Firestore_BeginTransaction_FullMethodName = "/google.firestore.v1.Firestore/BeginTransaction" + Firestore_Commit_FullMethodName = "/google.firestore.v1.Firestore/Commit" + Firestore_Rollback_FullMethodName = "/google.firestore.v1.Firestore/Rollback" + Firestore_RunQuery_FullMethodName = "/google.firestore.v1.Firestore/RunQuery" + Firestore_RunAggregationQuery_FullMethodName = "/google.firestore.v1.Firestore/RunAggregationQuery" + Firestore_PartitionQuery_FullMethodName = "/google.firestore.v1.Firestore/PartitionQuery" + Firestore_Write_FullMethodName = "/google.firestore.v1.Firestore/Write" + Firestore_Listen_FullMethodName = "/google.firestore.v1.Firestore/Listen" + Firestore_ListCollectionIds_FullMethodName = "/google.firestore.v1.Firestore/ListCollectionIds" + Firestore_BatchWrite_FullMethodName = "/google.firestore.v1.Firestore/BatchWrite" + Firestore_CreateDocument_FullMethodName = "/google.firestore.v1.Firestore/CreateDocument" +) + +// FirestoreClient is the client API for Firestore service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type FirestoreClient interface { + // Gets a single document. + GetDocument(ctx context.Context, in *GetDocumentRequest, opts ...grpc.CallOption) (*Document, error) + // Lists documents. + ListDocuments(ctx context.Context, in *ListDocumentsRequest, opts ...grpc.CallOption) (*ListDocumentsResponse, error) + // Updates or inserts a document. + UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*Document, error) + // Deletes a document. + DeleteDocument(ctx context.Context, in *DeleteDocumentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Gets multiple documents. + // + // Documents returned by this method are not guaranteed to be returned in the + // same order that they were requested. + BatchGetDocuments(ctx context.Context, in *BatchGetDocumentsRequest, opts ...grpc.CallOption) (Firestore_BatchGetDocumentsClient, error) + // Starts a new transaction. + BeginTransaction(ctx context.Context, in *BeginTransactionRequest, opts ...grpc.CallOption) (*BeginTransactionResponse, error) + // Commits a transaction, while optionally updating documents. + Commit(ctx context.Context, in *CommitRequest, opts ...grpc.CallOption) (*CommitResponse, error) + // Rolls back a transaction. + Rollback(ctx context.Context, in *RollbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Runs a query. + RunQuery(ctx context.Context, in *RunQueryRequest, opts ...grpc.CallOption) (Firestore_RunQueryClient, error) + // Runs an aggregation query. + // + // Rather than producing [Document][google.firestore.v1.Document] results like + // [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery], this API + // allows running an aggregation to produce a series of + // [AggregationResult][google.firestore.v1.AggregationResult] server-side. + // + // High-Level Example: + // + // ``` + // -- Return the number of documents in table given a filter. + // SELECT COUNT(*) FROM ( SELECT * FROM k where a = true ); + // ``` + RunAggregationQuery(ctx context.Context, in *RunAggregationQueryRequest, opts ...grpc.CallOption) (Firestore_RunAggregationQueryClient, error) + // Partitions a query by returning partition cursors that can be used to run + // the query in parallel. The returned partition cursors are split points that + // can be used by RunQuery as starting/end points for the query results. + PartitionQuery(ctx context.Context, in *PartitionQueryRequest, opts ...grpc.CallOption) (*PartitionQueryResponse, error) + // Streams batches of document updates and deletes, in order. This method is + // only available via gRPC or WebChannel (not REST). + Write(ctx context.Context, opts ...grpc.CallOption) (Firestore_WriteClient, error) + // Listens to changes. This method is only available via gRPC or WebChannel + // (not REST). + Listen(ctx context.Context, opts ...grpc.CallOption) (Firestore_ListenClient, error) + // Lists all the collection IDs underneath a document. + ListCollectionIds(ctx context.Context, in *ListCollectionIdsRequest, opts ...grpc.CallOption) (*ListCollectionIdsResponse, error) + // Applies a batch of write operations. + // + // The BatchWrite method does not apply the write operations atomically + // and can apply them out of order. Method does not allow more than one write + // per document. Each write succeeds or fails independently. See the + // [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for the + // success status of each write. + // + // If you require an atomically applied set of writes, use + // [Commit][google.firestore.v1.Firestore.Commit] instead. + BatchWrite(ctx context.Context, in *BatchWriteRequest, opts ...grpc.CallOption) (*BatchWriteResponse, error) + // Creates a new document. + CreateDocument(ctx context.Context, in *CreateDocumentRequest, opts ...grpc.CallOption) (*Document, error) +} + +type firestoreClient struct { + cc grpc.ClientConnInterface +} + +func NewFirestoreClient(cc grpc.ClientConnInterface) FirestoreClient { + return &firestoreClient{cc} +} + +func (c *firestoreClient) GetDocument(ctx context.Context, in *GetDocumentRequest, opts ...grpc.CallOption) (*Document, error) { + out := new(Document) + err := c.cc.Invoke(ctx, Firestore_GetDocument_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) ListDocuments(ctx context.Context, in *ListDocumentsRequest, opts ...grpc.CallOption) (*ListDocumentsResponse, error) { + out := new(ListDocumentsResponse) + err := c.cc.Invoke(ctx, Firestore_ListDocuments_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*Document, error) { + out := new(Document) + err := c.cc.Invoke(ctx, Firestore_UpdateDocument_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) DeleteDocument(ctx context.Context, in *DeleteDocumentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, Firestore_DeleteDocument_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) BatchGetDocuments(ctx context.Context, in *BatchGetDocumentsRequest, opts ...grpc.CallOption) (Firestore_BatchGetDocumentsClient, error) { + stream, err := c.cc.NewStream(ctx, &Firestore_ServiceDesc.Streams[0], Firestore_BatchGetDocuments_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &firestoreBatchGetDocumentsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Firestore_BatchGetDocumentsClient interface { + Recv() (*BatchGetDocumentsResponse, error) + grpc.ClientStream +} + +type firestoreBatchGetDocumentsClient struct { + grpc.ClientStream +} + +func (x *firestoreBatchGetDocumentsClient) Recv() (*BatchGetDocumentsResponse, error) { + m := new(BatchGetDocumentsResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *firestoreClient) BeginTransaction(ctx context.Context, in *BeginTransactionRequest, opts ...grpc.CallOption) (*BeginTransactionResponse, error) { + out := new(BeginTransactionResponse) + err := c.cc.Invoke(ctx, Firestore_BeginTransaction_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) Commit(ctx context.Context, in *CommitRequest, opts ...grpc.CallOption) (*CommitResponse, error) { + out := new(CommitResponse) + err := c.cc.Invoke(ctx, Firestore_Commit_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) Rollback(ctx context.Context, in *RollbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, Firestore_Rollback_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) RunQuery(ctx context.Context, in *RunQueryRequest, opts ...grpc.CallOption) (Firestore_RunQueryClient, error) { + stream, err := c.cc.NewStream(ctx, &Firestore_ServiceDesc.Streams[1], Firestore_RunQuery_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &firestoreRunQueryClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Firestore_RunQueryClient interface { + Recv() (*RunQueryResponse, error) + grpc.ClientStream +} + +type firestoreRunQueryClient struct { + grpc.ClientStream +} + +func (x *firestoreRunQueryClient) Recv() (*RunQueryResponse, error) { + m := new(RunQueryResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *firestoreClient) RunAggregationQuery(ctx context.Context, in *RunAggregationQueryRequest, opts ...grpc.CallOption) (Firestore_RunAggregationQueryClient, error) { + stream, err := c.cc.NewStream(ctx, &Firestore_ServiceDesc.Streams[2], Firestore_RunAggregationQuery_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &firestoreRunAggregationQueryClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Firestore_RunAggregationQueryClient interface { + Recv() (*RunAggregationQueryResponse, error) + grpc.ClientStream +} + +type firestoreRunAggregationQueryClient struct { + grpc.ClientStream +} + +func (x *firestoreRunAggregationQueryClient) Recv() (*RunAggregationQueryResponse, error) { + m := new(RunAggregationQueryResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *firestoreClient) PartitionQuery(ctx context.Context, in *PartitionQueryRequest, opts ...grpc.CallOption) (*PartitionQueryResponse, error) { + out := new(PartitionQueryResponse) + err := c.cc.Invoke(ctx, Firestore_PartitionQuery_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) Write(ctx context.Context, opts ...grpc.CallOption) (Firestore_WriteClient, error) { + stream, err := c.cc.NewStream(ctx, &Firestore_ServiceDesc.Streams[3], Firestore_Write_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &firestoreWriteClient{stream} + return x, nil +} + +type Firestore_WriteClient interface { + Send(*WriteRequest) error + Recv() (*WriteResponse, error) + grpc.ClientStream +} + +type firestoreWriteClient struct { + grpc.ClientStream +} + +func (x *firestoreWriteClient) Send(m *WriteRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *firestoreWriteClient) Recv() (*WriteResponse, error) { + m := new(WriteResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *firestoreClient) Listen(ctx context.Context, opts ...grpc.CallOption) (Firestore_ListenClient, error) { + stream, err := c.cc.NewStream(ctx, &Firestore_ServiceDesc.Streams[4], Firestore_Listen_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &firestoreListenClient{stream} + return x, nil +} + +type Firestore_ListenClient interface { + Send(*ListenRequest) error + Recv() (*ListenResponse, error) + grpc.ClientStream +} + +type firestoreListenClient struct { + grpc.ClientStream +} + +func (x *firestoreListenClient) Send(m *ListenRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *firestoreListenClient) Recv() (*ListenResponse, error) { + m := new(ListenResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *firestoreClient) ListCollectionIds(ctx context.Context, in *ListCollectionIdsRequest, opts ...grpc.CallOption) (*ListCollectionIdsResponse, error) { + out := new(ListCollectionIdsResponse) + err := c.cc.Invoke(ctx, Firestore_ListCollectionIds_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) BatchWrite(ctx context.Context, in *BatchWriteRequest, opts ...grpc.CallOption) (*BatchWriteResponse, error) { + out := new(BatchWriteResponse) + err := c.cc.Invoke(ctx, Firestore_BatchWrite_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *firestoreClient) CreateDocument(ctx context.Context, in *CreateDocumentRequest, opts ...grpc.CallOption) (*Document, error) { + out := new(Document) + err := c.cc.Invoke(ctx, Firestore_CreateDocument_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// FirestoreServer is the server API for Firestore service. +// All implementations should embed UnimplementedFirestoreServer +// for forward compatibility +type FirestoreServer interface { + // Gets a single document. + GetDocument(context.Context, *GetDocumentRequest) (*Document, error) + // Lists documents. + ListDocuments(context.Context, *ListDocumentsRequest) (*ListDocumentsResponse, error) + // Updates or inserts a document. + UpdateDocument(context.Context, *UpdateDocumentRequest) (*Document, error) + // Deletes a document. + DeleteDocument(context.Context, *DeleteDocumentRequest) (*emptypb.Empty, error) + // Gets multiple documents. + // + // Documents returned by this method are not guaranteed to be returned in the + // same order that they were requested. + BatchGetDocuments(*BatchGetDocumentsRequest, Firestore_BatchGetDocumentsServer) error + // Starts a new transaction. + BeginTransaction(context.Context, *BeginTransactionRequest) (*BeginTransactionResponse, error) + // Commits a transaction, while optionally updating documents. + Commit(context.Context, *CommitRequest) (*CommitResponse, error) + // Rolls back a transaction. + Rollback(context.Context, *RollbackRequest) (*emptypb.Empty, error) + // Runs a query. + RunQuery(*RunQueryRequest, Firestore_RunQueryServer) error + // Runs an aggregation query. + // + // Rather than producing [Document][google.firestore.v1.Document] results like + // [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery], this API + // allows running an aggregation to produce a series of + // [AggregationResult][google.firestore.v1.AggregationResult] server-side. + // + // High-Level Example: + // + // ``` + // -- Return the number of documents in table given a filter. + // SELECT COUNT(*) FROM ( SELECT * FROM k where a = true ); + // ``` + RunAggregationQuery(*RunAggregationQueryRequest, Firestore_RunAggregationQueryServer) error + // Partitions a query by returning partition cursors that can be used to run + // the query in parallel. The returned partition cursors are split points that + // can be used by RunQuery as starting/end points for the query results. + PartitionQuery(context.Context, *PartitionQueryRequest) (*PartitionQueryResponse, error) + // Streams batches of document updates and deletes, in order. This method is + // only available via gRPC or WebChannel (not REST). + Write(Firestore_WriteServer) error + // Listens to changes. This method is only available via gRPC or WebChannel + // (not REST). + Listen(Firestore_ListenServer) error + // Lists all the collection IDs underneath a document. + ListCollectionIds(context.Context, *ListCollectionIdsRequest) (*ListCollectionIdsResponse, error) + // Applies a batch of write operations. + // + // The BatchWrite method does not apply the write operations atomically + // and can apply them out of order. Method does not allow more than one write + // per document. Each write succeeds or fails independently. See the + // [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for the + // success status of each write. + // + // If you require an atomically applied set of writes, use + // [Commit][google.firestore.v1.Firestore.Commit] instead. + BatchWrite(context.Context, *BatchWriteRequest) (*BatchWriteResponse, error) + // Creates a new document. + CreateDocument(context.Context, *CreateDocumentRequest) (*Document, error) +} + +// UnimplementedFirestoreServer should be embedded to have forward compatible implementations. +type UnimplementedFirestoreServer struct { +} + +func (UnimplementedFirestoreServer) GetDocument(context.Context, *GetDocumentRequest) (*Document, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDocument not implemented") +} +func (UnimplementedFirestoreServer) ListDocuments(context.Context, *ListDocumentsRequest) (*ListDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListDocuments not implemented") +} +func (UnimplementedFirestoreServer) UpdateDocument(context.Context, *UpdateDocumentRequest) (*Document, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDocument not implemented") +} +func (UnimplementedFirestoreServer) DeleteDocument(context.Context, *DeleteDocumentRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteDocument not implemented") +} +func (UnimplementedFirestoreServer) BatchGetDocuments(*BatchGetDocumentsRequest, Firestore_BatchGetDocumentsServer) error { + return status.Errorf(codes.Unimplemented, "method BatchGetDocuments not implemented") +} +func (UnimplementedFirestoreServer) BeginTransaction(context.Context, *BeginTransactionRequest) (*BeginTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BeginTransaction not implemented") +} +func (UnimplementedFirestoreServer) Commit(context.Context, *CommitRequest) (*CommitResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Commit not implemented") +} +func (UnimplementedFirestoreServer) Rollback(context.Context, *RollbackRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Rollback not implemented") +} +func (UnimplementedFirestoreServer) RunQuery(*RunQueryRequest, Firestore_RunQueryServer) error { + return status.Errorf(codes.Unimplemented, "method RunQuery not implemented") +} +func (UnimplementedFirestoreServer) RunAggregationQuery(*RunAggregationQueryRequest, Firestore_RunAggregationQueryServer) error { + return status.Errorf(codes.Unimplemented, "method RunAggregationQuery not implemented") +} +func (UnimplementedFirestoreServer) PartitionQuery(context.Context, *PartitionQueryRequest) (*PartitionQueryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PartitionQuery not implemented") +} +func (UnimplementedFirestoreServer) Write(Firestore_WriteServer) error { + return status.Errorf(codes.Unimplemented, "method Write not implemented") +} +func (UnimplementedFirestoreServer) Listen(Firestore_ListenServer) error { + return status.Errorf(codes.Unimplemented, "method Listen not implemented") +} +func (UnimplementedFirestoreServer) ListCollectionIds(context.Context, *ListCollectionIdsRequest) (*ListCollectionIdsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListCollectionIds not implemented") +} +func (UnimplementedFirestoreServer) BatchWrite(context.Context, *BatchWriteRequest) (*BatchWriteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BatchWrite not implemented") +} +func (UnimplementedFirestoreServer) CreateDocument(context.Context, *CreateDocumentRequest) (*Document, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateDocument not implemented") +} + +// UnsafeFirestoreServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to FirestoreServer will +// result in compilation errors. +type UnsafeFirestoreServer interface { + mustEmbedUnimplementedFirestoreServer() +} + +func RegisterFirestoreServer(s grpc.ServiceRegistrar, srv FirestoreServer) { + s.RegisterService(&Firestore_ServiceDesc, srv) +} + +func _Firestore_GetDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetDocumentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).GetDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_GetDocument_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).GetDocument(ctx, req.(*GetDocumentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_ListDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListDocumentsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).ListDocuments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_ListDocuments_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).ListDocuments(ctx, req.(*ListDocumentsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_UpdateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateDocumentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).UpdateDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_UpdateDocument_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).UpdateDocument(ctx, req.(*UpdateDocumentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_DeleteDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteDocumentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).DeleteDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_DeleteDocument_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).DeleteDocument(ctx, req.(*DeleteDocumentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_BatchGetDocuments_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(BatchGetDocumentsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(FirestoreServer).BatchGetDocuments(m, &firestoreBatchGetDocumentsServer{stream}) +} + +type Firestore_BatchGetDocumentsServer interface { + Send(*BatchGetDocumentsResponse) error + grpc.ServerStream +} + +type firestoreBatchGetDocumentsServer struct { + grpc.ServerStream +} + +func (x *firestoreBatchGetDocumentsServer) Send(m *BatchGetDocumentsResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Firestore_BeginTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BeginTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).BeginTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_BeginTransaction_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).BeginTransaction(ctx, req.(*BeginTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CommitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).Commit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_Commit_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).Commit(ctx, req.(*CommitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_Rollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RollbackRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).Rollback(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_Rollback_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).Rollback(ctx, req.(*RollbackRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_RunQuery_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(RunQueryRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(FirestoreServer).RunQuery(m, &firestoreRunQueryServer{stream}) +} + +type Firestore_RunQueryServer interface { + Send(*RunQueryResponse) error + grpc.ServerStream +} + +type firestoreRunQueryServer struct { + grpc.ServerStream +} + +func (x *firestoreRunQueryServer) Send(m *RunQueryResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Firestore_RunAggregationQuery_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(RunAggregationQueryRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(FirestoreServer).RunAggregationQuery(m, &firestoreRunAggregationQueryServer{stream}) +} + +type Firestore_RunAggregationQueryServer interface { + Send(*RunAggregationQueryResponse) error + grpc.ServerStream +} + +type firestoreRunAggregationQueryServer struct { + grpc.ServerStream +} + +func (x *firestoreRunAggregationQueryServer) Send(m *RunAggregationQueryResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Firestore_PartitionQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PartitionQueryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).PartitionQuery(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_PartitionQuery_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).PartitionQuery(ctx, req.(*PartitionQueryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_Write_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(FirestoreServer).Write(&firestoreWriteServer{stream}) +} + +type Firestore_WriteServer interface { + Send(*WriteResponse) error + Recv() (*WriteRequest, error) + grpc.ServerStream +} + +type firestoreWriteServer struct { + grpc.ServerStream +} + +func (x *firestoreWriteServer) Send(m *WriteResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *firestoreWriteServer) Recv() (*WriteRequest, error) { + m := new(WriteRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Firestore_Listen_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(FirestoreServer).Listen(&firestoreListenServer{stream}) +} + +type Firestore_ListenServer interface { + Send(*ListenResponse) error + Recv() (*ListenRequest, error) + grpc.ServerStream +} + +type firestoreListenServer struct { + grpc.ServerStream +} + +func (x *firestoreListenServer) Send(m *ListenResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *firestoreListenServer) Recv() (*ListenRequest, error) { + m := new(ListenRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Firestore_ListCollectionIds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListCollectionIdsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).ListCollectionIds(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_ListCollectionIds_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).ListCollectionIds(ctx, req.(*ListCollectionIdsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_BatchWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchWriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).BatchWrite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_BatchWrite_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).BatchWrite(ctx, req.(*BatchWriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Firestore_CreateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateDocumentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FirestoreServer).CreateDocument(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Firestore_CreateDocument_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FirestoreServer).CreateDocument(ctx, req.(*CreateDocumentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Firestore_ServiceDesc is the grpc.ServiceDesc for Firestore service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Firestore_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.firestore.v1.Firestore", + HandlerType: (*FirestoreServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetDocument", + Handler: _Firestore_GetDocument_Handler, + }, + { + MethodName: "ListDocuments", + Handler: _Firestore_ListDocuments_Handler, + }, + { + MethodName: "UpdateDocument", + Handler: _Firestore_UpdateDocument_Handler, + }, + { + MethodName: "DeleteDocument", + Handler: _Firestore_DeleteDocument_Handler, + }, + { + MethodName: "BeginTransaction", + Handler: _Firestore_BeginTransaction_Handler, + }, + { + MethodName: "Commit", + Handler: _Firestore_Commit_Handler, + }, + { + MethodName: "Rollback", + Handler: _Firestore_Rollback_Handler, + }, + { + MethodName: "PartitionQuery", + Handler: _Firestore_PartitionQuery_Handler, + }, + { + MethodName: "ListCollectionIds", + Handler: _Firestore_ListCollectionIds_Handler, + }, + { + MethodName: "BatchWrite", + Handler: _Firestore_BatchWrite_Handler, + }, + { + MethodName: "CreateDocument", + Handler: _Firestore_CreateDocument_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "BatchGetDocuments", + Handler: _Firestore_BatchGetDocuments_Handler, + ServerStreams: true, + }, + { + StreamName: "RunQuery", + Handler: _Firestore_RunQuery_Handler, + ServerStreams: true, + }, + { + StreamName: "RunAggregationQuery", + Handler: _Firestore_RunAggregationQuery_Handler, + ServerStreams: true, + }, + { + StreamName: "Write", + Handler: _Firestore_Write_Handler, + ServerStreams: true, + ClientStreams: true, + }, + { + StreamName: "Listen", + Handler: _Firestore_Listen_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "google/firestore/v1/firestore.proto", +} diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query.pb.go index 2efba3e1a2..4df4e95536 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,19 +15,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/query.proto package firestorepb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" ) const ( @@ -419,6 +418,7 @@ func (StructuredQuery_FindNearest_DistanceMeasure) EnumDescriptor() ([]byte, []i // 4. order_by + start_at + end_at // 5. offset // 6. limit +// 7. find_nearest type StructuredQuery struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1310,8 +1310,8 @@ type StructuredQuery_FindNearest struct { // Since DOT_PRODUCT distances increase when the vectors are more similar, // the comparison is inverted. // - // For EUCLIDEAN, COSINE: WHERE distance <= distance_threshold - // For DOT_PRODUCT: WHERE distance >= distance_threshold + // * For EUCLIDEAN, COSINE: WHERE distance <= distance_threshold + // * For DOT_PRODUCT: WHERE distance >= distance_threshold DistanceThreshold *wrapperspb.DoubleValue `protobuf:"bytes,6,opt,name=distance_threshold,json=distanceThreshold,proto3" json:"distance_threshold,omitempty"` } diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query_profile.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query_profile.pb.go index 2c62a1b120..760adb3962 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query_profile.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/query_profile.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,20 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/query_profile.proto package firestorepb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/write.pb.go b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/write.pb.go index 20d0fc3578..4fcbff2d81 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/write.pb.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/firestorepb/write.pb.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/firestore/v1/write.proto package firestorepb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/firestore/apiv1/helpers.go b/vendor/cloud.google.com/go/firestore/apiv1/helpers.go index 41291e1880..b7ba4b6d46 100644 --- a/vendor/cloud.google.com/go/firestore/apiv1/helpers.go +++ b/vendor/cloud.google.com/go/firestore/apiv1/helpers.go @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package firestore import ( "context" + "fmt" "io" "log/slog" "net/http" @@ -28,10 +29,13 @@ import ( "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/runtime/protoimpl" ) const serviceName = "firestore.googleapis.com" +var protoVersion = fmt.Sprintf("1.%d", protoimpl.MaxVersion) + // For more information on implementing a client constructor hook, see // https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. type clientHookParams struct{} @@ -66,7 +70,7 @@ func executeHTTPRequestWithResponse(ctx context.Context, client *http.Client, re return nil, nil, err } logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", internallog.HTTPResponse(resp, buf)) - if err = googleapi.CheckResponse(resp); err != nil { + if err = googleapi.CheckResponseWithBody(resp, buf); err != nil { return nil, nil, err } return buf, resp, nil diff --git a/vendor/cloud.google.com/go/firestore/internal/version.go b/vendor/cloud.google.com/go/firestore/internal/version.go index ddddbd21f2..0b0f0e9141 100644 --- a/vendor/cloud.google.com/go/firestore/internal/version.go +++ b/vendor/cloud.google.com/go/firestore/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.18.0" +const Version = "1.20.0" diff --git a/vendor/cloud.google.com/go/iam/CHANGES.md b/vendor/cloud.google.com/go/iam/CHANGES.md index 7839f3b895..a91f9186b7 100644 --- a/vendor/cloud.google.com/go/iam/CHANGES.md +++ b/vendor/cloud.google.com/go/iam/CHANGES.md @@ -1,6 +1,13 @@ # Changes +## [1.5.3](https://github.com/googleapis/google-cloud-go/compare/iam/v1.5.2...iam/v1.5.3) (2025-10-08) + + +### Bug Fixes + +* **iam:** Upgrade gRPC service registration func ([9dd3adf](https://github.com/googleapis/google-cloud-go/commit/9dd3adf2bb0d57dff8d85f89a29e8cea03274c29)) + ## [1.5.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.5.1...iam/v1.5.2) (2025-04-15) diff --git a/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy.pb.go b/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy.pb.go index 2b57ae3b82..51a944cfa4 100644 --- a/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy.pb.go +++ b/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy.pb.go @@ -15,23 +15,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/iam/v1/iam_policy.proto package iampb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + sync "sync" ) const ( @@ -431,183 +426,3 @@ func file_google_iam_v1_iam_policy_proto_init() { file_google_iam_v1_iam_policy_proto_goTypes = nil file_google_iam_v1_iam_policy_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// IAMPolicyClient is the client API for IAMPolicy service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type IAMPolicyClient interface { - // Sets the access control policy on the specified resource. Replaces any - // existing policy. - // - // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors. - SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) - // Gets the access control policy for a resource. - // Returns an empty policy if the resource exists and does not have a policy - // set. - GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) - // Returns permissions that a caller has on the specified resource. - // If the resource does not exist, this will return an empty set of - // permissions, not a `NOT_FOUND` error. - // - // Note: This operation is designed to be used for building permission-aware - // UIs and command-line tools, not for authorization checking. This operation - // may "fail open" without warning. - TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) -} - -type iAMPolicyClient struct { - cc grpc.ClientConnInterface -} - -func NewIAMPolicyClient(cc grpc.ClientConnInterface) IAMPolicyClient { - return &iAMPolicyClient{cc} -} - -func (c *iAMPolicyClient) SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) { - out := new(Policy) - err := c.cc.Invoke(ctx, "/google.iam.v1.IAMPolicy/SetIamPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *iAMPolicyClient) GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) { - out := new(Policy) - err := c.cc.Invoke(ctx, "/google.iam.v1.IAMPolicy/GetIamPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *iAMPolicyClient) TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) { - out := new(TestIamPermissionsResponse) - err := c.cc.Invoke(ctx, "/google.iam.v1.IAMPolicy/TestIamPermissions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// IAMPolicyServer is the server API for IAMPolicy service. -type IAMPolicyServer interface { - // Sets the access control policy on the specified resource. Replaces any - // existing policy. - // - // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors. - SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) - // Gets the access control policy for a resource. - // Returns an empty policy if the resource exists and does not have a policy - // set. - GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) - // Returns permissions that a caller has on the specified resource. - // If the resource does not exist, this will return an empty set of - // permissions, not a `NOT_FOUND` error. - // - // Note: This operation is designed to be used for building permission-aware - // UIs and command-line tools, not for authorization checking. This operation - // may "fail open" without warning. - TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) -} - -// UnimplementedIAMPolicyServer can be embedded to have forward compatible implementations. -type UnimplementedIAMPolicyServer struct { -} - -func (*UnimplementedIAMPolicyServer) SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") -} -func (*UnimplementedIAMPolicyServer) GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") -} -func (*UnimplementedIAMPolicyServer) TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") -} - -func RegisterIAMPolicyServer(s *grpc.Server, srv IAMPolicyServer) { - s.RegisterService(&_IAMPolicy_serviceDesc, srv) -} - -func _IAMPolicy_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetIamPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(IAMPolicyServer).SetIamPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.iam.v1.IAMPolicy/SetIamPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IAMPolicyServer).SetIamPolicy(ctx, req.(*SetIamPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _IAMPolicy_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetIamPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(IAMPolicyServer).GetIamPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.iam.v1.IAMPolicy/GetIamPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IAMPolicyServer).GetIamPolicy(ctx, req.(*GetIamPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _IAMPolicy_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TestIamPermissionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(IAMPolicyServer).TestIamPermissions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.iam.v1.IAMPolicy/TestIamPermissions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IAMPolicyServer).TestIamPermissions(ctx, req.(*TestIamPermissionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _IAMPolicy_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.iam.v1.IAMPolicy", - HandlerType: (*IAMPolicyServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SetIamPolicy", - Handler: _IAMPolicy_SetIamPolicy_Handler, - }, - { - MethodName: "GetIamPolicy", - Handler: _IAMPolicy_GetIamPolicy_Handler, - }, - { - MethodName: "TestIamPermissions", - Handler: _IAMPolicy_TestIamPermissions_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/iam/v1/iam_policy.proto", -} diff --git a/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy_grpc.pb.go b/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy_grpc.pb.go new file mode 100644 index 0000000000..d2d5afeae6 --- /dev/null +++ b/vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy_grpc.pb.go @@ -0,0 +1,223 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/iam/v1/iam_policy.proto + +package iampb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + IAMPolicy_SetIamPolicy_FullMethodName = "/google.iam.v1.IAMPolicy/SetIamPolicy" + IAMPolicy_GetIamPolicy_FullMethodName = "/google.iam.v1.IAMPolicy/GetIamPolicy" + IAMPolicy_TestIamPermissions_FullMethodName = "/google.iam.v1.IAMPolicy/TestIamPermissions" +) + +// IAMPolicyClient is the client API for IAMPolicy service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IAMPolicyClient interface { + // Sets the access control policy on the specified resource. Replaces any + // existing policy. + // + // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors. + SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) + // Gets the access control policy for a resource. + // Returns an empty policy if the resource exists and does not have a policy + // set. + GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) + // Returns permissions that a caller has on the specified resource. + // If the resource does not exist, this will return an empty set of + // permissions, not a `NOT_FOUND` error. + // + // Note: This operation is designed to be used for building permission-aware + // UIs and command-line tools, not for authorization checking. This operation + // may "fail open" without warning. + TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) +} + +type iAMPolicyClient struct { + cc grpc.ClientConnInterface +} + +func NewIAMPolicyClient(cc grpc.ClientConnInterface) IAMPolicyClient { + return &iAMPolicyClient{cc} +} + +func (c *iAMPolicyClient) SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) { + out := new(Policy) + err := c.cc.Invoke(ctx, IAMPolicy_SetIamPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iAMPolicyClient) GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) { + out := new(Policy) + err := c.cc.Invoke(ctx, IAMPolicy_GetIamPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iAMPolicyClient) TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) { + out := new(TestIamPermissionsResponse) + err := c.cc.Invoke(ctx, IAMPolicy_TestIamPermissions_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IAMPolicyServer is the server API for IAMPolicy service. +// All implementations should embed UnimplementedIAMPolicyServer +// for forward compatibility +type IAMPolicyServer interface { + // Sets the access control policy on the specified resource. Replaces any + // existing policy. + // + // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors. + SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) + // Gets the access control policy for a resource. + // Returns an empty policy if the resource exists and does not have a policy + // set. + GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) + // Returns permissions that a caller has on the specified resource. + // If the resource does not exist, this will return an empty set of + // permissions, not a `NOT_FOUND` error. + // + // Note: This operation is designed to be used for building permission-aware + // UIs and command-line tools, not for authorization checking. This operation + // may "fail open" without warning. + TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) +} + +// UnimplementedIAMPolicyServer should be embedded to have forward compatible implementations. +type UnimplementedIAMPolicyServer struct { +} + +func (UnimplementedIAMPolicyServer) SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") +} +func (UnimplementedIAMPolicyServer) GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") +} +func (UnimplementedIAMPolicyServer) TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") +} + +// UnsafeIAMPolicyServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IAMPolicyServer will +// result in compilation errors. +type UnsafeIAMPolicyServer interface { + mustEmbedUnimplementedIAMPolicyServer() +} + +func RegisterIAMPolicyServer(s grpc.ServiceRegistrar, srv IAMPolicyServer) { + s.RegisterService(&IAMPolicy_ServiceDesc, srv) +} + +func _IAMPolicy_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetIamPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMPolicyServer).SetIamPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMPolicy_SetIamPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMPolicyServer).SetIamPolicy(ctx, req.(*SetIamPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IAMPolicy_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetIamPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMPolicyServer).GetIamPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMPolicy_GetIamPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMPolicyServer).GetIamPolicy(ctx, req.(*GetIamPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IAMPolicy_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TestIamPermissionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IAMPolicyServer).TestIamPermissions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IAMPolicy_TestIamPermissions_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IAMPolicyServer).TestIamPermissions(ctx, req.(*TestIamPermissionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IAMPolicy_ServiceDesc is the grpc.ServiceDesc for IAMPolicy service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IAMPolicy_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.iam.v1.IAMPolicy", + HandlerType: (*IAMPolicyServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SetIamPolicy", + Handler: _IAMPolicy_SetIamPolicy_Handler, + }, + { + MethodName: "GetIamPolicy", + Handler: _IAMPolicy_GetIamPolicy_Handler, + }, + { + MethodName: "TestIamPermissions", + Handler: _IAMPolicy_TestIamPermissions_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/iam/v1/iam_policy.proto", +} diff --git a/vendor/cloud.google.com/go/iam/apiv1/iampb/options.pb.go b/vendor/cloud.google.com/go/iam/apiv1/iampb/options.pb.go index 745de05ba2..9c7e7b831a 100644 --- a/vendor/cloud.google.com/go/iam/apiv1/iampb/options.pb.go +++ b/vendor/cloud.google.com/go/iam/apiv1/iampb/options.pb.go @@ -15,17 +15,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/iam/v1/options.proto package iampb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/iam/apiv1/iampb/policy.pb.go b/vendor/cloud.google.com/go/iam/apiv1/iampb/policy.pb.go index 0eba150896..2efacbb063 100644 --- a/vendor/cloud.google.com/go/iam/apiv1/iampb/policy.pb.go +++ b/vendor/cloud.google.com/go/iam/apiv1/iampb/policy.pb.go @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/iam/v1/policy.proto package iampb import ( - reflect "reflect" - sync "sync" - expr "google.golang.org/genproto/googleapis/type/expr" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/iam/apiv1/iampb/resource_policy_member.pb.go b/vendor/cloud.google.com/go/iam/apiv1/iampb/resource_policy_member.pb.go index c3339e26c4..c2b0f7a5bb 100644 --- a/vendor/cloud.google.com/go/iam/apiv1/iampb/resource_policy_member.pb.go +++ b/vendor/cloud.google.com/go/iam/apiv1/iampb/resource_policy_member.pb.go @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/iam/v1/resource_policy_member.proto package iampb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/internal/fields/fields.go b/vendor/cloud.google.com/go/internal/fields/fields.go deleted file mode 100644 index 1253904381..0000000000 --- a/vendor/cloud.google.com/go/internal/fields/fields.go +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package fields provides a view of the fields of a struct that follows the Go -// rules, amended to consider tags and case insensitivity. -// -// # Usage -// -// First define a function that interprets tags: -// -// func parseTag(st reflect.StructTag) (name string, keep bool, other interface{}, err error) { ... } -// -// The function's return values describe whether to ignore the field -// completely or provide an alternate name, as well as other data from the -// parse that is stored to avoid re-parsing. -// -// Then define a function to validate the type: -// -// func validate(t reflect.Type) error { ... } -// -// Then, if necessary, define a function to specify leaf types - types -// which should be considered one field and not be recursed into: -// -// func isLeafType(t reflect.Type) bool { ... } -// -// eg: -// -// func isLeafType(t reflect.Type) bool { -// return t == reflect.TypeOf(time.Time{}) -// } -// -// Next, construct a Cache, passing your functions. As its name suggests, a -// Cache remembers validation and field information for a type, so subsequent -// calls with the same type are very fast. -// -// cache := fields.NewCache(parseTag, validate, isLeafType) -// -// To get the fields of a struct type as determined by the above rules, call -// the Fields method: -// -// fields, err := cache.Fields(reflect.TypeOf(MyStruct{})) -// -// The return value can be treated as a slice of Fields. -// -// Given a string, such as a key or column name obtained during unmarshalling, -// call Match on the list of fields to find a field whose name is the best -// match: -// -// field := fields.Match(name) -// -// Match looks for an exact match first, then falls back to a case-insensitive -// comparison. -package fields - -import ( - "bytes" - "errors" - "reflect" - "sort" - "strings" - "sync" -) - -// A Field records information about a struct field. -type Field struct { - Name string // effective field name - NameFromTag bool // did Name come from a tag? - Type reflect.Type // field type - Index []int // index sequence, for reflect.Value.FieldByIndex - ParsedTag interface{} // third return value of the parseTag function - - nameBytes []byte - equalFold func(s, t []byte) bool -} - -// ParseTagFunc is a function that accepts a struct tag and returns four values: an alternative name for the field -// extracted from the tag, a boolean saying whether to keep the field or ignore it, additional data that is stored -// with the field information to avoid having to parse the tag again, and an error. -type ParseTagFunc func(reflect.StructTag) (name string, keep bool, other interface{}, err error) - -// ValidateFunc is a function that accepts a reflect.Type and returns an error if the struct type is invalid in any -// way. -type ValidateFunc func(reflect.Type) error - -// LeafTypesFunc is a function that accepts a reflect.Type and returns true if the struct type a leaf, or false if not. -// TODO(deklerk): is this description accurate? -type LeafTypesFunc func(reflect.Type) bool - -// A Cache records information about the fields of struct types. -// -// A Cache is safe for use by multiple goroutines. -type Cache struct { - parseTag ParseTagFunc - validate ValidateFunc - leafTypes LeafTypesFunc - cache sync.Map // from reflect.Type to cacheValue -} - -// NewCache constructs a Cache. -// -// Its first argument should be a function that accepts -// a struct tag and returns four values: an alternative name for the field -// extracted from the tag, a boolean saying whether to keep the field or ignore -// it, additional data that is stored with the field information to avoid -// having to parse the tag again, and an error. -// -// Its second argument should be a function that accepts a reflect.Type and -// returns an error if the struct type is invalid in any way. For example, it -// may check that all of the struct field tags are valid, or that all fields -// are of an appropriate type. -func NewCache(parseTag ParseTagFunc, validate ValidateFunc, leafTypes LeafTypesFunc) *Cache { - if parseTag == nil { - parseTag = func(reflect.StructTag) (string, bool, interface{}, error) { - return "", true, nil, nil - } - } - if validate == nil { - validate = func(reflect.Type) error { - return nil - } - } - if leafTypes == nil { - leafTypes = func(reflect.Type) bool { - return false - } - } - - return &Cache{ - parseTag: parseTag, - validate: validate, - leafTypes: leafTypes, - } -} - -// A fieldScan represents an item on the fieldByNameFunc scan work list. -type fieldScan struct { - typ reflect.Type - index []int -} - -// Fields returns all the exported fields of t, which must be a struct type. It -// follows the standard Go rules for embedded fields, modified by the presence -// of tags. The result is sorted lexicographically by index. -// -// These rules apply in the absence of tags: -// Anonymous struct fields are treated as if their inner exported fields were -// fields in the outer struct (embedding). The result includes all fields that -// aren't shadowed by fields at higher level of embedding. If more than one -// field with the same name exists at the same level of embedding, it is -// excluded. An anonymous field that is not of struct type is treated as having -// its type as its name. -// -// Tags modify these rules as follows: -// A field's tag is used as its name. -// An anonymous struct field with a name given in its tag is treated as -// a field having that name, rather than an embedded struct (the struct's -// fields will not be returned). -// If more than one field with the same name exists at the same level of embedding, -// but exactly one of them is tagged, then the tagged field is reported and the others -// are ignored. -func (c *Cache) Fields(t reflect.Type) (List, error) { - if t.Kind() != reflect.Struct { - panic("fields: Fields of non-struct type") - } - return c.cachedTypeFields(t) -} - -// A List is a list of Fields. -type List []Field - -// Match returns the field in the list whose name best matches the supplied -// name, nor nil if no field does. If there is a field with the exact name, it -// is returned. Otherwise the first field (sorted by index) whose name matches -// case-insensitively is returned. -func (l List) Match(name string) *Field { - return l.MatchBytes([]byte(name)) -} - -// MatchBytes is identical to Match, except that the argument is a byte slice. -func (l List) MatchBytes(name []byte) *Field { - var f *Field - for i := range l { - ff := &l[i] - if bytes.Equal(ff.nameBytes, name) { - return ff - } - if f == nil && ff.equalFold(ff.nameBytes, name) { - f = ff - } - } - return f -} - -type cacheValue struct { - fields List - err error -} - -// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. -// This code has been copied and modified from -// https://go.googlesource.com/go/+/go1.7.3/src/encoding/json/encode.go. -func (c *Cache) cachedTypeFields(t reflect.Type) (List, error) { - var cv cacheValue - x, ok := c.cache.Load(t) - if ok { - cv = x.(cacheValue) - } else { - if err := c.validate(t); err != nil { - cv = cacheValue{nil, err} - } else { - f, err := c.typeFields(t) - cv = cacheValue{List(f), err} - } - c.cache.Store(t, cv) - } - return cv.fields, cv.err -} - -func (c *Cache) typeFields(t reflect.Type) ([]Field, error) { - fields, err := c.listFields(t) - if err != nil { - return nil, err - } - sort.Sort(byName(fields)) - // Delete all fields that are hidden by the Go rules for embedded fields. - - // The fields are sorted in primary order of name, secondary order of field - // index length. So the first field with a given name is the dominant one. - var out []Field - for advance, i := 0, 0; i < len(fields); i += advance { - // One iteration per name. - // Find the sequence of fields with the name of this first field. - fi := fields[i] - name := fi.Name - for advance = 1; i+advance < len(fields); advance++ { - fj := fields[i+advance] - if fj.Name != name { - break - } - } - // Find the dominant field, if any, out of all fields that have the same name. - dominant, ok := dominantField(fields[i : i+advance]) - if ok { - out = append(out, dominant) - } - } - sort.Sort(byIndex(out)) - return out, nil -} - -func (c *Cache) listFields(t reflect.Type) ([]Field, error) { - // This uses the same condition that the Go language does: there must be a unique instance - // of the match at a given depth level. If there are multiple instances of a match at the - // same depth, they annihilate each other and inhibit any possible match at a lower level. - // The algorithm is breadth first search, one depth level at a time. - - // The current and next slices are work queues: - // current lists the fields to visit on this depth level, - // and next lists the fields on the next lower level. - current := []fieldScan{} - next := []fieldScan{{typ: t}} - - // nextCount records the number of times an embedded type has been - // encountered and considered for queueing in the 'next' slice. - // We only queue the first one, but we increment the count on each. - // If a struct type T can be reached more than once at a given depth level, - // then it annihilates itself and need not be considered at all when we - // process that next depth level. - var nextCount map[reflect.Type]int - - // visited records the structs that have been considered already. - // Embedded pointer fields can create cycles in the graph of - // reachable embedded types; visited avoids following those cycles. - // It also avoids duplicated effort: if we didn't find the field in an - // embedded type T at level 2, we won't find it in one at level 4 either. - visited := map[reflect.Type]bool{} - - var fields []Field // Fields found. - - for len(next) > 0 { - current, next = next, current[:0] - count := nextCount - nextCount = nil - - // Process all the fields at this depth, now listed in 'current'. - // The loop queues embedded fields found in 'next', for processing during the next - // iteration. The multiplicity of the 'current' field counts is recorded - // in 'count'; the multiplicity of the 'next' field counts is recorded in 'nextCount'. - for _, scan := range current { - t := scan.typ - if visited[t] { - // We've looked through this type before, at a higher level. - // That higher level would shadow the lower level we're now at, - // so this one can't be useful to us. Ignore it. - continue - } - visited[t] = true - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - - exported := (f.PkgPath == "") - - // If a named field is unexported, ignore it. An anonymous - // unexported field is processed, because it may contain - // exported fields, which are visible. - if !exported && !f.Anonymous { - continue - } - - // Examine the tag. - tagName, keep, other, err := c.parseTag(f.Tag) - if err != nil { - return nil, err - } - if !keep { - continue - } - if c.leafTypes(f.Type) { - fields = append(fields, newField(f, tagName, other, scan.index, i)) - continue - } - - var ntyp reflect.Type - if f.Anonymous { - // Anonymous field of type T or *T. - ntyp = f.Type - if ntyp.Kind() == reflect.Ptr { - ntyp = ntyp.Elem() - } - } - - // Record fields with a tag name, non-anonymous fields, or - // anonymous non-struct fields. - if tagName != "" || ntyp == nil || ntyp.Kind() != reflect.Struct { - if !exported { - continue - } - fields = append(fields, newField(f, tagName, other, scan.index, i)) - if count[t] > 1 { - // If there were multiple instances, add a second, - // so that the annihilation code will see a duplicate. - fields = append(fields, fields[len(fields)-1]) - } - continue - } - - // Queue embedded struct fields for processing with next level, - // but only if the embedded types haven't already been queued. - if nextCount[ntyp] > 0 { - nextCount[ntyp] = 2 // exact multiple doesn't matter - continue - } - if nextCount == nil { - nextCount = map[reflect.Type]int{} - } - nextCount[ntyp] = 1 - if count[t] > 1 { - nextCount[ntyp] = 2 // exact multiple doesn't matter - } - var index []int - index = append(index, scan.index...) - index = append(index, i) - next = append(next, fieldScan{ntyp, index}) - } - } - } - return fields, nil -} - -func newField(f reflect.StructField, tagName string, other interface{}, index []int, i int) Field { - name := tagName - if name == "" { - name = f.Name - } - sf := Field{ - Name: name, - NameFromTag: tagName != "", - Type: f.Type, - ParsedTag: other, - nameBytes: []byte(name), - } - sf.equalFold = foldFunc(sf.nameBytes) - sf.Index = append(sf.Index, index...) - sf.Index = append(sf.Index, i) - return sf -} - -// byName sorts fields using the following criteria, in order: -// 1. name -// 2. embedding depth -// 3. tag presence (preferring a tagged field) -// 4. index sequence. -type byName []Field - -func (x byName) Len() int { return len(x) } - -func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byName) Less(i, j int) bool { - if x[i].Name != x[j].Name { - return x[i].Name < x[j].Name - } - if len(x[i].Index) != len(x[j].Index) { - return len(x[i].Index) < len(x[j].Index) - } - if x[i].NameFromTag != x[j].NameFromTag { - return x[i].NameFromTag - } - return byIndex(x).Less(i, j) -} - -// byIndex sorts field by index sequence. -type byIndex []Field - -func (x byIndex) Len() int { return len(x) } - -func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byIndex) Less(i, j int) bool { - xi := x[i].Index - xj := x[j].Index - ln := len(xi) - if l := len(xj); l < ln { - ln = l - } - for k := 0; k < ln; k++ { - if xi[k] != xj[k] { - return xi[k] < xj[k] - } - } - return len(xi) < len(xj) -} - -// dominantField looks through the fields, all of which are known to have the -// same name, to find the single field that dominates the others using Go's -// embedding rules, modified by the presence of tags. If there are multiple -// top-level fields, the boolean will be false: This condition is an error in -// Go and we skip all the fields. -func dominantField(fs []Field) (Field, bool) { - // The fields are sorted in increasing index-length order, then by presence of tag. - // That means that the first field is the dominant one. We need only check - // for error cases: two fields at top level, either both tagged or neither tagged. - if len(fs) > 1 && len(fs[0].Index) == len(fs[1].Index) && fs[0].NameFromTag == fs[1].NameFromTag { - return Field{}, false - } - return fs[0], true -} - -// ParseStandardTag extracts the sub-tag named by key, then parses it using the -// de facto standard format introduced in encoding/json: -// -// "-" means "ignore this tag". It must occur by itself. (parseStandardTag returns an error -// in this case, whereas encoding/json accepts the "-" even if it is not alone.) -// "" provides an alternative name for the field -// ",opt1,opt2,..." specifies options after the name. -// -// The options are returned as a []string. -func ParseStandardTag(key string, t reflect.StructTag) (name string, keep bool, options []string, err error) { - s := t.Get(key) - parts := strings.Split(s, ",") - if parts[0] == "-" { - if len(parts) > 1 { - return "", false, nil, errors.New(`"-" field tag with options`) - } - return "", false, nil, nil - } - if len(parts) > 1 { - options = parts[1:] - } - return parts[0], true, options, nil -} diff --git a/vendor/cloud.google.com/go/internal/fields/fold.go b/vendor/cloud.google.com/go/internal/fields/fold.go deleted file mode 100644 index dff59f22bb..0000000000 --- a/vendor/cloud.google.com/go/internal/fields/fold.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package fields - -// This file was copied from https://go.googlesource.com/go/+/go1.7.3/src/encoding/json/fold.go. -// Only the license and package were changed. - -import ( - "bytes" - "unicode/utf8" -) - -const ( - caseMask = ^byte(0x20) // Mask to ignore case in ASCII. - kelvin = '\u212a' - smallLongEss = '\u017f' -) - -// foldFunc returns one of four different case folding equivalence -// functions, from most general (and slow) to fastest: -// -// 1) bytes.EqualFold, if the key s contains any non-ASCII UTF-8 -// 2) equalFoldRight, if s contains special folding ASCII ('k', 'K', 's', 'S') -// 3) asciiEqualFold, no special, but includes non-letters (including _) -// 4) simpleLetterEqualFold, no specials, no non-letters. -// -// The letters S and K are special because they map to 3 runes, not just 2: -// - S maps to s and to U+017F 'ſ' Latin small letter long s -// - k maps to K and to U+212A 'K' Kelvin sign -// -// See https://play.golang.org/p/tTxjOc0OGo -// -// The returned function is specialized for matching against s and -// should only be given s. It's not curried for performance reasons. -func foldFunc(s []byte) func(s, t []byte) bool { - nonLetter := false - special := false // special letter - for _, b := range s { - if b >= utf8.RuneSelf { - return bytes.EqualFold - } - upper := b & caseMask - if upper < 'A' || upper > 'Z' { - nonLetter = true - } else if upper == 'K' || upper == 'S' { - // See above for why these letters are special. - special = true - } - } - if special { - return equalFoldRight - } - if nonLetter { - return asciiEqualFold - } - return simpleLetterEqualFold -} - -// equalFoldRight is a specialization of bytes.EqualFold when s is -// known to be all ASCII (including punctuation), but contains an 's', -// 'S', 'k', or 'K', requiring a Unicode fold on the bytes in t. -// See comments on foldFunc. -func equalFoldRight(s, t []byte) bool { - for _, sb := range s { - if len(t) == 0 { - return false - } - tb := t[0] - if tb < utf8.RuneSelf { - if sb != tb { - sbUpper := sb & caseMask - if 'A' <= sbUpper && sbUpper <= 'Z' { - if sbUpper != tb&caseMask { - return false - } - } else { - return false - } - } - t = t[1:] - continue - } - // sb is ASCII and t is not. t must be either kelvin - // sign or long s; sb must be s, S, k, or K. - tr, size := utf8.DecodeRune(t) - switch sb { - case 's', 'S': - if tr != smallLongEss { - return false - } - case 'k', 'K': - if tr != kelvin { - return false - } - default: - return false - } - t = t[size:] - - } - return len(t) <= 0 -} - -// asciiEqualFold is a specialization of bytes.EqualFold for use when -// s is all ASCII (but may contain non-letters) and contains no -// special-folding letters. -// See comments on foldFunc. -func asciiEqualFold(s, t []byte) bool { - if len(s) != len(t) { - return false - } - for i, sb := range s { - tb := t[i] - if sb == tb { - continue - } - if ('a' <= sb && sb <= 'z') || ('A' <= sb && sb <= 'Z') { - if sb&caseMask != tb&caseMask { - return false - } - } else { - return false - } - } - return true -} - -// simpleLetterEqualFold is a specialization of bytes.EqualFold for -// use when s is all ASCII letters (no underscores, etc) and also -// doesn't contain 'k', 'K', 's', or 'S'. -// See comments on foldFunc. -func simpleLetterEqualFold(s, t []byte) bool { - if len(s) != len(t) { - return false - } - for i, b := range s { - if b&caseMask != t[i]&caseMask { - return false - } - } - return true -} diff --git a/vendor/cloud.google.com/go/internal/protostruct/protostruct.go b/vendor/cloud.google.com/go/internal/protostruct/protostruct.go deleted file mode 100644 index 0bbae0f35e..0000000000 --- a/vendor/cloud.google.com/go/internal/protostruct/protostruct.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package protostruct supports operations on the protocol buffer Struct message. -package protostruct - -import ( - pb "google.golang.org/protobuf/types/known/structpb" -) - -// DecodeToMap converts a pb.Struct to a map from strings to Go types. -// DecodeToMap panics if s is invalid. -func DecodeToMap(s *pb.Struct) map[string]interface{} { - if s == nil { - return nil - } - m := map[string]interface{}{} - for k, v := range s.Fields { - m[k] = decodeValue(v) - } - return m -} - -func decodeValue(v *pb.Value) interface{} { - switch k := v.Kind.(type) { - case *pb.Value_NullValue: - return nil - case *pb.Value_NumberValue: - return k.NumberValue - case *pb.Value_StringValue: - return k.StringValue - case *pb.Value_BoolValue: - return k.BoolValue - case *pb.Value_StructValue: - return DecodeToMap(k.StructValue) - case *pb.Value_ListValue: - s := make([]interface{}, len(k.ListValue.Values)) - for i, e := range k.ListValue.Values { - s[i] = decodeValue(e) - } - return s - default: - panic("protostruct: unknown kind") - } -} diff --git a/vendor/cloud.google.com/go/longrunning/CHANGES.md b/vendor/cloud.google.com/go/longrunning/CHANGES.md index ca0d28f167..06de6fd802 100644 --- a/vendor/cloud.google.com/go/longrunning/CHANGES.md +++ b/vendor/cloud.google.com/go/longrunning/CHANGES.md @@ -1,5 +1,12 @@ # Changes +## [0.7.0](https://github.com/googleapis/google-cloud-go/releases/tag/longrunning%2Fv0.7.0) (2025-10-14) + +### Features + +* add ListOperations partial success flag +* add ListOperations unreachable resources + ## [0.6.7](https://github.com/googleapis/google-cloud-go/compare/longrunning/v0.6.6...longrunning/v0.6.7) (2025-04-15) @@ -180,3 +187,4 @@ ## v0.1.0 Initial release. + diff --git a/vendor/cloud.google.com/go/longrunning/autogen/helpers.go b/vendor/cloud.google.com/go/longrunning/autogen/helpers.go index 4ff8ce8b5e..e81363c9da 100644 --- a/vendor/cloud.google.com/go/longrunning/autogen/helpers.go +++ b/vendor/cloud.google.com/go/longrunning/autogen/helpers.go @@ -18,6 +18,7 @@ package longrunning import ( "context" + "fmt" "io" "log/slog" "net/http" @@ -28,10 +29,13 @@ import ( "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/runtime/protoimpl" ) const serviceName = "longrunning.googleapis.com" +var protoVersion = fmt.Sprintf("1.%d", protoimpl.MaxVersion) + // For more information on implementing a client constructor hook, see // https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. type clientHookParams struct{} diff --git a/vendor/cloud.google.com/go/longrunning/autogen/longrunningpb/operations.pb.go b/vendor/cloud.google.com/go/longrunning/autogen/longrunningpb/operations.pb.go index d1a53c6792..036d8e350b 100644 --- a/vendor/cloud.google.com/go/longrunning/autogen/longrunningpb/operations.pb.go +++ b/vendor/cloud.google.com/go/longrunning/autogen/longrunningpb/operations.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/longrunning/operations.proto package longrunningpb @@ -237,6 +237,17 @@ type ListOperationsRequest struct { PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // The standard list page token. PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // When set to `true`, operations that are reachable are returned as normal, + // and those that are unreachable are returned in the + // [ListOperationsResponse.unreachable] field. + // + // This can only be `true` when reading across collections e.g. when `parent` + // is set to `"projects/example/locations/-"`. + // + // This field is not by default supported and will result in an + // `UNIMPLEMENTED` error if set unless explicitly documented otherwise in + // service or product specific documentation. + ReturnPartialSuccess bool `protobuf:"varint,5,opt,name=return_partial_success,json=returnPartialSuccess,proto3" json:"return_partial_success,omitempty"` } func (x *ListOperationsRequest) Reset() { @@ -297,6 +308,13 @@ func (x *ListOperationsRequest) GetPageToken() string { return "" } +func (x *ListOperationsRequest) GetReturnPartialSuccess() bool { + if x != nil { + return x.ReturnPartialSuccess + } + return false +} + // The response message for // [Operations.ListOperations][google.longrunning.Operations.ListOperations]. type ListOperationsResponse struct { @@ -308,6 +326,11 @@ type ListOperationsResponse struct { Operations []*Operation `protobuf:"bytes,1,rep,name=operations,proto3" json:"operations,omitempty"` // The standard List next-page token. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // Unordered list. Unreachable resources. Populated when the request sets + // `ListOperationsRequest.return_partial_success` and reads across + // collections e.g. when attempting to list all resources across all supported + // locations. + Unreachable []string `protobuf:"bytes,3,rep,name=unreachable,proto3" json:"unreachable,omitempty"` } func (x *ListOperationsResponse) Reset() { @@ -354,6 +377,13 @@ func (x *ListOperationsResponse) GetNextPageToken() string { return "" } +func (x *ListOperationsResponse) GetUnreachable() []string { + if x != nil { + return x.Unreachable + } + return nil +} + // The request message for // [Operations.CancelOperation][google.longrunning.Operations.CancelOperation]. type CancelOperationRequest struct { @@ -621,48 +651,56 @@ var file_google_longrunning_operations_proto_rawDesc = []byte{ 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x01, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, - 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x29, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x7f, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x7f, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x01, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, + 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x08, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x29, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x25, 0x0a, 0x0b, 0x75, + 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x06, 0x52, 0x0b, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, @@ -729,18 +767,17 @@ var file_google_longrunning_operations_proto_rawDesc = []byte{ 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x42, 0xa5, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x66, 0x6f, 0x42, 0xa2, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x0f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x43, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x05, 0x47, 0x4c, 0x52, 0x55, 0x4e, - 0xaa, 0x02, 0x12, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x6e, 0x67, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0xca, 0x02, 0x12, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x4c, - 0x6f, 0x6e, 0x67, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x69, 0x6e, 0x67, 0x70, 0x62, 0xa2, 0x02, 0x05, 0x47, 0x4c, 0x52, 0x55, 0x4e, 0xaa, 0x02, 0x12, + 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x6e, 0x67, 0x52, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0xca, 0x02, 0x12, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x4c, 0x6f, 0x6e, 0x67, + 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/cloud.google.com/go/longrunning/autogen/operations_client.go b/vendor/cloud.google.com/go/longrunning/autogen/operations_client.go index 57c8173e92..13ea291caa 100644 --- a/vendor/cloud.google.com/go/longrunning/autogen/operations_client.go +++ b/vendor/cloud.google.com/go/longrunning/autogen/operations_client.go @@ -346,7 +346,7 @@ func (c *operationsGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *operationsGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } @@ -422,7 +422,7 @@ func defaultOperationsRESTClientOptions() []option.ClientOption { // use by Google-written clients. func (c *operationsRESTClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN") + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN", "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/alert_policy_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/alert_policy_client.go index 9a9408f19b..cc8c69c240 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/alert_policy_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/alert_policy_client.go @@ -276,7 +276,7 @@ func (c *alertPolicyGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *alertPolicyGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/group_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/group_client.go index a45e1aec27..7a9e076093 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/group_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/group_client.go @@ -297,7 +297,7 @@ func (c *groupGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *groupGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/helpers.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/helpers.go index 6719cac863..b97da685e9 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/helpers.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/helpers.go @@ -18,16 +18,20 @@ package monitoring import ( "context" + "fmt" "log/slog" "github.com/googleapis/gax-go/v2/internallog/grpclog" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/runtime/protoimpl" ) const serviceName = "monitoring.googleapis.com" +var protoVersion = fmt.Sprintf("1.%d", protoimpl.MaxVersion) + // For more information on implementing a client constructor hook, see // https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. type clientHookParams struct{} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/metric_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/metric_client.go index 29eb4849d2..2ed8ccc133 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/metric_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/metric_client.go @@ -335,7 +335,7 @@ func (c *metricGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *metricGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert.pb.go index 24ca1414bb..f735f03253 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert.pb.go @@ -15,15 +15,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/alert.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" status "google.golang.org/genproto/googleapis/rpc/status" timeofday "google.golang.org/genproto/googleapis/type/timeofday" @@ -31,6 +28,8 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service.pb.go index ba0c4f65f2..5edc4a06df 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service.pb.go @@ -15,24 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/alert_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + sync "sync" ) const ( @@ -695,267 +690,3 @@ func file_google_monitoring_v3_alert_service_proto_init() { file_google_monitoring_v3_alert_service_proto_goTypes = nil file_google_monitoring_v3_alert_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// AlertPolicyServiceClient is the client API for AlertPolicyService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type AlertPolicyServiceClient interface { - // Lists the existing alerting policies for the workspace. - ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) - // Gets a single alerting policy. - GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) - // Creates a new alerting policy. - // - // Design your application to single-thread API calls that modify the state of - // alerting policies in a single project. This includes calls to - // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. - CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) - // Deletes an alerting policy. - // - // Design your application to single-thread API calls that modify the state of - // alerting policies in a single project. This includes calls to - // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. - DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Updates an alerting policy. You can either replace the entire policy with - // a new one or replace only certain fields in the current alerting policy by - // specifying the fields to be updated via `updateMask`. Returns the - // updated alerting policy. - // - // Design your application to single-thread API calls that modify the state of - // alerting policies in a single project. This includes calls to - // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. - UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) -} - -type alertPolicyServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewAlertPolicyServiceClient(cc grpc.ClientConnInterface) AlertPolicyServiceClient { - return &alertPolicyServiceClient{cc} -} - -func (c *alertPolicyServiceClient) ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) { - out := new(ListAlertPoliciesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { - out := new(AlertPolicy) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { - out := new(AlertPolicy) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { - out := new(AlertPolicy) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// AlertPolicyServiceServer is the server API for AlertPolicyService service. -type AlertPolicyServiceServer interface { - // Lists the existing alerting policies for the workspace. - ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) - // Gets a single alerting policy. - GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) - // Creates a new alerting policy. - // - // Design your application to single-thread API calls that modify the state of - // alerting policies in a single project. This includes calls to - // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. - CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) - // Deletes an alerting policy. - // - // Design your application to single-thread API calls that modify the state of - // alerting policies in a single project. This includes calls to - // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. - DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) - // Updates an alerting policy. You can either replace the entire policy with - // a new one or replace only certain fields in the current alerting policy by - // specifying the fields to be updated via `updateMask`. Returns the - // updated alerting policy. - // - // Design your application to single-thread API calls that modify the state of - // alerting policies in a single project. This includes calls to - // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. - UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) -} - -// UnimplementedAlertPolicyServiceServer can be embedded to have forward compatible implementations. -type UnimplementedAlertPolicyServiceServer struct { -} - -func (*UnimplementedAlertPolicyServiceServer) ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListAlertPolicies not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAlertPolicy not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateAlertPolicy not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteAlertPolicy not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateAlertPolicy not implemented") -} - -func RegisterAlertPolicyServiceServer(s *grpc.Server, srv AlertPolicyServiceServer) { - s.RegisterService(&_AlertPolicyService_serviceDesc, srv) -} - -func _AlertPolicyService_ListAlertPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListAlertPoliciesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, req.(*ListAlertPoliciesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_GetAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, req.(*GetAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_CreateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, req.(*CreateAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_DeleteAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, req.(*DeleteAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_UpdateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, req.(*UpdateAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _AlertPolicyService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.AlertPolicyService", - HandlerType: (*AlertPolicyServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListAlertPolicies", - Handler: _AlertPolicyService_ListAlertPolicies_Handler, - }, - { - MethodName: "GetAlertPolicy", - Handler: _AlertPolicyService_GetAlertPolicy_Handler, - }, - { - MethodName: "CreateAlertPolicy", - Handler: _AlertPolicyService_CreateAlertPolicy_Handler, - }, - { - MethodName: "DeleteAlertPolicy", - Handler: _AlertPolicyService_DeleteAlertPolicy_Handler, - }, - { - MethodName: "UpdateAlertPolicy", - Handler: _AlertPolicyService_UpdateAlertPolicy_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/alert_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service_grpc.pb.go new file mode 100644 index 0000000000..ff3412fb4c --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service_grpc.pb.go @@ -0,0 +1,310 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/alert_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + AlertPolicyService_ListAlertPolicies_FullMethodName = "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies" + AlertPolicyService_GetAlertPolicy_FullMethodName = "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy" + AlertPolicyService_CreateAlertPolicy_FullMethodName = "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy" + AlertPolicyService_DeleteAlertPolicy_FullMethodName = "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy" + AlertPolicyService_UpdateAlertPolicy_FullMethodName = "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy" +) + +// AlertPolicyServiceClient is the client API for AlertPolicyService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AlertPolicyServiceClient interface { + // Lists the existing alerting policies for the workspace. + ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) + // Gets a single alerting policy. + GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) + // Creates a new alerting policy. + // + // Design your application to single-thread API calls that modify the state of + // alerting policies in a single project. This includes calls to + // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. + CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) + // Deletes an alerting policy. + // + // Design your application to single-thread API calls that modify the state of + // alerting policies in a single project. This includes calls to + // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. + DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Updates an alerting policy. You can either replace the entire policy with + // a new one or replace only certain fields in the current alerting policy by + // specifying the fields to be updated via `updateMask`. Returns the + // updated alerting policy. + // + // Design your application to single-thread API calls that modify the state of + // alerting policies in a single project. This includes calls to + // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. + UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) +} + +type alertPolicyServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAlertPolicyServiceClient(cc grpc.ClientConnInterface) AlertPolicyServiceClient { + return &alertPolicyServiceClient{cc} +} + +func (c *alertPolicyServiceClient) ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) { + out := new(ListAlertPoliciesResponse) + err := c.cc.Invoke(ctx, AlertPolicyService_ListAlertPolicies_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *alertPolicyServiceClient) GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { + out := new(AlertPolicy) + err := c.cc.Invoke(ctx, AlertPolicyService_GetAlertPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *alertPolicyServiceClient) CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { + out := new(AlertPolicy) + err := c.cc.Invoke(ctx, AlertPolicyService_CreateAlertPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *alertPolicyServiceClient) DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, AlertPolicyService_DeleteAlertPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *alertPolicyServiceClient) UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { + out := new(AlertPolicy) + err := c.cc.Invoke(ctx, AlertPolicyService_UpdateAlertPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AlertPolicyServiceServer is the server API for AlertPolicyService service. +// All implementations should embed UnimplementedAlertPolicyServiceServer +// for forward compatibility +type AlertPolicyServiceServer interface { + // Lists the existing alerting policies for the workspace. + ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) + // Gets a single alerting policy. + GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) + // Creates a new alerting policy. + // + // Design your application to single-thread API calls that modify the state of + // alerting policies in a single project. This includes calls to + // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. + CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) + // Deletes an alerting policy. + // + // Design your application to single-thread API calls that modify the state of + // alerting policies in a single project. This includes calls to + // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. + DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) + // Updates an alerting policy. You can either replace the entire policy with + // a new one or replace only certain fields in the current alerting policy by + // specifying the fields to be updated via `updateMask`. Returns the + // updated alerting policy. + // + // Design your application to single-thread API calls that modify the state of + // alerting policies in a single project. This includes calls to + // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. + UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) +} + +// UnimplementedAlertPolicyServiceServer should be embedded to have forward compatible implementations. +type UnimplementedAlertPolicyServiceServer struct { +} + +func (UnimplementedAlertPolicyServiceServer) ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListAlertPolicies not implemented") +} +func (UnimplementedAlertPolicyServiceServer) GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAlertPolicy not implemented") +} +func (UnimplementedAlertPolicyServiceServer) CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAlertPolicy not implemented") +} +func (UnimplementedAlertPolicyServiceServer) DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAlertPolicy not implemented") +} +func (UnimplementedAlertPolicyServiceServer) UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateAlertPolicy not implemented") +} + +// UnsafeAlertPolicyServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AlertPolicyServiceServer will +// result in compilation errors. +type UnsafeAlertPolicyServiceServer interface { + mustEmbedUnimplementedAlertPolicyServiceServer() +} + +func RegisterAlertPolicyServiceServer(s grpc.ServiceRegistrar, srv AlertPolicyServiceServer) { + s.RegisterService(&AlertPolicyService_ServiceDesc, srv) +} + +func _AlertPolicyService_ListAlertPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListAlertPoliciesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AlertPolicyService_ListAlertPolicies_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, req.(*ListAlertPoliciesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AlertPolicyService_GetAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAlertPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AlertPolicyService_GetAlertPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, req.(*GetAlertPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AlertPolicyService_CreateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateAlertPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AlertPolicyService_CreateAlertPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, req.(*CreateAlertPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AlertPolicyService_DeleteAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAlertPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AlertPolicyService_DeleteAlertPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, req.(*DeleteAlertPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AlertPolicyService_UpdateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateAlertPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AlertPolicyService_UpdateAlertPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, req.(*UpdateAlertPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AlertPolicyService_ServiceDesc is the grpc.ServiceDesc for AlertPolicyService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AlertPolicyService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.AlertPolicyService", + HandlerType: (*AlertPolicyServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListAlertPolicies", + Handler: _AlertPolicyService_ListAlertPolicies_Handler, + }, + { + MethodName: "GetAlertPolicy", + Handler: _AlertPolicyService_GetAlertPolicy_Handler, + }, + { + MethodName: "CreateAlertPolicy", + Handler: _AlertPolicyService_CreateAlertPolicy_Handler, + }, + { + MethodName: "DeleteAlertPolicy", + Handler: _AlertPolicyService_DeleteAlertPolicy_Handler, + }, + { + MethodName: "UpdateAlertPolicy", + Handler: _AlertPolicyService_UpdateAlertPolicy_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/alert_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/common.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/common.pb.go index 81b8c8f5e4..d6d2047b67 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/common.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/common.pb.go @@ -15,20 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/common.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - distribution "google.golang.org/genproto/googleapis/api/distribution" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/dropped_labels.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/dropped_labels.pb.go index 0c3ac5a1c8..b9161423cb 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/dropped_labels.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/dropped_labels.pb.go @@ -15,17 +15,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/dropped_labels.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group.pb.go index c35046ac71..6cb42d2922 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group.pb.go @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/group.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service.pb.go index fbdf9ef54f..a0552019c2 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service.pb.go @@ -15,24 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/group_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" ) const ( @@ -929,277 +924,3 @@ func file_google_monitoring_v3_group_service_proto_init() { file_google_monitoring_v3_group_service_proto_goTypes = nil file_google_monitoring_v3_group_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GroupServiceClient is the client API for GroupService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GroupServiceClient interface { - // Lists the existing groups. - ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) - // Gets a single group. - GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) - // Creates a new group. - CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) - // Updates an existing group. - // You can change any group attributes except `name`. - UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) - // Deletes an existing group. - DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Lists the monitored resources that are members of a group. - ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) -} - -type groupServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewGroupServiceClient(cc grpc.ClientConnInterface) GroupServiceClient { - return &groupServiceClient{cc} -} - -func (c *groupServiceClient) ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) { - out := new(ListGroupsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/ListGroups", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) { - out := new(Group) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/GetGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) { - out := new(Group) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/CreateGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) { - out := new(Group) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/UpdateGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/DeleteGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) { - out := new(ListGroupMembersResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/ListGroupMembers", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GroupServiceServer is the server API for GroupService service. -type GroupServiceServer interface { - // Lists the existing groups. - ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) - // Gets a single group. - GetGroup(context.Context, *GetGroupRequest) (*Group, error) - // Creates a new group. - CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) - // Updates an existing group. - // You can change any group attributes except `name`. - UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) - // Deletes an existing group. - DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) - // Lists the monitored resources that are members of a group. - ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) -} - -// UnimplementedGroupServiceServer can be embedded to have forward compatible implementations. -type UnimplementedGroupServiceServer struct { -} - -func (*UnimplementedGroupServiceServer) ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListGroups not implemented") -} -func (*UnimplementedGroupServiceServer) GetGroup(context.Context, *GetGroupRequest) (*Group, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetGroup not implemented") -} -func (*UnimplementedGroupServiceServer) CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateGroup not implemented") -} -func (*UnimplementedGroupServiceServer) UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") -} -func (*UnimplementedGroupServiceServer) DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented") -} -func (*UnimplementedGroupServiceServer) ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListGroupMembers not implemented") -} - -func RegisterGroupServiceServer(s *grpc.Server, srv GroupServiceServer) { - s.RegisterService(&_GroupService_serviceDesc, srv) -} - -func _GroupService_ListGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListGroupsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).ListGroups(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/ListGroups", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).ListGroups(ctx, req.(*ListGroupsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_GetGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).GetGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/GetGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).GetGroup(ctx, req.(*GetGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_CreateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).CreateGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/CreateGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).CreateGroup(ctx, req.(*CreateGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).UpdateGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/UpdateGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).UpdateGroup(ctx, req.(*UpdateGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).DeleteGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/DeleteGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).DeleteGroup(ctx, req.(*DeleteGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_ListGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListGroupMembersRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).ListGroupMembers(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/ListGroupMembers", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).ListGroupMembers(ctx, req.(*ListGroupMembersRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _GroupService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.GroupService", - HandlerType: (*GroupServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListGroups", - Handler: _GroupService_ListGroups_Handler, - }, - { - MethodName: "GetGroup", - Handler: _GroupService_GetGroup_Handler, - }, - { - MethodName: "CreateGroup", - Handler: _GroupService_CreateGroup_Handler, - }, - { - MethodName: "UpdateGroup", - Handler: _GroupService_UpdateGroup_Handler, - }, - { - MethodName: "DeleteGroup", - Handler: _GroupService_DeleteGroup_Handler, - }, - { - MethodName: "ListGroupMembers", - Handler: _GroupService_ListGroupMembers_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/group_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service_grpc.pb.go new file mode 100644 index 0000000000..2828587eae --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service_grpc.pb.go @@ -0,0 +1,321 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/group_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + GroupService_ListGroups_FullMethodName = "/google.monitoring.v3.GroupService/ListGroups" + GroupService_GetGroup_FullMethodName = "/google.monitoring.v3.GroupService/GetGroup" + GroupService_CreateGroup_FullMethodName = "/google.monitoring.v3.GroupService/CreateGroup" + GroupService_UpdateGroup_FullMethodName = "/google.monitoring.v3.GroupService/UpdateGroup" + GroupService_DeleteGroup_FullMethodName = "/google.monitoring.v3.GroupService/DeleteGroup" + GroupService_ListGroupMembers_FullMethodName = "/google.monitoring.v3.GroupService/ListGroupMembers" +) + +// GroupServiceClient is the client API for GroupService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type GroupServiceClient interface { + // Lists the existing groups. + ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) + // Gets a single group. + GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) + // Creates a new group. + CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) + // Updates an existing group. + // You can change any group attributes except `name`. + UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) + // Deletes an existing group. + DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Lists the monitored resources that are members of a group. + ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) +} + +type groupServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewGroupServiceClient(cc grpc.ClientConnInterface) GroupServiceClient { + return &groupServiceClient{cc} +} + +func (c *groupServiceClient) ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) { + out := new(ListGroupsResponse) + err := c.cc.Invoke(ctx, GroupService_ListGroups_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupServiceClient) GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) { + out := new(Group) + err := c.cc.Invoke(ctx, GroupService_GetGroup_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupServiceClient) CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) { + out := new(Group) + err := c.cc.Invoke(ctx, GroupService_CreateGroup_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupServiceClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) { + out := new(Group) + err := c.cc.Invoke(ctx, GroupService_UpdateGroup_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupServiceClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, GroupService_DeleteGroup_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupServiceClient) ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) { + out := new(ListGroupMembersResponse) + err := c.cc.Invoke(ctx, GroupService_ListGroupMembers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GroupServiceServer is the server API for GroupService service. +// All implementations should embed UnimplementedGroupServiceServer +// for forward compatibility +type GroupServiceServer interface { + // Lists the existing groups. + ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) + // Gets a single group. + GetGroup(context.Context, *GetGroupRequest) (*Group, error) + // Creates a new group. + CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) + // Updates an existing group. + // You can change any group attributes except `name`. + UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) + // Deletes an existing group. + DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) + // Lists the monitored resources that are members of a group. + ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) +} + +// UnimplementedGroupServiceServer should be embedded to have forward compatible implementations. +type UnimplementedGroupServiceServer struct { +} + +func (UnimplementedGroupServiceServer) ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGroups not implemented") +} +func (UnimplementedGroupServiceServer) GetGroup(context.Context, *GetGroupRequest) (*Group, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGroup not implemented") +} +func (UnimplementedGroupServiceServer) CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGroup not implemented") +} +func (UnimplementedGroupServiceServer) UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") +} +func (UnimplementedGroupServiceServer) DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented") +} +func (UnimplementedGroupServiceServer) ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGroupMembers not implemented") +} + +// UnsafeGroupServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GroupServiceServer will +// result in compilation errors. +type UnsafeGroupServiceServer interface { + mustEmbedUnimplementedGroupServiceServer() +} + +func RegisterGroupServiceServer(s grpc.ServiceRegistrar, srv GroupServiceServer) { + s.RegisterService(&GroupService_ServiceDesc, srv) +} + +func _GroupService_ListGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGroupsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServiceServer).ListGroups(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GroupService_ListGroups_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServiceServer).ListGroups(ctx, req.(*ListGroupsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupService_GetGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetGroupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServiceServer).GetGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GroupService_GetGroup_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServiceServer).GetGroup(ctx, req.(*GetGroupRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupService_CreateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGroupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServiceServer).CreateGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GroupService_CreateGroup_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServiceServer).CreateGroup(ctx, req.(*CreateGroupRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupService_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGroupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServiceServer).UpdateGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GroupService_UpdateGroup_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServiceServer).UpdateGroup(ctx, req.(*UpdateGroupRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupService_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGroupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServiceServer).DeleteGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GroupService_DeleteGroup_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServiceServer).DeleteGroup(ctx, req.(*DeleteGroupRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupService_ListGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGroupMembersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServiceServer).ListGroupMembers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GroupService_ListGroupMembers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServiceServer).ListGroupMembers(ctx, req.(*ListGroupMembersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// GroupService_ServiceDesc is the grpc.ServiceDesc for GroupService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var GroupService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.GroupService", + HandlerType: (*GroupServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListGroups", + Handler: _GroupService_ListGroups_Handler, + }, + { + MethodName: "GetGroup", + Handler: _GroupService_GetGroup_Handler, + }, + { + MethodName: "CreateGroup", + Handler: _GroupService_CreateGroup_Handler, + }, + { + MethodName: "UpdateGroup", + Handler: _GroupService_UpdateGroup_Handler, + }, + { + MethodName: "DeleteGroup", + Handler: _GroupService_DeleteGroup_Handler, + }, + { + MethodName: "ListGroupMembers", + Handler: _GroupService_ListGroupMembers_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/group_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric.pb.go index ae7eea5b6f..7aefb0a5ec 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric.pb.go @@ -15,20 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/metric.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - label "google.golang.org/genproto/googleapis/api/label" metric "google.golang.org/genproto/googleapis/api/metric" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service.pb.go index 39b9595241..d4067d8594 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service.pb.go @@ -15,26 +15,21 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/metric_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" metric "google.golang.org/genproto/googleapis/api/metric" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" status "google.golang.org/genproto/googleapis/rpc/status" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status1 "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" ) const ( @@ -1863,431 +1858,3 @@ func file_google_monitoring_v3_metric_service_proto_init() { file_google_monitoring_v3_metric_service_proto_goTypes = nil file_google_monitoring_v3_metric_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// MetricServiceClient is the client API for MetricService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MetricServiceClient interface { - // Lists monitored resource descriptors that match a filter. - ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) - // Gets a single monitored resource descriptor. - GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) - // Lists metric descriptors that match a filter. - ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) - // Gets a single metric descriptor. - GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) - // Creates a new metric descriptor. - // The creation is executed asynchronously. - // User-created metric descriptors define - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). - // The metric descriptor is updated if it already exists, - // except that metric labels are never removed. - CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) - // Deletes a metric descriptor. Only user-created - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be - // deleted. - DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Lists time series that match a filter. - ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) - // Creates or adds data to one or more time series. - // The response is empty if all time series in the request were written. - // If any time series could not be written, a corresponding failure message is - // included in the error response. - // This method does not support - // [resource locations constraint of an organization - // policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). - CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Creates or adds data to one or more service time series. A service time - // series is a time series for a metric from a Google Cloud service. The - // response is empty if all time series in the request were written. If any - // time series could not be written, a corresponding failure message is - // included in the error response. This endpoint rejects writes to - // user-defined metrics. - // This method is only for use by Google Cloud services. Use - // [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries] - // instead. - CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) -} - -type metricServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewMetricServiceClient(cc grpc.ClientConnInterface) MetricServiceClient { - return &metricServiceClient{cc} -} - -func (c *metricServiceClient) ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) { - out := new(ListMonitoredResourceDescriptorsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) { - out := new(monitoredres.MonitoredResourceDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) { - out := new(ListMetricDescriptorsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListMetricDescriptors", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { - out := new(metric.MetricDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/GetMetricDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { - out := new(metric.MetricDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateMetricDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/DeleteMetricDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) { - out := new(ListTimeSeriesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListTimeSeries", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateTimeSeries", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateServiceTimeSeries", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MetricServiceServer is the server API for MetricService service. -type MetricServiceServer interface { - // Lists monitored resource descriptors that match a filter. - ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) - // Gets a single monitored resource descriptor. - GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) - // Lists metric descriptors that match a filter. - ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) - // Gets a single metric descriptor. - GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) - // Creates a new metric descriptor. - // The creation is executed asynchronously. - // User-created metric descriptors define - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). - // The metric descriptor is updated if it already exists, - // except that metric labels are never removed. - CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) - // Deletes a metric descriptor. Only user-created - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be - // deleted. - DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) - // Lists time series that match a filter. - ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) - // Creates or adds data to one or more time series. - // The response is empty if all time series in the request were written. - // If any time series could not be written, a corresponding failure message is - // included in the error response. - // This method does not support - // [resource locations constraint of an organization - // policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). - CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) - // Creates or adds data to one or more service time series. A service time - // series is a time series for a metric from a Google Cloud service. The - // response is empty if all time series in the request were written. If any - // time series could not be written, a corresponding failure message is - // included in the error response. This endpoint rejects writes to - // user-defined metrics. - // This method is only for use by Google Cloud services. Use - // [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries] - // instead. - CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) -} - -// UnimplementedMetricServiceServer can be embedded to have forward compatible implementations. -type UnimplementedMetricServiceServer struct { -} - -func (*UnimplementedMetricServiceServer) ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListMonitoredResourceDescriptors not implemented") -} -func (*UnimplementedMetricServiceServer) GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetMonitoredResourceDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListMetricDescriptors not implemented") -} -func (*UnimplementedMetricServiceServer) GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetMetricDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateMetricDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteMetricDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListTimeSeries not implemented") -} -func (*UnimplementedMetricServiceServer) CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateTimeSeries not implemented") -} -func (*UnimplementedMetricServiceServer) CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateServiceTimeSeries not implemented") -} - -func RegisterMetricServiceServer(s *grpc.Server, srv MetricServiceServer) { - s.RegisterService(&_MetricService_serviceDesc, srv) -} - -func _MetricService_ListMonitoredResourceDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListMonitoredResourceDescriptorsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, req.(*ListMonitoredResourceDescriptorsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_GetMonitoredResourceDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetMonitoredResourceDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, req.(*GetMonitoredResourceDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_ListMetricDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListMetricDescriptorsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).ListMetricDescriptors(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/ListMetricDescriptors", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).ListMetricDescriptors(ctx, req.(*ListMetricDescriptorsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_GetMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetMetricDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).GetMetricDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/GetMetricDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).GetMetricDescriptor(ctx, req.(*GetMetricDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_CreateMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateMetricDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/CreateMetricDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, req.(*CreateMetricDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_DeleteMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteMetricDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/DeleteMetricDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, req.(*DeleteMetricDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_ListTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListTimeSeriesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).ListTimeSeries(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/ListTimeSeries", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).ListTimeSeries(ctx, req.(*ListTimeSeriesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_CreateTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateTimeSeriesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).CreateTimeSeries(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/CreateTimeSeries", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).CreateTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_CreateServiceTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateTimeSeriesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/CreateServiceTimeSeries", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _MetricService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.MetricService", - HandlerType: (*MetricServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListMonitoredResourceDescriptors", - Handler: _MetricService_ListMonitoredResourceDescriptors_Handler, - }, - { - MethodName: "GetMonitoredResourceDescriptor", - Handler: _MetricService_GetMonitoredResourceDescriptor_Handler, - }, - { - MethodName: "ListMetricDescriptors", - Handler: _MetricService_ListMetricDescriptors_Handler, - }, - { - MethodName: "GetMetricDescriptor", - Handler: _MetricService_GetMetricDescriptor_Handler, - }, - { - MethodName: "CreateMetricDescriptor", - Handler: _MetricService_CreateMetricDescriptor_Handler, - }, - { - MethodName: "DeleteMetricDescriptor", - Handler: _MetricService_DeleteMetricDescriptor_Handler, - }, - { - MethodName: "ListTimeSeries", - Handler: _MetricService_ListTimeSeries_Handler, - }, - { - MethodName: "CreateTimeSeries", - Handler: _MetricService_CreateTimeSeries_Handler, - }, - { - MethodName: "CreateServiceTimeSeries", - Handler: _MetricService_CreateServiceTimeSeries_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/metric_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service_grpc.pb.go new file mode 100644 index 0000000000..b4a5478cf6 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service_grpc.pb.go @@ -0,0 +1,480 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/metric_service.proto + +package monitoringpb + +import ( + context "context" + metric "google.golang.org/genproto/googleapis/api/metric" + monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + MetricService_ListMonitoredResourceDescriptors_FullMethodName = "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors" + MetricService_GetMonitoredResourceDescriptor_FullMethodName = "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor" + MetricService_ListMetricDescriptors_FullMethodName = "/google.monitoring.v3.MetricService/ListMetricDescriptors" + MetricService_GetMetricDescriptor_FullMethodName = "/google.monitoring.v3.MetricService/GetMetricDescriptor" + MetricService_CreateMetricDescriptor_FullMethodName = "/google.monitoring.v3.MetricService/CreateMetricDescriptor" + MetricService_DeleteMetricDescriptor_FullMethodName = "/google.monitoring.v3.MetricService/DeleteMetricDescriptor" + MetricService_ListTimeSeries_FullMethodName = "/google.monitoring.v3.MetricService/ListTimeSeries" + MetricService_CreateTimeSeries_FullMethodName = "/google.monitoring.v3.MetricService/CreateTimeSeries" + MetricService_CreateServiceTimeSeries_FullMethodName = "/google.monitoring.v3.MetricService/CreateServiceTimeSeries" +) + +// MetricServiceClient is the client API for MetricService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MetricServiceClient interface { + // Lists monitored resource descriptors that match a filter. + ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) + // Gets a single monitored resource descriptor. + GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) + // Lists metric descriptors that match a filter. + ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) + // Gets a single metric descriptor. + GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) + // Creates a new metric descriptor. + // The creation is executed asynchronously. + // User-created metric descriptors define + // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). + // The metric descriptor is updated if it already exists, + // except that metric labels are never removed. + CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) + // Deletes a metric descriptor. Only user-created + // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be + // deleted. + DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Lists time series that match a filter. + ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) + // Creates or adds data to one or more time series. + // The response is empty if all time series in the request were written. + // If any time series could not be written, a corresponding failure message is + // included in the error response. + // This method does not support + // [resource locations constraint of an organization + // policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). + CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Creates or adds data to one or more service time series. A service time + // series is a time series for a metric from a Google Cloud service. The + // response is empty if all time series in the request were written. If any + // time series could not be written, a corresponding failure message is + // included in the error response. This endpoint rejects writes to + // user-defined metrics. + // This method is only for use by Google Cloud services. Use + // [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries] + // instead. + CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type metricServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewMetricServiceClient(cc grpc.ClientConnInterface) MetricServiceClient { + return &metricServiceClient{cc} +} + +func (c *metricServiceClient) ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) { + out := new(ListMonitoredResourceDescriptorsResponse) + err := c.cc.Invoke(ctx, MetricService_ListMonitoredResourceDescriptors_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) { + out := new(monitoredres.MonitoredResourceDescriptor) + err := c.cc.Invoke(ctx, MetricService_GetMonitoredResourceDescriptor_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) { + out := new(ListMetricDescriptorsResponse) + err := c.cc.Invoke(ctx, MetricService_ListMetricDescriptors_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { + out := new(metric.MetricDescriptor) + err := c.cc.Invoke(ctx, MetricService_GetMetricDescriptor_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { + out := new(metric.MetricDescriptor) + err := c.cc.Invoke(ctx, MetricService_CreateMetricDescriptor_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, MetricService_DeleteMetricDescriptor_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) { + out := new(ListTimeSeriesResponse) + err := c.cc.Invoke(ctx, MetricService_ListTimeSeries_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, MetricService_CreateTimeSeries_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *metricServiceClient) CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, MetricService_CreateServiceTimeSeries_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MetricServiceServer is the server API for MetricService service. +// All implementations should embed UnimplementedMetricServiceServer +// for forward compatibility +type MetricServiceServer interface { + // Lists monitored resource descriptors that match a filter. + ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) + // Gets a single monitored resource descriptor. + GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) + // Lists metric descriptors that match a filter. + ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) + // Gets a single metric descriptor. + GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) + // Creates a new metric descriptor. + // The creation is executed asynchronously. + // User-created metric descriptors define + // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). + // The metric descriptor is updated if it already exists, + // except that metric labels are never removed. + CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) + // Deletes a metric descriptor. Only user-created + // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be + // deleted. + DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) + // Lists time series that match a filter. + ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) + // Creates or adds data to one or more time series. + // The response is empty if all time series in the request were written. + // If any time series could not be written, a corresponding failure message is + // included in the error response. + // This method does not support + // [resource locations constraint of an organization + // policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). + CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) + // Creates or adds data to one or more service time series. A service time + // series is a time series for a metric from a Google Cloud service. The + // response is empty if all time series in the request were written. If any + // time series could not be written, a corresponding failure message is + // included in the error response. This endpoint rejects writes to + // user-defined metrics. + // This method is only for use by Google Cloud services. Use + // [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries] + // instead. + CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) +} + +// UnimplementedMetricServiceServer should be embedded to have forward compatible implementations. +type UnimplementedMetricServiceServer struct { +} + +func (UnimplementedMetricServiceServer) ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListMonitoredResourceDescriptors not implemented") +} +func (UnimplementedMetricServiceServer) GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMonitoredResourceDescriptor not implemented") +} +func (UnimplementedMetricServiceServer) ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListMetricDescriptors not implemented") +} +func (UnimplementedMetricServiceServer) GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMetricDescriptor not implemented") +} +func (UnimplementedMetricServiceServer) CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateMetricDescriptor not implemented") +} +func (UnimplementedMetricServiceServer) DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteMetricDescriptor not implemented") +} +func (UnimplementedMetricServiceServer) ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTimeSeries not implemented") +} +func (UnimplementedMetricServiceServer) CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateTimeSeries not implemented") +} +func (UnimplementedMetricServiceServer) CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateServiceTimeSeries not implemented") +} + +// UnsafeMetricServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MetricServiceServer will +// result in compilation errors. +type UnsafeMetricServiceServer interface { + mustEmbedUnimplementedMetricServiceServer() +} + +func RegisterMetricServiceServer(s grpc.ServiceRegistrar, srv MetricServiceServer) { + s.RegisterService(&MetricService_ServiceDesc, srv) +} + +func _MetricService_ListMonitoredResourceDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListMonitoredResourceDescriptorsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_ListMonitoredResourceDescriptors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, req.(*ListMonitoredResourceDescriptorsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_GetMonitoredResourceDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetMonitoredResourceDescriptorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_GetMonitoredResourceDescriptor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, req.(*GetMonitoredResourceDescriptorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_ListMetricDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListMetricDescriptorsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).ListMetricDescriptors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_ListMetricDescriptors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).ListMetricDescriptors(ctx, req.(*ListMetricDescriptorsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_GetMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetMetricDescriptorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).GetMetricDescriptor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_GetMetricDescriptor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).GetMetricDescriptor(ctx, req.(*GetMetricDescriptorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_CreateMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateMetricDescriptorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_CreateMetricDescriptor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, req.(*CreateMetricDescriptorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_DeleteMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteMetricDescriptorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_DeleteMetricDescriptor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, req.(*DeleteMetricDescriptorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_ListTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListTimeSeriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).ListTimeSeries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_ListTimeSeries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).ListTimeSeries(ctx, req.(*ListTimeSeriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_CreateTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateTimeSeriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).CreateTimeSeries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_CreateTimeSeries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).CreateTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MetricService_CreateServiceTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateTimeSeriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MetricService_CreateServiceTimeSeries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// MetricService_ServiceDesc is the grpc.ServiceDesc for MetricService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var MetricService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.MetricService", + HandlerType: (*MetricServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListMonitoredResourceDescriptors", + Handler: _MetricService_ListMonitoredResourceDescriptors_Handler, + }, + { + MethodName: "GetMonitoredResourceDescriptor", + Handler: _MetricService_GetMonitoredResourceDescriptor_Handler, + }, + { + MethodName: "ListMetricDescriptors", + Handler: _MetricService_ListMetricDescriptors_Handler, + }, + { + MethodName: "GetMetricDescriptor", + Handler: _MetricService_GetMetricDescriptor_Handler, + }, + { + MethodName: "CreateMetricDescriptor", + Handler: _MetricService_CreateMetricDescriptor_Handler, + }, + { + MethodName: "DeleteMetricDescriptor", + Handler: _MetricService_DeleteMetricDescriptor_Handler, + }, + { + MethodName: "ListTimeSeries", + Handler: _MetricService_ListTimeSeries_Handler, + }, + { + MethodName: "CreateTimeSeries", + Handler: _MetricService_CreateTimeSeries_Handler, + }, + { + MethodName: "CreateServiceTimeSeries", + Handler: _MetricService_CreateServiceTimeSeries_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/metric_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/mutation_record.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/mutation_record.pb.go index e03d89efe4..820101962e 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/mutation_record.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/mutation_record.pb.go @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/mutation_record.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification.pb.go index 0d5cacbecb..b2f0806e89 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification.pb.go @@ -15,21 +15,20 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/notification.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - api "google.golang.org/genproto/googleapis/api" _ "google.golang.org/genproto/googleapis/api/annotations" label "google.golang.org/genproto/googleapis/api/label" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service.pb.go index fd0230036d..1270600b38 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service.pb.go @@ -15,25 +15,20 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/notification_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( @@ -1297,523 +1292,3 @@ func file_google_monitoring_v3_notification_service_proto_init() { file_google_monitoring_v3_notification_service_proto_goTypes = nil file_google_monitoring_v3_notification_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// NotificationChannelServiceClient is the client API for NotificationChannelService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type NotificationChannelServiceClient interface { - // Lists the descriptors for supported channel types. The use of descriptors - // makes it possible for new channel types to be dynamically added. - ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) - // Gets a single channel descriptor. The descriptor indicates which fields - // are expected / permitted for a notification channel of the given type. - GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) - // Lists the notification channels that have been created for the project. - // To list the types of notification channels that are supported, use - // the `ListNotificationChannelDescriptors` method. - ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) - // Gets a single notification channel. The channel includes the relevant - // configuration details with which the channel was created. However, the - // response may truncate or omit passwords, API keys, or other private key - // matter and thus the response may not be 100% identical to the information - // that was supplied in the call to the create method. - GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) - // Creates a new notification channel, representing a single notification - // endpoint such as an email address, SMS number, or PagerDuty service. - // - // Design your application to single-thread API calls that modify the state of - // notification channels in a single project. This includes calls to - // CreateNotificationChannel, DeleteNotificationChannel and - // UpdateNotificationChannel. - CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) - // Updates a notification channel. Fields not specified in the field mask - // remain unchanged. - // - // Design your application to single-thread API calls that modify the state of - // notification channels in a single project. This includes calls to - // CreateNotificationChannel, DeleteNotificationChannel and - // UpdateNotificationChannel. - UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) - // Deletes a notification channel. - // - // Design your application to single-thread API calls that modify the state of - // notification channels in a single project. This includes calls to - // CreateNotificationChannel, DeleteNotificationChannel and - // UpdateNotificationChannel. - DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Causes a verification code to be delivered to the channel. The code - // can then be supplied in `VerifyNotificationChannel` to verify the channel. - SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Requests a verification code for an already verified channel that can then - // be used in a call to VerifyNotificationChannel() on a different channel - // with an equivalent identity in the same or in a different project. This - // makes it possible to copy a channel between projects without requiring - // manual reverification of the channel. If the channel is not in the - // verified state, this method will fail (in other words, this may only be - // used if the SendNotificationChannelVerificationCode and - // VerifyNotificationChannel paths have already been used to put the given - // channel into the verified state). - // - // There is no guarantee that the verification codes returned by this method - // will be of a similar structure or form as the ones that are delivered - // to the channel via SendNotificationChannelVerificationCode; while - // VerifyNotificationChannel() will recognize both the codes delivered via - // SendNotificationChannelVerificationCode() and returned from - // GetNotificationChannelVerificationCode(), it is typically the case that - // the verification codes delivered via - // SendNotificationChannelVerificationCode() will be shorter and also - // have a shorter expiration (e.g. codes such as "G-123456") whereas - // GetVerificationCode() will typically return a much longer, websafe base - // 64 encoded string that has a longer expiration time. - GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) - // Verifies a `NotificationChannel` by proving receipt of the code - // delivered to the channel as a result of calling - // `SendNotificationChannelVerificationCode`. - VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) -} - -type notificationChannelServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewNotificationChannelServiceClient(cc grpc.ClientConnInterface) NotificationChannelServiceClient { - return ¬ificationChannelServiceClient{cc} -} - -func (c *notificationChannelServiceClient) ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) { - out := new(ListNotificationChannelDescriptorsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) { - out := new(NotificationChannelDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) { - out := new(ListNotificationChannelsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) { - out := new(GetNotificationChannelVerificationCodeResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// NotificationChannelServiceServer is the server API for NotificationChannelService service. -type NotificationChannelServiceServer interface { - // Lists the descriptors for supported channel types. The use of descriptors - // makes it possible for new channel types to be dynamically added. - ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) - // Gets a single channel descriptor. The descriptor indicates which fields - // are expected / permitted for a notification channel of the given type. - GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) - // Lists the notification channels that have been created for the project. - // To list the types of notification channels that are supported, use - // the `ListNotificationChannelDescriptors` method. - ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) - // Gets a single notification channel. The channel includes the relevant - // configuration details with which the channel was created. However, the - // response may truncate or omit passwords, API keys, or other private key - // matter and thus the response may not be 100% identical to the information - // that was supplied in the call to the create method. - GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) - // Creates a new notification channel, representing a single notification - // endpoint such as an email address, SMS number, or PagerDuty service. - // - // Design your application to single-thread API calls that modify the state of - // notification channels in a single project. This includes calls to - // CreateNotificationChannel, DeleteNotificationChannel and - // UpdateNotificationChannel. - CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) - // Updates a notification channel. Fields not specified in the field mask - // remain unchanged. - // - // Design your application to single-thread API calls that modify the state of - // notification channels in a single project. This includes calls to - // CreateNotificationChannel, DeleteNotificationChannel and - // UpdateNotificationChannel. - UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) - // Deletes a notification channel. - // - // Design your application to single-thread API calls that modify the state of - // notification channels in a single project. This includes calls to - // CreateNotificationChannel, DeleteNotificationChannel and - // UpdateNotificationChannel. - DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) - // Causes a verification code to be delivered to the channel. The code - // can then be supplied in `VerifyNotificationChannel` to verify the channel. - SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) - // Requests a verification code for an already verified channel that can then - // be used in a call to VerifyNotificationChannel() on a different channel - // with an equivalent identity in the same or in a different project. This - // makes it possible to copy a channel between projects without requiring - // manual reverification of the channel. If the channel is not in the - // verified state, this method will fail (in other words, this may only be - // used if the SendNotificationChannelVerificationCode and - // VerifyNotificationChannel paths have already been used to put the given - // channel into the verified state). - // - // There is no guarantee that the verification codes returned by this method - // will be of a similar structure or form as the ones that are delivered - // to the channel via SendNotificationChannelVerificationCode; while - // VerifyNotificationChannel() will recognize both the codes delivered via - // SendNotificationChannelVerificationCode() and returned from - // GetNotificationChannelVerificationCode(), it is typically the case that - // the verification codes delivered via - // SendNotificationChannelVerificationCode() will be shorter and also - // have a shorter expiration (e.g. codes such as "G-123456") whereas - // GetVerificationCode() will typically return a much longer, websafe base - // 64 encoded string that has a longer expiration time. - GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) - // Verifies a `NotificationChannel` by proving receipt of the code - // delivered to the channel as a result of calling - // `SendNotificationChannelVerificationCode`. - VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) -} - -// UnimplementedNotificationChannelServiceServer can be embedded to have forward compatible implementations. -type UnimplementedNotificationChannelServiceServer struct { -} - -func (*UnimplementedNotificationChannelServiceServer) ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannelDescriptors not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelDescriptor not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannels not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendNotificationChannelVerificationCode not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelVerificationCode not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method VerifyNotificationChannel not implemented") -} - -func RegisterNotificationChannelServiceServer(s *grpc.Server, srv NotificationChannelServiceServer) { - s.RegisterService(&_NotificationChannelService_serviceDesc, srv) -} - -func _NotificationChannelService_ListNotificationChannelDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListNotificationChannelDescriptorsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, req.(*ListNotificationChannelDescriptorsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_GetNotificationChannelDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNotificationChannelDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, req.(*GetNotificationChannelDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_ListNotificationChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListNotificationChannelsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, req.(*ListNotificationChannelsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_GetNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, req.(*GetNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_CreateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, req.(*CreateNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_UpdateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, req.(*UpdateNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_DeleteNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, req.(*DeleteNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_SendNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SendNotificationChannelVerificationCodeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, req.(*SendNotificationChannelVerificationCodeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_GetNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNotificationChannelVerificationCodeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, req.(*GetNotificationChannelVerificationCodeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_VerifyNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(VerifyNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, req.(*VerifyNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _NotificationChannelService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.NotificationChannelService", - HandlerType: (*NotificationChannelServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListNotificationChannelDescriptors", - Handler: _NotificationChannelService_ListNotificationChannelDescriptors_Handler, - }, - { - MethodName: "GetNotificationChannelDescriptor", - Handler: _NotificationChannelService_GetNotificationChannelDescriptor_Handler, - }, - { - MethodName: "ListNotificationChannels", - Handler: _NotificationChannelService_ListNotificationChannels_Handler, - }, - { - MethodName: "GetNotificationChannel", - Handler: _NotificationChannelService_GetNotificationChannel_Handler, - }, - { - MethodName: "CreateNotificationChannel", - Handler: _NotificationChannelService_CreateNotificationChannel_Handler, - }, - { - MethodName: "UpdateNotificationChannel", - Handler: _NotificationChannelService_UpdateNotificationChannel_Handler, - }, - { - MethodName: "DeleteNotificationChannel", - Handler: _NotificationChannelService_DeleteNotificationChannel_Handler, - }, - { - MethodName: "SendNotificationChannelVerificationCode", - Handler: _NotificationChannelService_SendNotificationChannelVerificationCode_Handler, - }, - { - MethodName: "GetNotificationChannelVerificationCode", - Handler: _NotificationChannelService_GetNotificationChannelVerificationCode_Handler, - }, - { - MethodName: "VerifyNotificationChannel", - Handler: _NotificationChannelService_VerifyNotificationChannel_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/notification_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service_grpc.pb.go new file mode 100644 index 0000000000..ec5c2fe162 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service_grpc.pb.go @@ -0,0 +1,571 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/notification_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + NotificationChannelService_ListNotificationChannelDescriptors_FullMethodName = "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors" + NotificationChannelService_GetNotificationChannelDescriptor_FullMethodName = "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor" + NotificationChannelService_ListNotificationChannels_FullMethodName = "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels" + NotificationChannelService_GetNotificationChannel_FullMethodName = "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel" + NotificationChannelService_CreateNotificationChannel_FullMethodName = "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel" + NotificationChannelService_UpdateNotificationChannel_FullMethodName = "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel" + NotificationChannelService_DeleteNotificationChannel_FullMethodName = "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel" + NotificationChannelService_SendNotificationChannelVerificationCode_FullMethodName = "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode" + NotificationChannelService_GetNotificationChannelVerificationCode_FullMethodName = "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode" + NotificationChannelService_VerifyNotificationChannel_FullMethodName = "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel" +) + +// NotificationChannelServiceClient is the client API for NotificationChannelService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type NotificationChannelServiceClient interface { + // Lists the descriptors for supported channel types. The use of descriptors + // makes it possible for new channel types to be dynamically added. + ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) + // Gets a single channel descriptor. The descriptor indicates which fields + // are expected / permitted for a notification channel of the given type. + GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) + // Lists the notification channels that have been created for the project. + // To list the types of notification channels that are supported, use + // the `ListNotificationChannelDescriptors` method. + ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) + // Gets a single notification channel. The channel includes the relevant + // configuration details with which the channel was created. However, the + // response may truncate or omit passwords, API keys, or other private key + // matter and thus the response may not be 100% identical to the information + // that was supplied in the call to the create method. + GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) + // Creates a new notification channel, representing a single notification + // endpoint such as an email address, SMS number, or PagerDuty service. + // + // Design your application to single-thread API calls that modify the state of + // notification channels in a single project. This includes calls to + // CreateNotificationChannel, DeleteNotificationChannel and + // UpdateNotificationChannel. + CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) + // Updates a notification channel. Fields not specified in the field mask + // remain unchanged. + // + // Design your application to single-thread API calls that modify the state of + // notification channels in a single project. This includes calls to + // CreateNotificationChannel, DeleteNotificationChannel and + // UpdateNotificationChannel. + UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) + // Deletes a notification channel. + // + // Design your application to single-thread API calls that modify the state of + // notification channels in a single project. This includes calls to + // CreateNotificationChannel, DeleteNotificationChannel and + // UpdateNotificationChannel. + DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Causes a verification code to be delivered to the channel. The code + // can then be supplied in `VerifyNotificationChannel` to verify the channel. + SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Requests a verification code for an already verified channel that can then + // be used in a call to VerifyNotificationChannel() on a different channel + // with an equivalent identity in the same or in a different project. This + // makes it possible to copy a channel between projects without requiring + // manual reverification of the channel. If the channel is not in the + // verified state, this method will fail (in other words, this may only be + // used if the SendNotificationChannelVerificationCode and + // VerifyNotificationChannel paths have already been used to put the given + // channel into the verified state). + // + // There is no guarantee that the verification codes returned by this method + // will be of a similar structure or form as the ones that are delivered + // to the channel via SendNotificationChannelVerificationCode; while + // VerifyNotificationChannel() will recognize both the codes delivered via + // SendNotificationChannelVerificationCode() and returned from + // GetNotificationChannelVerificationCode(), it is typically the case that + // the verification codes delivered via + // SendNotificationChannelVerificationCode() will be shorter and also + // have a shorter expiration (e.g. codes such as "G-123456") whereas + // GetVerificationCode() will typically return a much longer, websafe base + // 64 encoded string that has a longer expiration time. + GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) + // Verifies a `NotificationChannel` by proving receipt of the code + // delivered to the channel as a result of calling + // `SendNotificationChannelVerificationCode`. + VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) +} + +type notificationChannelServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewNotificationChannelServiceClient(cc grpc.ClientConnInterface) NotificationChannelServiceClient { + return ¬ificationChannelServiceClient{cc} +} + +func (c *notificationChannelServiceClient) ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) { + out := new(ListNotificationChannelDescriptorsResponse) + err := c.cc.Invoke(ctx, NotificationChannelService_ListNotificationChannelDescriptors_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) { + out := new(NotificationChannelDescriptor) + err := c.cc.Invoke(ctx, NotificationChannelService_GetNotificationChannelDescriptor_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) { + out := new(ListNotificationChannelsResponse) + err := c.cc.Invoke(ctx, NotificationChannelService_ListNotificationChannels_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { + out := new(NotificationChannel) + err := c.cc.Invoke(ctx, NotificationChannelService_GetNotificationChannel_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { + out := new(NotificationChannel) + err := c.cc.Invoke(ctx, NotificationChannelService_CreateNotificationChannel_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { + out := new(NotificationChannel) + err := c.cc.Invoke(ctx, NotificationChannelService_UpdateNotificationChannel_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, NotificationChannelService_DeleteNotificationChannel_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, NotificationChannelService_SendNotificationChannelVerificationCode_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) { + out := new(GetNotificationChannelVerificationCodeResponse) + err := c.cc.Invoke(ctx, NotificationChannelService_GetNotificationChannelVerificationCode_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *notificationChannelServiceClient) VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { + out := new(NotificationChannel) + err := c.cc.Invoke(ctx, NotificationChannelService_VerifyNotificationChannel_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// NotificationChannelServiceServer is the server API for NotificationChannelService service. +// All implementations should embed UnimplementedNotificationChannelServiceServer +// for forward compatibility +type NotificationChannelServiceServer interface { + // Lists the descriptors for supported channel types. The use of descriptors + // makes it possible for new channel types to be dynamically added. + ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) + // Gets a single channel descriptor. The descriptor indicates which fields + // are expected / permitted for a notification channel of the given type. + GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) + // Lists the notification channels that have been created for the project. + // To list the types of notification channels that are supported, use + // the `ListNotificationChannelDescriptors` method. + ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) + // Gets a single notification channel. The channel includes the relevant + // configuration details with which the channel was created. However, the + // response may truncate or omit passwords, API keys, or other private key + // matter and thus the response may not be 100% identical to the information + // that was supplied in the call to the create method. + GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) + // Creates a new notification channel, representing a single notification + // endpoint such as an email address, SMS number, or PagerDuty service. + // + // Design your application to single-thread API calls that modify the state of + // notification channels in a single project. This includes calls to + // CreateNotificationChannel, DeleteNotificationChannel and + // UpdateNotificationChannel. + CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) + // Updates a notification channel. Fields not specified in the field mask + // remain unchanged. + // + // Design your application to single-thread API calls that modify the state of + // notification channels in a single project. This includes calls to + // CreateNotificationChannel, DeleteNotificationChannel and + // UpdateNotificationChannel. + UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) + // Deletes a notification channel. + // + // Design your application to single-thread API calls that modify the state of + // notification channels in a single project. This includes calls to + // CreateNotificationChannel, DeleteNotificationChannel and + // UpdateNotificationChannel. + DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) + // Causes a verification code to be delivered to the channel. The code + // can then be supplied in `VerifyNotificationChannel` to verify the channel. + SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) + // Requests a verification code for an already verified channel that can then + // be used in a call to VerifyNotificationChannel() on a different channel + // with an equivalent identity in the same or in a different project. This + // makes it possible to copy a channel between projects without requiring + // manual reverification of the channel. If the channel is not in the + // verified state, this method will fail (in other words, this may only be + // used if the SendNotificationChannelVerificationCode and + // VerifyNotificationChannel paths have already been used to put the given + // channel into the verified state). + // + // There is no guarantee that the verification codes returned by this method + // will be of a similar structure or form as the ones that are delivered + // to the channel via SendNotificationChannelVerificationCode; while + // VerifyNotificationChannel() will recognize both the codes delivered via + // SendNotificationChannelVerificationCode() and returned from + // GetNotificationChannelVerificationCode(), it is typically the case that + // the verification codes delivered via + // SendNotificationChannelVerificationCode() will be shorter and also + // have a shorter expiration (e.g. codes such as "G-123456") whereas + // GetVerificationCode() will typically return a much longer, websafe base + // 64 encoded string that has a longer expiration time. + GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) + // Verifies a `NotificationChannel` by proving receipt of the code + // delivered to the channel as a result of calling + // `SendNotificationChannelVerificationCode`. + VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) +} + +// UnimplementedNotificationChannelServiceServer should be embedded to have forward compatible implementations. +type UnimplementedNotificationChannelServiceServer struct { +} + +func (UnimplementedNotificationChannelServiceServer) ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannelDescriptors not implemented") +} +func (UnimplementedNotificationChannelServiceServer) GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelDescriptor not implemented") +} +func (UnimplementedNotificationChannelServiceServer) ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannels not implemented") +} +func (UnimplementedNotificationChannelServiceServer) GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannel not implemented") +} +func (UnimplementedNotificationChannelServiceServer) CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateNotificationChannel not implemented") +} +func (UnimplementedNotificationChannelServiceServer) UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateNotificationChannel not implemented") +} +func (UnimplementedNotificationChannelServiceServer) DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteNotificationChannel not implemented") +} +func (UnimplementedNotificationChannelServiceServer) SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendNotificationChannelVerificationCode not implemented") +} +func (UnimplementedNotificationChannelServiceServer) GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelVerificationCode not implemented") +} +func (UnimplementedNotificationChannelServiceServer) VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyNotificationChannel not implemented") +} + +// UnsafeNotificationChannelServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to NotificationChannelServiceServer will +// result in compilation errors. +type UnsafeNotificationChannelServiceServer interface { + mustEmbedUnimplementedNotificationChannelServiceServer() +} + +func RegisterNotificationChannelServiceServer(s grpc.ServiceRegistrar, srv NotificationChannelServiceServer) { + s.RegisterService(&NotificationChannelService_ServiceDesc, srv) +} + +func _NotificationChannelService_ListNotificationChannelDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListNotificationChannelDescriptorsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_ListNotificationChannelDescriptors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, req.(*ListNotificationChannelDescriptorsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_GetNotificationChannelDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNotificationChannelDescriptorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_GetNotificationChannelDescriptor_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, req.(*GetNotificationChannelDescriptorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_ListNotificationChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListNotificationChannelsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_ListNotificationChannels_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, req.(*ListNotificationChannelsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_GetNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNotificationChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_GetNotificationChannel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, req.(*GetNotificationChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_CreateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateNotificationChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_CreateNotificationChannel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, req.(*CreateNotificationChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_UpdateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateNotificationChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_UpdateNotificationChannel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, req.(*UpdateNotificationChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_DeleteNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteNotificationChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_DeleteNotificationChannel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, req.(*DeleteNotificationChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_SendNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SendNotificationChannelVerificationCodeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_SendNotificationChannelVerificationCode_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, req.(*SendNotificationChannelVerificationCodeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_GetNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNotificationChannelVerificationCodeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_GetNotificationChannelVerificationCode_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, req.(*GetNotificationChannelVerificationCodeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NotificationChannelService_VerifyNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(VerifyNotificationChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NotificationChannelService_VerifyNotificationChannel_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, req.(*VerifyNotificationChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// NotificationChannelService_ServiceDesc is the grpc.ServiceDesc for NotificationChannelService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var NotificationChannelService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.NotificationChannelService", + HandlerType: (*NotificationChannelServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListNotificationChannelDescriptors", + Handler: _NotificationChannelService_ListNotificationChannelDescriptors_Handler, + }, + { + MethodName: "GetNotificationChannelDescriptor", + Handler: _NotificationChannelService_GetNotificationChannelDescriptor_Handler, + }, + { + MethodName: "ListNotificationChannels", + Handler: _NotificationChannelService_ListNotificationChannels_Handler, + }, + { + MethodName: "GetNotificationChannel", + Handler: _NotificationChannelService_GetNotificationChannel_Handler, + }, + { + MethodName: "CreateNotificationChannel", + Handler: _NotificationChannelService_CreateNotificationChannel_Handler, + }, + { + MethodName: "UpdateNotificationChannel", + Handler: _NotificationChannelService_UpdateNotificationChannel_Handler, + }, + { + MethodName: "DeleteNotificationChannel", + Handler: _NotificationChannelService_DeleteNotificationChannel_Handler, + }, + { + MethodName: "SendNotificationChannelVerificationCode", + Handler: _NotificationChannelService_SendNotificationChannelVerificationCode_Handler, + }, + { + MethodName: "GetNotificationChannelVerificationCode", + Handler: _NotificationChannelService_GetNotificationChannelVerificationCode_Handler, + }, + { + MethodName: "VerifyNotificationChannel", + Handler: _NotificationChannelService_VerifyNotificationChannel_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/notification_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service.pb.go index 6402f18ca1..63741c4b6d 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service.pb.go @@ -15,21 +15,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/query_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" ) const ( @@ -128,94 +123,3 @@ func file_google_monitoring_v3_query_service_proto_init() { file_google_monitoring_v3_query_service_proto_goTypes = nil file_google_monitoring_v3_query_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// QueryServiceClient is the client API for QueryService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryServiceClient interface { - // Deprecated: Do not use. - // Queries time series by using Monitoring Query Language (MQL). We recommend - // using PromQL instead of MQL. For more information about the status of MQL, - // see the [MQL deprecation - // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). - QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) -} - -type queryServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewQueryServiceClient(cc grpc.ClientConnInterface) QueryServiceClient { - return &queryServiceClient{cc} -} - -// Deprecated: Do not use. -func (c *queryServiceClient) QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) { - out := new(QueryTimeSeriesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.QueryService/QueryTimeSeries", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServiceServer is the server API for QueryService service. -type QueryServiceServer interface { - // Deprecated: Do not use. - // Queries time series by using Monitoring Query Language (MQL). We recommend - // using PromQL instead of MQL. For more information about the status of MQL, - // see the [MQL deprecation - // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). - QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) -} - -// UnimplementedQueryServiceServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServiceServer struct { -} - -func (*UnimplementedQueryServiceServer) QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryTimeSeries not implemented") -} - -func RegisterQueryServiceServer(s *grpc.Server, srv QueryServiceServer) { - s.RegisterService(&_QueryService_serviceDesc, srv) -} - -func _QueryService_QueryTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryTimeSeriesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServiceServer).QueryTimeSeries(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.QueryService/QueryTimeSeries", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServiceServer).QueryTimeSeries(ctx, req.(*QueryTimeSeriesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _QueryService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.QueryService", - HandlerType: (*QueryServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "QueryTimeSeries", - Handler: _QueryService_QueryTimeSeries_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/query_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service_grpc.pb.go new file mode 100644 index 0000000000..403533951f --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service_grpc.pb.go @@ -0,0 +1,132 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/query_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + QueryService_QueryTimeSeries_FullMethodName = "/google.monitoring.v3.QueryService/QueryTimeSeries" +) + +// QueryServiceClient is the client API for QueryService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type QueryServiceClient interface { + // Deprecated: Do not use. + // Queries time series by using Monitoring Query Language (MQL). We recommend + // using PromQL instead of MQL. For more information about the status of MQL, + // see the [MQL deprecation + // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). + QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) +} + +type queryServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewQueryServiceClient(cc grpc.ClientConnInterface) QueryServiceClient { + return &queryServiceClient{cc} +} + +// Deprecated: Do not use. +func (c *queryServiceClient) QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) { + out := new(QueryTimeSeriesResponse) + err := c.cc.Invoke(ctx, QueryService_QueryTimeSeries_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServiceServer is the server API for QueryService service. +// All implementations should embed UnimplementedQueryServiceServer +// for forward compatibility +type QueryServiceServer interface { + // Deprecated: Do not use. + // Queries time series by using Monitoring Query Language (MQL). We recommend + // using PromQL instead of MQL. For more information about the status of MQL, + // see the [MQL deprecation + // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). + QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) +} + +// UnimplementedQueryServiceServer should be embedded to have forward compatible implementations. +type UnimplementedQueryServiceServer struct { +} + +func (UnimplementedQueryServiceServer) QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryTimeSeries not implemented") +} + +// UnsafeQueryServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to QueryServiceServer will +// result in compilation errors. +type UnsafeQueryServiceServer interface { + mustEmbedUnimplementedQueryServiceServer() +} + +func RegisterQueryServiceServer(s grpc.ServiceRegistrar, srv QueryServiceServer) { + s.RegisterService(&QueryService_ServiceDesc, srv) +} + +func _QueryService_QueryTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTimeSeriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServiceServer).QueryTimeSeries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: QueryService_QueryTimeSeries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServiceServer).QueryTimeSeries(ctx, req.(*QueryTimeSeriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// QueryService_ServiceDesc is the grpc.ServiceDesc for QueryService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var QueryService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.QueryService", + HandlerType: (*QueryServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "QueryTimeSeries", + Handler: _QueryService_QueryTimeSeries_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/query_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service.pb.go index a9d2ae8cb6..07a209ac19 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service.pb.go @@ -15,20 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/service.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" calendarperiod "google.golang.org/genproto/googleapis/type/calendarperiod" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service.pb.go index 08c2e08e26..f08dfe56ad 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service.pb.go @@ -15,24 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/service_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + sync "sync" ) const ( @@ -1200,427 +1195,3 @@ func file_google_monitoring_v3_service_service_proto_init() { file_google_monitoring_v3_service_service_proto_goTypes = nil file_google_monitoring_v3_service_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ServiceMonitoringServiceClient is the client API for ServiceMonitoringService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ServiceMonitoringServiceClient interface { - // Create a `Service`. - CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) - // Get the named `Service`. - GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) - // List `Service`s for this Metrics Scope. - ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) - // Update this `Service`. - UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) - // Soft delete this `Service`. - DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Create a `ServiceLevelObjective` for the given `Service`. - CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) - // Get a `ServiceLevelObjective` by name. - GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) - // List the `ServiceLevelObjective`s for the given `Service`. - ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) - // Update the given `ServiceLevelObjective`. - UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) - // Delete the given `ServiceLevelObjective`. - DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) -} - -type serviceMonitoringServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewServiceMonitoringServiceClient(cc grpc.ClientConnInterface) ServiceMonitoringServiceClient { - return &serviceMonitoringServiceClient{cc} -} - -func (c *serviceMonitoringServiceClient) CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) { - out := new(Service) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/CreateService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) { - out := new(Service) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/GetService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) { - out := new(ListServicesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/ListServices", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) { - out := new(Service) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/UpdateService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/DeleteService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { - out := new(ServiceLevelObjective) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { - out := new(ServiceLevelObjective) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) { - out := new(ListServiceLevelObjectivesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { - out := new(ServiceLevelObjective) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ServiceMonitoringServiceServer is the server API for ServiceMonitoringService service. -type ServiceMonitoringServiceServer interface { - // Create a `Service`. - CreateService(context.Context, *CreateServiceRequest) (*Service, error) - // Get the named `Service`. - GetService(context.Context, *GetServiceRequest) (*Service, error) - // List `Service`s for this Metrics Scope. - ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) - // Update this `Service`. - UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) - // Soft delete this `Service`. - DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) - // Create a `ServiceLevelObjective` for the given `Service`. - CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) - // Get a `ServiceLevelObjective` by name. - GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) - // List the `ServiceLevelObjective`s for the given `Service`. - ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) - // Update the given `ServiceLevelObjective`. - UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) - // Delete the given `ServiceLevelObjective`. - DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) -} - -// UnimplementedServiceMonitoringServiceServer can be embedded to have forward compatible implementations. -type UnimplementedServiceMonitoringServiceServer struct { -} - -func (*UnimplementedServiceMonitoringServiceServer) CreateService(context.Context, *CreateServiceRequest) (*Service, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) GetService(context.Context, *GetServiceRequest) (*Service, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListServices not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateServiceLevelObjective not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetServiceLevelObjective not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListServiceLevelObjectives not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateServiceLevelObjective not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteServiceLevelObjective not implemented") -} - -func RegisterServiceMonitoringServiceServer(s *grpc.Server, srv ServiceMonitoringServiceServer) { - s.RegisterService(&_ServiceMonitoringService_serviceDesc, srv) -} - -func _ServiceMonitoringService_CreateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).CreateService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/CreateService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).CreateService(ctx, req.(*CreateServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).GetService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/GetService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).GetService(ctx, req.(*GetServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListServicesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).ListServices(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/ListServices", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).ListServices(ctx, req.(*ListServicesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_UpdateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/UpdateService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, req.(*UpdateServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_DeleteService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/DeleteService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, req.(*DeleteServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_CreateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, req.(*CreateServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_GetServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, req.(*GetServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_ListServiceLevelObjectives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListServiceLevelObjectivesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, req.(*ListServiceLevelObjectivesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_UpdateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, req.(*UpdateServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_DeleteServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, req.(*DeleteServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _ServiceMonitoringService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.ServiceMonitoringService", - HandlerType: (*ServiceMonitoringServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateService", - Handler: _ServiceMonitoringService_CreateService_Handler, - }, - { - MethodName: "GetService", - Handler: _ServiceMonitoringService_GetService_Handler, - }, - { - MethodName: "ListServices", - Handler: _ServiceMonitoringService_ListServices_Handler, - }, - { - MethodName: "UpdateService", - Handler: _ServiceMonitoringService_UpdateService_Handler, - }, - { - MethodName: "DeleteService", - Handler: _ServiceMonitoringService_DeleteService_Handler, - }, - { - MethodName: "CreateServiceLevelObjective", - Handler: _ServiceMonitoringService_CreateServiceLevelObjective_Handler, - }, - { - MethodName: "GetServiceLevelObjective", - Handler: _ServiceMonitoringService_GetServiceLevelObjective_Handler, - }, - { - MethodName: "ListServiceLevelObjectives", - Handler: _ServiceMonitoringService_ListServiceLevelObjectives_Handler, - }, - { - MethodName: "UpdateServiceLevelObjective", - Handler: _ServiceMonitoringService_UpdateServiceLevelObjective_Handler, - }, - { - MethodName: "DeleteServiceLevelObjective", - Handler: _ServiceMonitoringService_DeleteServiceLevelObjective_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/service_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service_grpc.pb.go new file mode 100644 index 0000000000..bd7692b950 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service_grpc.pb.go @@ -0,0 +1,475 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/service_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + ServiceMonitoringService_CreateService_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/CreateService" + ServiceMonitoringService_GetService_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/GetService" + ServiceMonitoringService_ListServices_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/ListServices" + ServiceMonitoringService_UpdateService_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/UpdateService" + ServiceMonitoringService_DeleteService_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/DeleteService" + ServiceMonitoringService_CreateServiceLevelObjective_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective" + ServiceMonitoringService_GetServiceLevelObjective_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective" + ServiceMonitoringService_ListServiceLevelObjectives_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives" + ServiceMonitoringService_UpdateServiceLevelObjective_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective" + ServiceMonitoringService_DeleteServiceLevelObjective_FullMethodName = "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective" +) + +// ServiceMonitoringServiceClient is the client API for ServiceMonitoringService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ServiceMonitoringServiceClient interface { + // Create a `Service`. + CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) + // Get the named `Service`. + GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) + // List `Service`s for this Metrics Scope. + ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) + // Update this `Service`. + UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) + // Soft delete this `Service`. + DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Create a `ServiceLevelObjective` for the given `Service`. + CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) + // Get a `ServiceLevelObjective` by name. + GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) + // List the `ServiceLevelObjective`s for the given `Service`. + ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) + // Update the given `ServiceLevelObjective`. + UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) + // Delete the given `ServiceLevelObjective`. + DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type serviceMonitoringServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewServiceMonitoringServiceClient(cc grpc.ClientConnInterface) ServiceMonitoringServiceClient { + return &serviceMonitoringServiceClient{cc} +} + +func (c *serviceMonitoringServiceClient) CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) { + out := new(Service) + err := c.cc.Invoke(ctx, ServiceMonitoringService_CreateService_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) { + out := new(Service) + err := c.cc.Invoke(ctx, ServiceMonitoringService_GetService_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) { + out := new(ListServicesResponse) + err := c.cc.Invoke(ctx, ServiceMonitoringService_ListServices_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) { + out := new(Service) + err := c.cc.Invoke(ctx, ServiceMonitoringService_UpdateService_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, ServiceMonitoringService_DeleteService_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { + out := new(ServiceLevelObjective) + err := c.cc.Invoke(ctx, ServiceMonitoringService_CreateServiceLevelObjective_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { + out := new(ServiceLevelObjective) + err := c.cc.Invoke(ctx, ServiceMonitoringService_GetServiceLevelObjective_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) { + out := new(ListServiceLevelObjectivesResponse) + err := c.cc.Invoke(ctx, ServiceMonitoringService_ListServiceLevelObjectives_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { + out := new(ServiceLevelObjective) + err := c.cc.Invoke(ctx, ServiceMonitoringService_UpdateServiceLevelObjective_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceMonitoringServiceClient) DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, ServiceMonitoringService_DeleteServiceLevelObjective_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ServiceMonitoringServiceServer is the server API for ServiceMonitoringService service. +// All implementations should embed UnimplementedServiceMonitoringServiceServer +// for forward compatibility +type ServiceMonitoringServiceServer interface { + // Create a `Service`. + CreateService(context.Context, *CreateServiceRequest) (*Service, error) + // Get the named `Service`. + GetService(context.Context, *GetServiceRequest) (*Service, error) + // List `Service`s for this Metrics Scope. + ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) + // Update this `Service`. + UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) + // Soft delete this `Service`. + DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) + // Create a `ServiceLevelObjective` for the given `Service`. + CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) + // Get a `ServiceLevelObjective` by name. + GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) + // List the `ServiceLevelObjective`s for the given `Service`. + ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) + // Update the given `ServiceLevelObjective`. + UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) + // Delete the given `ServiceLevelObjective`. + DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) +} + +// UnimplementedServiceMonitoringServiceServer should be embedded to have forward compatible implementations. +type UnimplementedServiceMonitoringServiceServer struct { +} + +func (UnimplementedServiceMonitoringServiceServer) CreateService(context.Context, *CreateServiceRequest) (*Service, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateService not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) GetService(context.Context, *GetServiceRequest) (*Service, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetService not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListServices not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateService not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteService not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateServiceLevelObjective not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetServiceLevelObjective not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListServiceLevelObjectives not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateServiceLevelObjective not implemented") +} +func (UnimplementedServiceMonitoringServiceServer) DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteServiceLevelObjective not implemented") +} + +// UnsafeServiceMonitoringServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ServiceMonitoringServiceServer will +// result in compilation errors. +type UnsafeServiceMonitoringServiceServer interface { + mustEmbedUnimplementedServiceMonitoringServiceServer() +} + +func RegisterServiceMonitoringServiceServer(s grpc.ServiceRegistrar, srv ServiceMonitoringServiceServer) { + s.RegisterService(&ServiceMonitoringService_ServiceDesc, srv) +} + +func _ServiceMonitoringService_CreateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateServiceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).CreateService(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_CreateService_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).CreateService(ctx, req.(*CreateServiceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetServiceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).GetService(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_GetService_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).GetService(ctx, req.(*GetServiceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListServicesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).ListServices(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_ListServices_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).ListServices(ctx, req.(*ListServicesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_UpdateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateServiceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_UpdateService_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, req.(*UpdateServiceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_DeleteService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteServiceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_DeleteService_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, req.(*DeleteServiceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_CreateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateServiceLevelObjectiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_CreateServiceLevelObjective_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, req.(*CreateServiceLevelObjectiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_GetServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetServiceLevelObjectiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_GetServiceLevelObjective_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, req.(*GetServiceLevelObjectiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_ListServiceLevelObjectives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListServiceLevelObjectivesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_ListServiceLevelObjectives_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, req.(*ListServiceLevelObjectivesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_UpdateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateServiceLevelObjectiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_UpdateServiceLevelObjective_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, req.(*UpdateServiceLevelObjectiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ServiceMonitoringService_DeleteServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteServiceLevelObjectiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ServiceMonitoringService_DeleteServiceLevelObjective_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, req.(*DeleteServiceLevelObjectiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ServiceMonitoringService_ServiceDesc is the grpc.ServiceDesc for ServiceMonitoringService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ServiceMonitoringService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.ServiceMonitoringService", + HandlerType: (*ServiceMonitoringServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateService", + Handler: _ServiceMonitoringService_CreateService_Handler, + }, + { + MethodName: "GetService", + Handler: _ServiceMonitoringService_GetService_Handler, + }, + { + MethodName: "ListServices", + Handler: _ServiceMonitoringService_ListServices_Handler, + }, + { + MethodName: "UpdateService", + Handler: _ServiceMonitoringService_UpdateService_Handler, + }, + { + MethodName: "DeleteService", + Handler: _ServiceMonitoringService_DeleteService_Handler, + }, + { + MethodName: "CreateServiceLevelObjective", + Handler: _ServiceMonitoringService_CreateServiceLevelObjective_Handler, + }, + { + MethodName: "GetServiceLevelObjective", + Handler: _ServiceMonitoringService_GetServiceLevelObjective_Handler, + }, + { + MethodName: "ListServiceLevelObjectives", + Handler: _ServiceMonitoringService_ListServiceLevelObjectives_Handler, + }, + { + MethodName: "UpdateServiceLevelObjective", + Handler: _ServiceMonitoringService_UpdateServiceLevelObjective_Handler, + }, + { + MethodName: "DeleteServiceLevelObjective", + Handler: _ServiceMonitoringService_DeleteServiceLevelObjective_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/service_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze.pb.go index 861e045f2d..39a2dc9f98 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze.pb.go @@ -15,18 +15,17 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/snooze.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service.pb.go index c562d60bcc..094ab0d01e 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service.pb.go @@ -15,23 +15,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/snooze_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + sync "sync" ) const ( @@ -587,207 +582,3 @@ func file_google_monitoring_v3_snooze_service_proto_init() { file_google_monitoring_v3_snooze_service_proto_goTypes = nil file_google_monitoring_v3_snooze_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// SnoozeServiceClient is the client API for SnoozeService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type SnoozeServiceClient interface { - // Creates a `Snooze` that will prevent alerts, which match the provided - // criteria, from being opened. The `Snooze` applies for a specific time - // interval. - CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) - // Lists the `Snooze`s associated with a project. Can optionally pass in - // `filter`, which specifies predicates to match `Snooze`s. - ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) - // Retrieves a `Snooze` by `name`. - GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) - // Updates a `Snooze`, identified by its `name`, with the parameters in the - // given `Snooze` object. - UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) -} - -type snoozeServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewSnoozeServiceClient(cc grpc.ClientConnInterface) SnoozeServiceClient { - return &snoozeServiceClient{cc} -} - -func (c *snoozeServiceClient) CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { - out := new(Snooze) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/CreateSnooze", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *snoozeServiceClient) ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) { - out := new(ListSnoozesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/ListSnoozes", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *snoozeServiceClient) GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { - out := new(Snooze) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/GetSnooze", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *snoozeServiceClient) UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { - out := new(Snooze) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/UpdateSnooze", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// SnoozeServiceServer is the server API for SnoozeService service. -type SnoozeServiceServer interface { - // Creates a `Snooze` that will prevent alerts, which match the provided - // criteria, from being opened. The `Snooze` applies for a specific time - // interval. - CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) - // Lists the `Snooze`s associated with a project. Can optionally pass in - // `filter`, which specifies predicates to match `Snooze`s. - ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) - // Retrieves a `Snooze` by `name`. - GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) - // Updates a `Snooze`, identified by its `name`, with the parameters in the - // given `Snooze` object. - UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) -} - -// UnimplementedSnoozeServiceServer can be embedded to have forward compatible implementations. -type UnimplementedSnoozeServiceServer struct { -} - -func (*UnimplementedSnoozeServiceServer) CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateSnooze not implemented") -} -func (*UnimplementedSnoozeServiceServer) ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListSnoozes not implemented") -} -func (*UnimplementedSnoozeServiceServer) GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetSnooze not implemented") -} -func (*UnimplementedSnoozeServiceServer) UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateSnooze not implemented") -} - -func RegisterSnoozeServiceServer(s *grpc.Server, srv SnoozeServiceServer) { - s.RegisterService(&_SnoozeService_serviceDesc, srv) -} - -func _SnoozeService_CreateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateSnoozeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SnoozeServiceServer).CreateSnooze(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.SnoozeService/CreateSnooze", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SnoozeServiceServer).CreateSnooze(ctx, req.(*CreateSnoozeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _SnoozeService_ListSnoozes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListSnoozesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SnoozeServiceServer).ListSnoozes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.SnoozeService/ListSnoozes", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SnoozeServiceServer).ListSnoozes(ctx, req.(*ListSnoozesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _SnoozeService_GetSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetSnoozeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SnoozeServiceServer).GetSnooze(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.SnoozeService/GetSnooze", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SnoozeServiceServer).GetSnooze(ctx, req.(*GetSnoozeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _SnoozeService_UpdateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateSnoozeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SnoozeServiceServer).UpdateSnooze(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.SnoozeService/UpdateSnooze", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SnoozeServiceServer).UpdateSnooze(ctx, req.(*UpdateSnoozeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _SnoozeService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.SnoozeService", - HandlerType: (*SnoozeServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateSnooze", - Handler: _SnoozeService_CreateSnooze_Handler, - }, - { - MethodName: "ListSnoozes", - Handler: _SnoozeService_ListSnoozes_Handler, - }, - { - MethodName: "GetSnooze", - Handler: _SnoozeService_GetSnooze_Handler, - }, - { - MethodName: "UpdateSnooze", - Handler: _SnoozeService_UpdateSnooze_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/snooze_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service_grpc.pb.go new file mode 100644 index 0000000000..0b7e4fa924 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service_grpc.pb.go @@ -0,0 +1,248 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/snooze_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + SnoozeService_CreateSnooze_FullMethodName = "/google.monitoring.v3.SnoozeService/CreateSnooze" + SnoozeService_ListSnoozes_FullMethodName = "/google.monitoring.v3.SnoozeService/ListSnoozes" + SnoozeService_GetSnooze_FullMethodName = "/google.monitoring.v3.SnoozeService/GetSnooze" + SnoozeService_UpdateSnooze_FullMethodName = "/google.monitoring.v3.SnoozeService/UpdateSnooze" +) + +// SnoozeServiceClient is the client API for SnoozeService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SnoozeServiceClient interface { + // Creates a `Snooze` that will prevent alerts, which match the provided + // criteria, from being opened. The `Snooze` applies for a specific time + // interval. + CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) + // Lists the `Snooze`s associated with a project. Can optionally pass in + // `filter`, which specifies predicates to match `Snooze`s. + ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) + // Retrieves a `Snooze` by `name`. + GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) + // Updates a `Snooze`, identified by its `name`, with the parameters in the + // given `Snooze` object. + UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) +} + +type snoozeServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSnoozeServiceClient(cc grpc.ClientConnInterface) SnoozeServiceClient { + return &snoozeServiceClient{cc} +} + +func (c *snoozeServiceClient) CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { + out := new(Snooze) + err := c.cc.Invoke(ctx, SnoozeService_CreateSnooze_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *snoozeServiceClient) ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) { + out := new(ListSnoozesResponse) + err := c.cc.Invoke(ctx, SnoozeService_ListSnoozes_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *snoozeServiceClient) GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { + out := new(Snooze) + err := c.cc.Invoke(ctx, SnoozeService_GetSnooze_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *snoozeServiceClient) UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { + out := new(Snooze) + err := c.cc.Invoke(ctx, SnoozeService_UpdateSnooze_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SnoozeServiceServer is the server API for SnoozeService service. +// All implementations should embed UnimplementedSnoozeServiceServer +// for forward compatibility +type SnoozeServiceServer interface { + // Creates a `Snooze` that will prevent alerts, which match the provided + // criteria, from being opened. The `Snooze` applies for a specific time + // interval. + CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) + // Lists the `Snooze`s associated with a project. Can optionally pass in + // `filter`, which specifies predicates to match `Snooze`s. + ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) + // Retrieves a `Snooze` by `name`. + GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) + // Updates a `Snooze`, identified by its `name`, with the parameters in the + // given `Snooze` object. + UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) +} + +// UnimplementedSnoozeServiceServer should be embedded to have forward compatible implementations. +type UnimplementedSnoozeServiceServer struct { +} + +func (UnimplementedSnoozeServiceServer) CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateSnooze not implemented") +} +func (UnimplementedSnoozeServiceServer) ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListSnoozes not implemented") +} +func (UnimplementedSnoozeServiceServer) GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSnooze not implemented") +} +func (UnimplementedSnoozeServiceServer) UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateSnooze not implemented") +} + +// UnsafeSnoozeServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SnoozeServiceServer will +// result in compilation errors. +type UnsafeSnoozeServiceServer interface { + mustEmbedUnimplementedSnoozeServiceServer() +} + +func RegisterSnoozeServiceServer(s grpc.ServiceRegistrar, srv SnoozeServiceServer) { + s.RegisterService(&SnoozeService_ServiceDesc, srv) +} + +func _SnoozeService_CreateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSnoozeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SnoozeServiceServer).CreateSnooze(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SnoozeService_CreateSnooze_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SnoozeServiceServer).CreateSnooze(ctx, req.(*CreateSnoozeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SnoozeService_ListSnoozes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListSnoozesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SnoozeServiceServer).ListSnoozes(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SnoozeService_ListSnoozes_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SnoozeServiceServer).ListSnoozes(ctx, req.(*ListSnoozesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SnoozeService_GetSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSnoozeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SnoozeServiceServer).GetSnooze(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SnoozeService_GetSnooze_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SnoozeServiceServer).GetSnooze(ctx, req.(*GetSnoozeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SnoozeService_UpdateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateSnoozeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SnoozeServiceServer).UpdateSnooze(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SnoozeService_UpdateSnooze_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SnoozeServiceServer).UpdateSnooze(ctx, req.(*UpdateSnoozeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SnoozeService_ServiceDesc is the grpc.ServiceDesc for SnoozeService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SnoozeService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.SnoozeService", + HandlerType: (*SnoozeServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateSnooze", + Handler: _SnoozeService_CreateSnooze_Handler, + }, + { + MethodName: "ListSnoozes", + Handler: _SnoozeService_ListSnoozes_Handler, + }, + { + MethodName: "GetSnooze", + Handler: _SnoozeService_GetSnooze_Handler, + }, + { + MethodName: "UpdateSnooze", + Handler: _SnoozeService_UpdateSnooze_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/snooze_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/span_context.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/span_context.pb.go index 23f42835f1..b933261241 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/span_context.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/span_context.pb.go @@ -15,17 +15,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/span_context.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime.pb.go index f303ac2515..2e0fb6420a 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime.pb.go @@ -15,20 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/uptime.proto package monitoringpb import ( - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" + reflect "reflect" + sync "sync" ) const ( diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service.pb.go index 9ea159bbd2..1ff646bc56 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service.pb.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service.pb.go @@ -15,24 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 -// protoc v4.25.3 +// protoc v4.25.7 // source: google/monitoring/v3/uptime_service.proto package monitoringpb import ( - context "context" - reflect "reflect" - sync "sync" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + sync "sync" ) const ( @@ -826,287 +821,3 @@ func file_google_monitoring_v3_uptime_service_proto_init() { file_google_monitoring_v3_uptime_service_proto_goTypes = nil file_google_monitoring_v3_uptime_service_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// UptimeCheckServiceClient is the client API for UptimeCheckService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type UptimeCheckServiceClient interface { - // Lists the existing valid Uptime check configurations for the project - // (leaving out any invalid configurations). - ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) - // Gets a single Uptime check configuration. - GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) - // Creates a new Uptime check configuration. - CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) - // Updates an Uptime check configuration. You can either replace the entire - // configuration with a new one or replace only certain fields in the current - // configuration by specifying the fields to be updated via `updateMask`. - // Returns the updated configuration. - UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) - // Deletes an Uptime check configuration. Note that this method will fail - // if the Uptime check configuration is referenced by an alert policy or - // other dependent configs that would be rendered invalid by the deletion. - DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Returns the list of IP addresses that checkers run from. - ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) -} - -type uptimeCheckServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewUptimeCheckServiceClient(cc grpc.ClientConnInterface) UptimeCheckServiceClient { - return &uptimeCheckServiceClient{cc} -} - -func (c *uptimeCheckServiceClient) ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) { - out := new(ListUptimeCheckConfigsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { - out := new(UptimeCheckConfig) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { - out := new(UptimeCheckConfig) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { - out := new(UptimeCheckConfig) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) { - out := new(ListUptimeCheckIpsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// UptimeCheckServiceServer is the server API for UptimeCheckService service. -type UptimeCheckServiceServer interface { - // Lists the existing valid Uptime check configurations for the project - // (leaving out any invalid configurations). - ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) - // Gets a single Uptime check configuration. - GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) - // Creates a new Uptime check configuration. - CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) - // Updates an Uptime check configuration. You can either replace the entire - // configuration with a new one or replace only certain fields in the current - // configuration by specifying the fields to be updated via `updateMask`. - // Returns the updated configuration. - UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) - // Deletes an Uptime check configuration. Note that this method will fail - // if the Uptime check configuration is referenced by an alert policy or - // other dependent configs that would be rendered invalid by the deletion. - DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) - // Returns the list of IP addresses that checkers run from. - ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) -} - -// UnimplementedUptimeCheckServiceServer can be embedded to have forward compatible implementations. -type UnimplementedUptimeCheckServiceServer struct { -} - -func (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckConfigs not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckIps not implemented") -} - -func RegisterUptimeCheckServiceServer(s *grpc.Server, srv UptimeCheckServiceServer) { - s.RegisterService(&_UptimeCheckService_serviceDesc, srv) -} - -func _UptimeCheckService_ListUptimeCheckConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListUptimeCheckConfigsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, req.(*ListUptimeCheckConfigsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_GetUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, req.(*GetUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_CreateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, req.(*CreateUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_UpdateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, req.(*UpdateUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_DeleteUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, req.(*DeleteUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_ListUptimeCheckIps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListUptimeCheckIpsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, req.(*ListUptimeCheckIpsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _UptimeCheckService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.UptimeCheckService", - HandlerType: (*UptimeCheckServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListUptimeCheckConfigs", - Handler: _UptimeCheckService_ListUptimeCheckConfigs_Handler, - }, - { - MethodName: "GetUptimeCheckConfig", - Handler: _UptimeCheckService_GetUptimeCheckConfig_Handler, - }, - { - MethodName: "CreateUptimeCheckConfig", - Handler: _UptimeCheckService_CreateUptimeCheckConfig_Handler, - }, - { - MethodName: "UpdateUptimeCheckConfig", - Handler: _UptimeCheckService_UpdateUptimeCheckConfig_Handler, - }, - { - MethodName: "DeleteUptimeCheckConfig", - Handler: _UptimeCheckService_DeleteUptimeCheckConfig_Handler, - }, - { - MethodName: "ListUptimeCheckIps", - Handler: _UptimeCheckService_ListUptimeCheckIps_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/uptime_service.proto", -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service_grpc.pb.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service_grpc.pb.go new file mode 100644 index 0000000000..4fd7c67a3f --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service_grpc.pb.go @@ -0,0 +1,331 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/monitoring/v3/uptime_service.proto + +package monitoringpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + UptimeCheckService_ListUptimeCheckConfigs_FullMethodName = "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs" + UptimeCheckService_GetUptimeCheckConfig_FullMethodName = "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig" + UptimeCheckService_CreateUptimeCheckConfig_FullMethodName = "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig" + UptimeCheckService_UpdateUptimeCheckConfig_FullMethodName = "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig" + UptimeCheckService_DeleteUptimeCheckConfig_FullMethodName = "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig" + UptimeCheckService_ListUptimeCheckIps_FullMethodName = "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps" +) + +// UptimeCheckServiceClient is the client API for UptimeCheckService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type UptimeCheckServiceClient interface { + // Lists the existing valid Uptime check configurations for the project + // (leaving out any invalid configurations). + ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) + // Gets a single Uptime check configuration. + GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) + // Creates a new Uptime check configuration. + CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) + // Updates an Uptime check configuration. You can either replace the entire + // configuration with a new one or replace only certain fields in the current + // configuration by specifying the fields to be updated via `updateMask`. + // Returns the updated configuration. + UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) + // Deletes an Uptime check configuration. Note that this method will fail + // if the Uptime check configuration is referenced by an alert policy or + // other dependent configs that would be rendered invalid by the deletion. + DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Returns the list of IP addresses that checkers run from. + ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) +} + +type uptimeCheckServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewUptimeCheckServiceClient(cc grpc.ClientConnInterface) UptimeCheckServiceClient { + return &uptimeCheckServiceClient{cc} +} + +func (c *uptimeCheckServiceClient) ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) { + out := new(ListUptimeCheckConfigsResponse) + err := c.cc.Invoke(ctx, UptimeCheckService_ListUptimeCheckConfigs_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *uptimeCheckServiceClient) GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { + out := new(UptimeCheckConfig) + err := c.cc.Invoke(ctx, UptimeCheckService_GetUptimeCheckConfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *uptimeCheckServiceClient) CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { + out := new(UptimeCheckConfig) + err := c.cc.Invoke(ctx, UptimeCheckService_CreateUptimeCheckConfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *uptimeCheckServiceClient) UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { + out := new(UptimeCheckConfig) + err := c.cc.Invoke(ctx, UptimeCheckService_UpdateUptimeCheckConfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *uptimeCheckServiceClient) DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, UptimeCheckService_DeleteUptimeCheckConfig_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *uptimeCheckServiceClient) ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) { + out := new(ListUptimeCheckIpsResponse) + err := c.cc.Invoke(ctx, UptimeCheckService_ListUptimeCheckIps_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// UptimeCheckServiceServer is the server API for UptimeCheckService service. +// All implementations should embed UnimplementedUptimeCheckServiceServer +// for forward compatibility +type UptimeCheckServiceServer interface { + // Lists the existing valid Uptime check configurations for the project + // (leaving out any invalid configurations). + ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) + // Gets a single Uptime check configuration. + GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) + // Creates a new Uptime check configuration. + CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) + // Updates an Uptime check configuration. You can either replace the entire + // configuration with a new one or replace only certain fields in the current + // configuration by specifying the fields to be updated via `updateMask`. + // Returns the updated configuration. + UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) + // Deletes an Uptime check configuration. Note that this method will fail + // if the Uptime check configuration is referenced by an alert policy or + // other dependent configs that would be rendered invalid by the deletion. + DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) + // Returns the list of IP addresses that checkers run from. + ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) +} + +// UnimplementedUptimeCheckServiceServer should be embedded to have forward compatible implementations. +type UnimplementedUptimeCheckServiceServer struct { +} + +func (UnimplementedUptimeCheckServiceServer) ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckConfigs not implemented") +} +func (UnimplementedUptimeCheckServiceServer) GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUptimeCheckConfig not implemented") +} +func (UnimplementedUptimeCheckServiceServer) CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateUptimeCheckConfig not implemented") +} +func (UnimplementedUptimeCheckServiceServer) UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUptimeCheckConfig not implemented") +} +func (UnimplementedUptimeCheckServiceServer) DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteUptimeCheckConfig not implemented") +} +func (UnimplementedUptimeCheckServiceServer) ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckIps not implemented") +} + +// UnsafeUptimeCheckServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to UptimeCheckServiceServer will +// result in compilation errors. +type UnsafeUptimeCheckServiceServer interface { + mustEmbedUnimplementedUptimeCheckServiceServer() +} + +func RegisterUptimeCheckServiceServer(s grpc.ServiceRegistrar, srv UptimeCheckServiceServer) { + s.RegisterService(&UptimeCheckService_ServiceDesc, srv) +} + +func _UptimeCheckService_ListUptimeCheckConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUptimeCheckConfigsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UptimeCheckService_ListUptimeCheckConfigs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, req.(*ListUptimeCheckConfigsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UptimeCheckService_GetUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUptimeCheckConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UptimeCheckService_GetUptimeCheckConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, req.(*GetUptimeCheckConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UptimeCheckService_CreateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateUptimeCheckConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UptimeCheckService_CreateUptimeCheckConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, req.(*CreateUptimeCheckConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UptimeCheckService_UpdateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateUptimeCheckConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UptimeCheckService_UpdateUptimeCheckConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, req.(*UpdateUptimeCheckConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UptimeCheckService_DeleteUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteUptimeCheckConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UptimeCheckService_DeleteUptimeCheckConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, req.(*DeleteUptimeCheckConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UptimeCheckService_ListUptimeCheckIps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUptimeCheckIpsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UptimeCheckService_ListUptimeCheckIps_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, req.(*ListUptimeCheckIpsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// UptimeCheckService_ServiceDesc is the grpc.ServiceDesc for UptimeCheckService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var UptimeCheckService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.monitoring.v3.UptimeCheckService", + HandlerType: (*UptimeCheckServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListUptimeCheckConfigs", + Handler: _UptimeCheckService_ListUptimeCheckConfigs_Handler, + }, + { + MethodName: "GetUptimeCheckConfig", + Handler: _UptimeCheckService_GetUptimeCheckConfig_Handler, + }, + { + MethodName: "CreateUptimeCheckConfig", + Handler: _UptimeCheckService_CreateUptimeCheckConfig_Handler, + }, + { + MethodName: "UpdateUptimeCheckConfig", + Handler: _UptimeCheckService_UpdateUptimeCheckConfig_Handler, + }, + { + MethodName: "DeleteUptimeCheckConfig", + Handler: _UptimeCheckService_DeleteUptimeCheckConfig_Handler, + }, + { + MethodName: "ListUptimeCheckIps", + Handler: _UptimeCheckService_ListUptimeCheckIps_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "google/monitoring/v3/uptime_service.proto", +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/notification_channel_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/notification_channel_client.go index 3b36b219e5..6eac8ffe5e 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/notification_channel_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/notification_channel_client.go @@ -381,7 +381,7 @@ func (c *notificationChannelGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *notificationChannelGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/query_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/query_client.go index f792f2bd7e..97fb19974d 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/query_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/query_client.go @@ -183,7 +183,7 @@ func (c *queryGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *queryGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/service_monitoring_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/service_monitoring_client.go index 7dc66e3730..580f76a2a2 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/service_monitoring_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/service_monitoring_client.go @@ -328,7 +328,7 @@ func (c *serviceMonitoringGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *serviceMonitoringGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/snooze_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/snooze_client.go index 5b76a486bb..52f36302fa 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/snooze_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/snooze_client.go @@ -234,7 +234,7 @@ func (c *snoozeGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *snoozeGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/v2/uptime_check_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/v2/uptime_check_client.go index df0ec29575..7e2aed8c80 100644 --- a/vendor/cloud.google.com/go/monitoring/apiv3/v2/uptime_check_client.go +++ b/vendor/cloud.google.com/go/monitoring/apiv3/v2/uptime_check_client.go @@ -284,7 +284,7 @@ func (c *uptimeCheckGRPCClient) Connection() *grpc.ClientConn { // use by Google-written clients. func (c *uptimeCheckGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } diff --git a/vendor/cloud.google.com/go/monitoring/internal/version.go b/vendor/cloud.google.com/go/monitoring/internal/version.go index e199c1168a..e68e821943 100644 --- a/vendor/cloud.google.com/go/monitoring/internal/version.go +++ b/vendor/cloud.google.com/go/monitoring/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.24.2" +const Version = "1.24.3" diff --git a/vendor/cloud.google.com/go/spanner/CHANGES.md b/vendor/cloud.google.com/go/spanner/CHANGES.md deleted file mode 100644 index 88e806c1ba..0000000000 --- a/vendor/cloud.google.com/go/spanner/CHANGES.md +++ /dev/null @@ -1,1431 +0,0 @@ -# Changes - -## [1.84.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.84.0...spanner/v1.84.1) (2025-08-06) - - -### Features - -* **spanner:** Release 1.84.1 ([#12663](https://github.com/googleapis/google-cloud-go/issues/12663)) ([8b410ec](https://github.com/googleapis/google-cloud-go/commit/8b410ec689591a591aecb46831f2f50706cb973f)) - - -### Miscellaneous Chores - -* **spanner:** Release 1.84.1 ([#12665](https://github.com/googleapis/google-cloud-go/issues/12665)) ([a1ce8c2](https://github.com/googleapis/google-cloud-go/commit/a1ce8c26651e7a0ba4f1b20aba4c0fefbab0b972)) - -## [1.84.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.83.0...spanner/v1.84.0) (2025-08-05) - - -### Features - -* **spanner/adapter:** Add last field in AdaptMessageResponse for internal optimization usage ([c574e28](https://github.com/googleapis/google-cloud-go/commit/c574e287f49cc1c3b069b35d95b98da2bc9b948f)) -* **spanner/admin/database:** Proto changes for an internal api ([eeb4b1f](https://github.com/googleapis/google-cloud-go/commit/eeb4b1fe8eb83b73ec31b0bd46e3704bdc0212c3)) -* **spanner:** A new field `snapshot_timestamp` is added to message `.google.spanner.v1.CommitResponse` ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** Add GCP standard otel attributes ([#11652](https://github.com/googleapis/google-cloud-go/issues/11652)) ([f59fcff](https://github.com/googleapis/google-cloud-go/commit/f59fcfffdfcd01ef5b436b76fa83351e2b695920)) - - -### Bug Fixes - -* **spanner:** Context cancel in traces in case of skipping trailers ([#12635](https://github.com/googleapis/google-cloud-go/issues/12635)) ([509dc90](https://github.com/googleapis/google-cloud-go/commit/509dc90cd13061f8302d20451af1d9f7e186641f)) -* **spanner:** Enforce only one resource header ([#12618](https://github.com/googleapis/google-cloud-go/issues/12618)) ([4e04b7e](https://github.com/googleapis/google-cloud-go/commit/4e04b7efd68a979837f78d94ac1dbc930c2e5efb)) -* **spanner:** Fix blind retry for ResourceExhausted ([#12523](https://github.com/googleapis/google-cloud-go/issues/12523)) ([f9b6e88](https://github.com/googleapis/google-cloud-go/commit/f9b6e88bd3fce735ea58f70e3a7634837886d393)) -* **spanner:** Remove stream wrapper for direct path check ([#12622](https://github.com/googleapis/google-cloud-go/issues/12622)) ([88a36cd](https://github.com/googleapis/google-cloud-go/commit/88a36cdfb7f7d1d265f45ed8795b6c08915fe183)) - - -### Documentation - -* **spanner:** A comment for enum value `OPTIMISTIC` in enum `ReadLockMode` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for enum value `PESSIMISTIC` in enum `ReadLockMode` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for enum value `READ_LOCK_MODE_UNSPECIFIED` in enum `ReadLockMode` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for field `commit_stats` in message `.google.spanner.v1.CommitResponse` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for field `exclude_txn_from_change_streams` in message `.google.spanner.v1.TransactionOptions` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for field `multiplexed_session_previous_transaction_id` in message `.google.spanner.v1.TransactionOptions` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for field `precommit_token` in message `.google.spanner.v1.CommitResponse` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for message `.google.spanner.v1.MultiplexedSessionPrecommitToken` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) -* **spanner:** A comment for message `.google.spanner.v1.TransactionOptions` is changed ([ac4970b](https://github.com/googleapis/google-cloud-go/commit/ac4970b5a6318dbfcdca7da5ee256852ca49ea23)) - -## [1.83.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.82.0...spanner/v1.83.0) (2025-06-27) - - -### Features - -* **spanner/spansql:** Add support for TOKENIZE_JSON. ([#12338](https://github.com/googleapis/google-cloud-go/issues/12338)) ([72225a5](https://github.com/googleapis/google-cloud-go/commit/72225a52c0f6bc6eac6d4e450dad0b566e79553f)) -* **spanner/spansql:** Support EXISTS in query parsing ([#12439](https://github.com/googleapis/google-cloud-go/issues/12439)) ([f5cb67b](https://github.com/googleapis/google-cloud-go/commit/f5cb67b104e4d99196064fb4474e0644e90c9a00)) -* **spanner:** Add new change_stream.proto ([40b60a4](https://github.com/googleapis/google-cloud-go/commit/40b60a4b268040ca3debd71ebcbcd126b5d58eaa)) -* **spanner:** Add option for how to call BeginTransaction ([#12436](https://github.com/googleapis/google-cloud-go/issues/12436)) ([2cba13b](https://github.com/googleapis/google-cloud-go/commit/2cba13b8fef80b6cb5980e3b5b2bfc6dc796a03e)) -* **spanner:** Wrap proto mutation ([#12497](https://github.com/googleapis/google-cloud-go/issues/12497)) ([e655889](https://github.com/googleapis/google-cloud-go/commit/e655889e2fd6a55f901d1d8b146e7aa5efdca705)) - - -### Bug Fixes - -* **spanner:** Pointer type custom struct decoder ([#12496](https://github.com/googleapis/google-cloud-go/issues/12496)) ([ac3cafb](https://github.com/googleapis/google-cloud-go/commit/ac3cafbac435a3ac98fd4693bac84a3f4a260c5b)) - -## [1.82.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.81.1...spanner/v1.82.0) (2025-05-20) - - -### Features - -* **spanner/admin/database:** Add throughput_mode to UpdateDatabaseDdlRequest to be used by Spanner Migration Tool. See https ([#12287](https://github.com/googleapis/google-cloud-go/issues/12287)) ([2a9d8ee](https://github.com/googleapis/google-cloud-go/commit/2a9d8eec71a7e6803eb534287c8d2f64903dcddd)) - -## [1.81.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.81.0...spanner/v1.81.1) (2025-05-15) - - -### Bug Fixes - -* **spanner:** Do not export metrics during shutdown if prev export was less than 30 seconds ago ([#12266](https://github.com/googleapis/google-cloud-go/issues/12266)) ([8ad7511](https://github.com/googleapis/google-cloud-go/commit/8ad75111433be5424f9fff8aafd73463cb467734)) -* **spanner:** Fix invalid trace in case of skipping trailers ([#12235](https://github.com/googleapis/google-cloud-go/issues/12235)) ([e54c439](https://github.com/googleapis/google-cloud-go/commit/e54c4398831b5a1c2998f9e8d159f0118aee1d0b)) - -## [1.81.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.80.0...spanner/v1.81.0) (2025-05-09) - - -### Features - -* **spanner/spansql:** Add support for DROP SEARCH INDEX and ALTER SEARCH INDEX ([#11961](https://github.com/googleapis/google-cloud-go/issues/11961)) ([952cd7f](https://github.com/googleapis/google-cloud-go/commit/952cd7fd419af9eb74f5d30a111ae936094b0645)) -* **spanner:** Add support of AFE and GRPC metrics in client-side metrics ([#12067](https://github.com/googleapis/google-cloud-go/issues/12067)) ([7b77038](https://github.com/googleapis/google-cloud-go/commit/7b77038eb4afe31b1a0d42f7c35aeabce0f48810)) - - -### Bug Fixes - -* **spanner:** Row mismatch in SelectAll using custom type ([#12222](https://github.com/googleapis/google-cloud-go/issues/12222)) ([ce6a23a](https://github.com/googleapis/google-cloud-go/commit/ce6a23a45fe66cc12e1b5014d2d45f1968ddc067)) - -## [1.80.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.79.0...spanner/v1.80.0) (2025-04-23) - - -### Features - -* **spanner:** Add interval type support ([#12009](https://github.com/googleapis/google-cloud-go/issues/12009)) ([5152488](https://github.com/googleapis/google-cloud-go/commit/5152488d454f332373800134be1bce0e9ecf3505)) - - -### Bug Fixes - -* **spanner/benchmarks:** Update google.golang.org/api to 0.229.0 ([3319672](https://github.com/googleapis/google-cloud-go/commit/3319672f3dba84a7150772ccb5433e02dab7e201)) -* **spanner/test/opentelemetry/test:** Update google.golang.org/api to 0.229.0 ([3319672](https://github.com/googleapis/google-cloud-go/commit/3319672f3dba84a7150772ccb5433e02dab7e201)) -* **spanner:** Retry INTERNAL retriable auth error ([#12034](https://github.com/googleapis/google-cloud-go/issues/12034)) ([65c7461](https://github.com/googleapis/google-cloud-go/commit/65c7461c06deed3f5b7723a6049e1607f72fcbd4)) -* **spanner:** Update google.golang.org/api to 0.229.0 ([3319672](https://github.com/googleapis/google-cloud-go/commit/3319672f3dba84a7150772ccb5433e02dab7e201)) - - -### Performance Improvements - -* **spanner:** Skip gRPC trailers for StreamingRead & ExecuteStreamingSql ([#11854](https://github.com/googleapis/google-cloud-go/issues/11854)) ([10dc8b7](https://github.com/googleapis/google-cloud-go/commit/10dc8b7e376bdc2ee22378c9334dd6552c135b09)) - -## [1.79.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.78.0...spanner/v1.79.0) (2025-04-08) - - -### Features - -* **spanner:** Allow string values for Scan functions ([#11898](https://github.com/googleapis/google-cloud-go/issues/11898)) ([9989dd0](https://github.com/googleapis/google-cloud-go/commit/9989dd063ba36f39c880b2e7423adde05c703504)) -* **spanner:** New client(s) ([#11946](https://github.com/googleapis/google-cloud-go/issues/11946)) ([c60f28d](https://github.com/googleapis/google-cloud-go/commit/c60f28d5fd99d5356f39276268a68b729130f152)) - -## [1.78.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.77.0...spanner/v1.78.0) (2025-03-24) - - -### Features - -* **spanner/spansql:** Add support for tokenlist and create search index ([#11522](https://github.com/googleapis/google-cloud-go/issues/11522)) ([cd894f8](https://github.com/googleapis/google-cloud-go/commit/cd894f8aea935c43a6c5625c2fd66b132a9b2f8b)) -* **spanner:** Support multiplexed sessions for ReadWriteStmtBasedTransaction ([#11852](https://github.com/googleapis/google-cloud-go/issues/11852)) ([528d9dd](https://github.com/googleapis/google-cloud-go/commit/528d9ddc548c5f05237cf5a0cc4b762ca5f1dd31)) - - -### Bug Fixes - -* **spanner/test/opentelemetry/test:** Update golang.org/x/net to 0.37.0 ([1144978](https://github.com/googleapis/google-cloud-go/commit/11449782c7fb4896bf8b8b9cde8e7441c84fb2fd)) -* **spanner:** Revert the ALTS bound token enablement ([#11799](https://github.com/googleapis/google-cloud-go/issues/11799)) ([68cfb38](https://github.com/googleapis/google-cloud-go/commit/68cfb385ef30c636ab491e6d010cb69e8e1bebf4)) -* **spanner:** Update golang.org/x/net to 0.37.0 ([1144978](https://github.com/googleapis/google-cloud-go/commit/11449782c7fb4896bf8b8b9cde8e7441c84fb2fd)) - -## [1.77.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.76.1...spanner/v1.77.0) (2025-03-03) - - -### Features - -* **spanner:** A new enum `IsolationLevel` is added ([#11624](https://github.com/googleapis/google-cloud-go/issues/11624)) ([2c4fb44](https://github.com/googleapis/google-cloud-go/commit/2c4fb448a2207a6d9988ec3a7646ea6cbb6f65f9)) -* **spanner:** A new field `isolation_level` is added to message `.google.spanner.v1.TransactionOptions` ([2c4fb44](https://github.com/googleapis/google-cloud-go/commit/2c4fb448a2207a6d9988ec3a7646ea6cbb6f65f9)) -* **spanner:** Add a last field in the PartialResultSet ([#11645](https://github.com/googleapis/google-cloud-go/issues/11645)) ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** Add option for LastStatement in transaction ([#11638](https://github.com/googleapis/google-cloud-go/issues/11638)) ([d662a45](https://github.com/googleapis/google-cloud-go/commit/d662a4537c3883d13a612e335477ca875b5cf479)) - - -### Bug Fixes - -* **spanner:** Avoid desructive context augmentation that dropped all headers ([#11659](https://github.com/googleapis/google-cloud-go/issues/11659)) ([594732d](https://github.com/googleapis/google-cloud-go/commit/594732dac26341ec00fe20cd40a6cfab9bde6317)) - - -### Documentation - -* **spanner:** A comment for enum value `OPTIMISTIC` in enum `ReadLockMode` is changed ([2c4fb44](https://github.com/googleapis/google-cloud-go/commit/2c4fb448a2207a6d9988ec3a7646ea6cbb6f65f9)) -* **spanner:** A comment for enum value `PESSIMISTIC` in enum `ReadLockMode` is changed ([2c4fb44](https://github.com/googleapis/google-cloud-go/commit/2c4fb448a2207a6d9988ec3a7646ea6cbb6f65f9)) -* **spanner:** A comment for enum value `READ_LOCK_MODE_UNSPECIFIED` in enum `ReadLockMode` is changed ([2c4fb44](https://github.com/googleapis/google-cloud-go/commit/2c4fb448a2207a6d9988ec3a7646ea6cbb6f65f9)) -* **spanner:** A comment for field `chunked_value` in message `.google.spanner.v1.PartialResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `precommit_token` in message `.google.spanner.v1.PartialResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `precommit_token` in message `.google.spanner.v1.ResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `query_plan` in message `.google.spanner.v1.ResultSetStats` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `row_count_lower_bound` in message `.google.spanner.v1.ResultSetStats` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `row_type` in message `.google.spanner.v1.ResultSetMetadata` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `rows` in message `.google.spanner.v1.ResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `stats` in message `.google.spanner.v1.PartialResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `stats` in message `.google.spanner.v1.ResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for field `values` in message `.google.spanner.v1.PartialResultSet` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for message `ResultSetMetadata` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) -* **spanner:** A comment for message `ResultSetStats` is changed ([794ecf7](https://github.com/googleapis/google-cloud-go/commit/794ecf77993a83fcad01912fb066366ba16adc11)) - -## [1.76.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.76.0...spanner/v1.76.1) (2025-02-21) - - -### Bug Fixes - -* **spanner:** Multiplexed_session_previous_transaction_id is not supported in the request for a non multiplexed session ([#11626](https://github.com/googleapis/google-cloud-go/issues/11626)) ([a940bef](https://github.com/googleapis/google-cloud-go/commit/a940befed09ba7ff0de12c720036bc93fee7e8c7)) - -## [1.76.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.75.0...spanner/v1.76.0) (2025-02-20) - - -### Features - -* **spanner/admin/database:** Add instance partitions field in backup proto ([c6a6dc7](https://github.com/googleapis/google-cloud-go/commit/c6a6dc7c6e63740ec25fc1eb34990f4550a6a1f3)) -* **spanner:** Support multiplexed session for read-write transactions & partition ops ([#11615](https://github.com/googleapis/google-cloud-go/issues/11615)) ([4b40201](https://github.com/googleapis/google-cloud-go/commit/4b40201c5cfa223f3e5c039e18a72d74168f7ae9)) - - -### Performance Improvements - -* **spanner:** Grab debug stack outside of lock ([#11587](https://github.com/googleapis/google-cloud-go/issues/11587)) ([0ee82ff](https://github.com/googleapis/google-cloud-go/commit/0ee82ff4ff385bc632b5cc9630e7e6c4e25a438c)) - -## [1.75.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.74.0...spanner/v1.75.0) (2025-02-02) - - -### Features - -* **spanner/admin/database:** Add AddSplitPoints API ([59fe58a](https://github.com/googleapis/google-cloud-go/commit/59fe58aba61abf69bfb7549c0a03b21bdb4b8b2f)) - - -### Bug Fixes - -* **spanner:** Inject "x-goog-spanner-request-id" into outgoing client context ([#11544](https://github.com/googleapis/google-cloud-go/issues/11544)) ([a8f16ef](https://github.com/googleapis/google-cloud-go/commit/a8f16ef102068ad793b4aa8c6cf8c8f0ca0c2d03)), refs [#11543](https://github.com/googleapis/google-cloud-go/issues/11543) - -## [1.74.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.73.0...spanner/v1.74.0) (2025-01-24) - - -### Features - -* **spanner/admin/instance:** Exposing FreeInstanceAvailability in InstanceConfig ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** Exposing FreeInstanceMetadata in Instance configuration (to define the metadata related to FREE instance type) ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** Exposing InstanceType in Instance configuration (to define PROVISIONED or FREE spanner instance) ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** Exposing QuorumType in InstanceConfig ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** Exposing storage_limit_per_processing_unit in InstanceConfig ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner:** Add the last statement option to ExecuteSqlRequest and ExecuteBatchDmlRequest ([8dedb87](https://github.com/googleapis/google-cloud-go/commit/8dedb878c070cc1e92d62bb9b32358425e3ceffb)) -* **spanner:** Add UUID in Spanner TypeCode enum ([46fc993](https://github.com/googleapis/google-cloud-go/commit/46fc993a3195203a230e2831bee456baaa9f7b1c)) -* **spanner:** Implement generation and propagation of "x-goog-spanner-request-id" Header ([#11048](https://github.com/googleapis/google-cloud-go/issues/11048)) ([10960c1](https://github.com/googleapis/google-cloud-go/commit/10960c162660d183c70837762c8f71aeb6c6e1eb)) - - -### Bug Fixes - -* **spanner/spansql:** PROTO BUNDLE and protobuf type parsing fixes ([#11279](https://github.com/googleapis/google-cloud-go/issues/11279)) ([b1ca714](https://github.com/googleapis/google-cloud-go/commit/b1ca71449eeeda9ff19a57a3a759e17005692d06)) -* **spanner/test/opentelemetry/test:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) -* **spanner:** ReadWriteStmtBasedTransaction would not remember options for retries ([#11443](https://github.com/googleapis/google-cloud-go/issues/11443)) ([7d8f0c5](https://github.com/googleapis/google-cloud-go/commit/7d8f0c556b43265a8cf7715509892ac136d3da4b)) -* **spanner:** Support setting monitoring host via env and override any endpoint override from spanner options with default one ([#11141](https://github.com/googleapis/google-cloud-go/issues/11141)) ([3d61545](https://github.com/googleapis/google-cloud-go/commit/3d6154588da598092e5cffe6c1c5770998037fe1)) -* **spanner:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) - - -### Documentation - -* **spanner/admin/database:** Fix typo timzeone -> timezone ([a694e11](https://github.com/googleapis/google-cloud-go/commit/a694e1152fc75307da6ca8dcfff26cae9189f29c)) -* **spanner/admin/instance:** A comment for enum `DefaultBackupScheduleType` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for enum value `AUTOMATIC` in enum `DefaultBackupScheduleType` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for enum value `GOOGLE_MANAGED` in enum `Type` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for enum value `NONE` in enum `DefaultBackupScheduleType` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for enum value `USER_MANAGED` in enum `Type` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `base_config` in message `.google.spanner.admin.instance.v1.InstanceConfig` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `default_backup_schedule_type` in message `.google.spanner.admin.instance.v1.Instance` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `filter` in message `.google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `filter` in message `.google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `instance_config` in message `.google.spanner.admin.instance.v1.CreateInstanceConfigRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `instance_partition_deadline` in message `.google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `location` in message `.google.spanner.admin.instance.v1.ReplicaInfo` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `node_count` in message `.google.spanner.admin.instance.v1.Instance` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `node_count` in message `.google.spanner.admin.instance.v1.InstancePartition` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `operations` in message `.google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `operations` in message `.google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `optional_replicas` in message `.google.spanner.admin.instance.v1.InstanceConfig` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `parent` in message `.google.spanner.admin.instance.v1.ListInstancePartitionsRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `processing_units` in message `.google.spanner.admin.instance.v1.Instance` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `processing_units` in message `.google.spanner.admin.instance.v1.InstancePartition` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `referencing_backups` in message `.google.spanner.admin.instance.v1.InstancePartition` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `replicas` in message `.google.spanner.admin.instance.v1.InstanceConfig` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `storage_utilization_percent` in message `.google.spanner.admin.instance.v1.AutoscalingConfig` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for field `unreachable` in message `.google.spanner.admin.instance.v1.ListInstancePartitionsResponse` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for message `CreateInstanceConfigRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for message `DeleteInstanceConfigRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for message `UpdateInstanceConfigRequest` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `CreateInstance` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `CreateInstanceConfig` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `CreateInstancePartition` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `ListInstanceConfigOperations` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `ListInstanceConfigs` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `ListInstancePartitionOperations` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `MoveInstance` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `UpdateInstance` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `UpdateInstanceConfig` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) -* **spanner/admin/instance:** A comment for method `UpdateInstancePartition` in service `InstanceAdmin` is changed ([4254053](https://github.com/googleapis/google-cloud-go/commit/42540530e44e5f331e66e0777c4aabf449f5fd90)) - -## [1.73.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.72.0...spanner/v1.73.0) (2024-11-14) - - -### Features - -* **spanner:** Add ResetForRetry method for stmt-based transactions ([#10956](https://github.com/googleapis/google-cloud-go/issues/10956)) ([02c191c](https://github.com/googleapis/google-cloud-go/commit/02c191c5dc13023857812217f63be2395bfcb382)) - - -### Bug Fixes - -* **spanner:** Add safecheck to avoid deadlock when creating multiplex session ([#11131](https://github.com/googleapis/google-cloud-go/issues/11131)) ([8ee5d05](https://github.com/googleapis/google-cloud-go/commit/8ee5d05e288c7105ddb1722071d6719933effea4)) -* **spanner:** Allow non default service account only when direct path is enabled ([#11046](https://github.com/googleapis/google-cloud-go/issues/11046)) ([4250788](https://github.com/googleapis/google-cloud-go/commit/42507887523f41d0507ca8b1772235846947c3e0)) -* **spanner:** Use spanner options when initializing monitoring exporter ([#11109](https://github.com/googleapis/google-cloud-go/issues/11109)) ([81413f3](https://github.com/googleapis/google-cloud-go/commit/81413f3647a0ea406f25d4159db19b7ad9f0682b)) - -## [1.72.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.71.0...spanner/v1.72.0) (2024-11-07) - - -### Features - -* **spanner/spansql:** Add support for protobuf column types & Proto bundles ([#10945](https://github.com/googleapis/google-cloud-go/issues/10945)) ([91c6f0f](https://github.com/googleapis/google-cloud-go/commit/91c6f0fcaadfb7bd983e070e6ceffc8aeba7d5a2)), refs [#10944](https://github.com/googleapis/google-cloud-go/issues/10944) - - -### Bug Fixes - -* **spanner:** Skip exporting metrics if attempt or operation is not captured. ([#11095](https://github.com/googleapis/google-cloud-go/issues/11095)) ([1d074b5](https://github.com/googleapis/google-cloud-go/commit/1d074b520c7a368fb8a7a27574ef56a120665c64)) - -## [1.71.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.70.0...spanner/v1.71.0) (2024-11-01) - - -### Features - -* **spanner/admin/instance:** Add support for Cloud Spanner Default Backup Schedules ([706ecb2](https://github.com/googleapis/google-cloud-go/commit/706ecb2c813da3109035b986a642ca891a33847f)) -* **spanner:** Client built in metrics ([#10998](https://github.com/googleapis/google-cloud-go/issues/10998)) ([d81a1a7](https://github.com/googleapis/google-cloud-go/commit/d81a1a75b9efbf7104bb077300364f8d63da89b5)) - - -### Bug Fixes - -* **spanner/test/opentelemetry/test:** Update google.golang.org/api to v0.203.0 ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e)) -* **spanner/test/opentelemetry/test:** WARNING: On approximately Dec 1, 2024, an update to Protobuf will change service registration function signatures to use an interface instead of a concrete type in generated .pb.go files. This change is expected to affect very few if any users of this client library. For more information, see https://togithub.com/googleapis/google-cloud-go/issues/11020. ([2b8ca4b](https://github.com/googleapis/google-cloud-go/commit/2b8ca4b4127ce3025c7a21cc7247510e07cc5625)) -* **spanner:** Attempt latency for streaming call should capture the total latency till decoding of protos ([#11039](https://github.com/googleapis/google-cloud-go/issues/11039)) ([255c6bf](https://github.com/googleapis/google-cloud-go/commit/255c6bfcdd3e844dcf602a829bfa2ce495bcd72e)) -* **spanner:** Decode PROTO to custom type variant of base type ([#11007](https://github.com/googleapis/google-cloud-go/issues/11007)) ([5e363a3](https://github.com/googleapis/google-cloud-go/commit/5e363a31cc9f2616832540ca82aa5cb998a3938c)) -* **spanner:** Update google.golang.org/api to v0.203.0 ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e)) -* **spanner:** WARNING: On approximately Dec 1, 2024, an update to Protobuf will change service registration function signatures to use an interface instead of a concrete type in generated .pb.go files. This change is expected to affect very few if any users of this client library. For more information, see https://togithub.com/googleapis/google-cloud-go/issues/11020. ([2b8ca4b](https://github.com/googleapis/google-cloud-go/commit/2b8ca4b4127ce3025c7a21cc7247510e07cc5625)) - -## [1.70.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.69.0...spanner/v1.70.0) (2024-10-14) - - -### Features - -* **spanner/admin/instance:** Define ReplicaComputeCapacity and AsymmetricAutoscalingOption ([78d8513](https://github.com/googleapis/google-cloud-go/commit/78d8513f7e31c6ef118bdfc784049b8c7f1e3249)) -* **spanner:** Add INTERVAL API ([78d8513](https://github.com/googleapis/google-cloud-go/commit/78d8513f7e31c6ef118bdfc784049b8c7f1e3249)) -* **spanner:** Add new QueryMode enum values (WITH_STATS, WITH_PLAN_AND_STATS) ([78d8513](https://github.com/googleapis/google-cloud-go/commit/78d8513f7e31c6ef118bdfc784049b8c7f1e3249)) - - -### Documentation - -* **spanner/admin/instance:** A comment for field `node_count` in message `spanner.admin.instance.v1.Instance` is changed ([78d8513](https://github.com/googleapis/google-cloud-go/commit/78d8513f7e31c6ef118bdfc784049b8c7f1e3249)) -* **spanner/admin/instance:** A comment for field `processing_units` in message `spanner.admin.instance.v1.Instance` is changed ([78d8513](https://github.com/googleapis/google-cloud-go/commit/78d8513f7e31c6ef118bdfc784049b8c7f1e3249)) -* **spanner:** Update comment for PROFILE QueryMode ([78d8513](https://github.com/googleapis/google-cloud-go/commit/78d8513f7e31c6ef118bdfc784049b8c7f1e3249)) - -## [1.69.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.68.0...spanner/v1.69.0) (2024-10-03) - - -### Features - -* **spanner:** Add x-goog-spanner-end-to-end-tracing header for requests to Spanner ([#10241](https://github.com/googleapis/google-cloud-go/issues/10241)) ([7f61cd5](https://github.com/googleapis/google-cloud-go/commit/7f61cd579f7e4ed4f1ac161f2c2a28e931406f16)) - - -### Bug Fixes - -* **spanner:** Handle errors ([#10943](https://github.com/googleapis/google-cloud-go/issues/10943)) ([c67f964](https://github.com/googleapis/google-cloud-go/commit/c67f964de364808c02085dda61fa53e2b2fda850)) - - -### Performance Improvements - -* **spanner:** Use passthrough with emulator endpoint ([#10947](https://github.com/googleapis/google-cloud-go/issues/10947)) ([9e964dd](https://github.com/googleapis/google-cloud-go/commit/9e964ddc01a54819f25435cfcc9d5b37c91f5a1d)) - -## [1.68.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.67.0...spanner/v1.68.0) (2024-09-25) - - -### Features - -* **spanner:** Add support for Go 1.23 iterators ([84461c0](https://github.com/googleapis/google-cloud-go/commit/84461c0ba464ec2f951987ba60030e37c8a8fc18)) - - -### Bug Fixes - -* **spanner/test:** Bump dependencies ([2ddeb15](https://github.com/googleapis/google-cloud-go/commit/2ddeb1544a53188a7592046b98913982f1b0cf04)) -* **spanner:** Bump dependencies ([2ddeb15](https://github.com/googleapis/google-cloud-go/commit/2ddeb1544a53188a7592046b98913982f1b0cf04)) -* **spanner:** Check errors in tests ([#10738](https://github.com/googleapis/google-cloud-go/issues/10738)) ([971bfb8](https://github.com/googleapis/google-cloud-go/commit/971bfb85ee7bf8c636117a6424280a4323b5fb3c)) -* **spanner:** Enable toStruct support for structs with proto message pointer fields ([#10704](https://github.com/googleapis/google-cloud-go/issues/10704)) ([42cdde6](https://github.com/googleapis/google-cloud-go/commit/42cdde6ee34fc9058dc47c9c9ab39ba91b6b9c58)) -* **spanner:** Ensure defers run at the right time in tests ([#9759](https://github.com/googleapis/google-cloud-go/issues/9759)) ([7ef0ded](https://github.com/googleapis/google-cloud-go/commit/7ef0ded2502dbb37f07bc93bc2e868e29f7121c4)) -* **spanner:** Increase spanner ping timeout to give backend more time to process executeSQL requests ([#10874](https://github.com/googleapis/google-cloud-go/issues/10874)) ([6997991](https://github.com/googleapis/google-cloud-go/commit/6997991e2325e7a66d3ffa60c27622a1a13041a8)) -* **spanner:** Json null handling ([#10660](https://github.com/googleapis/google-cloud-go/issues/10660)) ([4c519e3](https://github.com/googleapis/google-cloud-go/commit/4c519e37a124defc3451adfdbd0883a5e081eb2f)) -* **spanner:** Support custom encoding and decoding of protos ([#10799](https://github.com/googleapis/google-cloud-go/issues/10799)) ([d410907](https://github.com/googleapis/google-cloud-go/commit/d410907f3e52bcc64bd92e0a341777c1277a6418)) -* **spanner:** Unnecessary string formatting fixes ([#10736](https://github.com/googleapis/google-cloud-go/issues/10736)) ([1efe5c4](https://github.com/googleapis/google-cloud-go/commit/1efe5c4275dca6d739691e89b8d460b97160d953)) -* **spanner:** Wait for things to complete ([#10095](https://github.com/googleapis/google-cloud-go/issues/10095)) ([7785cad](https://github.com/googleapis/google-cloud-go/commit/7785cad89effbc8c4e67043368f96d4768cdb40f)) - - -### Performance Improvements - -* **spanner:** Better error handling ([#10734](https://github.com/googleapis/google-cloud-go/issues/10734)) ([c342f65](https://github.com/googleapis/google-cloud-go/commit/c342f6550c24e3a16e32d1cd61c6fcfeaed77c7b)), refs [#9749](https://github.com/googleapis/google-cloud-go/issues/9749) - - -### Documentation - -* **spanner:** Fix Key related document code to add package name ([#10711](https://github.com/googleapis/google-cloud-go/issues/10711)) ([bbe7b9c](https://github.com/googleapis/google-cloud-go/commit/bbe7b9ceed1deb85a4f40ea95572595ce63ff002)) - -## [1.67.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.66.0...spanner/v1.67.0) (2024-08-15) - - -### Features - -* **spanner/admin/database:** Add resource reference annotation to backup schedules ([#10677](https://github.com/googleapis/google-cloud-go/issues/10677)) ([6593c0d](https://github.com/googleapis/google-cloud-go/commit/6593c0d62d48751c857bce3d3f858127467a4489)) -* **spanner/admin/instance:** Add edition field to the instance proto ([6593c0d](https://github.com/googleapis/google-cloud-go/commit/6593c0d62d48751c857bce3d3f858127467a4489)) -* **spanner:** Support commit options in mutation operations. ([#10668](https://github.com/googleapis/google-cloud-go/issues/10668)) ([62a56f9](https://github.com/googleapis/google-cloud-go/commit/62a56f953d3b8fe82083c42926831c2728312b9c)) - - -### Bug Fixes - -* **spanner/test/opentelemetry/test:** Update google.golang.org/api to v0.191.0 ([5b32644](https://github.com/googleapis/google-cloud-go/commit/5b32644eb82eb6bd6021f80b4fad471c60fb9d73)) -* **spanner:** Update google.golang.org/api to v0.191.0 ([5b32644](https://github.com/googleapis/google-cloud-go/commit/5b32644eb82eb6bd6021f80b4fad471c60fb9d73)) - - -### Documentation - -* **spanner/admin/database:** Add an example to filter backups based on schedule name ([6593c0d](https://github.com/googleapis/google-cloud-go/commit/6593c0d62d48751c857bce3d3f858127467a4489)) - -## [1.66.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.65.0...spanner/v1.66.0) (2024-08-07) - - -### Features - -* **spanner/admin/database:** Add support for Cloud Spanner Incremental Backups ([d949cc0](https://github.com/googleapis/google-cloud-go/commit/d949cc0e5d44af62154d9d5fd393f25a852f93ed)) -* **spanner:** Add support of multiplexed session support in writeAtleastOnce mutations ([#10646](https://github.com/googleapis/google-cloud-go/issues/10646)) ([54009ea](https://github.com/googleapis/google-cloud-go/commit/54009eab1c3b11a28531ad9e621917d01c9e5339)) -* **spanner:** Add support of using multiplexed session with ReadOnlyTransactions ([#10269](https://github.com/googleapis/google-cloud-go/issues/10269)) ([7797022](https://github.com/googleapis/google-cloud-go/commit/7797022e51d1ac07b8d919c421a8bfdf34a1d53c)) - -## [1.65.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.64.0...spanner/v1.65.0) (2024-07-29) - - -### Features - -* **spanner/admin/database:** Add support for Cloud Spanner Scheduled Backups ([3b15f9d](https://github.com/googleapis/google-cloud-go/commit/3b15f9db9e0ee3bff3d8d5aafc82cdc2a31d60fc)) -* **spanner:** Add RESOURCE_EXHAUSTED to retryable transaction codes ([#10412](https://github.com/googleapis/google-cloud-go/issues/10412)) ([29b52dc](https://github.com/googleapis/google-cloud-go/commit/29b52dc40f3d1a6ffe7fa40e6142d8035c0d95ee)) - - -### Bug Fixes - -* **spanner/test:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) -* **spanner/test:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5)) -* **spanner/test:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) -* **spanner:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) -* **spanner:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5)) -* **spanner:** Fix negative values for max_in_use_sessions metrics [#10449](https://github.com/googleapis/google-cloud-go/issues/10449) ([#10508](https://github.com/googleapis/google-cloud-go/issues/10508)) ([4e180f4](https://github.com/googleapis/google-cloud-go/commit/4e180f4539012eb6e3d1d2788e68b291ef7230c3)) -* **spanner:** HealthCheck should not decrement num_in_use sessions ([#10480](https://github.com/googleapis/google-cloud-go/issues/10480)) ([9b2b47f](https://github.com/googleapis/google-cloud-go/commit/9b2b47f107153d624d56709d9a8e6a6b72c39447)) -* **spanner:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) - -## [1.64.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.63.0...spanner/v1.64.0) (2024-06-29) - - -### Features - -* **spanner:** Add field lock_hint in spanner.proto ([3df3c04](https://github.com/googleapis/google-cloud-go/commit/3df3c04f0dffad3fa2fe272eb7b2c263801b9ada)) -* **spanner:** Add field order_by in spanner.proto ([3df3c04](https://github.com/googleapis/google-cloud-go/commit/3df3c04f0dffad3fa2fe272eb7b2c263801b9ada)) -* **spanner:** Add LockHint feature ([#10382](https://github.com/googleapis/google-cloud-go/issues/10382)) ([64bdcb1](https://github.com/googleapis/google-cloud-go/commit/64bdcb1a6a462d41a62d3badea6814425e271f22)) -* **spanner:** Add OrderBy feature ([#10289](https://github.com/googleapis/google-cloud-go/issues/10289)) ([07b8bd2](https://github.com/googleapis/google-cloud-go/commit/07b8bd2f5dc738e0293305dfc459c13632d5ea65)) -* **spanner:** Add support of checking row not found errors from ReadRow and ReadRowUsingIndex ([#10405](https://github.com/googleapis/google-cloud-go/issues/10405)) ([5cb0c26](https://github.com/googleapis/google-cloud-go/commit/5cb0c26013eeb3bbe51174bee628a20c2ec775e0)) - - -### Bug Fixes - -* **spanner:** Fix data-race caused by TrackSessionHandle ([#10321](https://github.com/googleapis/google-cloud-go/issues/10321)) ([23c5fff](https://github.com/googleapis/google-cloud-go/commit/23c5fffd06bcde408db50a981c015921cd4ecf0e)), refs [#10320](https://github.com/googleapis/google-cloud-go/issues/10320) -* **spanner:** Fix negative values for max_in_use_sessions metrics ([#10449](https://github.com/googleapis/google-cloud-go/issues/10449)) ([a1e198a](https://github.com/googleapis/google-cloud-go/commit/a1e198a9b18bd2f92c3438e4f609412047f8ccf4)) -* **spanner:** Prevent possible panic for Session not found errors ([#10386](https://github.com/googleapis/google-cloud-go/issues/10386)) ([ba9711f](https://github.com/googleapis/google-cloud-go/commit/ba9711f87ec871153ae00cfd0827bce17c31ee9c)), refs [#10385](https://github.com/googleapis/google-cloud-go/issues/10385) - -## [1.63.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.62.0...spanner/v1.63.0) (2024-05-24) - - -### Features - -* **spanner:** Fix schema naming ([#10194](https://github.com/googleapis/google-cloud-go/issues/10194)) ([215e0c8](https://github.com/googleapis/google-cloud-go/commit/215e0c8125ea05246c834984bde1ca698c7dde4c)) -* **spanner:** Update go mod to use latest grpc lib ([#10218](https://github.com/googleapis/google-cloud-go/issues/10218)) ([adf91f9](https://github.com/googleapis/google-cloud-go/commit/adf91f9fd37faa39ec7c6f9200273220f65d2a82)) - -## [1.62.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.61.0...spanner/v1.62.0) (2024-05-15) - - -### Features - -* **spanner/admin/database:** Add support for multi region encryption config ([3e25053](https://github.com/googleapis/google-cloud-go/commit/3e250530567ee81ed4f51a3856c5940dbec35289)) -* **spanner/executor:** Add QueryCancellationAction message in executor protos ([292e812](https://github.com/googleapis/google-cloud-go/commit/292e81231b957ae7ac243b47b8926564cee35920)) -* **spanner:** Add `RESOURCE_EXHAUSTED` to the list of retryable error codes ([1d757c6](https://github.com/googleapis/google-cloud-go/commit/1d757c66478963d6cbbef13fee939632c742759c)) -* **spanner:** Add support for Proto Columns ([#9315](https://github.com/googleapis/google-cloud-go/issues/9315)) ([3ffbbbe](https://github.com/googleapis/google-cloud-go/commit/3ffbbbe50225684f4211c6dbe3ca25acb3d02b8e)) - - -### Bug Fixes - -* **spanner:** Add ARRAY keywords to keywords ([#10079](https://github.com/googleapis/google-cloud-go/issues/10079)) ([8e675cd](https://github.com/googleapis/google-cloud-go/commit/8e675cd0ccf12c6912209aa5c56092db3716c40d)) -* **spanner:** Handle unused errors ([#10067](https://github.com/googleapis/google-cloud-go/issues/10067)) ([a0c097c](https://github.com/googleapis/google-cloud-go/commit/a0c097c724b609cfa428e69f89075f02a3782a7b)) -* **spanner:** Remove json-iterator dependency ([#10099](https://github.com/googleapis/google-cloud-go/issues/10099)) ([3917cca](https://github.com/googleapis/google-cloud-go/commit/3917ccac57c403b3b4d07514ac10a66a86e298c0)), refs [#9380](https://github.com/googleapis/google-cloud-go/issues/9380) -* **spanner:** Update staleness bound ([#10118](https://github.com/googleapis/google-cloud-go/issues/10118)) ([c07f1e4](https://github.com/googleapis/google-cloud-go/commit/c07f1e47c06387b696abb1edbfa339b391ec1fd5)) - -## [1.61.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.60.0...spanner/v1.61.0) (2024-04-30) - - -### Features - -* **spanner/admin/instance:** Adding `EXPECTED_FULFILLMENT_PERIOD` to the indicate instance creation times (with `FULFILLMENT_PERIOD_NORMAL` or `FULFILLMENT_PERIOD_EXTENDED` ENUM) with the extended instance creation time triggered by On-Demand Capacity... ([#9693](https://github.com/googleapis/google-cloud-go/issues/9693)) ([aa93790](https://github.com/googleapis/google-cloud-go/commit/aa93790132ba830b4c97d217ef02764e2fb1b8ea)) -* **spanner/executor:** Add SessionPoolOptions, SpannerOptions protos in executor protos ([2cdc40a](https://github.com/googleapis/google-cloud-go/commit/2cdc40a0b4288f5ab5f2b2b8f5c1d6453a9c81ec)) -* **spanner:** Add support for change streams transaction exclusion option ([#9779](https://github.com/googleapis/google-cloud-go/issues/9779)) ([979ce94](https://github.com/googleapis/google-cloud-go/commit/979ce94758442b1224a78a4f3b1f5d592ab51660)) -* **spanner:** Support MultiEndpoint ([#9565](https://github.com/googleapis/google-cloud-go/issues/9565)) ([0ac0d26](https://github.com/googleapis/google-cloud-go/commit/0ac0d265abedf946b05294ef874a892b2c5d6067)) - - -### Bug Fixes - -* **spanner/test/opentelemetry/test:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4)) -* **spanner:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4)) -* **spanner:** Fix uint8 conversion ([9221c7f](https://github.com/googleapis/google-cloud-go/commit/9221c7fa12cef9d5fb7ddc92f41f1d6204971c7b)) - -## [1.60.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.59.0...spanner/v1.60.0) (2024-03-19) - - -### Features - -* **spanner:** Allow attempt direct path xds via env var ([e4b663c](https://github.com/googleapis/google-cloud-go/commit/e4b663cdcb6e010c5a8ac791e5624407aaa191b3)) - -## [1.59.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.58.0...spanner/v1.59.0) (2024-03-13) - - -### Features - -* **spanner/spansql:** Support Table rename & Table synonym ([#9275](https://github.com/googleapis/google-cloud-go/issues/9275)) ([9b97ce7](https://github.com/googleapis/google-cloud-go/commit/9b97ce75d36980fdaa06f15b0398b7b65e0d6082)) -* **spanner:** Add support of float32 type ([#9525](https://github.com/googleapis/google-cloud-go/issues/9525)) ([87d7ea9](https://github.com/googleapis/google-cloud-go/commit/87d7ea97787a56b18506b53e9b26d037f92759ca)) - - -### Bug Fixes - -* **spanner:** Add JSON_PARSE_ARRAY to funcNames slice ([#9557](https://github.com/googleapis/google-cloud-go/issues/9557)) ([f799597](https://github.com/googleapis/google-cloud-go/commit/f79959722352ead48bfb3efb3001fddd3a56db65)) - -## [1.58.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.57.0...spanner/v1.58.0) (2024-03-06) - - -### Features - -* **spanner/admin/instance:** Add instance partition support to spanner instance proto ([ae1f547](https://github.com/googleapis/google-cloud-go/commit/ae1f5472bff1b476c3fd58e590ec135185446daf)) -* **spanner:** Add field for multiplexed session in spanner.proto ([a86aa8e](https://github.com/googleapis/google-cloud-go/commit/a86aa8e962b77d152ee6cdd433ad94967150ef21)) -* **spanner:** SelectAll struct spanner tag annotation match should be case-insensitive ([#9460](https://github.com/googleapis/google-cloud-go/issues/9460)) ([6cd6a73](https://github.com/googleapis/google-cloud-go/commit/6cd6a73be87a261729d3b6b45f3d28be93c3fdb3)) -* **spanner:** Update TransactionOptions to include new option exclude_txn_from_change_streams ([0195fe9](https://github.com/googleapis/google-cloud-go/commit/0195fe9292274ff9d86c71079a8e96ed2e5f9331)) - -## [1.57.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.56.0...spanner/v1.57.0) (2024-02-13) - - -### Features - -* **spanner:** Add OpenTelemetry implementation ([#9254](https://github.com/googleapis/google-cloud-go/issues/9254)) ([fc51cc2](https://github.com/googleapis/google-cloud-go/commit/fc51cc2ac71e8fb0b3e381379dc343630ed441e7)) -* **spanner:** Support max_commit_delay in Spanner transactions ([#9299](https://github.com/googleapis/google-cloud-go/issues/9299)) ([a8078f0](https://github.com/googleapis/google-cloud-go/commit/a8078f0b841281bd439c548db9d303f6b5ce54e6)) - - -### Bug Fixes - -* **spanner:** Enable universe domain resolution options ([fd1d569](https://github.com/googleapis/google-cloud-go/commit/fd1d56930fa8a747be35a224611f4797b8aeb698)) -* **spanner:** Internal test package should import local version ([#9416](https://github.com/googleapis/google-cloud-go/issues/9416)) ([f377281](https://github.com/googleapis/google-cloud-go/commit/f377281a73553af9a9a2bee2181efe2e354e1c68)) -* **spanner:** SelectAll struct fields match should be case-insensitive ([#9417](https://github.com/googleapis/google-cloud-go/issues/9417)) ([7ff5356](https://github.com/googleapis/google-cloud-go/commit/7ff535672b868e6cba54abdf5dd92b9199e4d1d4)) -* **spanner:** Support time.Time and other custom types using SelectAll ([#9382](https://github.com/googleapis/google-cloud-go/issues/9382)) ([dc21234](https://github.com/googleapis/google-cloud-go/commit/dc21234268b08a4a21b2b3a1ed9ed74d65a289f0)) - - -### Documentation - -* **spanner:** Update the comment regarding eligible SQL shapes for PartitionQuery ([e60a6ba](https://github.com/googleapis/google-cloud-go/commit/e60a6ba01acf2ef2e8d12e23ed5c6e876edeb1b7)) - -## [1.56.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.55.0...spanner/v1.56.0) (2024-01-30) - - -### Features - -* **spanner/admin/database:** Add proto descriptors for proto and enum types in create/update/get database ddl requests ([97d62c7](https://github.com/googleapis/google-cloud-go/commit/97d62c7a6a305c47670ea9c147edc444f4bf8620)) -* **spanner/spansql:** Add support for CREATE VIEW with SQL SECURITY DEFINER ([#8754](https://github.com/googleapis/google-cloud-go/issues/8754)) ([5f156e8](https://github.com/googleapis/google-cloud-go/commit/5f156e8c88f4729f569ee5b4ac9378dda3907997)) -* **spanner:** Add FLOAT32 enum to TypeCode ([97d62c7](https://github.com/googleapis/google-cloud-go/commit/97d62c7a6a305c47670ea9c147edc444f4bf8620)) -* **spanner:** Add max_commit_delay API ([af2f8b4](https://github.com/googleapis/google-cloud-go/commit/af2f8b4f3401c0b12dadb2c504aa0f902aee76de)) -* **spanner:** Add proto and enum types ([00b9900](https://github.com/googleapis/google-cloud-go/commit/00b990061592a20a181e61faa6964b45205b76a7)) -* **spanner:** Add SelectAll method to decode from Spanner iterator.Rows to golang struct ([#9206](https://github.com/googleapis/google-cloud-go/issues/9206)) ([802088f](https://github.com/googleapis/google-cloud-go/commit/802088f1322752bb9ce9bab1315c3fed6b3a99aa)) - -## [1.55.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.54.0...spanner/v1.55.0) (2024-01-08) - - -### Features - -* **spanner:** Add directed reads feature ([#7668](https://github.com/googleapis/google-cloud-go/issues/7668)) ([a42604a](https://github.com/googleapis/google-cloud-go/commit/a42604a3a6ea90c38a2ff90d036a79fd070174fd)) - -## [1.54.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.53.1...spanner/v1.54.0) (2023-12-14) - - -### Features - -* **spanner/executor:** Add autoscaling config in the instance to support autoscaling in systests ([29effe6](https://github.com/googleapis/google-cloud-go/commit/29effe600e16f24a127a1422ec04263c4f7a600a)) -* **spanner:** New clients ([#9127](https://github.com/googleapis/google-cloud-go/issues/9127)) ([2c97389](https://github.com/googleapis/google-cloud-go/commit/2c97389ddacdfc140a06f74498cc2753bb040a4d)) - - -### Bug Fixes - -* **spanner:** Use json.Number for decoding unknown values from spanner ([#9054](https://github.com/googleapis/google-cloud-go/issues/9054)) ([40d1392](https://github.com/googleapis/google-cloud-go/commit/40d139297bd484408c63c9d6ad1d7035d9673c1c)) - -## [1.53.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.53.0...spanner/v1.53.1) (2023-12-01) - - -### Bug Fixes - -* **spanner:** Handle nil error when cleaning up long running session ([#9052](https://github.com/googleapis/google-cloud-go/issues/9052)) ([a93bc26](https://github.com/googleapis/google-cloud-go/commit/a93bc2696bf9ae60aae93af0e8c4911b58514d31)) -* **spanner:** MarshalJSON function caused errors for certain values ([#9063](https://github.com/googleapis/google-cloud-go/issues/9063)) ([afe7c98](https://github.com/googleapis/google-cloud-go/commit/afe7c98036c198995075530d4228f1f4ae3f1222)) - -## [1.53.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.52.0...spanner/v1.53.0) (2023-11-15) - - -### Features - -* **spanner:** Enable long running transaction clean up ([#8969](https://github.com/googleapis/google-cloud-go/issues/8969)) ([5d181bb](https://github.com/googleapis/google-cloud-go/commit/5d181bb3a6fea55b8d9d596213516129006bdae2)) - -## [1.52.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.51.0...spanner/v1.52.0) (2023-11-14) - - -### Features - -* **spanner:** Add directed_read_option in spanner.proto ([#8950](https://github.com/googleapis/google-cloud-go/issues/8950)) ([24e410e](https://github.com/googleapis/google-cloud-go/commit/24e410efbb6add2d33ecfb6ad98b67dc8894e578)) -* **spanner:** Add DML, DQL, Mutation, Txn Actions and Utility methods for executor framework ([#8976](https://github.com/googleapis/google-cloud-go/issues/8976)) ([ca76671](https://github.com/googleapis/google-cloud-go/commit/ca7667194007394bdcade8058fa84c1fe19c06b1)) -* **spanner:** Add lastUseTime property to session ([#8942](https://github.com/googleapis/google-cloud-go/issues/8942)) ([b560cfc](https://github.com/googleapis/google-cloud-go/commit/b560cfcf967ff6dec0cd6ac4b13045470945f30b)) -* **spanner:** Add method ([#8945](https://github.com/googleapis/google-cloud-go/issues/8945)) ([411a51e](https://github.com/googleapis/google-cloud-go/commit/411a51e320fe21ffe830cdaa6bb4e4d77f7a996b)) -* **spanner:** Add methods to return Row fields ([#8953](https://github.com/googleapis/google-cloud-go/issues/8953)) ([e22e70f](https://github.com/googleapis/google-cloud-go/commit/e22e70f44f83aab4f8b89af28fcd24216d2e740e)) -* **spanner:** Add PG.OID type cod annotation ([#8749](https://github.com/googleapis/google-cloud-go/issues/8749)) ([ffb0dda](https://github.com/googleapis/google-cloud-go/commit/ffb0ddabf3d9822ba8120cabaf25515fd32e9615)) -* **spanner:** Admin, Batch, Partition actions for executor framework ([#8932](https://github.com/googleapis/google-cloud-go/issues/8932)) ([b2db89e](https://github.com/googleapis/google-cloud-go/commit/b2db89e03a125cde31a7ea86eecc3fbb08ebd281)) -* **spanner:** Auto-generated executor framework proto changes ([#8713](https://github.com/googleapis/google-cloud-go/issues/8713)) ([2ca939c](https://github.com/googleapis/google-cloud-go/commit/2ca939cba4bc240f2bfca7d5683708fd3a94fd74)) -* **spanner:** BatchWrite ([#8652](https://github.com/googleapis/google-cloud-go/issues/8652)) ([507d232](https://github.com/googleapis/google-cloud-go/commit/507d232cdb09bd941ebfe800bdd4bfc020346f5d)) -* **spanner:** Executor framework server and worker proxy ([#8714](https://github.com/googleapis/google-cloud-go/issues/8714)) ([6b931ee](https://github.com/googleapis/google-cloud-go/commit/6b931eefb9aa4a18758788167bdcf9e2fad1d7b9)) -* **spanner:** Fix falkiness ([#8977](https://github.com/googleapis/google-cloud-go/issues/8977)) ([ca8d3cb](https://github.com/googleapis/google-cloud-go/commit/ca8d3cbf80f7fc2f47beb53b95138040c83097db)) -* **spanner:** Long running transaction clean up - disabled ([#8177](https://github.com/googleapis/google-cloud-go/issues/8177)) ([461d11e](https://github.com/googleapis/google-cloud-go/commit/461d11e913414e9de822e5f1acdf19c8f3f953d5)) -* **spanner:** Update code for session leaks cleanup ([#8978](https://github.com/googleapis/google-cloud-go/issues/8978)) ([cc83515](https://github.com/googleapis/google-cloud-go/commit/cc83515d0c837c8b1596a97b6f09d519a0f75f72)) - - -### Bug Fixes - -* **spanner:** Bump google.golang.org/api to v0.149.0 ([8d2ab9f](https://github.com/googleapis/google-cloud-go/commit/8d2ab9f320a86c1c0fab90513fc05861561d0880)) -* **spanner:** Expose Mutations field in MutationGroup ([#8923](https://github.com/googleapis/google-cloud-go/issues/8923)) ([42180cf](https://github.com/googleapis/google-cloud-go/commit/42180cf1134885188270f75126a65fa71b03c033)) -* **spanner:** Update grpc-go to v1.56.3 ([343cea8](https://github.com/googleapis/google-cloud-go/commit/343cea8c43b1e31ae21ad50ad31d3b0b60143f8c)) -* **spanner:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7)) - - -### Documentation - -* **spanner:** Updated comment formatting ([24e410e](https://github.com/googleapis/google-cloud-go/commit/24e410efbb6add2d33ecfb6ad98b67dc8894e578)) - -## [1.51.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.50.0...spanner/v1.51.0) (2023-10-17) - - -### Features - -* **spanner/admin/instance:** Add autoscaling config to the instance proto ([#8701](https://github.com/googleapis/google-cloud-go/issues/8701)) ([56ce871](https://github.com/googleapis/google-cloud-go/commit/56ce87195320634b07ae0b012efcc5f2b3813fb0)) - - -### Bug Fixes - -* **spanner:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d)) - -## [1.50.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.49.0...spanner/v1.50.0) (2023-10-03) - - -### Features - -* **spanner/spansql:** Add support for aggregate functions ([#8498](https://github.com/googleapis/google-cloud-go/issues/8498)) ([d440d75](https://github.com/googleapis/google-cloud-go/commit/d440d75f19286653afe4bc81a5f2efcfc4fa152c)) -* **spanner/spansql:** Add support for bit functions, sequence functions and GENERATE_UUID ([#8482](https://github.com/googleapis/google-cloud-go/issues/8482)) ([3789882](https://github.com/googleapis/google-cloud-go/commit/3789882c8b30a6d3100a56c1dcc8844952605637)) -* **spanner/spansql:** Add support for SEQUENCE statements ([#8481](https://github.com/googleapis/google-cloud-go/issues/8481)) ([ccd0205](https://github.com/googleapis/google-cloud-go/commit/ccd020598921f1b5550587c95b4ceddf580705bb)) -* **spanner:** Add BatchWrite API ([02a899c](https://github.com/googleapis/google-cloud-go/commit/02a899c95eb9660128506cf94525c5a75bedb308)) -* **spanner:** Allow non-default service accounts ([#8488](https://github.com/googleapis/google-cloud-go/issues/8488)) ([c90dd00](https://github.com/googleapis/google-cloud-go/commit/c90dd00350fa018dbc5f0af5aabce80e80be0b90)) - -## [1.49.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.48.0...spanner/v1.49.0) (2023-08-24) - - -### Features - -* **spanner/spannertest:** Support INSERT DML ([#7820](https://github.com/googleapis/google-cloud-go/issues/7820)) ([3dda7b2](https://github.com/googleapis/google-cloud-go/commit/3dda7b27ec536637d8ebaa20937fc8019c930481)) - - -### Bug Fixes - -* **spanner:** Transaction was started in a different session ([#8467](https://github.com/googleapis/google-cloud-go/issues/8467)) ([6c21558](https://github.com/googleapis/google-cloud-go/commit/6c21558f75628908a70de79c62aff2851e756e7b)) - -## [1.48.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.47.0...spanner/v1.48.0) (2023-08-18) - - -### Features - -* **spanner/spansql:** Add complete set of math functions ([#8246](https://github.com/googleapis/google-cloud-go/issues/8246)) ([d7a238e](https://github.com/googleapis/google-cloud-go/commit/d7a238eca2a9b08e968cea57edc3708694673e22)) -* **spanner/spansql:** Add support for foreign key actions ([#8296](https://github.com/googleapis/google-cloud-go/issues/8296)) ([d78b851](https://github.com/googleapis/google-cloud-go/commit/d78b8513b13a9a2c04b8097f0d89f85dcfd73797)) -* **spanner/spansql:** Add support for IF NOT EXISTS and IF EXISTS clause ([#8245](https://github.com/googleapis/google-cloud-go/issues/8245)) ([96840ab](https://github.com/googleapis/google-cloud-go/commit/96840ab1232bbdb788e37f81cf113ee0f1b4e8e7)) -* **spanner:** Add integration tests for Bit Reversed Sequences ([#7924](https://github.com/googleapis/google-cloud-go/issues/7924)) ([9b6e7c6](https://github.com/googleapis/google-cloud-go/commit/9b6e7c6061dc69683d7f558faed7f4249da5b7cb)) - - -### Bug Fixes - -* **spanner:** Reset buffer after abort on first SQL statement ([#8440](https://github.com/googleapis/google-cloud-go/issues/8440)) ([d980b42](https://github.com/googleapis/google-cloud-go/commit/d980b42f33968ef25061be50e18038d73b0503b6)) -* **spanner:** REST query UpdateMask bug ([df52820](https://github.com/googleapis/google-cloud-go/commit/df52820b0e7721954809a8aa8700b93c5662dc9b)) - -## [1.47.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.46.0...spanner/v1.47.0) (2023-06-20) - - -### Features - -* **spanner/admin/database:** Add DdlStatementActionInfo and add actions to UpdateDatabaseDdlMetadata ([01eff11](https://github.com/googleapis/google-cloud-go/commit/01eff11eedb3edde69cc33db23e26be6a7e42f10)) -* **spanner:** Add databoost property for batch transactions ([#8152](https://github.com/googleapis/google-cloud-go/issues/8152)) ([fc49c78](https://github.com/googleapis/google-cloud-go/commit/fc49c78c9503c6dd4cbcba8c15e887415a744136)) -* **spanner:** Add tests for database roles in PG dialect ([#7898](https://github.com/googleapis/google-cloud-go/issues/7898)) ([dc84649](https://github.com/googleapis/google-cloud-go/commit/dc84649c546fe09b0bab09991086c156bd78cb3f)) -* **spanner:** Enable client to server compression ([#7899](https://github.com/googleapis/google-cloud-go/issues/7899)) ([3a047d2](https://github.com/googleapis/google-cloud-go/commit/3a047d2a449b0316a9000539ec9797e47cdd5c91)) -* **spanner:** Update all direct dependencies ([b340d03](https://github.com/googleapis/google-cloud-go/commit/b340d030f2b52a4ce48846ce63984b28583abde6)) - - -### Bug Fixes - -* **spanner:** Fix TestRetryInfoTransactionOutcomeUnknownError flaky behaviour ([#7959](https://github.com/googleapis/google-cloud-go/issues/7959)) ([f037795](https://github.com/googleapis/google-cloud-go/commit/f03779538f949fb4ad93d5247d3c6b3e5b21091a)) - -## [1.46.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.45.1...spanner/v1.46.0) (2023-05-12) - - -### Features - -* **spanner/admin/database:** Add support for UpdateDatabase in Cloud Spanner ([#7917](https://github.com/googleapis/google-cloud-go/issues/7917)) ([83870f5](https://github.com/googleapis/google-cloud-go/commit/83870f55035d6692e22264b209e39e07fe2823b9)) -* **spanner:** Make leader aware routing default enabled for supported RPC requests. ([#7912](https://github.com/googleapis/google-cloud-go/issues/7912)) ([d0d3755](https://github.com/googleapis/google-cloud-go/commit/d0d37550911f37e09ea9204d0648fb64ff3204ff)) - - -### Bug Fixes - -* **spanner:** Update grpc to v1.55.0 ([1147ce0](https://github.com/googleapis/google-cloud-go/commit/1147ce02a990276ca4f8ab7a1ab65c14da4450ef)) - -## [1.45.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.45.0...spanner/v1.45.1) (2023-04-21) - - -### Bug Fixes - -* **spanner/spannertest:** Send transaction id in result metadata ([#7809](https://github.com/googleapis/google-cloud-go/issues/7809)) ([e3bbd5f](https://github.com/googleapis/google-cloud-go/commit/e3bbd5f10b3922ab2eb50cb39daccd7bc1891892)) -* **spanner:** Context timeout should be wrapped correctly ([#7744](https://github.com/googleapis/google-cloud-go/issues/7744)) ([f8e22f6](https://github.com/googleapis/google-cloud-go/commit/f8e22f6cbba10fc262e87b4d06d5c1289d877503)) - -## [1.45.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.44.0...spanner/v1.45.0) (2023-04-10) - - -### Features - -* **spanner/spansql:** Add support for missing DDL syntax for ALTER CHANGE STREAM ([#7429](https://github.com/googleapis/google-cloud-go/issues/7429)) ([d34fe02](https://github.com/googleapis/google-cloud-go/commit/d34fe02cfa31520f88dedbd41bbc887e8faa857f)) -* **spanner/spansql:** Support fine-grained access control DDL syntax ([#6691](https://github.com/googleapis/google-cloud-go/issues/6691)) ([a7edf6b](https://github.com/googleapis/google-cloud-go/commit/a7edf6b5c62d02b7d5199fc83d435f6a37a8eac5)) -* **spanner/spansql:** Support grant/revoke view, change stream, table function ([#7533](https://github.com/googleapis/google-cloud-go/issues/7533)) ([9c61215](https://github.com/googleapis/google-cloud-go/commit/9c612159647d540e694ec9e84cab5cdd1c94d2b8)) -* **spanner:** Add x-goog-spanner-route-to-leader header to Spanner RPC contexts for RW/PDML transactions. ([#7500](https://github.com/googleapis/google-cloud-go/issues/7500)) ([fcab05f](https://github.com/googleapis/google-cloud-go/commit/fcab05faa5026896af76b762eed5b7b6b2e7ee07)) -* **spanner:** Adding new fields for Serverless analytics ([69067f8](https://github.com/googleapis/google-cloud-go/commit/69067f8c0075099a84dd9d40e438711881710784)) -* **spanner:** Enable custom decoding for list value ([#7463](https://github.com/googleapis/google-cloud-go/issues/7463)) ([3aeadcd](https://github.com/googleapis/google-cloud-go/commit/3aeadcd97eaf2707c2f6e288c8b72ef29f49a185)) -* **spanner:** Update iam and longrunning deps ([91a1f78](https://github.com/googleapis/google-cloud-go/commit/91a1f784a109da70f63b96414bba8a9b4254cddd)) - - -### Bug Fixes - -* **spanner/spansql:** Fix SQL for CREATE CHANGE STREAM TableName; case ([#7514](https://github.com/googleapis/google-cloud-go/issues/7514)) ([fc5fd86](https://github.com/googleapis/google-cloud-go/commit/fc5fd8652771aeca73e7a28ee68134155a5a9499)) -* **spanner:** Correcting the proto field Id for field data_boost_enabled ([00fff3a](https://github.com/googleapis/google-cloud-go/commit/00fff3a58bed31274ab39af575876dab91d708c9)) - -## [1.44.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.43.0...spanner/v1.44.0) (2023-02-01) - - -### Features - -* **spanner/spansql:** Add support for ALTER INDEX statement ([#7287](https://github.com/googleapis/google-cloud-go/issues/7287)) ([fbe1bd4](https://github.com/googleapis/google-cloud-go/commit/fbe1bd4d0806302a48ff4a5822867757893a5f2d)) -* **spanner/spansql:** Add support for managing the optimizer statistics package ([#7283](https://github.com/googleapis/google-cloud-go/issues/7283)) ([e528221](https://github.com/googleapis/google-cloud-go/commit/e52822139e2821a11873c2d6af85a5fea07700e8)) -* **spanner:** Add support for Optimistic Concurrency Control ([#7332](https://github.com/googleapis/google-cloud-go/issues/7332)) ([48ba16f](https://github.com/googleapis/google-cloud-go/commit/48ba16f3a09893a3527a22838ad1e9ff829da15b)) - -## [1.43.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.42.0...spanner/v1.43.0) (2023-01-19) - - -### Features - -* **spanner/spansql:** Add support for change stream value_capture_type option ([#7201](https://github.com/googleapis/google-cloud-go/issues/7201)) ([27b3398](https://github.com/googleapis/google-cloud-go/commit/27b33988f078779c2d641f776a11b2095a5ccc51)) -* **spanner/spansql:** Support `default_leader` database option ([#7187](https://github.com/googleapis/google-cloud-go/issues/7187)) ([88adaa2](https://github.com/googleapis/google-cloud-go/commit/88adaa216832467560c19e61528b5ce5f1e5ff76)) -* **spanner:** Add REST client ([06a54a1](https://github.com/googleapis/google-cloud-go/commit/06a54a16a5866cce966547c51e203b9e09a25bc0)) -* **spanner:** Inline begin transaction for ReadWriteTransactions ([#7149](https://github.com/googleapis/google-cloud-go/issues/7149)) ([2ce3606](https://github.com/googleapis/google-cloud-go/commit/2ce360644439a386aeaad7df5f47541667bd621b)) - - -### Bug Fixes - -* **spanner:** Fix integration tests data race ([#7229](https://github.com/googleapis/google-cloud-go/issues/7229)) ([a741024](https://github.com/googleapis/google-cloud-go/commit/a741024abd6fb1f073831503c2717b2a44226a59)) - -## [1.42.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.41.0...spanner/v1.42.0) (2022-12-14) - - -### Features - -* **spanner:** Add database roles ([#5701](https://github.com/googleapis/google-cloud-go/issues/5701)) ([6bb95ef](https://github.com/googleapis/google-cloud-go/commit/6bb95efb7997692a52c321e787e633a5045b21f8)) -* **spanner:** Rewrite signatures and type in terms of new location ([620e6d8](https://github.com/googleapis/google-cloud-go/commit/620e6d828ad8641663ae351bfccfe46281e817ad)) - - -### Bug Fixes - -* **spanner:** Fallback to check grpc error message if ResourceType is nil for checking sessionNotFound errors ([#7163](https://github.com/googleapis/google-cloud-go/issues/7163)) ([2552e09](https://github.com/googleapis/google-cloud-go/commit/2552e092cff01e0d6b80fefaa7877f77e36db6be)) - -## [1.41.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.40.0...spanner/v1.41.0) (2022-12-01) - - -### Features - -* **spanner:** Start generating proto stubs ([#7030](https://github.com/googleapis/google-cloud-go/issues/7030)) ([41f446f](https://github.com/googleapis/google-cloud-go/commit/41f446f891a17c97278879f2207fd58996fd038c)) - -## [1.40.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.39.0...spanner/v1.40.0) (2022-11-03) - - -### Features - -* **spanner/spansql:** Add support for interval arg of some date/timestamp functions ([#6950](https://github.com/googleapis/google-cloud-go/issues/6950)) ([1ce0f7d](https://github.com/googleapis/google-cloud-go/commit/1ce0f7d38778068fd1d9a171377067739f4ea8d6)) -* **spanner:** Configurable logger ([#6958](https://github.com/googleapis/google-cloud-go/issues/6958)) ([bd85442](https://github.com/googleapis/google-cloud-go/commit/bd85442bc6fb8c18d1a7c6d73850d220c3973c46)), refs [#6957](https://github.com/googleapis/google-cloud-go/issues/6957) -* **spanner:** PG JSONB support ([#6874](https://github.com/googleapis/google-cloud-go/issues/6874)) ([5b14658](https://github.com/googleapis/google-cloud-go/commit/5b146587939ccc3403945c756cbf68e6f2d41fda)) -* **spanner:** Update result_set.proto to return undeclared parameters in ExecuteSql API ([de4e16a](https://github.com/googleapis/google-cloud-go/commit/de4e16a498354ea7271f5b396f7cb2bb430052aa)) -* **spanner:** Update transaction.proto to include different lock modes ([caf4afa](https://github.com/googleapis/google-cloud-go/commit/caf4afa139ad7b38b6df3e3b17b8357c81e1fd6c)) - -## [1.39.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.38.0...spanner/v1.39.0) (2022-09-21) - - -### Features - -* **spanner/admin/database:** Add custom instance config operations ([ec1a190](https://github.com/googleapis/google-cloud-go/commit/ec1a190abbc4436fcaeaa1421c7d9df624042752)) -* **spanner/admin/instance:** Add custom instance config operations ([ef2b0b1](https://github.com/googleapis/google-cloud-go/commit/ef2b0b1d4de9beb9005537ae48d7d8e1c0f23b98)) -* **spanner/spannersql:** Add backticks when name contains a hypen ([#6621](https://github.com/googleapis/google-cloud-go/issues/6621)) ([e88ca66](https://github.com/googleapis/google-cloud-go/commit/e88ca66ca950e15d9011322dbfca3c88ccceb0ec)) -* **spanner/spansql:** Add support for create, alter and drop change … ([#6669](https://github.com/googleapis/google-cloud-go/issues/6669)) ([cc4620a](https://github.com/googleapis/google-cloud-go/commit/cc4620a5ee3a9129a4cdd48d90d4060ba0bbcd58)) -* **spanner:** Retry spanner transactions and mutations when RST_STREAM error ([#6699](https://github.com/googleapis/google-cloud-go/issues/6699)) ([1b56cd0](https://github.com/googleapis/google-cloud-go/commit/1b56cd0ec31bc32362259fc722907e092bae081a)) - - -### Bug Fixes - -* **spanner/admin/database:** Revert add custom instance config operations (change broke client libraries; reverting before any are released) ([ec1a190](https://github.com/googleapis/google-cloud-go/commit/ec1a190abbc4436fcaeaa1421c7d9df624042752)) -* **spanner:** Destroy session when client is closing ([#6700](https://github.com/googleapis/google-cloud-go/issues/6700)) ([a1ce541](https://github.com/googleapis/google-cloud-go/commit/a1ce5410f1e0f4d68dae0ddc790518e9978faf0c)) -* **spanner:** Spanner sessions will be cleaned up from the backend ([#6679](https://github.com/googleapis/google-cloud-go/issues/6679)) ([c27097e](https://github.com/googleapis/google-cloud-go/commit/c27097e236abeb8439a67ad9b716d05c001aea2e)) - -## [1.38.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.37.0...spanner/v1.38.0) (2022-09-03) - - -### Features - -* **spanner/spannertest:** add support for adding and dropping Foreign Keys ([#6608](https://github.com/googleapis/google-cloud-go/issues/6608)) ([ccd3614](https://github.com/googleapis/google-cloud-go/commit/ccd3614f6edbaf3d7d202feb4df220f244550a78)) -* **spanner/spansql:** add support for coalesce expressions ([#6461](https://github.com/googleapis/google-cloud-go/issues/6461)) ([bff16a7](https://github.com/googleapis/google-cloud-go/commit/bff16a783c1fd4d7e888d4ee3b5420c1bbf10da1)) -* **spanner:** Adds auto-generated CL for googleapis for jsonb ([3bc37e2](https://github.com/googleapis/google-cloud-go/commit/3bc37e28626df5f7ec37b00c0c2f0bfb91c30495)) - - -### Bug Fixes - -* **spanner:** pass userAgent to cloud spanner requests ([#6598](https://github.com/googleapis/google-cloud-go/issues/6598)) ([59d162b](https://github.com/googleapis/google-cloud-go/commit/59d162bdfcbe00a060a52930be7185f00e8df2c1)) - -## [1.37.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.36.0...spanner/v1.37.0) (2022-08-28) - - -### Features - -* **spanner/admin/database:** Add ListDatabaseRoles API to support role based access control ([1ffeb95](https://github.com/googleapis/google-cloud-go/commit/1ffeb9557bf1f18cc131aff40ec7e0e15a9f4ead)) -* **spanner/spansql:** add support for nullif expressions ([#6423](https://github.com/googleapis/google-cloud-go/issues/6423)) ([5b7bfeb](https://github.com/googleapis/google-cloud-go/commit/5b7bfebcd4a0fd3cbe355d9d290e6b5101810b7e)) -* **spanner:** install grpc rls and xds by default ([#6007](https://github.com/googleapis/google-cloud-go/issues/6007)) ([70d562f](https://github.com/googleapis/google-cloud-go/commit/70d562f25738052e833a46daf6ff7fa1f4a0a746)) -* **spanner:** set client wide ReadOptions, ApplyOptions, and TransactionOptions ([#6486](https://github.com/googleapis/google-cloud-go/issues/6486)) ([757f1ca](https://github.com/googleapis/google-cloud-go/commit/757f1cac7a765fe2e7ead872d07eb24baad61c28)) - - -### Bug Fixes - -* **spanner/admin/database:** target new spanner db admin service config ([1d6fbcc](https://github.com/googleapis/google-cloud-go/commit/1d6fbcc6406e2063201ef5a98de560bf32f7fb73)) - -## [1.36.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.35.0...spanner/v1.36.0) (2022-07-23) - - -### Features - -* **spanner/spansql:** add support for IFNULL expressions ([#6389](https://github.com/googleapis/google-cloud-go/issues/6389)) ([09e96ce](https://github.com/googleapis/google-cloud-go/commit/09e96ce1076df4b41d45c3676b7506b318da6b9c)) -* **spanner/spansql:** support for parsing a DML file ([#6349](https://github.com/googleapis/google-cloud-go/issues/6349)) ([267a9bb](https://github.com/googleapis/google-cloud-go/commit/267a9bbec55ee8fe885354efc8db8a61a17a8374)) - -## [1.35.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.34.1...spanner/v1.35.0) (2022-07-19) - - -### Features - -* **spanner/admin/instance:** Adding two new fields for Instance create_time and update_time ([8a1ad06](https://github.com/googleapis/google-cloud-go/commit/8a1ad06572a65afa91a0a77a85b849e766876671)) -* **spanner/spansql:** add support for if expressions ([#6341](https://github.com/googleapis/google-cloud-go/issues/6341)) ([56c858c](https://github.com/googleapis/google-cloud-go/commit/56c858cebd683e45d1dd5ab8ae98ef9bfd767edc)) - - -### Bug Fixes - -* **spanner:** fix pool.numInUse exceeding MaxOpened ([#6344](https://github.com/googleapis/google-cloud-go/issues/6344)) ([882b325](https://github.com/googleapis/google-cloud-go/commit/882b32593e8c7bff8369b1ff9259c7b408fad661)) - -## [1.34.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.34.0...spanner/v1.34.1) (2022-07-06) - - -### Bug Fixes - -* **spanner/spansql:** Add tests for INSERT parsing ([#6303](https://github.com/googleapis/google-cloud-go/issues/6303)) ([0d19fb5](https://github.com/googleapis/google-cloud-go/commit/0d19fb5d60554b9a90fac52918f784e6c3e13918)) - -## [1.34.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.33.0...spanner/v1.34.0) (2022-06-17) - - -### Features - -* **spanner/spansql:** add a support for parsing INSERT statement ([#6148](https://github.com/googleapis/google-cloud-go/issues/6148)) ([c6185cf](https://github.com/googleapis/google-cloud-go/commit/c6185cffc7f23741ac4a230aadee74b3def85ced)) -* **spanner:** add Session creator role docs: clarify transaction semantics ([4134941](https://github.com/googleapis/google-cloud-go/commit/41349411e601f57dc6d9e246f1748fd86d17bb15)) - -## [1.33.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.32.0...spanner/v1.33.0) (2022-05-28) - - -### Bug Fixes - -* **spanner/spansql:** fix invalid timestamp literal formats ([#6077](https://github.com/googleapis/google-cloud-go/issues/6077)) ([6ab8bed](https://github.com/googleapis/google-cloud-go/commit/6ab8bed93a978e00a6c195d8cb4d574ca6db27c3)) - - -### Miscellaneous Chores - -* **spanner:** release 1.33.0 ([#6104](https://github.com/googleapis/google-cloud-go/issues/6104)) ([54bc54e](https://github.com/googleapis/google-cloud-go/commit/54bc54e9bbdc22e2bbfd9f315885f95987e2c3f2)) - -## [1.32.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.31.0...spanner/v1.32.0) (2022-05-09) - - -### Features - -* **spanner/spansql:** support DEFAULT keyword ([#5932](https://github.com/googleapis/google-cloud-go/issues/5932)) ([49c19a9](https://github.com/googleapis/google-cloud-go/commit/49c19a956031fa889d024bd57fa34681bc79e743)) -* **spanner/spansql:** support JSON literals ([#5968](https://github.com/googleapis/google-cloud-go/issues/5968)) ([b500120](https://github.com/googleapis/google-cloud-go/commit/b500120f3cc5c7b5717f6525a24de72fd317ba66)) -* **spanner:** enable row.ToStructLenient to work with STRUCT data type ([#5944](https://github.com/googleapis/google-cloud-go/issues/5944)) ([bca8d50](https://github.com/googleapis/google-cloud-go/commit/bca8d50533115b9995f7b4a63d5d1f9abaf6a753)) - -## [1.31.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.30.1...spanner/v1.31.0) (2022-04-08) - - -### Features - -* **spanner/spansql:** support case expression ([#5836](https://github.com/googleapis/google-cloud-go/issues/5836)) ([3ffdd62](https://github.com/googleapis/google-cloud-go/commit/3ffdd626e72c6472f337a423b9702baf0c298185)) - - -### Bug Fixes - -* **spanner/spannertest:** Improve DDL application delay cancellation. ([#5874](https://github.com/googleapis/google-cloud-go/issues/5874)) ([08f1e72](https://github.com/googleapis/google-cloud-go/commit/08f1e72dbf2ef5a06425f71500d061af246bd490)) - -### [1.30.1](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.30.0...spanner/v1.30.1) (2022-03-28) - - -### Bug Fixes - -* **spanner:** early unlock of session pool lock during dumping the tracked session handles to avoid deadlock ([#5777](https://github.com/googleapis/google-cloud-go/issues/5777)) ([b007836](https://github.com/googleapis/google-cloud-go/commit/b0078362865159b87bc34c1a7f990a361f1cafcf)) - -## [1.30.0](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.29.0...spanner/v1.30.0) (2022-03-04) - - -### Features - -* **spanner:** add better version metadata to calls ([#5515](https://github.com/googleapis/google-cloud-go/issues/5515)) ([dcab7c4](https://github.com/googleapis/google-cloud-go/commit/dcab7c4a98ebecfef1f75ec5bddfd7782b28a7c5)), refs [#2749](https://github.com/googleapis/google-cloud-go/issues/2749) -* **spanner:** add file for tracking version ([17b36ea](https://github.com/googleapis/google-cloud-go/commit/17b36ead42a96b1a01105122074e65164357519e)) -* **spanner:** add support of PGNumeric with integration tests for PG dialect ([#5700](https://github.com/googleapis/google-cloud-go/issues/5700)) ([f7e02e1](https://github.com/googleapis/google-cloud-go/commit/f7e02e11064d14c04eca18ab808e8fe5194ac355)) -* **spanner:** set versionClient to module version ([55f0d92](https://github.com/googleapis/google-cloud-go/commit/55f0d92bf112f14b024b4ab0076c9875a17423c9)) - -### Bug Fixes - -* **spanner/spansql:** support GROUP BY without an aggregation function ([#5717](https://github.com/googleapis/google-cloud-go/issues/5717)) ([c819ee9](https://github.com/googleapis/google-cloud-go/commit/c819ee9ad4695afa31eddcb4bf87764762555cd5)) - - -### Miscellaneous Chores - -* **spanner:** release 1.30.0 ([#5715](https://github.com/googleapis/google-cloud-go/issues/5715)) ([a19d182](https://github.com/googleapis/google-cloud-go/commit/a19d182dab5476cf01e719c751e94a73a98c6c4a)) - -## [1.29.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.28.0...spanner/v1.29.0) (2022-01-06) - - -### ⚠ BREAKING CHANGES - -* **spanner:** fix data race in spanner integration tests (#5276) - -### Features - -* **spanner/spansql:** support EXTRACT ([#5218](https://www.github.com/googleapis/google-cloud-go/issues/5218)) ([81b7c85](https://www.github.com/googleapis/google-cloud-go/commit/81b7c85a8993a36557ea4eb4ec0c47d1f93c4960)) -* **spanner/spansql:** support MOD function ([#5231](https://www.github.com/googleapis/google-cloud-go/issues/5231)) ([0a81fbc](https://www.github.com/googleapis/google-cloud-go/commit/0a81fbc0171af7e828f3e606cbe7b3905ac32213)) -* **spanner:** add google-c2p dependence ([5343756](https://www.github.com/googleapis/google-cloud-go/commit/534375668b5b81bae5ef750c96856bef027f9d1e)) -* **spanner:** Add ReadRowWithOptions method ([#5240](https://www.github.com/googleapis/google-cloud-go/issues/5240)) ([c276428](https://www.github.com/googleapis/google-cloud-go/commit/c276428bca79702245d422849af6472bb2e74171)) -* **spanner:** Adding GFE Latency and Header Missing Count Metrics ([#5199](https://www.github.com/googleapis/google-cloud-go/issues/5199)) ([3d8a9ea](https://www.github.com/googleapis/google-cloud-go/commit/3d8a9ead8d73a4f38524a424a98362c32f56954b)) - - -### Bug Fixes - -* **spanner:** result from unmarshal of string and spanner.NullString type from json should be consistent. ([#5263](https://www.github.com/googleapis/google-cloud-go/issues/5263)) ([7eaaa47](https://www.github.com/googleapis/google-cloud-go/commit/7eaaa470fda5dc7cd1ff041d6a898e35fb54920e)) - - -### Tests - -* **spanner:** fix data race in spanner integration tests ([#5276](https://www.github.com/googleapis/google-cloud-go/issues/5276)) ([22df34b](https://www.github.com/googleapis/google-cloud-go/commit/22df34b8e7d0d003b3eeaf1c069aee58f30a8dfe)) - - -### Miscellaneous Chores - -* **spanner:** release 1.29.0 ([#5292](https://www.github.com/googleapis/google-cloud-go/issues/5292)) ([9f0b900](https://www.github.com/googleapis/google-cloud-go/commit/9f0b9003686d26c66a10c3b54e67b59c2a6327ff)) - -## [1.28.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.27.0...spanner/v1.28.0) (2021-12-03) - - -### Features - -* **spanner/spannertest:** support JSON_VALUE function ([#5173](https://www.github.com/googleapis/google-cloud-go/issues/5173)) ([ac98735](https://www.github.com/googleapis/google-cloud-go/commit/ac98735cb1adc9384c5b2caeb9aac938db275bf7)) -* **spanner/spansql:** support CAST and SAFE_CAST ([#5057](https://www.github.com/googleapis/google-cloud-go/issues/5057)) ([54cbf4c](https://www.github.com/googleapis/google-cloud-go/commit/54cbf4c0a0305e680b213f84487110dfeaf8e7e1)) -* **spanner:** add ToStructLenient method to decode to struct fields with no error return with un-matched row's column with struct's exported fields. ([#5153](https://www.github.com/googleapis/google-cloud-go/issues/5153)) ([899ffbf](https://www.github.com/googleapis/google-cloud-go/commit/899ffbf8ce42b1597ca3cd59bfd9f042054b8ae2)) - -## [1.27.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.26.0...spanner/v1.27.0) (2021-10-19) - - -### Features - -* **spanner:** implement valuer and scanner interfaces ([#4936](https://www.github.com/googleapis/google-cloud-go/issues/4936)) ([4537b45](https://www.github.com/googleapis/google-cloud-go/commit/4537b45d2611ce480abfb5d186b59e7258ec872c)) - -## [1.26.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.25.0...spanner/v1.26.0) (2021-10-11) - - -### Features - -* **spanner/spannertest:** implement RowDeletionPolicy in spannertest ([#4961](https://www.github.com/googleapis/google-cloud-go/issues/4961)) ([7800a33](https://www.github.com/googleapis/google-cloud-go/commit/7800a3303b97204a0573780786388437bbbf2673)), refs [#4782](https://www.github.com/googleapis/google-cloud-go/issues/4782) -* **spanner/spannertest:** Support generated columns ([#4742](https://www.github.com/googleapis/google-cloud-go/issues/4742)) ([324d11d](https://www.github.com/googleapis/google-cloud-go/commit/324d11d3c19ffbd77848c8e19c972b70ff5e9268)) -* **spanner/spansql:** fill in missing hash functions ([#4808](https://www.github.com/googleapis/google-cloud-go/issues/4808)) ([37ee2d9](https://www.github.com/googleapis/google-cloud-go/commit/37ee2d95220efc1aaf0280d0aa2c01ae4b9d4c1b)) -* **spanner/spansql:** support JSON data type ([#4959](https://www.github.com/googleapis/google-cloud-go/issues/4959)) ([e84e408](https://www.github.com/googleapis/google-cloud-go/commit/e84e40830752fc8bc0ccdd869fa7b8fd0c80f306)) -* **spanner/spansql:** Support multiple joins in query ([#4743](https://www.github.com/googleapis/google-cloud-go/issues/4743)) ([81a308e](https://www.github.com/googleapis/google-cloud-go/commit/81a308e909a3ae97504a49fbc9982f7eeb6be80c)) - -## [1.25.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.24.1...spanner/v1.25.0) (2021-08-25) - - -### Features - -* **spanner/spansql:** add support for STARTS_WITH function ([#4670](https://www.github.com/googleapis/google-cloud-go/issues/4670)) ([7a56af0](https://www.github.com/googleapis/google-cloud-go/commit/7a56af03d1505d9a29d1185a50e261c0e90fdb1a)), refs [#4661](https://www.github.com/googleapis/google-cloud-go/issues/4661) -* **spanner:** add support for JSON data type ([#4104](https://www.github.com/googleapis/google-cloud-go/issues/4104)) ([ade8ab1](https://www.github.com/googleapis/google-cloud-go/commit/ade8ab111315d84fa140ddde020387a78668dfa4)) - - -### Bug Fixes - -* **spanner/spannertest:** Fix the "LIKE" clause handling for prefix and suffix matches ([#4655](https://www.github.com/googleapis/google-cloud-go/issues/4655)) ([a2118f0](https://www.github.com/googleapis/google-cloud-go/commit/a2118f02fb03bfc50952699318f35c23dc234c41)) -* **spanner:** invalid numeric should throw an error ([#3926](https://www.github.com/googleapis/google-cloud-go/issues/3926)) ([cde8697](https://www.github.com/googleapis/google-cloud-go/commit/cde8697be01f1ef57806275c0ddf54f87bb9a571)) - -### [1.24.1](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.24.0...spanner/v1.24.1) (2021-08-11) - - -### Bug Fixes - -* **spanner/spansql:** only add comma after other option ([#4551](https://www.github.com/googleapis/google-cloud-go/issues/4551)) ([3ac1e00](https://www.github.com/googleapis/google-cloud-go/commit/3ac1e007163803d315dcf5db612fe003f6eab978)) -* **spanner:** allow decoding null values to spanner.Decoder ([#4558](https://www.github.com/googleapis/google-cloud-go/issues/4558)) ([45ddaca](https://www.github.com/googleapis/google-cloud-go/commit/45ddaca606a372d9293bf2e2b3dc6d4398166c43)), refs [#4552](https://www.github.com/googleapis/google-cloud-go/issues/4552) - -## [1.24.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.23.0...spanner/v1.24.0) (2021-07-29) - - -### Features - -* **spanner/spansql:** add ROW DELETION POLICY parsing ([#4496](https://www.github.com/googleapis/google-cloud-go/issues/4496)) ([3d6c6c7](https://www.github.com/googleapis/google-cloud-go/commit/3d6c6c7873e1b75e8b492ede2e561411dc40536a)) -* **spanner/spansql:** fix unstable SelectFromTable SQL ([#4473](https://www.github.com/googleapis/google-cloud-go/issues/4473)) ([39bc4ec](https://www.github.com/googleapis/google-cloud-go/commit/39bc4eca655d0180b18378c175d4a9a77fe1602f)) -* **spanner/spansql:** support ALTER DATABASE ([#4403](https://www.github.com/googleapis/google-cloud-go/issues/4403)) ([1458dc9](https://www.github.com/googleapis/google-cloud-go/commit/1458dc9c21d98ffffb871943f178678cc3c21306)) -* **spanner/spansql:** support table_hint_expr at from_clause on query_statement ([#4457](https://www.github.com/googleapis/google-cloud-go/issues/4457)) ([7047808](https://www.github.com/googleapis/google-cloud-go/commit/7047808794cf463c6a96d7b59ef5af3ed94fd7cf)) -* **spanner:** add row.String() and refine error message for decoding a struct array ([#4431](https://www.github.com/googleapis/google-cloud-go/issues/4431)) ([f6258a4](https://www.github.com/googleapis/google-cloud-go/commit/f6258a47a4dfadc02dcdd75b53fd5f88c5dcca30)) -* **spanner:** allow untyped nil values in parameterized queries ([#4482](https://www.github.com/googleapis/google-cloud-go/issues/4482)) ([c1ba18b](https://www.github.com/googleapis/google-cloud-go/commit/c1ba18b1b1fc45de6e959cc22a5c222cc80433ee)) - - -### Bug Fixes - -* **spanner/spansql:** fix DATE and TIMESTAMP parsing. ([#4480](https://www.github.com/googleapis/google-cloud-go/issues/4480)) ([dec7a67](https://www.github.com/googleapis/google-cloud-go/commit/dec7a67a3e980f6f5e0d170919da87e1bffe923f)) - -## [1.23.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.22.0...spanner/v1.23.0) (2021-07-08) - - -### Features - -* **spanner/admin/database:** add leader_options to InstanceConfig and default_leader to Database ([7aa0e19](https://www.github.com/googleapis/google-cloud-go/commit/7aa0e195a5536dd060a1fca871bd3c6f946d935e)) - -## [1.22.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.21.0...spanner/v1.22.0) (2021-06-30) - - -### Features - -* **spanner:** support request and transaction tags ([#4336](https://www.github.com/googleapis/google-cloud-go/issues/4336)) ([f08c73a](https://www.github.com/googleapis/google-cloud-go/commit/f08c73a75e2d2a8b9a0b184179346cb97c82e9e5)) -* **spanner:** enable request options for batch read ([#4337](https://www.github.com/googleapis/google-cloud-go/issues/4337)) ([b9081c3](https://www.github.com/googleapis/google-cloud-go/commit/b9081c36ed6495a67f8e458ad884bdb8da5b7fbc)) - -## [1.21.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.20.0...spanner/v1.21.0) (2021-06-23) - - -### Miscellaneous Chores - -* **spanner:** trigger a release for low cost instance ([#4264](https://www.github.com/googleapis/google-cloud-go/issues/4264)) ([24c4451](https://www.github.com/googleapis/google-cloud-go/commit/24c4451404cdf4a83cc7a35ee1911d654d2ba132)) - -## [1.20.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.19.0...spanner/v1.20.0) (2021-06-08) - - -### Features - -* **spanner:** add the support of optimizer statistics package ([#2717](https://www.github.com/googleapis/google-cloud-go/issues/2717)) ([29c7247](https://www.github.com/googleapis/google-cloud-go/commit/29c724771f0b19849c76e62d4bc8e9342922bf75)) - -## [1.19.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.18.0...spanner/v1.19.0) (2021-06-03) - - -### Features - -* **spanner/spannertest:** support multiple aggregations ([#3965](https://www.github.com/googleapis/google-cloud-go/issues/3965)) ([1265dc3](https://www.github.com/googleapis/google-cloud-go/commit/1265dc3289693f79fcb9c5785a424eb510a50007)) -* **spanner/spansql:** case insensitive parsing of keywords and functions ([#4034](https://www.github.com/googleapis/google-cloud-go/issues/4034)) ([ddb09d2](https://www.github.com/googleapis/google-cloud-go/commit/ddb09d22a737deea0d0a9ab58cd5d337164bbbfe)) -* **spanner:** add a database name getter to client ([#4190](https://www.github.com/googleapis/google-cloud-go/issues/4190)) ([7fce29a](https://www.github.com/googleapis/google-cloud-go/commit/7fce29af404f0623b483ca6d6f2af4c726105fa6)) -* **spanner:** add custom instance config to tests ([#4194](https://www.github.com/googleapis/google-cloud-go/issues/4194)) ([e935345](https://www.github.com/googleapis/google-cloud-go/commit/e9353451237e658bde2e41b30e8270fbc5987b39)) - - -### Bug Fixes - -* **spanner:** add missing NUMERIC type to the doc for Row ([#4116](https://www.github.com/googleapis/google-cloud-go/issues/4116)) ([9a3b416](https://www.github.com/googleapis/google-cloud-go/commit/9a3b416221f3c8b3793837e2a459b1d7cd9c479f)) -* **spanner:** indent code example for Encoder and Decoder ([#4128](https://www.github.com/googleapis/google-cloud-go/issues/4128)) ([7c1f48f](https://www.github.com/googleapis/google-cloud-go/commit/7c1f48f307284c26c10cd5787dbc94136a2a36a6)) -* **spanner:** mark SessionPoolConfig.MaxBurst deprecated ([#4115](https://www.github.com/googleapis/google-cloud-go/issues/4115)) ([d60a686](https://www.github.com/googleapis/google-cloud-go/commit/d60a68649f85f1edfbd8f11673bb280813c2b771)) - -## [1.18.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.17.0...spanner/v1.18.0) (2021-04-29) - - -### Features - -* **spanner/admin/database:** add `progress` field to `UpdateDatabaseDdlMetadata` ([9029071](https://www.github.com/googleapis/google-cloud-go/commit/90290710158cf63de918c2d790df48f55a23adc5)) - -## [1.17.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.16.0...spanner/v1.17.0) (2021-03-31) - - -### Features - -* **spanner/admin/database:** add tagging request options ([2b02a03](https://www.github.com/googleapis/google-cloud-go/commit/2b02a03ff9f78884da5a8e7b64a336014c61bde7)) -* **spanner:** add RPC Priority request options ([b5b4da6](https://www.github.com/googleapis/google-cloud-go/commit/b5b4da6952922440d03051f629f3166f731dfaa3)) -* **spanner:** Add support for RPC priority ([#3341](https://www.github.com/googleapis/google-cloud-go/issues/3341)) ([88cf097](https://www.github.com/googleapis/google-cloud-go/commit/88cf097649f1cdf01cab531eabdff7fbf2be3f8f)) - -## [1.16.0](https://www.github.com/googleapis/google-cloud-go/compare/v1.15.0...v1.16.0) (2021-03-17) - - -### Features - -* **spanner:** add `optimizer_statistics_package` field in `QueryOptions` ([18c88c4](https://www.github.com/googleapis/google-cloud-go/commit/18c88c437bd1741eaf5bf5911b9da6f6ea7cd75d)) -* **spanner/admin/database:** add CMEK fields to backup and database ([16597fa](https://github.com/googleapis/google-cloud-go/commit/16597fa1ce549053c7183e8456e23f554a5501de)) - - -### Bug Fixes - -* **spanner/spansql:** fix parsing of NOT IN operator ([#3724](https://www.github.com/googleapis/google-cloud-go/issues/3724)) ([7636478](https://www.github.com/googleapis/google-cloud-go/commit/76364784d82073b80929ae60fd42da34c8050820)) - -## [1.15.0](https://www.github.com/googleapis/google-cloud-go/compare/v1.14.1...v1.15.0) (2021-02-24) - - -### Features - -* **spanner/admin/database:** add CMEK fields to backup and database ([47037ed](https://www.github.com/googleapis/google-cloud-go/commit/47037ed33cd36edfff4ba7c4a4ea332140d5e67b)) -* **spanner/admin/database:** add CMEK fields to backup and database ([16597fa](https://www.github.com/googleapis/google-cloud-go/commit/16597fa1ce549053c7183e8456e23f554a5501de)) - - -### Bug Fixes - -* **spanner:** parallelize session deletion when closing pool ([#3701](https://www.github.com/googleapis/google-cloud-go/issues/3701)) ([75ac7d2](https://www.github.com/googleapis/google-cloud-go/commit/75ac7d2506e706869ae41cf186b0c873b146e926)), refs [#3685](https://www.github.com/googleapis/google-cloud-go/issues/3685) - -### [1.14.1](https://www.github.com/googleapis/google-cloud-go/compare/v1.14.0...v1.14.1) (2021-02-09) - - -### Bug Fixes - -* **spanner:** restore removed scopes ([#3684](https://www.github.com/googleapis/google-cloud-go/issues/3684)) ([232d3a1](https://www.github.com/googleapis/google-cloud-go/commit/232d3a17bdadb92864592351a335ec920a68f9bf)) - -## [1.14.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.13.0...v1.14.0) (2021-02-09) - - -### Features - -* **spanner/admin/database:** adds PITR fields to backup and database ([0959f27](https://www.github.com/googleapis/google-cloud-go/commit/0959f27e85efe94d39437ceef0ff62ddceb8e7a7)) -* **spanner/spannertest:** restructure column alteration implementation ([#3616](https://www.github.com/googleapis/google-cloud-go/issues/3616)) ([176400b](https://www.github.com/googleapis/google-cloud-go/commit/176400be9ab485fb343b8994bc49ac2291d8eea9)) -* **spanner/spansql:** add complete set of array functions ([#3633](https://www.github.com/googleapis/google-cloud-go/issues/3633)) ([13d50b9](https://www.github.com/googleapis/google-cloud-go/commit/13d50b93cc8348c54641b594371a96ecdb1bcabc)) -* **spanner/spansql:** add complete set of string functions ([#3625](https://www.github.com/googleapis/google-cloud-go/issues/3625)) ([34027ad](https://www.github.com/googleapis/google-cloud-go/commit/34027ada6a718603be2987b4084ce5e0ead6413c)) -* **spanner:** add option for returning Spanner commit stats ([c7ecf0f](https://www.github.com/googleapis/google-cloud-go/commit/c7ecf0f3f454606b124e52d20af2545b2c68646f)) -* **spanner:** add option for returning Spanner commit stats ([7bdebad](https://www.github.com/googleapis/google-cloud-go/commit/7bdebadbe06774c94ab745dfef4ce58ce40a5582)) -* **spanner:** support CommitStats ([#3444](https://www.github.com/googleapis/google-cloud-go/issues/3444)) ([b7c3ca6](https://www.github.com/googleapis/google-cloud-go/commit/b7c3ca6c83cbdca95d734df8aa07c5ddb8ab3db0)) - - -### Bug Fixes - -* **spanner/spannertest:** support queries in ExecuteSql ([#3640](https://www.github.com/googleapis/google-cloud-go/issues/3640)) ([8eede84](https://www.github.com/googleapis/google-cloud-go/commit/8eede8411a5521f45a5c3f8091c42b3c5407ea90)), refs [#3639](https://www.github.com/googleapis/google-cloud-go/issues/3639) -* **spanner/spansql:** fix SelectFromJoin behavior ([#3571](https://www.github.com/googleapis/google-cloud-go/issues/3571)) ([e0887c7](https://www.github.com/googleapis/google-cloud-go/commit/e0887c762a4c58f29b3e5b49ee163a36a065463c)) - -## [1.13.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.12.0...v1.13.0) (2021-01-15) - - -### Features - -* **spanner/spannertest:** implement ANY_VALUE aggregation function ([#3428](https://www.github.com/googleapis/google-cloud-go/issues/3428)) ([e16c3e9](https://www.github.com/googleapis/google-cloud-go/commit/e16c3e9b412762b85483f3831ee586a5e6631313)) -* **spanner/spannertest:** implement FULL JOIN ([#3218](https://www.github.com/googleapis/google-cloud-go/issues/3218)) ([99f7212](https://www.github.com/googleapis/google-cloud-go/commit/99f7212bd70bb333c1aa1c7a57348b4dfd80d31b)) -* **spanner/spannertest:** implement SELECT ... FROM UNNEST(...) ([#3431](https://www.github.com/googleapis/google-cloud-go/issues/3431)) ([deb466f](https://www.github.com/googleapis/google-cloud-go/commit/deb466f497a1e6df78fcad57c3b90b1a4ccd93b4)) -* **spanner/spannertest:** support array literals ([#3438](https://www.github.com/googleapis/google-cloud-go/issues/3438)) ([69e0110](https://www.github.com/googleapis/google-cloud-go/commit/69e0110f4977035cd1a705c3034c3ba96cadf36f)) -* **spanner/spannertest:** support AVG aggregation function ([#3286](https://www.github.com/googleapis/google-cloud-go/issues/3286)) ([4788415](https://www.github.com/googleapis/google-cloud-go/commit/4788415c908f58c1cc08c951f1a7f17cdaf35aa2)) -* **spanner/spannertest:** support Not Null constraint ([#3491](https://www.github.com/googleapis/google-cloud-go/issues/3491)) ([c36aa07](https://www.github.com/googleapis/google-cloud-go/commit/c36aa0785e798b9339d540e691850ca3c474a288)) -* **spanner/spannertest:** support UPDATE DML ([#3201](https://www.github.com/googleapis/google-cloud-go/issues/3201)) ([1dec6f6](https://www.github.com/googleapis/google-cloud-go/commit/1dec6f6a31768a3f70bfec7274828301c22ea10b)) -* **spanner/spansql:** define structures and parse UPDATE DML statements ([#3192](https://www.github.com/googleapis/google-cloud-go/issues/3192)) ([23b6904](https://www.github.com/googleapis/google-cloud-go/commit/23b69042c58489df512703259f54d075ba0c0722)) -* **spanner/spansql:** support DATE and TIMESTAMP literals ([#3557](https://www.github.com/googleapis/google-cloud-go/issues/3557)) ([1961930](https://www.github.com/googleapis/google-cloud-go/commit/196193034a15f84dc3d3c27901990e8be77fca85)) -* **spanner/spansql:** support for parsing generated columns ([#3373](https://www.github.com/googleapis/google-cloud-go/issues/3373)) ([9b1d06f](https://www.github.com/googleapis/google-cloud-go/commit/9b1d06fc90a4c07899c641a893dba0b47a1cead9)) -* **spanner/spansql:** support NUMERIC data type ([#3411](https://www.github.com/googleapis/google-cloud-go/issues/3411)) ([1bc65d9](https://www.github.com/googleapis/google-cloud-go/commit/1bc65d9124ba22db5bec4c71b6378c27dfc04724)) -* **spanner:** Add a DirectPath fallback integration test ([#3487](https://www.github.com/googleapis/google-cloud-go/issues/3487)) ([de821c5](https://www.github.com/googleapis/google-cloud-go/commit/de821c59fb81e9946216d205162b59de8b5ce71c)) -* **spanner:** attempt DirectPath by default ([#3516](https://www.github.com/googleapis/google-cloud-go/issues/3516)) ([bbc61ed](https://www.github.com/googleapis/google-cloud-go/commit/bbc61ed368453b28aaf5bed627ca2499a3591f63)) -* **spanner:** include User agent ([#3465](https://www.github.com/googleapis/google-cloud-go/issues/3465)) ([4e1ef1b](https://www.github.com/googleapis/google-cloud-go/commit/4e1ef1b3fb536ef950249cdee02cc0b6c2b56e86)) -* **spanner:** run E2E test over DirectPath ([#3466](https://www.github.com/googleapis/google-cloud-go/issues/3466)) ([18e3a4f](https://www.github.com/googleapis/google-cloud-go/commit/18e3a4fe2a0c59c6295db2d85c7893ac51688083)) -* **spanner:** support NUMERIC in mutations ([#3328](https://www.github.com/googleapis/google-cloud-go/issues/3328)) ([fa90737](https://www.github.com/googleapis/google-cloud-go/commit/fa90737a2adbe0cefbaba4aa1046a6efbba2a0e9)) - - -### Bug Fixes - -* **spanner:** fix session leak ([#3461](https://www.github.com/googleapis/google-cloud-go/issues/3461)) ([11fb917](https://www.github.com/googleapis/google-cloud-go/commit/11fb91711db5b941995737980cef7b48b611fefd)), refs [#3460](https://www.github.com/googleapis/google-cloud-go/issues/3460) - -## [1.12.0](https://www.github.com/googleapis/google-cloud-go/compare/spanner/v1.11.0...v1.12.0) (2020-11-10) - - -### Features - -* **spanner:** add metadata to RowIterator ([#3050](https://www.github.com/googleapis/google-cloud-go/issues/3050)) ([9a2289c](https://www.github.com/googleapis/google-cloud-go/commit/9a2289c3a38492bc2e84e0f4000c68a8718f5c11)), closes [#1805](https://www.github.com/googleapis/google-cloud-go/issues/1805) -* **spanner:** export ToSpannerError ([#3133](https://www.github.com/googleapis/google-cloud-go/issues/3133)) ([b951d8b](https://www.github.com/googleapis/google-cloud-go/commit/b951d8bd194b76da0a8bf2ce7cf85b546d2e051c)), closes [#3122](https://www.github.com/googleapis/google-cloud-go/issues/3122) -* **spanner:** support rw-transaction with options ([#3058](https://www.github.com/googleapis/google-cloud-go/issues/3058)) ([5130694](https://www.github.com/googleapis/google-cloud-go/commit/51306948eef9d26cff70453efc3eb500ddef9117)) -* **spanner/spannertest:** make SELECT list aliases visible to ORDER BY ([#3054](https://www.github.com/googleapis/google-cloud-go/issues/3054)) ([7d2d83e](https://www.github.com/googleapis/google-cloud-go/commit/7d2d83ee1cce58d4014d5570bc599bcef1ed9c22)), closes [#3043](https://www.github.com/googleapis/google-cloud-go/issues/3043) - -## v1.11.0 - -* Features: - - feat(spanner): add KeySetFromKeys function (#2837) -* Misc: - - test(spanner): check for Aborted error (#3039) - - test(spanner): fix potential race condition in TestRsdBlockingStates (#3017) - - test(spanner): compare data instead of struct (#3013) - - test(spanner): fix flaky oc_test.go (#2838) - - docs(spanner): document NULL value (#2885) -* spansql/spannertest: - - Support JOINs (all but FULL JOIN) (#2936, #2924, #2896, #3042, #3037, #2995, #2945, #2931) - - feat(spanner/spansql): parse CHECK constraints (#3046) - - fix(spanner/spansql): fix parsing of unary minus and plus (#2997) - - fix(spanner/spansql): fix parsing of adjacent inline and leading comments (#2851) - - fix(spanner/spannertest): fix ORDER BY combined with SELECT aliases (#3043) - - fix(spanner/spannertest): generate query output columns in construction order (#2990) - - fix(spanner/spannertest): correct handling of NULL AND FALSE (#2991) - - fix(spanner/spannertest): correct handling of tri-state boolean expression evaluation (#2983) - - fix(spanner/spannertest): fix handling of NULL with LIKE operator (#2982) - - test(spanner/spannertest): migrate most test code to integration_test.go (#2977) - - test(spanner/spansql): add fuzz target for ParseQuery (#2909) - - doc(spanner/spannertest): document the implementation (#2996) - - perf(spanner/spannertest): speed up no-wait DDL changes (#2994) - - perf(spanner/spansql): make fewer allocations during SQL (#2969) -* Backward Incompatible Changes - - chore(spanner/spansql): use ID type for identifiers throughout (#2889) - - chore(spanner/spansql): restructure FROM, TABLESAMPLE (#2888) - -## v1.10.0 - -* feat(spanner): add support for NUMERIC data type (#2415) -* feat(spanner): add custom type support to spanner.Key (#2748) -* feat(spanner/spannertest): add support for bool parameter types (#2674) -* fix(spanner): update PDML to take sessions from pool (#2736) -* spanner/spansql: update docs on TableAlteration, ColumnAlteration (#2825) -* spanner/spannertest: support dropping columns (#2823) -* spanner/spannertest: implement GetDatabase (#2802) -* spanner/spannertest: fix aggregation in query evaluation for empty inputs (#2803) - -## v1.9.0 - -* Features: - - feat(spanner): support custom field type (#2614) -* Bugfixes: - - fix(spanner): call ctx.cancel after stats have been recorded (#2728) - - fix(spanner): retry session not found for read (#2724) - - fix(spanner): specify credentials with SPANNER_EMULATOR_HOST (#2701) - - fix(spanner): update pdml to retry EOS internal error (#2678) -* Misc: - - test(spanner): unskip tests for emulator (#2675) -* spansql/spannertest: - - spanner/spansql: restructure types and parsing for column options (#2656) - - spanner/spannertest: return error for Read with no keys (#2655) - -## v1.8.0 - -* Features: - - feat(spanner): support of client-level custom retry settings (#2599) - - feat(spanner): add a statement-based way to run read-write transaction. (#2545) -* Bugfixes: - - fix(spanner): set 'gccl' to the request header. (#2609) - - fix(spanner): add the missing resource prefix (#2605) - - fix(spanner): fix the upgrade of protobuf. (#2583) - - fix(spanner): do not copy protobuf messages by value. (#2581) - - fix(spanner): fix the required resource prefix. (#2580) - - fix(spanner): add extra field to ignore with cmp (#2577) - - fix(spanner): remove appengine-specific numChannels. (#2513) -* Misc: - - test(spanner): log warning instead of fail for stress test (#2559) - - test(spanner): fix failed TestRsdBlockingStates test (#2597) - - chore(spanner): cleanup mockserver and mockclient (#2414) - -## v1.7.0 - -* Retry: - - Only retry certain types of internal errors. (#2460) -* Tracing/metrics: - - Never sample `ping()` trace spans (#2520) - - Add oc tests for session pool metrics. (#2416) -* Encoding: - - Allow encoding struct with custom types to mutation (#2529) -* spannertest: - - Fix evaluation on IN (#2479) - - Support MIN/MAX aggregation functions (#2411) -* Misc: - - Fix TestClient_WithGRPCConnectionPoolAndNumChannels_Misconfigured test (#2539) - - Cleanup backoff files and rename a variable (#2526) - - Fix TestIntegration_DML test to return err from tx (#2509) - - Unskip tests for emulator 0.8.0. (#2494) - - Fix TestIntegration_StartBackupOperation test. (#2418) - - Fix flakiness in TestIntegration_BatchDML_Error - - Unskip TestIntegration_BatchDML and TestIntegration_BatchDML_TwoStatements - for emulator by checking the existence of status. - - Fix TestStressSessionPool test by taking lock while getting sessions from - hc. - -## v1.6.0 - -* Sessions: - - Increase the number of sessions in batches instead of one by one when - additional sessions are needed. The step size is set to 25, which means - that whenever the session pool needs at least one more session, it will - create a batch of 25 sessions. -* Emulator: - - Run integration tests against the emulator in Kokoro Presubmit. -* RPC retrying: - - Retry CreateDatabase on retryable codes. -* spannertest: - - Change internal representation of DATE/TIMESTAMP values. -* spansql: - - Cleanly parse adjacent comment marker/terminator. - - Support FROM aliases in SELECT statements. -* Misc: - - Fix comparing errors in tests. - - Fix flaky session pool test. - - Increase timeout in TestIntegration_ReadOnlyTransaction. - - Fix incorrect instance IDs when deleting instances in tests. - - Clean up test instances. - - Clearify docs on Aborted transaction. - - Fix timeout+staleness bound for test - - Remove the support for resource-based routing. - - Fix TestTransaction_SessionNotFound test. - -## v1.5.1 - -* Fix incorrect decreasing metrics, numReads and numWrites. -* Fix an issue that XXX fields/methods are internal to proto and may change - at any time. XXX_Merge panics in proto v1.4.0. Use proto.Merge instead of - XXX_Merge. -* spannertest: handle list parameters in RPC interfacea. - -## v1.5.0 - -* Metrics - - Instrument client library with adding OpenCensus metrics. This allows for - better monitoring of the session pool. -* Session management - - Switch the session keepalive method from GetSession to SELECT 1. -* Emulator - - Use client hooks for admin clients running against an emulator. With - this change, users can use SPANNER_EMULATOR_HOST for initializing admin - clients when running against an emulator. -* spansql - - Add space between constraint name and foreign key def. -* Misc - - Fix segfault when a non-existent credentials file had been specified. - - Fix cleaning up instances in integration tests. - - Fix race condition in batch read-only transaction. - - Fix the flaky TestLIFOTakeWriteSessionOrder test. - - Fix ITs to order results in SELECT queries. - - Fix the documentation of timestamp bounds. - - Fix the regex issue in managing backups. - -## v1.4.0 - -- Support managed backups. This includes the API methods for CreateBackup, - GetBackup, UpdateBackup, DeleteBackup and others. Also includes a simple - wrapper in DatabaseAdminClient to create a backup. -- Update the healthcheck interval. The default interval is updated to 50 mins. - By default, the first healthcheck is scheduled between 10 and 55 mins and - the subsequent healthchecks are between 45 and 55 mins. This update avoids - overloading the backend service with frequent healthchecking. - -## v1.3.0 - -* Query options: - - Adds the support of providing query options (optimizer version) via - three ways (precedence follows the order): - `client-level < environment variables < query-level`. The environment - variable is set by "SPANNER_OPTIMIZER_VERSION". -* Connection pooling: - - Use the new connection pooling in gRPC. This change deprecates - `ClientConfig.numChannels` and users should move to - `WithGRPCConnectionPool(numChannels)` at their earliest convenience. - Example: - ```go - // numChannels (deprecated): - err, client := NewClientWithConfig(ctx, database, ClientConfig{NumChannels: 8}) - - // gRPC connection pool: - err, client := NewClientWithConfig(ctx, database, ClientConfig{}, option.WithGRPCConnectionPool(8)) - ``` -* Error handling: - - Do not rollback after failed commit. - - Return TransactionOutcomeUnknownError if a DEADLINE_EXCEEDED or CANCELED - error occurs while a COMMIT request is in flight. -* spansql: - - Added support for IN expressions and OFFSET clauses. - - Fixed parsing of table constraints. - - Added support for foreign key constraints in ALTER TABLE and CREATE TABLE. - - Added support for GROUP BY clauses. -* spannertest: - - Added support for IN expressions and OFFSET clauses. - - Added support for GROUP BY clauses. - - Fixed data race in query execution. - - No longer rejects reads specifying an index to use. - - Return last commit timestamp as read timestamp when requested. - - Evaluate add, subtract, multiply, divide, unary - negation, unary not, bitwise and/xor/or operations, as well as reporting - column types for expressions involving any possible arithmetic - operator.arithmetic expressions. - - Fixed handling of descending primary keys. -* Misc: - - Change default healthcheck interval to 30 mins to reduce the GetSession - calls made to the backend. - - Add marshal/unmarshal json for nullable types to support NullString, - NullInt64, NullFloat64, NullBool, NullTime, NullDate. - - Use ResourceInfo to extract error. - - Extract retry info from status. - -## v1.2.1 - -- Fix session leakage for ApplyAtLeastOnce. Previously session handles where - leaked whenever Commit() returned a non-abort, non-session-not-found error, - due to a missing recycle() call. -- Fix error for WriteStruct with pointers. This fixes a specific check for - encoding and decoding to pointer types. -- Fix a GRPCStatus issue that returns a Status that has Unknown code if the - base error is nil. Now, it always returns a Status based on Code field of - current error. - -## v1.2.0 - -- Support tracking stacktrace of sessionPool.take() that allows the user - to instruct the session pool to keep track of the stacktrace of each - goroutine that checks out a session from the pool. This is disabled by - default, but it can be enabled by setting - `SessionPoolConfig.TrackSessionHandles: true`. -- Add resource-based routing that includes a step to retrieve the - instance-specific endpoint before creating the session client when - creating a new spanner client. This is disabled by default, but it can - be enabled by setting `GOOGLE_CLOUD_SPANNER_ENABLE_RESOURCE_BASED_ROUTING`. -- Make logger configurable so that the Spanner client can now be configured to - use a specific logger instead of the standard logger. -- Support encoding custom types that point back to supported basic types. -- Allow decoding Spanner values to custom types that point back to supported - types. - -## v1.1.0 - -- The String() method of NullString, NullTime and NullDate will now return - an unquoted string instead of a quoted string. This is a BREAKING CHANGE. - If you relied on the old behavior, please use fmt.Sprintf("%q", T). -- The Spanner client will now use the new BatchCreateSessions RPC to initialize - the session pool. This will improve the startup time of clients that are - initialized with a minimum number of sessions greater than zero - (i.e. SessionPoolConfig.MinOpened>0). -- Spanner clients that are created with the NewClient method will now default - to a minimum of 100 opened sessions in the pool - (i.e. SessionPoolConfig.MinOpened=100). This will improve the performance - of the first transaction/query that is executed by an application, as a - session will normally not have to be created as part of the transaction. - Spanner clients that are created with the NewClientWithConfig method are - not affected by this change. -- Spanner clients that are created with the NewClient method will now default - to a write sessions fraction of 0.2 in the pool - (i.e. SessionPoolConfig.WriteSessions=0.2). - Spanner clients that are created with the NewClientWithConfig method are - not affected by this change. -- The session pool maintenance worker has been improved so it keeps better - track of the actual number of sessions needed. It will now less often delete - and re-create sessions. This can improve the overall performance of - applications with a low transaction rate. - -## v1.0.0 - -This is the first tag to carve out spanner as its own module. See: -https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository. diff --git a/vendor/cloud.google.com/go/spanner/LICENSE b/vendor/cloud.google.com/go/spanner/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/cloud.google.com/go/spanner/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/cloud.google.com/go/spanner/README.md b/vendor/cloud.google.com/go/spanner/README.md deleted file mode 100644 index 04757e9b2f..0000000000 --- a/vendor/cloud.google.com/go/spanner/README.md +++ /dev/null @@ -1,116 +0,0 @@ -## Cloud Spanner [![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/spanner.svg)](https://pkg.go.dev/cloud.google.com/go/spanner) - -- [About Cloud Spanner](https://cloud.google.com/spanner/) -- [API documentation](https://cloud.google.com/spanner/docs) -- [Go client documentation](https://pkg.go.dev/cloud.google.com/go/spanner) - -### Example Usage - -First create a `spanner.Client` to use throughout your application: - -[snip]:# (spanner-1) -```go -client, err := spanner.NewClient(ctx, "projects/P/instances/I/databases/D") -if err != nil { - log.Fatal(err) -} -``` - -[snip]:# (spanner-2) -```go -// Simple Reads And Writes -_, err = client.Apply(ctx, []*spanner.Mutation{ - spanner.Insert("Users", - []string{"name", "email"}, - []interface{}{"alice", "a@example.com"})}) -if err != nil { - log.Fatal(err) -} -row, err := client.Single().ReadRow(ctx, "Users", - spanner.Key{"alice"}, []string{"email"}) -if err != nil { - log.Fatal(err) -} -``` - -### Session Leak -A `Client` object of the Client Library has a limit on the number of maximum sessions. For example the -default value of `MaxOpened`, which is the maximum number of sessions allowed by the session pool in the -Golang Client Library, is 400. You can configure these values at the time of -creating a `Client` by passing custom `SessionPoolConfig` as part of `ClientConfig`. When all the sessions are checked -out of the session pool, every new transaction has to wait until a session is returned to the pool. -If a session is never returned to the pool (hence causing a session leak), the transactions will have to wait -indefinitely and your application will be blocked. - -#### Common Root Causes -The most common reason for session leaks in the Golang client library are: -1. Not stopping a `RowIterator` that is returned by `Query`, `Read` and other methods. Always use `RowIterator.Stop()` to ensure that the `RowIterator` is always closed. -2. Not closing a `ReadOnlyTransaction` when you no longer need it. Always call `ReadOnlyTransaction.Close()` after use, to ensure that the `ReadOnlyTransaction` is always closed. - -As shown in the example below, the `txn.Close()` statement releases the session after it is complete. -If you fail to call `txn.Close()`, the session is not released back to the pool. The recommended way is to use `defer` as shown below. -```go -client, err := spanner.NewClient(ctx, "projects/P/instances/I/databases/D") -if err != nil { - log.Fatal(err) -} -txn := client.ReadOnlyTransaction() -defer txn.Close() -``` - -#### Debugging and Resolving Session Leaks - -##### Logging inactive transactions -This option logs warnings when you have exhausted >95% of your session pool. It is enabled by default. -This could mean two things; either you need to increase the max sessions in your session pool (as the number -of queries run using the client side database object is greater than your session pool can serve), or you may -have a session leak. To help debug which transactions may be causing this session leak, the logs will also contain stack traces of -transactions which have been running longer than expected if `TrackSessionHandles` under `SessionPoolConfig` is enabled. - -```go -sessionPoolConfig := spanner.SessionPoolConfig{ - TrackSessionHandles: true, - InactiveTransactionRemovalOptions: spanner.InactiveTransactionRemovalOptions{ - ActionOnInactiveTransaction: spanner.Warn, - }, -} -client, err := spanner.NewClientWithConfig( - ctx, database, spanner.ClientConfig{SessionPoolConfig: sessionPoolConfig}, -) -if err != nil { - log.Fatal(err) -} -defer client.Close() - -// Example Log message to warn presence of long running transactions -// session checked out of pool at is long running due to possible session leak for goroutine -// - -``` - -##### Automatically clean inactive transactions -When the option to automatically clean inactive transactions is enabled, the client library will automatically detect -problematic transactions that are running for a very long time (thus causing session leaks) and close them. -The session will be removed from the pool and be replaced by a new session. To dig deeper into which transactions are being -closed, you can check the logs to see the stack trace of the transactions which might be causing these leaks and further -debug them. - -```go -sessionPoolConfig := spanner.SessionPoolConfig{ - TrackSessionHandles: true, - InactiveTransactionRemovalOptions: spanner.InactiveTransactionRemovalOptions{ - ActionOnInactiveTransaction: spanner.WarnAndClose, - }, -} -client, err := spanner.NewClientWithConfig( - ctx, database, spanner.ClientConfig{SessionPoolConfig: sessionPoolConfig}, -) -if err != nil { -log.Fatal(err) -} -defer client.Close() - -// Example Log message for when transaction is recycled -// session checked out of pool at is long running and will be removed due to possible session leak for goroutine -// -``` \ No newline at end of file diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/auxiliary.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/auxiliary.go deleted file mode 100644 index 9f2bf4cc3a..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/auxiliary.go +++ /dev/null @@ -1,636 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -package database - -import ( - "context" - "time" - - "cloud.google.com/go/longrunning" - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" - databasepb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" -) - -// CopyBackupOperation manages a long-running operation from CopyBackup. -type CopyBackupOperation struct { - lro *longrunning.Operation - pollPath string -} - -// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. -// -// See documentation of Poll for error-handling information. -func (op *CopyBackupOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*databasepb.Backup, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Backup - if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { - return nil, err - } - return &resp, nil -} - -// Poll fetches the latest state of the long-running operation. -// -// Poll also fetches the latest metadata, which can be retrieved by Metadata. -// -// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and -// the operation has completed with failure, the error is returned and op.Done will return true. -// If Poll succeeds and the operation has completed successfully, -// op.Done will return true, and the response of the operation is returned. -// If Poll succeeds and the operation has not completed, the returned response and error are both nil. -func (op *CopyBackupOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*databasepb.Backup, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Backup - if err := op.lro.Poll(ctx, &resp, opts...); err != nil { - return nil, err - } - if !op.Done() { - return nil, nil - } - return &resp, nil -} - -// Metadata returns metadata associated with the long-running operation. -// Metadata itself does not contact the server, but Poll does. -// To get the latest metadata, call this method after a successful call to Poll. -// If the metadata is not available, the returned metadata and error are both nil. -func (op *CopyBackupOperation) Metadata() (*databasepb.CopyBackupMetadata, error) { - var meta databasepb.CopyBackupMetadata - if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { - return nil, nil - } else if err != nil { - return nil, err - } - return &meta, nil -} - -// Done reports whether the long-running operation has completed. -func (op *CopyBackupOperation) Done() bool { - return op.lro.Done() -} - -// Name returns the name of the long-running operation. -// The name is assigned by the server and is unique within the service from which the operation is created. -func (op *CopyBackupOperation) Name() string { - return op.lro.Name() -} - -// CreateBackupOperation manages a long-running operation from CreateBackup. -type CreateBackupOperation struct { - lro *longrunning.Operation - pollPath string -} - -// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. -// -// See documentation of Poll for error-handling information. -func (op *CreateBackupOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*databasepb.Backup, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Backup - if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { - return nil, err - } - return &resp, nil -} - -// Poll fetches the latest state of the long-running operation. -// -// Poll also fetches the latest metadata, which can be retrieved by Metadata. -// -// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and -// the operation has completed with failure, the error is returned and op.Done will return true. -// If Poll succeeds and the operation has completed successfully, -// op.Done will return true, and the response of the operation is returned. -// If Poll succeeds and the operation has not completed, the returned response and error are both nil. -func (op *CreateBackupOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*databasepb.Backup, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Backup - if err := op.lro.Poll(ctx, &resp, opts...); err != nil { - return nil, err - } - if !op.Done() { - return nil, nil - } - return &resp, nil -} - -// Metadata returns metadata associated with the long-running operation. -// Metadata itself does not contact the server, but Poll does. -// To get the latest metadata, call this method after a successful call to Poll. -// If the metadata is not available, the returned metadata and error are both nil. -func (op *CreateBackupOperation) Metadata() (*databasepb.CreateBackupMetadata, error) { - var meta databasepb.CreateBackupMetadata - if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { - return nil, nil - } else if err != nil { - return nil, err - } - return &meta, nil -} - -// Done reports whether the long-running operation has completed. -func (op *CreateBackupOperation) Done() bool { - return op.lro.Done() -} - -// Name returns the name of the long-running operation. -// The name is assigned by the server and is unique within the service from which the operation is created. -func (op *CreateBackupOperation) Name() string { - return op.lro.Name() -} - -// CreateDatabaseOperation manages a long-running operation from CreateDatabase. -type CreateDatabaseOperation struct { - lro *longrunning.Operation - pollPath string -} - -// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. -// -// See documentation of Poll for error-handling information. -func (op *CreateDatabaseOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*databasepb.Database, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Database - if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { - return nil, err - } - return &resp, nil -} - -// Poll fetches the latest state of the long-running operation. -// -// Poll also fetches the latest metadata, which can be retrieved by Metadata. -// -// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and -// the operation has completed with failure, the error is returned and op.Done will return true. -// If Poll succeeds and the operation has completed successfully, -// op.Done will return true, and the response of the operation is returned. -// If Poll succeeds and the operation has not completed, the returned response and error are both nil. -func (op *CreateDatabaseOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*databasepb.Database, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Database - if err := op.lro.Poll(ctx, &resp, opts...); err != nil { - return nil, err - } - if !op.Done() { - return nil, nil - } - return &resp, nil -} - -// Metadata returns metadata associated with the long-running operation. -// Metadata itself does not contact the server, but Poll does. -// To get the latest metadata, call this method after a successful call to Poll. -// If the metadata is not available, the returned metadata and error are both nil. -func (op *CreateDatabaseOperation) Metadata() (*databasepb.CreateDatabaseMetadata, error) { - var meta databasepb.CreateDatabaseMetadata - if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { - return nil, nil - } else if err != nil { - return nil, err - } - return &meta, nil -} - -// Done reports whether the long-running operation has completed. -func (op *CreateDatabaseOperation) Done() bool { - return op.lro.Done() -} - -// Name returns the name of the long-running operation. -// The name is assigned by the server and is unique within the service from which the operation is created. -func (op *CreateDatabaseOperation) Name() string { - return op.lro.Name() -} - -// RestoreDatabaseOperation manages a long-running operation from RestoreDatabase. -type RestoreDatabaseOperation struct { - lro *longrunning.Operation - pollPath string -} - -// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. -// -// See documentation of Poll for error-handling information. -func (op *RestoreDatabaseOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*databasepb.Database, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Database - if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { - return nil, err - } - return &resp, nil -} - -// Poll fetches the latest state of the long-running operation. -// -// Poll also fetches the latest metadata, which can be retrieved by Metadata. -// -// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and -// the operation has completed with failure, the error is returned and op.Done will return true. -// If Poll succeeds and the operation has completed successfully, -// op.Done will return true, and the response of the operation is returned. -// If Poll succeeds and the operation has not completed, the returned response and error are both nil. -func (op *RestoreDatabaseOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*databasepb.Database, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Database - if err := op.lro.Poll(ctx, &resp, opts...); err != nil { - return nil, err - } - if !op.Done() { - return nil, nil - } - return &resp, nil -} - -// Metadata returns metadata associated with the long-running operation. -// Metadata itself does not contact the server, but Poll does. -// To get the latest metadata, call this method after a successful call to Poll. -// If the metadata is not available, the returned metadata and error are both nil. -func (op *RestoreDatabaseOperation) Metadata() (*databasepb.RestoreDatabaseMetadata, error) { - var meta databasepb.RestoreDatabaseMetadata - if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { - return nil, nil - } else if err != nil { - return nil, err - } - return &meta, nil -} - -// Done reports whether the long-running operation has completed. -func (op *RestoreDatabaseOperation) Done() bool { - return op.lro.Done() -} - -// Name returns the name of the long-running operation. -// The name is assigned by the server and is unique within the service from which the operation is created. -func (op *RestoreDatabaseOperation) Name() string { - return op.lro.Name() -} - -// UpdateDatabaseDdlOperation manages a long-running operation from UpdateDatabaseDdl. -type UpdateDatabaseDdlOperation struct { - lro *longrunning.Operation - pollPath string -} - -// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. -// -// See documentation of Poll for error-handling information. -func (op *UpdateDatabaseDdlOperation) Wait(ctx context.Context, opts ...gax.CallOption) error { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - return op.lro.WaitWithInterval(ctx, nil, time.Minute, opts...) -} - -// Poll fetches the latest state of the long-running operation. -// -// Poll also fetches the latest metadata, which can be retrieved by Metadata. -// -// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and -// the operation has completed with failure, the error is returned and op.Done will return true. -// If Poll succeeds and the operation has completed successfully, -// op.Done will return true, and the response of the operation is returned. -// If Poll succeeds and the operation has not completed, the returned response and error are both nil. -func (op *UpdateDatabaseDdlOperation) Poll(ctx context.Context, opts ...gax.CallOption) error { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - return op.lro.Poll(ctx, nil, opts...) -} - -// Metadata returns metadata associated with the long-running operation. -// Metadata itself does not contact the server, but Poll does. -// To get the latest metadata, call this method after a successful call to Poll. -// If the metadata is not available, the returned metadata and error are both nil. -func (op *UpdateDatabaseDdlOperation) Metadata() (*databasepb.UpdateDatabaseDdlMetadata, error) { - var meta databasepb.UpdateDatabaseDdlMetadata - if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { - return nil, nil - } else if err != nil { - return nil, err - } - return &meta, nil -} - -// Done reports whether the long-running operation has completed. -func (op *UpdateDatabaseDdlOperation) Done() bool { - return op.lro.Done() -} - -// Name returns the name of the long-running operation. -// The name is assigned by the server and is unique within the service from which the operation is created. -func (op *UpdateDatabaseDdlOperation) Name() string { - return op.lro.Name() -} - -// UpdateDatabaseOperation manages a long-running operation from UpdateDatabase. -type UpdateDatabaseOperation struct { - lro *longrunning.Operation - pollPath string -} - -// Wait blocks until the long-running operation is completed, returning the response and any errors encountered. -// -// See documentation of Poll for error-handling information. -func (op *UpdateDatabaseOperation) Wait(ctx context.Context, opts ...gax.CallOption) (*databasepb.Database, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Database - if err := op.lro.WaitWithInterval(ctx, &resp, time.Minute, opts...); err != nil { - return nil, err - } - return &resp, nil -} - -// Poll fetches the latest state of the long-running operation. -// -// Poll also fetches the latest metadata, which can be retrieved by Metadata. -// -// If Poll fails, the error is returned and op is unmodified. If Poll succeeds and -// the operation has completed with failure, the error is returned and op.Done will return true. -// If Poll succeeds and the operation has completed successfully, -// op.Done will return true, and the response of the operation is returned. -// If Poll succeeds and the operation has not completed, the returned response and error are both nil. -func (op *UpdateDatabaseOperation) Poll(ctx context.Context, opts ...gax.CallOption) (*databasepb.Database, error) { - opts = append([]gax.CallOption{gax.WithPath(op.pollPath)}, opts...) - var resp databasepb.Database - if err := op.lro.Poll(ctx, &resp, opts...); err != nil { - return nil, err - } - if !op.Done() { - return nil, nil - } - return &resp, nil -} - -// Metadata returns metadata associated with the long-running operation. -// Metadata itself does not contact the server, but Poll does. -// To get the latest metadata, call this method after a successful call to Poll. -// If the metadata is not available, the returned metadata and error are both nil. -func (op *UpdateDatabaseOperation) Metadata() (*databasepb.UpdateDatabaseMetadata, error) { - var meta databasepb.UpdateDatabaseMetadata - if err := op.lro.Metadata(&meta); err == longrunning.ErrNoMetadata { - return nil, nil - } else if err != nil { - return nil, err - } - return &meta, nil -} - -// Done reports whether the long-running operation has completed. -func (op *UpdateDatabaseOperation) Done() bool { - return op.lro.Done() -} - -// Name returns the name of the long-running operation. -// The name is assigned by the server and is unique within the service from which the operation is created. -func (op *UpdateDatabaseOperation) Name() string { - return op.lro.Name() -} - -// BackupIterator manages a stream of *databasepb.Backup. -type BackupIterator struct { - items []*databasepb.Backup - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*databasepb.Backup, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. -func (it *BackupIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *BackupIterator) Next() (*databasepb.Backup, error) { - var item *databasepb.Backup - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *BackupIterator) bufLen() int { - return len(it.items) -} - -func (it *BackupIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// BackupScheduleIterator manages a stream of *databasepb.BackupSchedule. -type BackupScheduleIterator struct { - items []*databasepb.BackupSchedule - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*databasepb.BackupSchedule, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. -func (it *BackupScheduleIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *BackupScheduleIterator) Next() (*databasepb.BackupSchedule, error) { - var item *databasepb.BackupSchedule - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *BackupScheduleIterator) bufLen() int { - return len(it.items) -} - -func (it *BackupScheduleIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// DatabaseIterator manages a stream of *databasepb.Database. -type DatabaseIterator struct { - items []*databasepb.Database - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*databasepb.Database, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. -func (it *DatabaseIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *DatabaseIterator) Next() (*databasepb.Database, error) { - var item *databasepb.Database - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *DatabaseIterator) bufLen() int { - return len(it.items) -} - -func (it *DatabaseIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// DatabaseRoleIterator manages a stream of *databasepb.DatabaseRole. -type DatabaseRoleIterator struct { - items []*databasepb.DatabaseRole - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*databasepb.DatabaseRole, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. -func (it *DatabaseRoleIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *DatabaseRoleIterator) Next() (*databasepb.DatabaseRole, error) { - var item *databasepb.DatabaseRole - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *DatabaseRoleIterator) bufLen() int { - return len(it.items) -} - -func (it *DatabaseRoleIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// OperationIterator manages a stream of *longrunningpb.Operation. -type OperationIterator struct { - items []*longrunningpb.Operation - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*longrunningpb.Operation, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. -func (it *OperationIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *OperationIterator) Next() (*longrunningpb.Operation, error) { - var item *longrunningpb.Operation - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *OperationIterator) bufLen() int { - return len(it.items) -} - -func (it *OperationIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/auxiliary_go123.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/auxiliary_go123.go deleted file mode 100644 index b6c2f328de..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/auxiliary_go123.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -//go:build go1.23 - -package database - -import ( - "iter" - - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" - databasepb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb" - "github.com/googleapis/gax-go/v2/iterator" -) - -// All returns an iterator. If an error is returned by the iterator, the -// iterator will stop after that iteration. -func (it *BackupIterator) All() iter.Seq2[*databasepb.Backup, error] { - return iterator.RangeAdapter(it.Next) -} - -// All returns an iterator. If an error is returned by the iterator, the -// iterator will stop after that iteration. -func (it *BackupScheduleIterator) All() iter.Seq2[*databasepb.BackupSchedule, error] { - return iterator.RangeAdapter(it.Next) -} - -// All returns an iterator. If an error is returned by the iterator, the -// iterator will stop after that iteration. -func (it *DatabaseIterator) All() iter.Seq2[*databasepb.Database, error] { - return iterator.RangeAdapter(it.Next) -} - -// All returns an iterator. If an error is returned by the iterator, the -// iterator will stop after that iteration. -func (it *DatabaseRoleIterator) All() iter.Seq2[*databasepb.DatabaseRole, error] { - return iterator.RangeAdapter(it.Next) -} - -// All returns an iterator. If an error is returned by the iterator, the -// iterator will stop after that iteration. -func (it *OperationIterator) All() iter.Seq2[*longrunningpb.Operation, error] { - return iterator.RangeAdapter(it.Next) -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/backup.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/backup.go deleted file mode 100644 index 648c7f88e2..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/backup.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2020 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package database - -import ( - "context" - "fmt" - "regexp" - "time" - - "cloud.google.com/go/spanner/admin/database/apiv1/databasepb" - "github.com/googleapis/gax-go/v2" - pbt "google.golang.org/protobuf/types/known/timestamppb" -) - -var ( - validDBPattern = regexp.MustCompile("^projects/(?P[^/]+)/instances/(?P[^/]+)/databases/(?P[^/]+)$") -) - -// StartBackupOperation creates a backup of the given database. It will be stored -// as projects//instances//backups/. The -// backup will be automatically deleted by Cloud Spanner after its expiration. -// -// backupID must be unique across an instance. -// -// expireTime is the time the backup will expire. It is respected to -// microsecond granularity. -// -// databasePath must have the form -// projects//instances//databases/. -func (c *DatabaseAdminClient) StartBackupOperation(ctx context.Context, backupID string, databasePath string, expireTime time.Time, opts ...gax.CallOption) (*CreateBackupOperation, error) { - m := validDBPattern.FindStringSubmatch(databasePath) - if m == nil { - return nil, fmt.Errorf("database name %q should conform to pattern %q", - databasePath, validDBPattern) - } - ts := &pbt.Timestamp{Seconds: expireTime.Unix(), Nanos: int32(expireTime.Nanosecond())} - // Create request from parameters. - req := &databasepb.CreateBackupRequest{ - Parent: fmt.Sprintf("projects/%s/instances/%s", m[1], m[2]), - BackupId: backupID, - Backup: &databasepb.Backup{ - Database: databasePath, - ExpireTime: ts, - }, - } - return c.CreateBackup(ctx, req, opts...) -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/database.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/database.go deleted file mode 100644 index f68a4cb65b..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/database.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package database - -import ( - "context" - "fmt" - "regexp" - "strings" - "time" - "unicode" - - "cloud.google.com/go/longrunning/autogen/longrunningpb" - "cloud.google.com/go/spanner/admin/database/apiv1/databasepb" - "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -var retryer = gax.OnCodes( - []codes.Code{codes.DeadlineExceeded, codes.Unavailable}, - gax.Backoff{Initial: time.Millisecond, Max: time.Millisecond, Multiplier: 1.0}, -) - -// CreateDatabaseWithRetry creates a new database and retries the call if the -// backend returns a retryable error. The actual CreateDatabase RPC is only -// retried if the initial call did not reach the server. In other cases, the -// client will query the backend for the long-running operation that was -// created by the initial RPC and return that operation. -func (c *DatabaseAdminClient) CreateDatabaseWithRetry(ctx context.Context, req *databasepb.CreateDatabaseRequest, opts ...gax.CallOption) (*CreateDatabaseOperation, error) { - for { - db, createErr := c.CreateDatabase(ctx, req, opts...) - if createErr == nil { - return db, nil - } - // Failed, check whether we should retry. - delay, shouldRetry := retryer.Retry(createErr) - if !shouldRetry { - return nil, createErr - } - if err := gax.Sleep(ctx, delay); err != nil { - return nil, err - } - // Extract the name of the database. - dbName := extractDBName(req.CreateStatement) - // Query the backend for any corresponding long-running operation to - // determine whether we should retry the RPC or not. - iter := c.ListDatabaseOperations(ctx, &databasepb.ListDatabaseOperationsRequest{ - Parent: req.Parent, - Filter: fmt.Sprintf("(metadata.@type:type.googleapis.com/google.spanner.admin.database.v1.CreateDatabaseMetadata) AND (name:%s/databases/%s/operations/)", req.Parent, dbName), - }, opts...) - var mostRecentOp *longrunningpb.Operation - for { - op, err := iter.Next() - if err == iterator.Done { - break - } - if err != nil { - return nil, err - } - // A running operation is the most recent and should be returned. - if !op.Done { - return c.CreateDatabaseOperation(op.Name), nil - } - if op.GetError() == nil { - mostRecentOp = op - } - } - if mostRecentOp == nil { - continue - } - // Only finished operations found. Check whether the database exists. - _, getErr := c.GetDatabase(ctx, &databasepb.GetDatabaseRequest{ - Name: fmt.Sprintf("%s/databases/%s", req.Parent, dbName), - }) - if getErr == nil { - // Database found, return one of the long-running operations that - // has finished, which again should return the database. - return c.CreateDatabaseOperation(mostRecentOp.Name), nil - } - if status.Code(getErr) == codes.NotFound { - continue - } - // Error getting the database that was not NotFound. - return nil, getErr - } -} - -var dbNameRegEx = regexp.MustCompile("\\s*CREATE\\s+DATABASE\\s+(.+)\\s*") - -// extractDBName extracts the database name from a valid CREATE DATABASE -// statement. We don't have to worry about invalid create statements, as those -// should already have been handled by the backend and should return a non- -// retryable error. -func extractDBName(createStatement string) string { - if dbNameRegEx.MatchString(createStatement) { - namePossiblyWithQuotes := strings.TrimRightFunc(dbNameRegEx.FindStringSubmatch(createStatement)[1], unicode.IsSpace) - if len(namePossiblyWithQuotes) > 0 && namePossiblyWithQuotes[0] == '`' { - if len(namePossiblyWithQuotes) > 5 && namePossiblyWithQuotes[1] == '`' && namePossiblyWithQuotes[2] == '`' { - return string(namePossiblyWithQuotes[3 : len(namePossiblyWithQuotes)-3]) - } - return string(namePossiblyWithQuotes[1 : len(namePossiblyWithQuotes)-1]) - } - return string(namePossiblyWithQuotes) - } - return "" -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/database_admin_client.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/database_admin_client.go deleted file mode 100644 index db26bbca7f..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/database_admin_client.go +++ /dev/null @@ -1,4104 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -package database - -import ( - "bytes" - "context" - "fmt" - "log/slog" - "math" - "net/http" - "net/url" - "time" - - iampb "cloud.google.com/go/iam/apiv1/iampb" - "cloud.google.com/go/longrunning" - lroauto "cloud.google.com/go/longrunning/autogen" - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" - databasepb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/option/internaloption" - gtransport "google.golang.org/api/transport/grpc" - httptransport "google.golang.org/api/transport/http" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" -) - -var newDatabaseAdminClientHook clientHook - -// DatabaseAdminCallOptions contains the retry settings for each method of DatabaseAdminClient. -type DatabaseAdminCallOptions struct { - ListDatabases []gax.CallOption - CreateDatabase []gax.CallOption - GetDatabase []gax.CallOption - UpdateDatabase []gax.CallOption - UpdateDatabaseDdl []gax.CallOption - DropDatabase []gax.CallOption - GetDatabaseDdl []gax.CallOption - SetIamPolicy []gax.CallOption - GetIamPolicy []gax.CallOption - TestIamPermissions []gax.CallOption - CreateBackup []gax.CallOption - CopyBackup []gax.CallOption - GetBackup []gax.CallOption - UpdateBackup []gax.CallOption - DeleteBackup []gax.CallOption - ListBackups []gax.CallOption - RestoreDatabase []gax.CallOption - ListDatabaseOperations []gax.CallOption - ListBackupOperations []gax.CallOption - ListDatabaseRoles []gax.CallOption - AddSplitPoints []gax.CallOption - CreateBackupSchedule []gax.CallOption - GetBackupSchedule []gax.CallOption - UpdateBackupSchedule []gax.CallOption - DeleteBackupSchedule []gax.CallOption - ListBackupSchedules []gax.CallOption - InternalUpdateGraphOperation []gax.CallOption - CancelOperation []gax.CallOption - DeleteOperation []gax.CallOption - GetOperation []gax.CallOption - ListOperations []gax.CallOption -} - -func defaultDatabaseAdminGRPCClientOptions() []option.ClientOption { - return []option.ClientOption{ - internaloption.WithDefaultEndpoint("spanner.googleapis.com:443"), - internaloption.WithDefaultEndpointTemplate("spanner.UNIVERSE_DOMAIN:443"), - internaloption.WithDefaultMTLSEndpoint("spanner.mtls.googleapis.com:443"), - internaloption.WithDefaultUniverseDomain("googleapis.com"), - internaloption.WithDefaultAudience("https://spanner.googleapis.com/"), - internaloption.WithDefaultScopes(DefaultAuthScopes()...), - internaloption.EnableJwtWithScope(), - internaloption.EnableNewAuthLibrary(), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultDatabaseAdminCallOptions() *DatabaseAdminCallOptions { - return &DatabaseAdminCallOptions{ - ListDatabases: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - CreateDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - GetDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - UpdateDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - UpdateDatabaseDdl: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - DropDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - GetDatabaseDdl: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - SetIamPolicy: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - }, - GetIamPolicy: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - TestIamPermissions: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - }, - CreateBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - CopyBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - GetBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - UpdateBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - DeleteBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ListBackups: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - RestoreDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - ListDatabaseOperations: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ListBackupOperations: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ListDatabaseRoles: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - AddSplitPoints: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - CreateBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - GetBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - UpdateBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - DeleteBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ListBackupSchedules: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.DeadlineExceeded, - }, gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - InternalUpdateGraphOperation: []gax.CallOption{}, - CancelOperation: []gax.CallOption{}, - DeleteOperation: []gax.CallOption{}, - GetOperation: []gax.CallOption{}, - ListOperations: []gax.CallOption{}, - } -} - -func defaultDatabaseAdminRESTCallOptions() *DatabaseAdminCallOptions { - return &DatabaseAdminCallOptions{ - ListDatabases: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - CreateDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - GetDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - UpdateDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - UpdateDatabaseDdl: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - DropDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - GetDatabaseDdl: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - SetIamPolicy: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - }, - GetIamPolicy: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - TestIamPermissions: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - }, - CreateBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - CopyBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - GetBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - UpdateBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - DeleteBackup: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - ListBackups: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - RestoreDatabase: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - ListDatabaseOperations: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - ListBackupOperations: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - ListDatabaseRoles: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - AddSplitPoints: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - CreateBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - GetBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - UpdateBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - DeleteBackupSchedule: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - ListBackupSchedules: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 1000 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusGatewayTimeout) - }), - }, - InternalUpdateGraphOperation: []gax.CallOption{}, - CancelOperation: []gax.CallOption{}, - DeleteOperation: []gax.CallOption{}, - GetOperation: []gax.CallOption{}, - ListOperations: []gax.CallOption{}, - } -} - -// internalDatabaseAdminClient is an interface that defines the methods available from Cloud Spanner API. -type internalDatabaseAdminClient interface { - Close() error - setGoogleClientInfo(...string) - Connection() *grpc.ClientConn - ListDatabases(context.Context, *databasepb.ListDatabasesRequest, ...gax.CallOption) *DatabaseIterator - CreateDatabase(context.Context, *databasepb.CreateDatabaseRequest, ...gax.CallOption) (*CreateDatabaseOperation, error) - CreateDatabaseOperation(name string) *CreateDatabaseOperation - GetDatabase(context.Context, *databasepb.GetDatabaseRequest, ...gax.CallOption) (*databasepb.Database, error) - UpdateDatabase(context.Context, *databasepb.UpdateDatabaseRequest, ...gax.CallOption) (*UpdateDatabaseOperation, error) - UpdateDatabaseOperation(name string) *UpdateDatabaseOperation - UpdateDatabaseDdl(context.Context, *databasepb.UpdateDatabaseDdlRequest, ...gax.CallOption) (*UpdateDatabaseDdlOperation, error) - UpdateDatabaseDdlOperation(name string) *UpdateDatabaseDdlOperation - DropDatabase(context.Context, *databasepb.DropDatabaseRequest, ...gax.CallOption) error - GetDatabaseDdl(context.Context, *databasepb.GetDatabaseDdlRequest, ...gax.CallOption) (*databasepb.GetDatabaseDdlResponse, error) - SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest, ...gax.CallOption) (*iampb.Policy, error) - GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest, ...gax.CallOption) (*iampb.Policy, error) - TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest, ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) - CreateBackup(context.Context, *databasepb.CreateBackupRequest, ...gax.CallOption) (*CreateBackupOperation, error) - CreateBackupOperation(name string) *CreateBackupOperation - CopyBackup(context.Context, *databasepb.CopyBackupRequest, ...gax.CallOption) (*CopyBackupOperation, error) - CopyBackupOperation(name string) *CopyBackupOperation - GetBackup(context.Context, *databasepb.GetBackupRequest, ...gax.CallOption) (*databasepb.Backup, error) - UpdateBackup(context.Context, *databasepb.UpdateBackupRequest, ...gax.CallOption) (*databasepb.Backup, error) - DeleteBackup(context.Context, *databasepb.DeleteBackupRequest, ...gax.CallOption) error - ListBackups(context.Context, *databasepb.ListBackupsRequest, ...gax.CallOption) *BackupIterator - RestoreDatabase(context.Context, *databasepb.RestoreDatabaseRequest, ...gax.CallOption) (*RestoreDatabaseOperation, error) - RestoreDatabaseOperation(name string) *RestoreDatabaseOperation - ListDatabaseOperations(context.Context, *databasepb.ListDatabaseOperationsRequest, ...gax.CallOption) *OperationIterator - ListBackupOperations(context.Context, *databasepb.ListBackupOperationsRequest, ...gax.CallOption) *OperationIterator - ListDatabaseRoles(context.Context, *databasepb.ListDatabaseRolesRequest, ...gax.CallOption) *DatabaseRoleIterator - AddSplitPoints(context.Context, *databasepb.AddSplitPointsRequest, ...gax.CallOption) (*databasepb.AddSplitPointsResponse, error) - CreateBackupSchedule(context.Context, *databasepb.CreateBackupScheduleRequest, ...gax.CallOption) (*databasepb.BackupSchedule, error) - GetBackupSchedule(context.Context, *databasepb.GetBackupScheduleRequest, ...gax.CallOption) (*databasepb.BackupSchedule, error) - UpdateBackupSchedule(context.Context, *databasepb.UpdateBackupScheduleRequest, ...gax.CallOption) (*databasepb.BackupSchedule, error) - DeleteBackupSchedule(context.Context, *databasepb.DeleteBackupScheduleRequest, ...gax.CallOption) error - ListBackupSchedules(context.Context, *databasepb.ListBackupSchedulesRequest, ...gax.CallOption) *BackupScheduleIterator - InternalUpdateGraphOperation(context.Context, *databasepb.InternalUpdateGraphOperationRequest, ...gax.CallOption) (*databasepb.InternalUpdateGraphOperationResponse, error) - CancelOperation(context.Context, *longrunningpb.CancelOperationRequest, ...gax.CallOption) error - DeleteOperation(context.Context, *longrunningpb.DeleteOperationRequest, ...gax.CallOption) error - GetOperation(context.Context, *longrunningpb.GetOperationRequest, ...gax.CallOption) (*longrunningpb.Operation, error) - ListOperations(context.Context, *longrunningpb.ListOperationsRequest, ...gax.CallOption) *OperationIterator -} - -// DatabaseAdminClient is a client for interacting with Cloud Spanner API. -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -// -// # Cloud Spanner Database Admin API -// -// The Cloud Spanner Database Admin API can be used to: -// -// create, drop, and list databases -// -// update the schema of pre-existing databases -// -// create, delete, copy and list backups for a database -// -// restore a database from an existing backup -type DatabaseAdminClient struct { - // The internal transport-dependent client. - internalClient internalDatabaseAdminClient - - // The call options for this service. - CallOptions *DatabaseAdminCallOptions - - // LROClient is used internally to handle long-running operations. - // It is exposed so that its CallOptions can be modified if required. - // Users should not Close this client. - LROClient *lroauto.OperationsClient -} - -// Wrapper methods routed to the internal client. - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *DatabaseAdminClient) Close() error { - return c.internalClient.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *DatabaseAdminClient) setGoogleClientInfo(keyval ...string) { - c.internalClient.setGoogleClientInfo(keyval...) -} - -// Connection returns a connection to the API service. -// -// Deprecated: Connections are now pooled so this method does not always -// return the same resource. -func (c *DatabaseAdminClient) Connection() *grpc.ClientConn { - return c.internalClient.Connection() -} - -// ListDatabases lists Cloud Spanner databases. -func (c *DatabaseAdminClient) ListDatabases(ctx context.Context, req *databasepb.ListDatabasesRequest, opts ...gax.CallOption) *DatabaseIterator { - return c.internalClient.ListDatabases(ctx, req, opts...) -} - -// CreateDatabase creates a new Cloud Spanner database and starts to prepare it for serving. -// The returned [long-running operation][google.longrunning.Operation] will -// have a name of the format /operations/ and -// can be used to track preparation of the database. The -// metadata field type is -// CreateDatabaseMetadata. -// The response field type is -// Database, if successful. -func (c *DatabaseAdminClient) CreateDatabase(ctx context.Context, req *databasepb.CreateDatabaseRequest, opts ...gax.CallOption) (*CreateDatabaseOperation, error) { - return c.internalClient.CreateDatabase(ctx, req, opts...) -} - -// CreateDatabaseOperation returns a new CreateDatabaseOperation from a given name. -// The name must be that of a previously created CreateDatabaseOperation, possibly from a different process. -func (c *DatabaseAdminClient) CreateDatabaseOperation(name string) *CreateDatabaseOperation { - return c.internalClient.CreateDatabaseOperation(name) -} - -// GetDatabase gets the state of a Cloud Spanner database. -func (c *DatabaseAdminClient) GetDatabase(ctx context.Context, req *databasepb.GetDatabaseRequest, opts ...gax.CallOption) (*databasepb.Database, error) { - return c.internalClient.GetDatabase(ctx, req, opts...) -} - -// UpdateDatabase updates a Cloud Spanner database. The returned -// [long-running operation][google.longrunning.Operation] can be used to track -// the progress of updating the database. If the named database does not -// exist, returns NOT_FOUND. -// -// While the operation is pending: -// -// The database’s -// reconciling -// field is set to true. -// -// Cancelling the operation is best-effort. If the cancellation succeeds, -// the operation metadata’s -// cancel_time -// is set, the updates are reverted, and the operation terminates with a -// CANCELLED status. -// -// New UpdateDatabase requests will return a FAILED_PRECONDITION error -// until the pending operation is done (returns successfully or with -// error). -// -// Reading the database via the API continues to give the pre-request -// values. -// -// Upon completion of the returned operation: -// -// The new values are in effect and readable via the API. -// -// The database’s -// reconciling -// field becomes false. -// -// The returned [long-running operation][google.longrunning.Operation] will -// have a name of the format -// projects//instances//databases//operations/ -// and can be used to track the database modification. The -// metadata field type is -// UpdateDatabaseMetadata. -// The response field type is -// Database, if successful. -func (c *DatabaseAdminClient) UpdateDatabase(ctx context.Context, req *databasepb.UpdateDatabaseRequest, opts ...gax.CallOption) (*UpdateDatabaseOperation, error) { - return c.internalClient.UpdateDatabase(ctx, req, opts...) -} - -// UpdateDatabaseOperation returns a new UpdateDatabaseOperation from a given name. -// The name must be that of a previously created UpdateDatabaseOperation, possibly from a different process. -func (c *DatabaseAdminClient) UpdateDatabaseOperation(name string) *UpdateDatabaseOperation { - return c.internalClient.UpdateDatabaseOperation(name) -} - -// UpdateDatabaseDdl updates the schema of a Cloud Spanner database by -// creating/altering/dropping tables, columns, indexes, etc. The returned -// [long-running operation][google.longrunning.Operation] will have a name of -// the format /operations/ and can be used to -// track execution of the schema change(s). The -// metadata field type is -// UpdateDatabaseDdlMetadata. -// The operation has no response. -func (c *DatabaseAdminClient) UpdateDatabaseDdl(ctx context.Context, req *databasepb.UpdateDatabaseDdlRequest, opts ...gax.CallOption) (*UpdateDatabaseDdlOperation, error) { - return c.internalClient.UpdateDatabaseDdl(ctx, req, opts...) -} - -// UpdateDatabaseDdlOperation returns a new UpdateDatabaseDdlOperation from a given name. -// The name must be that of a previously created UpdateDatabaseDdlOperation, possibly from a different process. -func (c *DatabaseAdminClient) UpdateDatabaseDdlOperation(name string) *UpdateDatabaseDdlOperation { - return c.internalClient.UpdateDatabaseDdlOperation(name) -} - -// DropDatabase drops (aka deletes) a Cloud Spanner database. -// Completed backups for the database will be retained according to their -// expire_time. -// Note: Cloud Spanner might continue to accept requests for a few seconds -// after the database has been deleted. -func (c *DatabaseAdminClient) DropDatabase(ctx context.Context, req *databasepb.DropDatabaseRequest, opts ...gax.CallOption) error { - return c.internalClient.DropDatabase(ctx, req, opts...) -} - -// GetDatabaseDdl returns the schema of a Cloud Spanner database as a list of formatted -// DDL statements. This method does not show pending schema updates, those may -// be queried using the Operations API. -func (c *DatabaseAdminClient) GetDatabaseDdl(ctx context.Context, req *databasepb.GetDatabaseDdlRequest, opts ...gax.CallOption) (*databasepb.GetDatabaseDdlResponse, error) { - return c.internalClient.GetDatabaseDdl(ctx, req, opts...) -} - -// SetIamPolicy sets the access control policy on a database or backup resource. -// Replaces any existing policy. -// -// Authorization requires spanner.databases.setIamPolicy -// permission on resource. -// For backups, authorization requires spanner.backups.setIamPolicy -// permission on resource. -func (c *DatabaseAdminClient) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { - return c.internalClient.SetIamPolicy(ctx, req, opts...) -} - -// GetIamPolicy gets the access control policy for a database or backup resource. -// Returns an empty policy if a database or backup exists but does not have a -// policy set. -// -// Authorization requires spanner.databases.getIamPolicy permission on -// resource. -// For backups, authorization requires spanner.backups.getIamPolicy -// permission on resource. -func (c *DatabaseAdminClient) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { - return c.internalClient.GetIamPolicy(ctx, req, opts...) -} - -// TestIamPermissions returns permissions that the caller has on the specified database or backup -// resource. -// -// Attempting this RPC on a non-existent Cloud Spanner database will -// result in a NOT_FOUND error if the user has -// spanner.databases.list permission on the containing Cloud -// Spanner instance. Otherwise returns an empty set of permissions. -// Calling this method on a backup that does not exist will -// result in a NOT_FOUND error if the user has -// spanner.backups.list permission on the containing instance. -func (c *DatabaseAdminClient) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) { - return c.internalClient.TestIamPermissions(ctx, req, opts...) -} - -// CreateBackup starts creating a new Cloud Spanner Backup. -// The returned backup [long-running operation][google.longrunning.Operation] -// will have a name of the format -// projects//instances//backups//operations/ -// and can be used to track creation of the backup. The -// metadata field type is -// CreateBackupMetadata. -// The response field type is -// Backup, if successful. -// Cancelling the returned operation will stop the creation and delete the -// backup. There can be only one pending backup creation per database. Backup -// creation of different databases can run concurrently. -func (c *DatabaseAdminClient) CreateBackup(ctx context.Context, req *databasepb.CreateBackupRequest, opts ...gax.CallOption) (*CreateBackupOperation, error) { - return c.internalClient.CreateBackup(ctx, req, opts...) -} - -// CreateBackupOperation returns a new CreateBackupOperation from a given name. -// The name must be that of a previously created CreateBackupOperation, possibly from a different process. -func (c *DatabaseAdminClient) CreateBackupOperation(name string) *CreateBackupOperation { - return c.internalClient.CreateBackupOperation(name) -} - -// CopyBackup starts copying a Cloud Spanner Backup. -// The returned backup [long-running operation][google.longrunning.Operation] -// will have a name of the format -// projects//instances//backups//operations/ -// and can be used to track copying of the backup. The operation is associated -// with the destination backup. -// The metadata field type is -// CopyBackupMetadata. -// The response field type is -// Backup, if successful. -// Cancelling the returned operation will stop the copying and delete the -// destination backup. Concurrent CopyBackup requests can run on the same -// source backup. -func (c *DatabaseAdminClient) CopyBackup(ctx context.Context, req *databasepb.CopyBackupRequest, opts ...gax.CallOption) (*CopyBackupOperation, error) { - return c.internalClient.CopyBackup(ctx, req, opts...) -} - -// CopyBackupOperation returns a new CopyBackupOperation from a given name. -// The name must be that of a previously created CopyBackupOperation, possibly from a different process. -func (c *DatabaseAdminClient) CopyBackupOperation(name string) *CopyBackupOperation { - return c.internalClient.CopyBackupOperation(name) -} - -// GetBackup gets metadata on a pending or completed -// Backup. -func (c *DatabaseAdminClient) GetBackup(ctx context.Context, req *databasepb.GetBackupRequest, opts ...gax.CallOption) (*databasepb.Backup, error) { - return c.internalClient.GetBackup(ctx, req, opts...) -} - -// UpdateBackup updates a pending or completed -// Backup. -func (c *DatabaseAdminClient) UpdateBackup(ctx context.Context, req *databasepb.UpdateBackupRequest, opts ...gax.CallOption) (*databasepb.Backup, error) { - return c.internalClient.UpdateBackup(ctx, req, opts...) -} - -// DeleteBackup deletes a pending or completed -// Backup. -func (c *DatabaseAdminClient) DeleteBackup(ctx context.Context, req *databasepb.DeleteBackupRequest, opts ...gax.CallOption) error { - return c.internalClient.DeleteBackup(ctx, req, opts...) -} - -// ListBackups lists completed and pending backups. -// Backups returned are ordered by create_time in descending order, -// starting from the most recent create_time. -func (c *DatabaseAdminClient) ListBackups(ctx context.Context, req *databasepb.ListBackupsRequest, opts ...gax.CallOption) *BackupIterator { - return c.internalClient.ListBackups(ctx, req, opts...) -} - -// RestoreDatabase create a new database by restoring from a completed backup. The new -// database must be in the same project and in an instance with the same -// instance configuration as the instance containing -// the backup. The returned database [long-running -// operation][google.longrunning.Operation] has a name of the format -// projects//instances//databases//operations/, -// and can be used to track the progress of the operation, and to cancel it. -// The metadata field type is -// RestoreDatabaseMetadata. -// The response type -// is Database, if -// successful. Cancelling the returned operation will stop the restore and -// delete the database. -// There can be only one database being restored into an instance at a time. -// Once the restore operation completes, a new restore operation can be -// initiated, without waiting for the optimize operation associated with the -// first restore to complete. -func (c *DatabaseAdminClient) RestoreDatabase(ctx context.Context, req *databasepb.RestoreDatabaseRequest, opts ...gax.CallOption) (*RestoreDatabaseOperation, error) { - return c.internalClient.RestoreDatabase(ctx, req, opts...) -} - -// RestoreDatabaseOperation returns a new RestoreDatabaseOperation from a given name. -// The name must be that of a previously created RestoreDatabaseOperation, possibly from a different process. -func (c *DatabaseAdminClient) RestoreDatabaseOperation(name string) *RestoreDatabaseOperation { - return c.internalClient.RestoreDatabaseOperation(name) -} - -// ListDatabaseOperations lists database [longrunning-operations][google.longrunning.Operation]. -// A database operation has a name of the form -// projects//instances//databases//operations/. -// The long-running operation -// metadata field type -// metadata.type_url describes the type of the metadata. Operations returned -// include those that have completed/failed/canceled within the last 7 days, -// and pending operations. -func (c *DatabaseAdminClient) ListDatabaseOperations(ctx context.Context, req *databasepb.ListDatabaseOperationsRequest, opts ...gax.CallOption) *OperationIterator { - return c.internalClient.ListDatabaseOperations(ctx, req, opts...) -} - -// ListBackupOperations lists the backup [long-running operations][google.longrunning.Operation] in -// the given instance. A backup operation has a name of the form -// projects//instances//backups//operations/. -// The long-running operation -// metadata field type -// metadata.type_url describes the type of the metadata. Operations returned -// include those that have completed/failed/canceled within the last 7 days, -// and pending operations. Operations returned are ordered by -// operation.metadata.value.progress.start_time in descending order starting -// from the most recently started operation. -func (c *DatabaseAdminClient) ListBackupOperations(ctx context.Context, req *databasepb.ListBackupOperationsRequest, opts ...gax.CallOption) *OperationIterator { - return c.internalClient.ListBackupOperations(ctx, req, opts...) -} - -// ListDatabaseRoles lists Cloud Spanner database roles. -func (c *DatabaseAdminClient) ListDatabaseRoles(ctx context.Context, req *databasepb.ListDatabaseRolesRequest, opts ...gax.CallOption) *DatabaseRoleIterator { - return c.internalClient.ListDatabaseRoles(ctx, req, opts...) -} - -// AddSplitPoints adds split points to specified tables, indexes of a database. -func (c *DatabaseAdminClient) AddSplitPoints(ctx context.Context, req *databasepb.AddSplitPointsRequest, opts ...gax.CallOption) (*databasepb.AddSplitPointsResponse, error) { - return c.internalClient.AddSplitPoints(ctx, req, opts...) -} - -// CreateBackupSchedule creates a new backup schedule. -func (c *DatabaseAdminClient) CreateBackupSchedule(ctx context.Context, req *databasepb.CreateBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - return c.internalClient.CreateBackupSchedule(ctx, req, opts...) -} - -// GetBackupSchedule gets backup schedule for the input schedule name. -func (c *DatabaseAdminClient) GetBackupSchedule(ctx context.Context, req *databasepb.GetBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - return c.internalClient.GetBackupSchedule(ctx, req, opts...) -} - -// UpdateBackupSchedule updates a backup schedule. -func (c *DatabaseAdminClient) UpdateBackupSchedule(ctx context.Context, req *databasepb.UpdateBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - return c.internalClient.UpdateBackupSchedule(ctx, req, opts...) -} - -// DeleteBackupSchedule deletes a backup schedule. -func (c *DatabaseAdminClient) DeleteBackupSchedule(ctx context.Context, req *databasepb.DeleteBackupScheduleRequest, opts ...gax.CallOption) error { - return c.internalClient.DeleteBackupSchedule(ctx, req, opts...) -} - -// ListBackupSchedules lists all the backup schedules for the database. -func (c *DatabaseAdminClient) ListBackupSchedules(ctx context.Context, req *databasepb.ListBackupSchedulesRequest, opts ...gax.CallOption) *BackupScheduleIterator { - return c.internalClient.ListBackupSchedules(ctx, req, opts...) -} - -// InternalUpdateGraphOperation this is an internal API called by Spanner Graph jobs. You should never need -// to call this API directly. -func (c *DatabaseAdminClient) InternalUpdateGraphOperation(ctx context.Context, req *databasepb.InternalUpdateGraphOperationRequest, opts ...gax.CallOption) (*databasepb.InternalUpdateGraphOperationResponse, error) { - return c.internalClient.InternalUpdateGraphOperation(ctx, req, opts...) -} - -// CancelOperation is a utility method from google.longrunning.Operations. -func (c *DatabaseAdminClient) CancelOperation(ctx context.Context, req *longrunningpb.CancelOperationRequest, opts ...gax.CallOption) error { - return c.internalClient.CancelOperation(ctx, req, opts...) -} - -// DeleteOperation is a utility method from google.longrunning.Operations. -func (c *DatabaseAdminClient) DeleteOperation(ctx context.Context, req *longrunningpb.DeleteOperationRequest, opts ...gax.CallOption) error { - return c.internalClient.DeleteOperation(ctx, req, opts...) -} - -// GetOperation is a utility method from google.longrunning.Operations. -func (c *DatabaseAdminClient) GetOperation(ctx context.Context, req *longrunningpb.GetOperationRequest, opts ...gax.CallOption) (*longrunningpb.Operation, error) { - return c.internalClient.GetOperation(ctx, req, opts...) -} - -// ListOperations is a utility method from google.longrunning.Operations. -func (c *DatabaseAdminClient) ListOperations(ctx context.Context, req *longrunningpb.ListOperationsRequest, opts ...gax.CallOption) *OperationIterator { - return c.internalClient.ListOperations(ctx, req, opts...) -} - -// databaseAdminGRPCClient is a client for interacting with Cloud Spanner API over gRPC transport. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type databaseAdminGRPCClient struct { - // Connection pool of gRPC connections to the service. - connPool gtransport.ConnPool - - // Points back to the CallOptions field of the containing DatabaseAdminClient - CallOptions **DatabaseAdminCallOptions - - // The gRPC API client. - databaseAdminClient databasepb.DatabaseAdminClient - - // LROClient is used internally to handle long-running operations. - // It is exposed so that its CallOptions can be modified if required. - // Users should not Close this client. - LROClient **lroauto.OperationsClient - - operationsClient longrunningpb.OperationsClient - - // The x-goog-* metadata to be sent with each request. - xGoogHeaders []string - - logger *slog.Logger -} - -// NewDatabaseAdminClient creates a new database admin client based on gRPC. -// The returned client must be Closed when it is done being used to clean up its underlying connections. -// -// # Cloud Spanner Database Admin API -// -// The Cloud Spanner Database Admin API can be used to: -// -// create, drop, and list databases -// -// update the schema of pre-existing databases -// -// create, delete, copy and list backups for a database -// -// restore a database from an existing backup -func NewDatabaseAdminClient(ctx context.Context, opts ...option.ClientOption) (*DatabaseAdminClient, error) { - clientOpts := defaultDatabaseAdminGRPCClientOptions() - if newDatabaseAdminClientHook != nil { - hookOpts, err := newDatabaseAdminClientHook(ctx, clientHookParams{}) - if err != nil { - return nil, err - } - clientOpts = append(clientOpts, hookOpts...) - } - - connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) - if err != nil { - return nil, err - } - client := DatabaseAdminClient{CallOptions: defaultDatabaseAdminCallOptions()} - - c := &databaseAdminGRPCClient{ - connPool: connPool, - databaseAdminClient: databasepb.NewDatabaseAdminClient(connPool), - CallOptions: &client.CallOptions, - logger: internaloption.GetLogger(opts), - operationsClient: longrunningpb.NewOperationsClient(connPool), - } - c.setGoogleClientInfo() - - client.internalClient = c - - client.LROClient, err = lroauto.NewOperationsClient(ctx, gtransport.WithConnPool(connPool)) - if err != nil { - // This error "should not happen", since we are just reusing old connection pool - // and never actually need to dial. - // If this does happen, we could leak connp. However, we cannot close conn: - // If the user invoked the constructor with option.WithGRPCConn, - // we would close a connection that's still in use. - // TODO: investigate error conditions. - return nil, err - } - c.LROClient = &client.LROClient - return &client, nil -} - -// Connection returns a connection to the API service. -// -// Deprecated: Connections are now pooled so this method does not always -// return the same resource. -func (c *databaseAdminGRPCClient) Connection() *grpc.ClientConn { - return c.connPool.Conn() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *databaseAdminGRPCClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) - c.xGoogHeaders = []string{ - "x-goog-api-client", gax.XGoogHeader(kv...), - } -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *databaseAdminGRPCClient) Close() error { - return c.connPool.Close() -} - -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type databaseAdminRESTClient struct { - // The http endpoint to connect to. - endpoint string - - // The http client. - httpClient *http.Client - - // LROClient is used internally to handle long-running operations. - // It is exposed so that its CallOptions can be modified if required. - // Users should not Close this client. - LROClient **lroauto.OperationsClient - - // The x-goog-* headers to be sent with each request. - xGoogHeaders []string - - // Points back to the CallOptions field of the containing DatabaseAdminClient - CallOptions **DatabaseAdminCallOptions - - logger *slog.Logger -} - -// NewDatabaseAdminRESTClient creates a new database admin rest client. -// -// # Cloud Spanner Database Admin API -// -// The Cloud Spanner Database Admin API can be used to: -// -// create, drop, and list databases -// -// update the schema of pre-existing databases -// -// create, delete, copy and list backups for a database -// -// restore a database from an existing backup -func NewDatabaseAdminRESTClient(ctx context.Context, opts ...option.ClientOption) (*DatabaseAdminClient, error) { - clientOpts := append(defaultDatabaseAdminRESTClientOptions(), opts...) - httpClient, endpoint, err := httptransport.NewClient(ctx, clientOpts...) - if err != nil { - return nil, err - } - - callOpts := defaultDatabaseAdminRESTCallOptions() - c := &databaseAdminRESTClient{ - endpoint: endpoint, - httpClient: httpClient, - CallOptions: &callOpts, - logger: internaloption.GetLogger(opts), - } - c.setGoogleClientInfo() - - lroOpts := []option.ClientOption{ - option.WithHTTPClient(httpClient), - option.WithEndpoint(endpoint), - } - opClient, err := lroauto.NewOperationsRESTClient(ctx, lroOpts...) - if err != nil { - return nil, err - } - c.LROClient = &opClient - - return &DatabaseAdminClient{internalClient: c, CallOptions: callOpts}, nil -} - -func defaultDatabaseAdminRESTClientOptions() []option.ClientOption { - return []option.ClientOption{ - internaloption.WithDefaultEndpoint("https://spanner.googleapis.com"), - internaloption.WithDefaultEndpointTemplate("https://spanner.UNIVERSE_DOMAIN"), - internaloption.WithDefaultMTLSEndpoint("https://spanner.mtls.googleapis.com"), - internaloption.WithDefaultUniverseDomain("googleapis.com"), - internaloption.WithDefaultAudience("https://spanner.googleapis.com/"), - internaloption.WithDefaultScopes(DefaultAuthScopes()...), - internaloption.EnableNewAuthLibrary(), - } -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *databaseAdminRESTClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN", "pb", protoVersion) - c.xGoogHeaders = []string{ - "x-goog-api-client", gax.XGoogHeader(kv...), - } -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *databaseAdminRESTClient) Close() error { - // Replace httpClient with nil to force cleanup. - c.httpClient = nil - return nil -} - -// Connection returns a connection to the API service. -// -// Deprecated: This method always returns nil. -func (c *databaseAdminRESTClient) Connection() *grpc.ClientConn { - return nil -} -func (c *databaseAdminGRPCClient) ListDatabases(ctx context.Context, req *databasepb.ListDatabasesRequest, opts ...gax.CallOption) *DatabaseIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListDatabases[0:len((*c.CallOptions).ListDatabases):len((*c.CallOptions).ListDatabases)], opts...) - it := &DatabaseIterator{} - req = proto.Clone(req).(*databasepb.ListDatabasesRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.Database, string, error) { - resp := &databasepb.ListDatabasesResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.ListDatabases, req, settings.GRPC, c.logger, "ListDatabases") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetDatabases(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *databaseAdminGRPCClient) CreateDatabase(ctx context.Context, req *databasepb.CreateDatabaseRequest, opts ...gax.CallOption) (*CreateDatabaseOperation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).CreateDatabase[0:len((*c.CallOptions).CreateDatabase):len((*c.CallOptions).CreateDatabase)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.CreateDatabase, req, settings.GRPC, c.logger, "CreateDatabase") - return err - }, opts...) - if err != nil { - return nil, err - } - return &CreateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - }, nil -} - -func (c *databaseAdminGRPCClient) GetDatabase(ctx context.Context, req *databasepb.GetDatabaseRequest, opts ...gax.CallOption) (*databasepb.Database, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetDatabase[0:len((*c.CallOptions).GetDatabase):len((*c.CallOptions).GetDatabase)], opts...) - var resp *databasepb.Database - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.GetDatabase, req, settings.GRPC, c.logger, "GetDatabase") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) UpdateDatabase(ctx context.Context, req *databasepb.UpdateDatabaseRequest, opts ...gax.CallOption) (*UpdateDatabaseOperation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database.name", url.QueryEscape(req.GetDatabase().GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).UpdateDatabase[0:len((*c.CallOptions).UpdateDatabase):len((*c.CallOptions).UpdateDatabase)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.UpdateDatabase, req, settings.GRPC, c.logger, "UpdateDatabase") - return err - }, opts...) - if err != nil { - return nil, err - } - return &UpdateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - }, nil -} - -func (c *databaseAdminGRPCClient) UpdateDatabaseDdl(ctx context.Context, req *databasepb.UpdateDatabaseDdlRequest, opts ...gax.CallOption) (*UpdateDatabaseDdlOperation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).UpdateDatabaseDdl[0:len((*c.CallOptions).UpdateDatabaseDdl):len((*c.CallOptions).UpdateDatabaseDdl)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.UpdateDatabaseDdl, req, settings.GRPC, c.logger, "UpdateDatabaseDdl") - return err - }, opts...) - if err != nil { - return nil, err - } - return &UpdateDatabaseDdlOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - }, nil -} - -func (c *databaseAdminGRPCClient) DropDatabase(ctx context.Context, req *databasepb.DropDatabaseRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).DropDatabase[0:len((*c.CallOptions).DropDatabase):len((*c.CallOptions).DropDatabase)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.databaseAdminClient.DropDatabase, req, settings.GRPC, c.logger, "DropDatabase") - return err - }, opts...) - return err -} - -func (c *databaseAdminGRPCClient) GetDatabaseDdl(ctx context.Context, req *databasepb.GetDatabaseDdlRequest, opts ...gax.CallOption) (*databasepb.GetDatabaseDdlResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetDatabaseDdl[0:len((*c.CallOptions).GetDatabaseDdl):len((*c.CallOptions).GetDatabaseDdl)], opts...) - var resp *databasepb.GetDatabaseDdlResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.GetDatabaseDdl, req, settings.GRPC, c.logger, "GetDatabaseDdl") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "resource", url.QueryEscape(req.GetResource()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).SetIamPolicy[0:len((*c.CallOptions).SetIamPolicy):len((*c.CallOptions).SetIamPolicy)], opts...) - var resp *iampb.Policy - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.SetIamPolicy, req, settings.GRPC, c.logger, "SetIamPolicy") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "resource", url.QueryEscape(req.GetResource()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetIamPolicy[0:len((*c.CallOptions).GetIamPolicy):len((*c.CallOptions).GetIamPolicy)], opts...) - var resp *iampb.Policy - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.GetIamPolicy, req, settings.GRPC, c.logger, "GetIamPolicy") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "resource", url.QueryEscape(req.GetResource()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).TestIamPermissions[0:len((*c.CallOptions).TestIamPermissions):len((*c.CallOptions).TestIamPermissions)], opts...) - var resp *iampb.TestIamPermissionsResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.TestIamPermissions, req, settings.GRPC, c.logger, "TestIamPermissions") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) CreateBackup(ctx context.Context, req *databasepb.CreateBackupRequest, opts ...gax.CallOption) (*CreateBackupOperation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).CreateBackup[0:len((*c.CallOptions).CreateBackup):len((*c.CallOptions).CreateBackup)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.CreateBackup, req, settings.GRPC, c.logger, "CreateBackup") - return err - }, opts...) - if err != nil { - return nil, err - } - return &CreateBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - }, nil -} - -func (c *databaseAdminGRPCClient) CopyBackup(ctx context.Context, req *databasepb.CopyBackupRequest, opts ...gax.CallOption) (*CopyBackupOperation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).CopyBackup[0:len((*c.CallOptions).CopyBackup):len((*c.CallOptions).CopyBackup)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.CopyBackup, req, settings.GRPC, c.logger, "CopyBackup") - return err - }, opts...) - if err != nil { - return nil, err - } - return &CopyBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - }, nil -} - -func (c *databaseAdminGRPCClient) GetBackup(ctx context.Context, req *databasepb.GetBackupRequest, opts ...gax.CallOption) (*databasepb.Backup, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetBackup[0:len((*c.CallOptions).GetBackup):len((*c.CallOptions).GetBackup)], opts...) - var resp *databasepb.Backup - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.GetBackup, req, settings.GRPC, c.logger, "GetBackup") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) UpdateBackup(ctx context.Context, req *databasepb.UpdateBackupRequest, opts ...gax.CallOption) (*databasepb.Backup, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "backup.name", url.QueryEscape(req.GetBackup().GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).UpdateBackup[0:len((*c.CallOptions).UpdateBackup):len((*c.CallOptions).UpdateBackup)], opts...) - var resp *databasepb.Backup - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.UpdateBackup, req, settings.GRPC, c.logger, "UpdateBackup") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) DeleteBackup(ctx context.Context, req *databasepb.DeleteBackupRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).DeleteBackup[0:len((*c.CallOptions).DeleteBackup):len((*c.CallOptions).DeleteBackup)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.databaseAdminClient.DeleteBackup, req, settings.GRPC, c.logger, "DeleteBackup") - return err - }, opts...) - return err -} - -func (c *databaseAdminGRPCClient) ListBackups(ctx context.Context, req *databasepb.ListBackupsRequest, opts ...gax.CallOption) *BackupIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListBackups[0:len((*c.CallOptions).ListBackups):len((*c.CallOptions).ListBackups)], opts...) - it := &BackupIterator{} - req = proto.Clone(req).(*databasepb.ListBackupsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.Backup, string, error) { - resp := &databasepb.ListBackupsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.ListBackups, req, settings.GRPC, c.logger, "ListBackups") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetBackups(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *databaseAdminGRPCClient) RestoreDatabase(ctx context.Context, req *databasepb.RestoreDatabaseRequest, opts ...gax.CallOption) (*RestoreDatabaseOperation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).RestoreDatabase[0:len((*c.CallOptions).RestoreDatabase):len((*c.CallOptions).RestoreDatabase)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.RestoreDatabase, req, settings.GRPC, c.logger, "RestoreDatabase") - return err - }, opts...) - if err != nil { - return nil, err - } - return &RestoreDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - }, nil -} - -func (c *databaseAdminGRPCClient) ListDatabaseOperations(ctx context.Context, req *databasepb.ListDatabaseOperationsRequest, opts ...gax.CallOption) *OperationIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListDatabaseOperations[0:len((*c.CallOptions).ListDatabaseOperations):len((*c.CallOptions).ListDatabaseOperations)], opts...) - it := &OperationIterator{} - req = proto.Clone(req).(*databasepb.ListDatabaseOperationsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*longrunningpb.Operation, string, error) { - resp := &databasepb.ListDatabaseOperationsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.ListDatabaseOperations, req, settings.GRPC, c.logger, "ListDatabaseOperations") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetOperations(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *databaseAdminGRPCClient) ListBackupOperations(ctx context.Context, req *databasepb.ListBackupOperationsRequest, opts ...gax.CallOption) *OperationIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListBackupOperations[0:len((*c.CallOptions).ListBackupOperations):len((*c.CallOptions).ListBackupOperations)], opts...) - it := &OperationIterator{} - req = proto.Clone(req).(*databasepb.ListBackupOperationsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*longrunningpb.Operation, string, error) { - resp := &databasepb.ListBackupOperationsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.ListBackupOperations, req, settings.GRPC, c.logger, "ListBackupOperations") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetOperations(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *databaseAdminGRPCClient) ListDatabaseRoles(ctx context.Context, req *databasepb.ListDatabaseRolesRequest, opts ...gax.CallOption) *DatabaseRoleIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListDatabaseRoles[0:len((*c.CallOptions).ListDatabaseRoles):len((*c.CallOptions).ListDatabaseRoles)], opts...) - it := &DatabaseRoleIterator{} - req = proto.Clone(req).(*databasepb.ListDatabaseRolesRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.DatabaseRole, string, error) { - resp := &databasepb.ListDatabaseRolesResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.ListDatabaseRoles, req, settings.GRPC, c.logger, "ListDatabaseRoles") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetDatabaseRoles(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *databaseAdminGRPCClient) AddSplitPoints(ctx context.Context, req *databasepb.AddSplitPointsRequest, opts ...gax.CallOption) (*databasepb.AddSplitPointsResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).AddSplitPoints[0:len((*c.CallOptions).AddSplitPoints):len((*c.CallOptions).AddSplitPoints)], opts...) - var resp *databasepb.AddSplitPointsResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.AddSplitPoints, req, settings.GRPC, c.logger, "AddSplitPoints") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) CreateBackupSchedule(ctx context.Context, req *databasepb.CreateBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).CreateBackupSchedule[0:len((*c.CallOptions).CreateBackupSchedule):len((*c.CallOptions).CreateBackupSchedule)], opts...) - var resp *databasepb.BackupSchedule - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.CreateBackupSchedule, req, settings.GRPC, c.logger, "CreateBackupSchedule") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) GetBackupSchedule(ctx context.Context, req *databasepb.GetBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetBackupSchedule[0:len((*c.CallOptions).GetBackupSchedule):len((*c.CallOptions).GetBackupSchedule)], opts...) - var resp *databasepb.BackupSchedule - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.GetBackupSchedule, req, settings.GRPC, c.logger, "GetBackupSchedule") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) UpdateBackupSchedule(ctx context.Context, req *databasepb.UpdateBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "backup_schedule.name", url.QueryEscape(req.GetBackupSchedule().GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).UpdateBackupSchedule[0:len((*c.CallOptions).UpdateBackupSchedule):len((*c.CallOptions).UpdateBackupSchedule)], opts...) - var resp *databasepb.BackupSchedule - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.UpdateBackupSchedule, req, settings.GRPC, c.logger, "UpdateBackupSchedule") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) DeleteBackupSchedule(ctx context.Context, req *databasepb.DeleteBackupScheduleRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).DeleteBackupSchedule[0:len((*c.CallOptions).DeleteBackupSchedule):len((*c.CallOptions).DeleteBackupSchedule)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.databaseAdminClient.DeleteBackupSchedule, req, settings.GRPC, c.logger, "DeleteBackupSchedule") - return err - }, opts...) - return err -} - -func (c *databaseAdminGRPCClient) ListBackupSchedules(ctx context.Context, req *databasepb.ListBackupSchedulesRequest, opts ...gax.CallOption) *BackupScheduleIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListBackupSchedules[0:len((*c.CallOptions).ListBackupSchedules):len((*c.CallOptions).ListBackupSchedules)], opts...) - it := &BackupScheduleIterator{} - req = proto.Clone(req).(*databasepb.ListBackupSchedulesRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.BackupSchedule, string, error) { - resp := &databasepb.ListBackupSchedulesResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.ListBackupSchedules, req, settings.GRPC, c.logger, "ListBackupSchedules") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetBackupSchedules(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *databaseAdminGRPCClient) InternalUpdateGraphOperation(ctx context.Context, req *databasepb.InternalUpdateGraphOperationRequest, opts ...gax.CallOption) (*databasepb.InternalUpdateGraphOperationResponse, error) { - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...) - opts = append((*c.CallOptions).InternalUpdateGraphOperation[0:len((*c.CallOptions).InternalUpdateGraphOperation):len((*c.CallOptions).InternalUpdateGraphOperation)], opts...) - var resp *databasepb.InternalUpdateGraphOperationResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.databaseAdminClient.InternalUpdateGraphOperation, req, settings.GRPC, c.logger, "InternalUpdateGraphOperation") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) CancelOperation(ctx context.Context, req *longrunningpb.CancelOperationRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).CancelOperation[0:len((*c.CallOptions).CancelOperation):len((*c.CallOptions).CancelOperation)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.operationsClient.CancelOperation, req, settings.GRPC, c.logger, "CancelOperation") - return err - }, opts...) - return err -} - -func (c *databaseAdminGRPCClient) DeleteOperation(ctx context.Context, req *longrunningpb.DeleteOperationRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).DeleteOperation[0:len((*c.CallOptions).DeleteOperation):len((*c.CallOptions).DeleteOperation)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.operationsClient.DeleteOperation, req, settings.GRPC, c.logger, "DeleteOperation") - return err - }, opts...) - return err -} - -func (c *databaseAdminGRPCClient) GetOperation(ctx context.Context, req *longrunningpb.GetOperationRequest, opts ...gax.CallOption) (*longrunningpb.Operation, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetOperation[0:len((*c.CallOptions).GetOperation):len((*c.CallOptions).GetOperation)], opts...) - var resp *longrunningpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.operationsClient.GetOperation, req, settings.GRPC, c.logger, "GetOperation") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *databaseAdminGRPCClient) ListOperations(ctx context.Context, req *longrunningpb.ListOperationsRequest, opts ...gax.CallOption) *OperationIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListOperations[0:len((*c.CallOptions).ListOperations):len((*c.CallOptions).ListOperations)], opts...) - it := &OperationIterator{} - req = proto.Clone(req).(*longrunningpb.ListOperationsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*longrunningpb.Operation, string, error) { - resp := &longrunningpb.ListOperationsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.operationsClient.ListOperations, req, settings.GRPC, c.logger, "ListOperations") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetOperations(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// ListDatabases lists Cloud Spanner databases. -func (c *databaseAdminRESTClient) ListDatabases(ctx context.Context, req *databasepb.ListDatabasesRequest, opts ...gax.CallOption) *DatabaseIterator { - it := &DatabaseIterator{} - req = proto.Clone(req).(*databasepb.ListDatabasesRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.Database, string, error) { - resp := &databasepb.ListDatabasesResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/databases", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListDatabases") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetDatabases(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// CreateDatabase creates a new Cloud Spanner database and starts to prepare it for serving. -// The returned [long-running operation][google.longrunning.Operation] will -// have a name of the format /operations/ and -// can be used to track preparation of the database. The -// metadata field type is -// CreateDatabaseMetadata. -// The response field type is -// Database, if successful. -func (c *databaseAdminRESTClient) CreateDatabase(ctx context.Context, req *databasepb.CreateDatabaseRequest, opts ...gax.CallOption) (*CreateDatabaseOperation, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/databases", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "CreateDatabase") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - - override := fmt.Sprintf("/v1/%s", resp.GetName()) - return &CreateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - pollPath: override, - }, nil -} - -// GetDatabase gets the state of a Cloud Spanner database. -func (c *databaseAdminRESTClient) GetDatabase(ctx context.Context, req *databasepb.GetDatabaseRequest, opts ...gax.CallOption) (*databasepb.Database, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetDatabase[0:len((*c.CallOptions).GetDatabase):len((*c.CallOptions).GetDatabase)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.Database{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "GetDatabase") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// UpdateDatabase updates a Cloud Spanner database. The returned -// [long-running operation][google.longrunning.Operation] can be used to track -// the progress of updating the database. If the named database does not -// exist, returns NOT_FOUND. -// -// While the operation is pending: -// -// The database’s -// reconciling -// field is set to true. -// -// Cancelling the operation is best-effort. If the cancellation succeeds, -// the operation metadata’s -// cancel_time -// is set, the updates are reverted, and the operation terminates with a -// CANCELLED status. -// -// New UpdateDatabase requests will return a FAILED_PRECONDITION error -// until the pending operation is done (returns successfully or with -// error). -// -// Reading the database via the API continues to give the pre-request -// values. -// -// Upon completion of the returned operation: -// -// The new values are in effect and readable via the API. -// -// The database’s -// reconciling -// field becomes false. -// -// The returned [long-running operation][google.longrunning.Operation] will -// have a name of the format -// projects//instances//databases//operations/ -// and can be used to track the database modification. The -// metadata field type is -// UpdateDatabaseMetadata. -// The response field type is -// Database, if successful. -func (c *databaseAdminRESTClient) UpdateDatabase(ctx context.Context, req *databasepb.UpdateDatabaseRequest, opts ...gax.CallOption) (*UpdateDatabaseOperation, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - body := req.GetDatabase() - jsonReq, err := m.Marshal(body) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetDatabase().GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetUpdateMask() != nil { - field, err := protojson.Marshal(req.GetUpdateMask()) - if err != nil { - return nil, err - } - params.Add("updateMask", string(field[1:len(field)-1])) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database.name", url.QueryEscape(req.GetDatabase().GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("PATCH", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "UpdateDatabase") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - - override := fmt.Sprintf("/v1/%s", resp.GetName()) - return &UpdateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - pollPath: override, - }, nil -} - -// UpdateDatabaseDdl updates the schema of a Cloud Spanner database by -// creating/altering/dropping tables, columns, indexes, etc. The returned -// [long-running operation][google.longrunning.Operation] will have a name of -// the format /operations/ and can be used to -// track execution of the schema change(s). The -// metadata field type is -// UpdateDatabaseDdlMetadata. -// The operation has no response. -func (c *databaseAdminRESTClient) UpdateDatabaseDdl(ctx context.Context, req *databasepb.UpdateDatabaseDdlRequest, opts ...gax.CallOption) (*UpdateDatabaseDdlOperation, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/ddl", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("PATCH", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "UpdateDatabaseDdl") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - - override := fmt.Sprintf("/v1/%s", resp.GetName()) - return &UpdateDatabaseDdlOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - pollPath: override, - }, nil -} - -// DropDatabase drops (aka deletes) a Cloud Spanner database. -// Completed backups for the database will be retained according to their -// expire_time. -// Note: Cloud Spanner might continue to accept requests for a few seconds -// after the database has been deleted. -func (c *databaseAdminRESTClient) DropDatabase(ctx context.Context, req *databasepb.DropDatabaseRequest, opts ...gax.CallOption) error { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("DELETE", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "DropDatabase") - return err - }, opts...) -} - -// GetDatabaseDdl returns the schema of a Cloud Spanner database as a list of formatted -// DDL statements. This method does not show pending schema updates, those may -// be queried using the Operations API. -func (c *databaseAdminRESTClient) GetDatabaseDdl(ctx context.Context, req *databasepb.GetDatabaseDdlRequest, opts ...gax.CallOption) (*databasepb.GetDatabaseDdlResponse, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/ddl", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetDatabaseDdl[0:len((*c.CallOptions).GetDatabaseDdl):len((*c.CallOptions).GetDatabaseDdl)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.GetDatabaseDdlResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "GetDatabaseDdl") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// SetIamPolicy sets the access control policy on a database or backup resource. -// Replaces any existing policy. -// -// Authorization requires spanner.databases.setIamPolicy -// permission on resource. -// For backups, authorization requires spanner.backups.setIamPolicy -// permission on resource. -func (c *databaseAdminRESTClient) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:setIamPolicy", req.GetResource()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "resource", url.QueryEscape(req.GetResource()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).SetIamPolicy[0:len((*c.CallOptions).SetIamPolicy):len((*c.CallOptions).SetIamPolicy)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &iampb.Policy{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "SetIamPolicy") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// GetIamPolicy gets the access control policy for a database or backup resource. -// Returns an empty policy if a database or backup exists but does not have a -// policy set. -// -// Authorization requires spanner.databases.getIamPolicy permission on -// resource. -// For backups, authorization requires spanner.backups.getIamPolicy -// permission on resource. -func (c *databaseAdminRESTClient) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:getIamPolicy", req.GetResource()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "resource", url.QueryEscape(req.GetResource()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetIamPolicy[0:len((*c.CallOptions).GetIamPolicy):len((*c.CallOptions).GetIamPolicy)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &iampb.Policy{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "GetIamPolicy") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// TestIamPermissions returns permissions that the caller has on the specified database or backup -// resource. -// -// Attempting this RPC on a non-existent Cloud Spanner database will -// result in a NOT_FOUND error if the user has -// spanner.databases.list permission on the containing Cloud -// Spanner instance. Otherwise returns an empty set of permissions. -// Calling this method on a backup that does not exist will -// result in a NOT_FOUND error if the user has -// spanner.backups.list permission on the containing instance. -func (c *databaseAdminRESTClient) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:testIamPermissions", req.GetResource()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "resource", url.QueryEscape(req.GetResource()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).TestIamPermissions[0:len((*c.CallOptions).TestIamPermissions):len((*c.CallOptions).TestIamPermissions)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &iampb.TestIamPermissionsResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "TestIamPermissions") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// CreateBackup starts creating a new Cloud Spanner Backup. -// The returned backup [long-running operation][google.longrunning.Operation] -// will have a name of the format -// projects//instances//backups//operations/ -// and can be used to track creation of the backup. The -// metadata field type is -// CreateBackupMetadata. -// The response field type is -// Backup, if successful. -// Cancelling the returned operation will stop the creation and delete the -// backup. There can be only one pending backup creation per database. Backup -// creation of different databases can run concurrently. -func (c *databaseAdminRESTClient) CreateBackup(ctx context.Context, req *databasepb.CreateBackupRequest, opts ...gax.CallOption) (*CreateBackupOperation, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - body := req.GetBackup() - jsonReq, err := m.Marshal(body) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/backups", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - params.Add("backupId", fmt.Sprintf("%v", req.GetBackupId())) - params.Add("encryptionConfig.encryptionType", fmt.Sprintf("%v", req.GetEncryptionConfig().GetEncryptionType())) - if req.GetEncryptionConfig().GetKmsKeyName() != "" { - params.Add("encryptionConfig.kmsKeyName", fmt.Sprintf("%v", req.GetEncryptionConfig().GetKmsKeyName())) - } - if items := req.GetEncryptionConfig().GetKmsKeyNames(); len(items) > 0 { - for _, item := range items { - params.Add("encryptionConfig.kmsKeyNames", fmt.Sprintf("%v", item)) - } - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "CreateBackup") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - - override := fmt.Sprintf("/v1/%s", resp.GetName()) - return &CreateBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - pollPath: override, - }, nil -} - -// CopyBackup starts copying a Cloud Spanner Backup. -// The returned backup [long-running operation][google.longrunning.Operation] -// will have a name of the format -// projects//instances//backups//operations/ -// and can be used to track copying of the backup. The operation is associated -// with the destination backup. -// The metadata field type is -// CopyBackupMetadata. -// The response field type is -// Backup, if successful. -// Cancelling the returned operation will stop the copying and delete the -// destination backup. Concurrent CopyBackup requests can run on the same -// source backup. -func (c *databaseAdminRESTClient) CopyBackup(ctx context.Context, req *databasepb.CopyBackupRequest, opts ...gax.CallOption) (*CopyBackupOperation, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/backups:copy", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "CopyBackup") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - - override := fmt.Sprintf("/v1/%s", resp.GetName()) - return &CopyBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - pollPath: override, - }, nil -} - -// GetBackup gets metadata on a pending or completed -// Backup. -func (c *databaseAdminRESTClient) GetBackup(ctx context.Context, req *databasepb.GetBackupRequest, opts ...gax.CallOption) (*databasepb.Backup, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetBackup[0:len((*c.CallOptions).GetBackup):len((*c.CallOptions).GetBackup)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.Backup{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "GetBackup") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// UpdateBackup updates a pending or completed -// Backup. -func (c *databaseAdminRESTClient) UpdateBackup(ctx context.Context, req *databasepb.UpdateBackupRequest, opts ...gax.CallOption) (*databasepb.Backup, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - body := req.GetBackup() - jsonReq, err := m.Marshal(body) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetBackup().GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetUpdateMask() != nil { - field, err := protojson.Marshal(req.GetUpdateMask()) - if err != nil { - return nil, err - } - params.Add("updateMask", string(field[1:len(field)-1])) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "backup.name", url.QueryEscape(req.GetBackup().GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).UpdateBackup[0:len((*c.CallOptions).UpdateBackup):len((*c.CallOptions).UpdateBackup)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.Backup{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("PATCH", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "UpdateBackup") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// DeleteBackup deletes a pending or completed -// Backup. -func (c *databaseAdminRESTClient) DeleteBackup(ctx context.Context, req *databasepb.DeleteBackupRequest, opts ...gax.CallOption) error { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("DELETE", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "DeleteBackup") - return err - }, opts...) -} - -// ListBackups lists completed and pending backups. -// Backups returned are ordered by create_time in descending order, -// starting from the most recent create_time. -func (c *databaseAdminRESTClient) ListBackups(ctx context.Context, req *databasepb.ListBackupsRequest, opts ...gax.CallOption) *BackupIterator { - it := &BackupIterator{} - req = proto.Clone(req).(*databasepb.ListBackupsRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.Backup, string, error) { - resp := &databasepb.ListBackupsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/backups", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetFilter() != "" { - params.Add("filter", fmt.Sprintf("%v", req.GetFilter())) - } - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListBackups") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetBackups(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// RestoreDatabase create a new database by restoring from a completed backup. The new -// database must be in the same project and in an instance with the same -// instance configuration as the instance containing -// the backup. The returned database [long-running -// operation][google.longrunning.Operation] has a name of the format -// projects//instances//databases//operations/, -// and can be used to track the progress of the operation, and to cancel it. -// The metadata field type is -// RestoreDatabaseMetadata. -// The response type -// is Database, if -// successful. Cancelling the returned operation will stop the restore and -// delete the database. -// There can be only one database being restored into an instance at a time. -// Once the restore operation completes, a new restore operation can be -// initiated, without waiting for the optimize operation associated with the -// first restore to complete. -func (c *databaseAdminRESTClient) RestoreDatabase(ctx context.Context, req *databasepb.RestoreDatabaseRequest, opts ...gax.CallOption) (*RestoreDatabaseOperation, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/databases:restore", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "RestoreDatabase") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - - override := fmt.Sprintf("/v1/%s", resp.GetName()) - return &RestoreDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, resp), - pollPath: override, - }, nil -} - -// ListDatabaseOperations lists database [longrunning-operations][google.longrunning.Operation]. -// A database operation has a name of the form -// projects//instances//databases//operations/. -// The long-running operation -// metadata field type -// metadata.type_url describes the type of the metadata. Operations returned -// include those that have completed/failed/canceled within the last 7 days, -// and pending operations. -func (c *databaseAdminRESTClient) ListDatabaseOperations(ctx context.Context, req *databasepb.ListDatabaseOperationsRequest, opts ...gax.CallOption) *OperationIterator { - it := &OperationIterator{} - req = proto.Clone(req).(*databasepb.ListDatabaseOperationsRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*longrunningpb.Operation, string, error) { - resp := &databasepb.ListDatabaseOperationsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/databaseOperations", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetFilter() != "" { - params.Add("filter", fmt.Sprintf("%v", req.GetFilter())) - } - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListDatabaseOperations") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetOperations(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// ListBackupOperations lists the backup [long-running operations][google.longrunning.Operation] in -// the given instance. A backup operation has a name of the form -// projects//instances//backups//operations/. -// The long-running operation -// metadata field type -// metadata.type_url describes the type of the metadata. Operations returned -// include those that have completed/failed/canceled within the last 7 days, -// and pending operations. Operations returned are ordered by -// operation.metadata.value.progress.start_time in descending order starting -// from the most recently started operation. -func (c *databaseAdminRESTClient) ListBackupOperations(ctx context.Context, req *databasepb.ListBackupOperationsRequest, opts ...gax.CallOption) *OperationIterator { - it := &OperationIterator{} - req = proto.Clone(req).(*databasepb.ListBackupOperationsRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*longrunningpb.Operation, string, error) { - resp := &databasepb.ListBackupOperationsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/backupOperations", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetFilter() != "" { - params.Add("filter", fmt.Sprintf("%v", req.GetFilter())) - } - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListBackupOperations") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetOperations(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// ListDatabaseRoles lists Cloud Spanner database roles. -func (c *databaseAdminRESTClient) ListDatabaseRoles(ctx context.Context, req *databasepb.ListDatabaseRolesRequest, opts ...gax.CallOption) *DatabaseRoleIterator { - it := &DatabaseRoleIterator{} - req = proto.Clone(req).(*databasepb.ListDatabaseRolesRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.DatabaseRole, string, error) { - resp := &databasepb.ListDatabaseRolesResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/databaseRoles", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListDatabaseRoles") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetDatabaseRoles(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// AddSplitPoints adds split points to specified tables, indexes of a database. -func (c *databaseAdminRESTClient) AddSplitPoints(ctx context.Context, req *databasepb.AddSplitPointsRequest, opts ...gax.CallOption) (*databasepb.AddSplitPointsResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:addSplitPoints", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).AddSplitPoints[0:len((*c.CallOptions).AddSplitPoints):len((*c.CallOptions).AddSplitPoints)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.AddSplitPointsResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "AddSplitPoints") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// CreateBackupSchedule creates a new backup schedule. -func (c *databaseAdminRESTClient) CreateBackupSchedule(ctx context.Context, req *databasepb.CreateBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - body := req.GetBackupSchedule() - jsonReq, err := m.Marshal(body) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/backupSchedules", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - params.Add("backupScheduleId", fmt.Sprintf("%v", req.GetBackupScheduleId())) - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).CreateBackupSchedule[0:len((*c.CallOptions).CreateBackupSchedule):len((*c.CallOptions).CreateBackupSchedule)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.BackupSchedule{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "CreateBackupSchedule") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// GetBackupSchedule gets backup schedule for the input schedule name. -func (c *databaseAdminRESTClient) GetBackupSchedule(ctx context.Context, req *databasepb.GetBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetBackupSchedule[0:len((*c.CallOptions).GetBackupSchedule):len((*c.CallOptions).GetBackupSchedule)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.BackupSchedule{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "GetBackupSchedule") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// UpdateBackupSchedule updates a backup schedule. -func (c *databaseAdminRESTClient) UpdateBackupSchedule(ctx context.Context, req *databasepb.UpdateBackupScheduleRequest, opts ...gax.CallOption) (*databasepb.BackupSchedule, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - body := req.GetBackupSchedule() - jsonReq, err := m.Marshal(body) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetBackupSchedule().GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetUpdateMask() != nil { - field, err := protojson.Marshal(req.GetUpdateMask()) - if err != nil { - return nil, err - } - params.Add("updateMask", string(field[1:len(field)-1])) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "backup_schedule.name", url.QueryEscape(req.GetBackupSchedule().GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).UpdateBackupSchedule[0:len((*c.CallOptions).UpdateBackupSchedule):len((*c.CallOptions).UpdateBackupSchedule)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.BackupSchedule{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("PATCH", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "UpdateBackupSchedule") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// DeleteBackupSchedule deletes a backup schedule. -func (c *databaseAdminRESTClient) DeleteBackupSchedule(ctx context.Context, req *databasepb.DeleteBackupScheduleRequest, opts ...gax.CallOption) error { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("DELETE", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "DeleteBackupSchedule") - return err - }, opts...) -} - -// ListBackupSchedules lists all the backup schedules for the database. -func (c *databaseAdminRESTClient) ListBackupSchedules(ctx context.Context, req *databasepb.ListBackupSchedulesRequest, opts ...gax.CallOption) *BackupScheduleIterator { - it := &BackupScheduleIterator{} - req = proto.Clone(req).(*databasepb.ListBackupSchedulesRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*databasepb.BackupSchedule, string, error) { - resp := &databasepb.ListBackupSchedulesResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/backupSchedules", req.GetParent()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListBackupSchedules") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetBackupSchedules(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// InternalUpdateGraphOperation this is an internal API called by Spanner Graph jobs. You should never need -// to call this API directly. -func (c *databaseAdminRESTClient) InternalUpdateGraphOperation(ctx context.Context, req *databasepb.InternalUpdateGraphOperationRequest, opts ...gax.CallOption) (*databasepb.InternalUpdateGraphOperationResponse, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("") - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - params.Add("database", fmt.Sprintf("%v", req.GetDatabase())) - params.Add("operationId", fmt.Sprintf("%v", req.GetOperationId())) - if req.GetProgress() != 0 { - params.Add("progress", fmt.Sprintf("%v", req.GetProgress())) - } - if req.GetStatus().GetCode() != 0 { - params.Add("status.code", fmt.Sprintf("%v", req.GetStatus().GetCode())) - } - if req.GetStatus().GetMessage() != "" { - params.Add("status.message", fmt.Sprintf("%v", req.GetStatus().GetMessage())) - } - params.Add("vmIdentityToken", fmt.Sprintf("%v", req.GetVmIdentityToken())) - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).InternalUpdateGraphOperation[0:len((*c.CallOptions).InternalUpdateGraphOperation):len((*c.CallOptions).InternalUpdateGraphOperation)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &databasepb.InternalUpdateGraphOperationResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "InternalUpdateGraphOperation") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// CancelOperation is a utility method from google.longrunning.Operations. -func (c *databaseAdminRESTClient) CancelOperation(ctx context.Context, req *longrunningpb.CancelOperationRequest, opts ...gax.CallOption) error { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:cancel", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "CancelOperation") - return err - }, opts...) -} - -// DeleteOperation is a utility method from google.longrunning.Operations. -func (c *databaseAdminRESTClient) DeleteOperation(ctx context.Context, req *longrunningpb.DeleteOperationRequest, opts ...gax.CallOption) error { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("DELETE", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "DeleteOperation") - return err - }, opts...) -} - -// GetOperation is a utility method from google.longrunning.Operations. -func (c *databaseAdminRESTClient) GetOperation(ctx context.Context, req *longrunningpb.GetOperationRequest, opts ...gax.CallOption) (*longrunningpb.Operation, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetOperation[0:len((*c.CallOptions).GetOperation):len((*c.CallOptions).GetOperation)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &longrunningpb.Operation{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "GetOperation") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// ListOperations is a utility method from google.longrunning.Operations. -func (c *databaseAdminRESTClient) ListOperations(ctx context.Context, req *longrunningpb.ListOperationsRequest, opts ...gax.CallOption) *OperationIterator { - it := &OperationIterator{} - req = proto.Clone(req).(*longrunningpb.ListOperationsRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*longrunningpb.Operation, string, error) { - resp := &longrunningpb.ListOperationsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetFilter() != "" { - params.Add("filter", fmt.Sprintf("%v", req.GetFilter())) - } - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListOperations") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetOperations(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// CopyBackupOperation returns a new CopyBackupOperation from a given name. -// The name must be that of a previously created CopyBackupOperation, possibly from a different process. -func (c *databaseAdminGRPCClient) CopyBackupOperation(name string) *CopyBackupOperation { - return &CopyBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - } -} - -// CopyBackupOperation returns a new CopyBackupOperation from a given name. -// The name must be that of a previously created CopyBackupOperation, possibly from a different process. -func (c *databaseAdminRESTClient) CopyBackupOperation(name string) *CopyBackupOperation { - override := fmt.Sprintf("/v1/%s", name) - return &CopyBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - pollPath: override, - } -} - -// CreateBackupOperation returns a new CreateBackupOperation from a given name. -// The name must be that of a previously created CreateBackupOperation, possibly from a different process. -func (c *databaseAdminGRPCClient) CreateBackupOperation(name string) *CreateBackupOperation { - return &CreateBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - } -} - -// CreateBackupOperation returns a new CreateBackupOperation from a given name. -// The name must be that of a previously created CreateBackupOperation, possibly from a different process. -func (c *databaseAdminRESTClient) CreateBackupOperation(name string) *CreateBackupOperation { - override := fmt.Sprintf("/v1/%s", name) - return &CreateBackupOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - pollPath: override, - } -} - -// CreateDatabaseOperation returns a new CreateDatabaseOperation from a given name. -// The name must be that of a previously created CreateDatabaseOperation, possibly from a different process. -func (c *databaseAdminGRPCClient) CreateDatabaseOperation(name string) *CreateDatabaseOperation { - return &CreateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - } -} - -// CreateDatabaseOperation returns a new CreateDatabaseOperation from a given name. -// The name must be that of a previously created CreateDatabaseOperation, possibly from a different process. -func (c *databaseAdminRESTClient) CreateDatabaseOperation(name string) *CreateDatabaseOperation { - override := fmt.Sprintf("/v1/%s", name) - return &CreateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - pollPath: override, - } -} - -// RestoreDatabaseOperation returns a new RestoreDatabaseOperation from a given name. -// The name must be that of a previously created RestoreDatabaseOperation, possibly from a different process. -func (c *databaseAdminGRPCClient) RestoreDatabaseOperation(name string) *RestoreDatabaseOperation { - return &RestoreDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - } -} - -// RestoreDatabaseOperation returns a new RestoreDatabaseOperation from a given name. -// The name must be that of a previously created RestoreDatabaseOperation, possibly from a different process. -func (c *databaseAdminRESTClient) RestoreDatabaseOperation(name string) *RestoreDatabaseOperation { - override := fmt.Sprintf("/v1/%s", name) - return &RestoreDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - pollPath: override, - } -} - -// UpdateDatabaseOperation returns a new UpdateDatabaseOperation from a given name. -// The name must be that of a previously created UpdateDatabaseOperation, possibly from a different process. -func (c *databaseAdminGRPCClient) UpdateDatabaseOperation(name string) *UpdateDatabaseOperation { - return &UpdateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - } -} - -// UpdateDatabaseOperation returns a new UpdateDatabaseOperation from a given name. -// The name must be that of a previously created UpdateDatabaseOperation, possibly from a different process. -func (c *databaseAdminRESTClient) UpdateDatabaseOperation(name string) *UpdateDatabaseOperation { - override := fmt.Sprintf("/v1/%s", name) - return &UpdateDatabaseOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - pollPath: override, - } -} - -// UpdateDatabaseDdlOperation returns a new UpdateDatabaseDdlOperation from a given name. -// The name must be that of a previously created UpdateDatabaseDdlOperation, possibly from a different process. -func (c *databaseAdminGRPCClient) UpdateDatabaseDdlOperation(name string) *UpdateDatabaseDdlOperation { - return &UpdateDatabaseDdlOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - } -} - -// UpdateDatabaseDdlOperation returns a new UpdateDatabaseDdlOperation from a given name. -// The name must be that of a previously created UpdateDatabaseDdlOperation, possibly from a different process. -func (c *databaseAdminRESTClient) UpdateDatabaseDdlOperation(name string) *UpdateDatabaseDdlOperation { - override := fmt.Sprintf("/v1/%s", name) - return &UpdateDatabaseDdlOperation{ - lro: longrunning.InternalNewOperation(*c.LROClient, &longrunningpb.Operation{Name: name}), - pollPath: override, - } -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/backup.pb.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/backup.pb.go deleted file mode 100644 index f74e9e0b5a..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/backup.pb.go +++ /dev/null @@ -1,2282 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/admin/database/v1/backup.proto - -package databasepb - -import ( - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Indicates the current state of the backup. -type Backup_State int32 - -const ( - // Not specified. - Backup_STATE_UNSPECIFIED Backup_State = 0 - // The pending backup is still being created. Operations on the - // backup may fail with `FAILED_PRECONDITION` in this state. - Backup_CREATING Backup_State = 1 - // The backup is complete and ready for use. - Backup_READY Backup_State = 2 -) - -// Enum value maps for Backup_State. -var ( - Backup_State_name = map[int32]string{ - 0: "STATE_UNSPECIFIED", - 1: "CREATING", - 2: "READY", - } - Backup_State_value = map[string]int32{ - "STATE_UNSPECIFIED": 0, - "CREATING": 1, - "READY": 2, - } -) - -func (x Backup_State) Enum() *Backup_State { - p := new(Backup_State) - *p = x - return p -} - -func (x Backup_State) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Backup_State) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_backup_proto_enumTypes[0].Descriptor() -} - -func (Backup_State) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_backup_proto_enumTypes[0] -} - -func (x Backup_State) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Backup_State.Descriptor instead. -func (Backup_State) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{0, 0} -} - -// Encryption types for the backup. -type CreateBackupEncryptionConfig_EncryptionType int32 - -const ( - // Unspecified. Do not use. - CreateBackupEncryptionConfig_ENCRYPTION_TYPE_UNSPECIFIED CreateBackupEncryptionConfig_EncryptionType = 0 - // Use the same encryption configuration as the database. This is the - // default option when - // [encryption_config][google.spanner.admin.database.v1.CreateBackupEncryptionConfig] - // is empty. For example, if the database is using - // `Customer_Managed_Encryption`, the backup will be using the same Cloud - // KMS key as the database. - CreateBackupEncryptionConfig_USE_DATABASE_ENCRYPTION CreateBackupEncryptionConfig_EncryptionType = 1 - // Use Google default encryption. - CreateBackupEncryptionConfig_GOOGLE_DEFAULT_ENCRYPTION CreateBackupEncryptionConfig_EncryptionType = 2 - // Use customer managed encryption. If specified, `kms_key_name` - // must contain a valid Cloud KMS key. - CreateBackupEncryptionConfig_CUSTOMER_MANAGED_ENCRYPTION CreateBackupEncryptionConfig_EncryptionType = 3 -) - -// Enum value maps for CreateBackupEncryptionConfig_EncryptionType. -var ( - CreateBackupEncryptionConfig_EncryptionType_name = map[int32]string{ - 0: "ENCRYPTION_TYPE_UNSPECIFIED", - 1: "USE_DATABASE_ENCRYPTION", - 2: "GOOGLE_DEFAULT_ENCRYPTION", - 3: "CUSTOMER_MANAGED_ENCRYPTION", - } - CreateBackupEncryptionConfig_EncryptionType_value = map[string]int32{ - "ENCRYPTION_TYPE_UNSPECIFIED": 0, - "USE_DATABASE_ENCRYPTION": 1, - "GOOGLE_DEFAULT_ENCRYPTION": 2, - "CUSTOMER_MANAGED_ENCRYPTION": 3, - } -) - -func (x CreateBackupEncryptionConfig_EncryptionType) Enum() *CreateBackupEncryptionConfig_EncryptionType { - p := new(CreateBackupEncryptionConfig_EncryptionType) - *p = x - return p -} - -func (x CreateBackupEncryptionConfig_EncryptionType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (CreateBackupEncryptionConfig_EncryptionType) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_backup_proto_enumTypes[1].Descriptor() -} - -func (CreateBackupEncryptionConfig_EncryptionType) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_backup_proto_enumTypes[1] -} - -func (x CreateBackupEncryptionConfig_EncryptionType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use CreateBackupEncryptionConfig_EncryptionType.Descriptor instead. -func (CreateBackupEncryptionConfig_EncryptionType) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{13, 0} -} - -// Encryption types for the backup. -type CopyBackupEncryptionConfig_EncryptionType int32 - -const ( - // Unspecified. Do not use. - CopyBackupEncryptionConfig_ENCRYPTION_TYPE_UNSPECIFIED CopyBackupEncryptionConfig_EncryptionType = 0 - // This is the default option for - // [CopyBackup][google.spanner.admin.database.v1.DatabaseAdmin.CopyBackup] - // when - // [encryption_config][google.spanner.admin.database.v1.CopyBackupEncryptionConfig] - // is not specified. For example, if the source backup is using - // `Customer_Managed_Encryption`, the backup will be using the same Cloud - // KMS key as the source backup. - CopyBackupEncryptionConfig_USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION CopyBackupEncryptionConfig_EncryptionType = 1 - // Use Google default encryption. - CopyBackupEncryptionConfig_GOOGLE_DEFAULT_ENCRYPTION CopyBackupEncryptionConfig_EncryptionType = 2 - // Use customer managed encryption. If specified, either `kms_key_name` or - // `kms_key_names` must contain valid Cloud KMS key(s). - CopyBackupEncryptionConfig_CUSTOMER_MANAGED_ENCRYPTION CopyBackupEncryptionConfig_EncryptionType = 3 -) - -// Enum value maps for CopyBackupEncryptionConfig_EncryptionType. -var ( - CopyBackupEncryptionConfig_EncryptionType_name = map[int32]string{ - 0: "ENCRYPTION_TYPE_UNSPECIFIED", - 1: "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION", - 2: "GOOGLE_DEFAULT_ENCRYPTION", - 3: "CUSTOMER_MANAGED_ENCRYPTION", - } - CopyBackupEncryptionConfig_EncryptionType_value = map[string]int32{ - "ENCRYPTION_TYPE_UNSPECIFIED": 0, - "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION": 1, - "GOOGLE_DEFAULT_ENCRYPTION": 2, - "CUSTOMER_MANAGED_ENCRYPTION": 3, - } -) - -func (x CopyBackupEncryptionConfig_EncryptionType) Enum() *CopyBackupEncryptionConfig_EncryptionType { - p := new(CopyBackupEncryptionConfig_EncryptionType) - *p = x - return p -} - -func (x CopyBackupEncryptionConfig_EncryptionType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (CopyBackupEncryptionConfig_EncryptionType) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_backup_proto_enumTypes[2].Descriptor() -} - -func (CopyBackupEncryptionConfig_EncryptionType) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_backup_proto_enumTypes[2] -} - -func (x CopyBackupEncryptionConfig_EncryptionType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use CopyBackupEncryptionConfig_EncryptionType.Descriptor instead. -func (CopyBackupEncryptionConfig_EncryptionType) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{14, 0} -} - -// A backup of a Cloud Spanner database. -type Backup struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required for the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // operation. Name of the database from which this backup was created. This - // needs to be in the same instance as the backup. Values are of the form - // `projects//instances//databases/`. - Database string `protobuf:"bytes,2,opt,name=database,proto3" json:"database,omitempty"` - // The backup will contain an externally consistent copy of the database at - // the timestamp specified by `version_time`. If `version_time` is not - // specified, the system will set `version_time` to the `create_time` of the - // backup. - VersionTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=version_time,json=versionTime,proto3" json:"version_time,omitempty"` - // Required for the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // operation. The expiration time of the backup, with microseconds - // granularity that must be at least 6 hours and at most 366 days - // from the time the CreateBackup request is processed. Once the `expire_time` - // has passed, the backup is eligible to be automatically deleted by Cloud - // Spanner to free the resources used by the backup. - ExpireTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` - // Output only for the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // operation. Required for the - // [UpdateBackup][google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackup] - // operation. - // - // A globally unique identifier for the backup which cannot be - // changed. Values are of the form - // `projects//instances//backups/[a-z][a-z0-9_\-]*[a-z0-9]` - // The final segment of the name must be between 2 and 60 characters - // in length. - // - // The backup is stored in the location(s) specified in the instance - // configuration of the instance containing the backup, identified - // by the prefix of the backup name of the form - // `projects//instances/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Output only. The time the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // request is received. If the request does not specify `version_time`, the - // `version_time` of the backup will be equivalent to the `create_time`. - CreateTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - // Output only. Size of the backup in bytes. - SizeBytes int64 `protobuf:"varint,5,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` - // Output only. The number of bytes that will be freed by deleting this - // backup. This value will be zero if, for example, this backup is part of an - // incremental backup chain and younger backups in the chain require that we - // keep its data. For backups not in an incremental backup chain, this is - // always the size of the backup. This value may change if backups on the same - // chain get created, deleted or expired. - FreeableSizeBytes int64 `protobuf:"varint,15,opt,name=freeable_size_bytes,json=freeableSizeBytes,proto3" json:"freeable_size_bytes,omitempty"` - // Output only. For a backup in an incremental backup chain, this is the - // storage space needed to keep the data that has changed since the previous - // backup. For all other backups, this is always the size of the backup. This - // value may change if backups on the same chain get deleted or expired. - // - // This field can be used to calculate the total storage space used by a set - // of backups. For example, the total space used by all backups of a database - // can be computed by summing up this field. - ExclusiveSizeBytes int64 `protobuf:"varint,16,opt,name=exclusive_size_bytes,json=exclusiveSizeBytes,proto3" json:"exclusive_size_bytes,omitempty"` - // Output only. The current state of the backup. - State Backup_State `protobuf:"varint,6,opt,name=state,proto3,enum=google.spanner.admin.database.v1.Backup_State" json:"state,omitempty"` - // Output only. The names of the restored databases that reference the backup. - // The database names are of - // the form `projects//instances//databases/`. - // Referencing databases may exist in different instances. The existence of - // any referencing database prevents the backup from being deleted. When a - // restored database from the backup enters the `READY` state, the reference - // to the backup is removed. - ReferencingDatabases []string `protobuf:"bytes,7,rep,name=referencing_databases,json=referencingDatabases,proto3" json:"referencing_databases,omitempty"` - // Output only. The encryption information for the backup. - EncryptionInfo *EncryptionInfo `protobuf:"bytes,8,opt,name=encryption_info,json=encryptionInfo,proto3" json:"encryption_info,omitempty"` - // Output only. The encryption information for the backup, whether it is - // protected by one or more KMS keys. The information includes all Cloud - // KMS key versions used to encrypt the backup. The `encryption_status' field - // inside of each `EncryptionInfo` is not populated. At least one of the key - // versions must be available for the backup to be restored. If a key version - // is revoked in the middle of a restore, the restore behavior is undefined. - EncryptionInformation []*EncryptionInfo `protobuf:"bytes,13,rep,name=encryption_information,json=encryptionInformation,proto3" json:"encryption_information,omitempty"` - // Output only. The database dialect information for the backup. - DatabaseDialect DatabaseDialect `protobuf:"varint,10,opt,name=database_dialect,json=databaseDialect,proto3,enum=google.spanner.admin.database.v1.DatabaseDialect" json:"database_dialect,omitempty"` - // Output only. The names of the destination backups being created by copying - // this source backup. The backup names are of the form - // `projects//instances//backups/`. - // Referencing backups may exist in different instances. The existence of - // any referencing backup prevents the backup from being deleted. When the - // copy operation is done (either successfully completed or cancelled or the - // destination backup is deleted), the reference to the backup is removed. - ReferencingBackups []string `protobuf:"bytes,11,rep,name=referencing_backups,json=referencingBackups,proto3" json:"referencing_backups,omitempty"` - // Output only. The max allowed expiration time of the backup, with - // microseconds granularity. A backup's expiration time can be configured in - // multiple APIs: CreateBackup, UpdateBackup, CopyBackup. When updating or - // copying an existing backup, the expiration time specified must be - // less than `Backup.max_expire_time`. - MaxExpireTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=max_expire_time,json=maxExpireTime,proto3" json:"max_expire_time,omitempty"` - // Output only. List of backup schedule URIs that are associated with - // creating this backup. This is only applicable for scheduled backups, and - // is empty for on-demand backups. - // - // To optimize for storage, whenever possible, multiple schedules are - // collapsed together to create one backup. In such cases, this field captures - // the list of all backup schedule URIs that are associated with creating - // this backup. If collapsing is not done, then this field captures the - // single backup schedule URI associated with creating this backup. - BackupSchedules []string `protobuf:"bytes,14,rep,name=backup_schedules,json=backupSchedules,proto3" json:"backup_schedules,omitempty"` - // Output only. Populated only for backups in an incremental backup chain. - // Backups share the same chain id if and only if they belong to the same - // incremental backup chain. Use this field to determine which backups are - // part of the same incremental backup chain. The ordering of backups in the - // chain can be determined by ordering the backup `version_time`. - IncrementalBackupChainId string `protobuf:"bytes,17,opt,name=incremental_backup_chain_id,json=incrementalBackupChainId,proto3" json:"incremental_backup_chain_id,omitempty"` - // Output only. Data deleted at a time older than this is guaranteed not to be - // retained in order to support this backup. For a backup in an incremental - // backup chain, this is the version time of the oldest backup that exists or - // ever existed in the chain. For all other backups, this is the version time - // of the backup. This field can be used to understand what data is being - // retained by the backup system. - OldestVersionTime *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=oldest_version_time,json=oldestVersionTime,proto3" json:"oldest_version_time,omitempty"` - // Output only. The instance partition(s) storing the backup. - // - // This is the same as the list of the instance partition(s) that the database - // had footprint in at the backup's `version_time`. - InstancePartitions []*BackupInstancePartition `protobuf:"bytes,19,rep,name=instance_partitions,json=instancePartitions,proto3" json:"instance_partitions,omitempty"` -} - -func (x *Backup) Reset() { - *x = Backup{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Backup) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Backup) ProtoMessage() {} - -func (x *Backup) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Backup.ProtoReflect.Descriptor instead. -func (*Backup) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{0} -} - -func (x *Backup) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *Backup) GetVersionTime() *timestamppb.Timestamp { - if x != nil { - return x.VersionTime - } - return nil -} - -func (x *Backup) GetExpireTime() *timestamppb.Timestamp { - if x != nil { - return x.ExpireTime - } - return nil -} - -func (x *Backup) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Backup) GetCreateTime() *timestamppb.Timestamp { - if x != nil { - return x.CreateTime - } - return nil -} - -func (x *Backup) GetSizeBytes() int64 { - if x != nil { - return x.SizeBytes - } - return 0 -} - -func (x *Backup) GetFreeableSizeBytes() int64 { - if x != nil { - return x.FreeableSizeBytes - } - return 0 -} - -func (x *Backup) GetExclusiveSizeBytes() int64 { - if x != nil { - return x.ExclusiveSizeBytes - } - return 0 -} - -func (x *Backup) GetState() Backup_State { - if x != nil { - return x.State - } - return Backup_STATE_UNSPECIFIED -} - -func (x *Backup) GetReferencingDatabases() []string { - if x != nil { - return x.ReferencingDatabases - } - return nil -} - -func (x *Backup) GetEncryptionInfo() *EncryptionInfo { - if x != nil { - return x.EncryptionInfo - } - return nil -} - -func (x *Backup) GetEncryptionInformation() []*EncryptionInfo { - if x != nil { - return x.EncryptionInformation - } - return nil -} - -func (x *Backup) GetDatabaseDialect() DatabaseDialect { - if x != nil { - return x.DatabaseDialect - } - return DatabaseDialect_DATABASE_DIALECT_UNSPECIFIED -} - -func (x *Backup) GetReferencingBackups() []string { - if x != nil { - return x.ReferencingBackups - } - return nil -} - -func (x *Backup) GetMaxExpireTime() *timestamppb.Timestamp { - if x != nil { - return x.MaxExpireTime - } - return nil -} - -func (x *Backup) GetBackupSchedules() []string { - if x != nil { - return x.BackupSchedules - } - return nil -} - -func (x *Backup) GetIncrementalBackupChainId() string { - if x != nil { - return x.IncrementalBackupChainId - } - return "" -} - -func (x *Backup) GetOldestVersionTime() *timestamppb.Timestamp { - if x != nil { - return x.OldestVersionTime - } - return nil -} - -func (x *Backup) GetInstancePartitions() []*BackupInstancePartition { - if x != nil { - return x.InstancePartitions - } - return nil -} - -// The request for -// [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup]. -type CreateBackupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the instance in which the backup will be - // created. This must be the same instance that contains the database the - // backup will be created from. The backup will be stored in the - // location(s) specified in the instance configuration of this - // instance. Values are of the form - // `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Required. The id of the backup to be created. The `backup_id` appended to - // `parent` forms the full backup name of the form - // `projects//instances//backups/`. - BackupId string `protobuf:"bytes,2,opt,name=backup_id,json=backupId,proto3" json:"backup_id,omitempty"` - // Required. The backup to create. - Backup *Backup `protobuf:"bytes,3,opt,name=backup,proto3" json:"backup,omitempty"` - // Optional. The encryption configuration used to encrypt the backup. If this - // field is not specified, the backup will use the same encryption - // configuration as the database by default, namely - // [encryption_type][google.spanner.admin.database.v1.CreateBackupEncryptionConfig.encryption_type] - // = `USE_DATABASE_ENCRYPTION`. - EncryptionConfig *CreateBackupEncryptionConfig `protobuf:"bytes,4,opt,name=encryption_config,json=encryptionConfig,proto3" json:"encryption_config,omitempty"` -} - -func (x *CreateBackupRequest) Reset() { - *x = CreateBackupRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateBackupRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateBackupRequest) ProtoMessage() {} - -func (x *CreateBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateBackupRequest.ProtoReflect.Descriptor instead. -func (*CreateBackupRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{1} -} - -func (x *CreateBackupRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *CreateBackupRequest) GetBackupId() string { - if x != nil { - return x.BackupId - } - return "" -} - -func (x *CreateBackupRequest) GetBackup() *Backup { - if x != nil { - return x.Backup - } - return nil -} - -func (x *CreateBackupRequest) GetEncryptionConfig() *CreateBackupEncryptionConfig { - if x != nil { - return x.EncryptionConfig - } - return nil -} - -// Metadata type for the operation returned by -// [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup]. -type CreateBackupMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The name of the backup being created. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The name of the database the backup is created from. - Database string `protobuf:"bytes,2,opt,name=database,proto3" json:"database,omitempty"` - // The progress of the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // operation. - Progress *OperationProgress `protobuf:"bytes,3,opt,name=progress,proto3" json:"progress,omitempty"` - // The time at which cancellation of this operation was received. - // [Operations.CancelOperation][google.longrunning.Operations.CancelOperation] - // starts asynchronous cancellation on a long-running operation. The server - // makes a best effort to cancel the operation, but success is not guaranteed. - // Clients can use - // [Operations.GetOperation][google.longrunning.Operations.GetOperation] or - // other methods to check whether the cancellation succeeded or whether the - // operation completed despite cancellation. On successful cancellation, - // the operation is not deleted; instead, it becomes an operation with - // an [Operation.error][google.longrunning.Operation.error] value with a - // [google.rpc.Status.code][google.rpc.Status.code] of 1, - // corresponding to `Code.CANCELLED`. - CancelTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=cancel_time,json=cancelTime,proto3" json:"cancel_time,omitempty"` -} - -func (x *CreateBackupMetadata) Reset() { - *x = CreateBackupMetadata{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateBackupMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateBackupMetadata) ProtoMessage() {} - -func (x *CreateBackupMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateBackupMetadata.ProtoReflect.Descriptor instead. -func (*CreateBackupMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{2} -} - -func (x *CreateBackupMetadata) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CreateBackupMetadata) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *CreateBackupMetadata) GetProgress() *OperationProgress { - if x != nil { - return x.Progress - } - return nil -} - -func (x *CreateBackupMetadata) GetCancelTime() *timestamppb.Timestamp { - if x != nil { - return x.CancelTime - } - return nil -} - -// The request for -// [CopyBackup][google.spanner.admin.database.v1.DatabaseAdmin.CopyBackup]. -type CopyBackupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the destination instance that will contain the backup - // copy. Values are of the form: `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Required. The id of the backup copy. - // The `backup_id` appended to `parent` forms the full backup_uri of the form - // `projects//instances//backups/`. - BackupId string `protobuf:"bytes,2,opt,name=backup_id,json=backupId,proto3" json:"backup_id,omitempty"` - // Required. The source backup to be copied. - // The source backup needs to be in READY state for it to be copied. - // Once CopyBackup is in progress, the source backup cannot be deleted or - // cleaned up on expiration until CopyBackup is finished. - // Values are of the form: - // `projects//instances//backups/`. - SourceBackup string `protobuf:"bytes,3,opt,name=source_backup,json=sourceBackup,proto3" json:"source_backup,omitempty"` - // Required. The expiration time of the backup in microsecond granularity. - // The expiration time must be at least 6 hours and at most 366 days - // from the `create_time` of the source backup. Once the `expire_time` has - // passed, the backup is eligible to be automatically deleted by Cloud Spanner - // to free the resources used by the backup. - ExpireTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` - // Optional. The encryption configuration used to encrypt the backup. If this - // field is not specified, the backup will use the same encryption - // configuration as the source backup by default, namely - // [encryption_type][google.spanner.admin.database.v1.CopyBackupEncryptionConfig.encryption_type] - // = `USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION`. - EncryptionConfig *CopyBackupEncryptionConfig `protobuf:"bytes,5,opt,name=encryption_config,json=encryptionConfig,proto3" json:"encryption_config,omitempty"` -} - -func (x *CopyBackupRequest) Reset() { - *x = CopyBackupRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CopyBackupRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CopyBackupRequest) ProtoMessage() {} - -func (x *CopyBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CopyBackupRequest.ProtoReflect.Descriptor instead. -func (*CopyBackupRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{3} -} - -func (x *CopyBackupRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *CopyBackupRequest) GetBackupId() string { - if x != nil { - return x.BackupId - } - return "" -} - -func (x *CopyBackupRequest) GetSourceBackup() string { - if x != nil { - return x.SourceBackup - } - return "" -} - -func (x *CopyBackupRequest) GetExpireTime() *timestamppb.Timestamp { - if x != nil { - return x.ExpireTime - } - return nil -} - -func (x *CopyBackupRequest) GetEncryptionConfig() *CopyBackupEncryptionConfig { - if x != nil { - return x.EncryptionConfig - } - return nil -} - -// Metadata type for the operation returned by -// [CopyBackup][google.spanner.admin.database.v1.DatabaseAdmin.CopyBackup]. -type CopyBackupMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The name of the backup being created through the copy operation. - // Values are of the form - // `projects//instances//backups/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The name of the source backup that is being copied. - // Values are of the form - // `projects//instances//backups/`. - SourceBackup string `protobuf:"bytes,2,opt,name=source_backup,json=sourceBackup,proto3" json:"source_backup,omitempty"` - // The progress of the - // [CopyBackup][google.spanner.admin.database.v1.DatabaseAdmin.CopyBackup] - // operation. - Progress *OperationProgress `protobuf:"bytes,3,opt,name=progress,proto3" json:"progress,omitempty"` - // The time at which cancellation of CopyBackup operation was received. - // [Operations.CancelOperation][google.longrunning.Operations.CancelOperation] - // starts asynchronous cancellation on a long-running operation. The server - // makes a best effort to cancel the operation, but success is not guaranteed. - // Clients can use - // [Operations.GetOperation][google.longrunning.Operations.GetOperation] or - // other methods to check whether the cancellation succeeded or whether the - // operation completed despite cancellation. On successful cancellation, - // the operation is not deleted; instead, it becomes an operation with - // an [Operation.error][google.longrunning.Operation.error] value with a - // [google.rpc.Status.code][google.rpc.Status.code] of 1, - // corresponding to `Code.CANCELLED`. - CancelTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=cancel_time,json=cancelTime,proto3" json:"cancel_time,omitempty"` -} - -func (x *CopyBackupMetadata) Reset() { - *x = CopyBackupMetadata{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CopyBackupMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CopyBackupMetadata) ProtoMessage() {} - -func (x *CopyBackupMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CopyBackupMetadata.ProtoReflect.Descriptor instead. -func (*CopyBackupMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{4} -} - -func (x *CopyBackupMetadata) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CopyBackupMetadata) GetSourceBackup() string { - if x != nil { - return x.SourceBackup - } - return "" -} - -func (x *CopyBackupMetadata) GetProgress() *OperationProgress { - if x != nil { - return x.Progress - } - return nil -} - -func (x *CopyBackupMetadata) GetCancelTime() *timestamppb.Timestamp { - if x != nil { - return x.CancelTime - } - return nil -} - -// The request for -// [UpdateBackup][google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackup]. -type UpdateBackupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The backup to update. `backup.name`, and the fields to be updated - // as specified by `update_mask` are required. Other fields are ignored. - // Update is only supported for the following fields: - // - `backup.expire_time`. - Backup *Backup `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"` - // Required. A mask specifying which fields (e.g. `expire_time`) in the - // Backup resource should be updated. This mask is relative to the Backup - // resource, not to the request message. The field mask must always be - // specified; this prevents any future fields from being erased accidentally - // by clients that do not know about them. - UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` -} - -func (x *UpdateBackupRequest) Reset() { - *x = UpdateBackupRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateBackupRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateBackupRequest) ProtoMessage() {} - -func (x *UpdateBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateBackupRequest.ProtoReflect.Descriptor instead. -func (*UpdateBackupRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{5} -} - -func (x *UpdateBackupRequest) GetBackup() *Backup { - if x != nil { - return x.Backup - } - return nil -} - -func (x *UpdateBackupRequest) GetUpdateMask() *fieldmaskpb.FieldMask { - if x != nil { - return x.UpdateMask - } - return nil -} - -// The request for -// [GetBackup][google.spanner.admin.database.v1.DatabaseAdmin.GetBackup]. -type GetBackupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. Name of the backup. - // Values are of the form - // `projects//instances//backups/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetBackupRequest) Reset() { - *x = GetBackupRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetBackupRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetBackupRequest) ProtoMessage() {} - -func (x *GetBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetBackupRequest.ProtoReflect.Descriptor instead. -func (*GetBackupRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{6} -} - -func (x *GetBackupRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for -// [DeleteBackup][google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackup]. -type DeleteBackupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. Name of the backup to delete. - // Values are of the form - // `projects//instances//backups/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *DeleteBackupRequest) Reset() { - *x = DeleteBackupRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeleteBackupRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteBackupRequest) ProtoMessage() {} - -func (x *DeleteBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteBackupRequest.ProtoReflect.Descriptor instead. -func (*DeleteBackupRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{7} -} - -func (x *DeleteBackupRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for -// [ListBackups][google.spanner.admin.database.v1.DatabaseAdmin.ListBackups]. -type ListBackupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The instance to list backups from. Values are of the - // form `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // An expression that filters the list of returned backups. - // - // A filter expression consists of a field name, a comparison operator, and a - // value for filtering. - // The value must be a string, a number, or a boolean. The comparison operator - // must be one of: `<`, `>`, `<=`, `>=`, `!=`, `=`, or `:`. - // Colon `:` is the contains operator. Filter rules are not case sensitive. - // - // The following fields in the - // [Backup][google.spanner.admin.database.v1.Backup] are eligible for - // filtering: - // - // - `name` - // - `database` - // - `state` - // - `create_time` (and values are of the format YYYY-MM-DDTHH:MM:SSZ) - // - `expire_time` (and values are of the format YYYY-MM-DDTHH:MM:SSZ) - // - `version_time` (and values are of the format YYYY-MM-DDTHH:MM:SSZ) - // - `size_bytes` - // - `backup_schedules` - // - // You can combine multiple expressions by enclosing each expression in - // parentheses. By default, expressions are combined with AND logic, but - // you can specify AND, OR, and NOT logic explicitly. - // - // Here are a few examples: - // - // - `name:Howl` - The backup's name contains the string "howl". - // - `database:prod` - // - The database's name contains the string "prod". - // - `state:CREATING` - The backup is pending creation. - // - `state:READY` - The backup is fully created and ready for use. - // - `(name:howl) AND (create_time < \"2018-03-28T14:50:00Z\")` - // - The backup name contains the string "howl" and `create_time` - // of the backup is before 2018-03-28T14:50:00Z. - // - `expire_time < \"2018-03-28T14:50:00Z\"` - // - The backup `expire_time` is before 2018-03-28T14:50:00Z. - // - `size_bytes > 10000000000` - The backup's size is greater than 10GB - // - `backup_schedules:daily` - // - The backup is created from a schedule with "daily" in its name. - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // Number of backups to be returned in the response. If 0 or - // less, defaults to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListBackupsResponse.next_page_token] - // from a previous - // [ListBackupsResponse][google.spanner.admin.database.v1.ListBackupsResponse] - // to the same `parent` and with the same `filter`. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` -} - -func (x *ListBackupsRequest) Reset() { - *x = ListBackupsRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListBackupsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListBackupsRequest) ProtoMessage() {} - -func (x *ListBackupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListBackupsRequest.ProtoReflect.Descriptor instead. -func (*ListBackupsRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{8} -} - -func (x *ListBackupsRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *ListBackupsRequest) GetFilter() string { - if x != nil { - return x.Filter - } - return "" -} - -func (x *ListBackupsRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListBackupsRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -// The response for -// [ListBackups][google.spanner.admin.database.v1.DatabaseAdmin.ListBackups]. -type ListBackupsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The list of matching backups. Backups returned are ordered by `create_time` - // in descending order, starting from the most recent `create_time`. - Backups []*Backup `protobuf:"bytes,1,rep,name=backups,proto3" json:"backups,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListBackups][google.spanner.admin.database.v1.DatabaseAdmin.ListBackups] - // call to fetch more of the matching backups. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListBackupsResponse) Reset() { - *x = ListBackupsResponse{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListBackupsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListBackupsResponse) ProtoMessage() {} - -func (x *ListBackupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListBackupsResponse.ProtoReflect.Descriptor instead. -func (*ListBackupsResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{9} -} - -func (x *ListBackupsResponse) GetBackups() []*Backup { - if x != nil { - return x.Backups - } - return nil -} - -func (x *ListBackupsResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// The request for -// [ListBackupOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperations]. -type ListBackupOperationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The instance of the backup operations. Values are of - // the form `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // An expression that filters the list of returned backup operations. - // - // A filter expression consists of a field name, a - // comparison operator, and a value for filtering. - // The value must be a string, a number, or a boolean. The comparison operator - // must be one of: `<`, `>`, `<=`, `>=`, `!=`, `=`, or `:`. - // Colon `:` is the contains operator. Filter rules are not case sensitive. - // - // The following fields in the [operation][google.longrunning.Operation] - // are eligible for filtering: - // - // - `name` - The name of the long-running operation - // - `done` - False if the operation is in progress, else true. - // - `metadata.@type` - the type of metadata. For example, the type string - // for - // [CreateBackupMetadata][google.spanner.admin.database.v1.CreateBackupMetadata] - // is - // `type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata`. - // - `metadata.` - any field in metadata.value. - // `metadata.@type` must be specified first if filtering on metadata - // fields. - // - `error` - Error associated with the long-running operation. - // - `response.@type` - the type of response. - // - `response.` - any field in response.value. - // - // You can combine multiple expressions by enclosing each expression in - // parentheses. By default, expressions are combined with AND logic, but - // you can specify AND, OR, and NOT logic explicitly. - // - // Here are a few examples: - // - // - `done:true` - The operation is complete. - // - `(metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata) AND` \ - // `metadata.database:prod` - Returns operations where: - // - The operation's metadata type is - // [CreateBackupMetadata][google.spanner.admin.database.v1.CreateBackupMetadata]. - // - The source database name of backup contains the string "prod". - // - `(metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata) AND` \ - // `(metadata.name:howl) AND` \ - // `(metadata.progress.start_time < \"2018-03-28T14:50:00Z\") AND` \ - // `(error:*)` - Returns operations where: - // - The operation's metadata type is - // [CreateBackupMetadata][google.spanner.admin.database.v1.CreateBackupMetadata]. - // - The backup name contains the string "howl". - // - The operation started before 2018-03-28T14:50:00Z. - // - The operation resulted in an error. - // - `(metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.CopyBackupMetadata) AND` \ - // `(metadata.source_backup:test) AND` \ - // `(metadata.progress.start_time < \"2022-01-18T14:50:00Z\") AND` \ - // `(error:*)` - Returns operations where: - // - The operation's metadata type is - // [CopyBackupMetadata][google.spanner.admin.database.v1.CopyBackupMetadata]. - // - The source backup name contains the string "test". - // - The operation started before 2022-01-18T14:50:00Z. - // - The operation resulted in an error. - // - `((metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata) AND` \ - // `(metadata.database:test_db)) OR` \ - // `((metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.CopyBackupMetadata) - // AND` \ - // `(metadata.source_backup:test_bkp)) AND` \ - // `(error:*)` - Returns operations where: - // - The operation's metadata matches either of criteria: - // - The operation's metadata type is - // [CreateBackupMetadata][google.spanner.admin.database.v1.CreateBackupMetadata] - // AND the source database name of the backup contains the string - // "test_db" - // - The operation's metadata type is - // [CopyBackupMetadata][google.spanner.admin.database.v1.CopyBackupMetadata] - // AND the source backup name contains the string "test_bkp" - // - The operation resulted in an error. - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // Number of operations to be returned in the response. If 0 or - // less, defaults to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListBackupOperationsResponse.next_page_token] - // from a previous - // [ListBackupOperationsResponse][google.spanner.admin.database.v1.ListBackupOperationsResponse] - // to the same `parent` and with the same `filter`. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` -} - -func (x *ListBackupOperationsRequest) Reset() { - *x = ListBackupOperationsRequest{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListBackupOperationsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListBackupOperationsRequest) ProtoMessage() {} - -func (x *ListBackupOperationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListBackupOperationsRequest.ProtoReflect.Descriptor instead. -func (*ListBackupOperationsRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{10} -} - -func (x *ListBackupOperationsRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *ListBackupOperationsRequest) GetFilter() string { - if x != nil { - return x.Filter - } - return "" -} - -func (x *ListBackupOperationsRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListBackupOperationsRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -// The response for -// [ListBackupOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperations]. -type ListBackupOperationsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The list of matching backup [long-running - // operations][google.longrunning.Operation]. Each operation's name will be - // prefixed by the backup's name. The operation's - // [metadata][google.longrunning.Operation.metadata] field type - // `metadata.type_url` describes the type of the metadata. Operations returned - // include those that are pending or have completed/failed/canceled within the - // last 7 days. Operations returned are ordered by - // `operation.metadata.value.progress.start_time` in descending order starting - // from the most recently started operation. - Operations []*longrunningpb.Operation `protobuf:"bytes,1,rep,name=operations,proto3" json:"operations,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListBackupOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperations] - // call to fetch more of the matching metadata. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListBackupOperationsResponse) Reset() { - *x = ListBackupOperationsResponse{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListBackupOperationsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListBackupOperationsResponse) ProtoMessage() {} - -func (x *ListBackupOperationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListBackupOperationsResponse.ProtoReflect.Descriptor instead. -func (*ListBackupOperationsResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{11} -} - -func (x *ListBackupOperationsResponse) GetOperations() []*longrunningpb.Operation { - if x != nil { - return x.Operations - } - return nil -} - -func (x *ListBackupOperationsResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// Information about a backup. -type BackupInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Name of the backup. - Backup string `protobuf:"bytes,1,opt,name=backup,proto3" json:"backup,omitempty"` - // The backup contains an externally consistent copy of `source_database` at - // the timestamp specified by `version_time`. If the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // request did not specify `version_time`, the `version_time` of the backup is - // equivalent to the `create_time`. - VersionTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=version_time,json=versionTime,proto3" json:"version_time,omitempty"` - // The time the - // [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup] - // request was received. - CreateTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - // Name of the database the backup was created from. - SourceDatabase string `protobuf:"bytes,3,opt,name=source_database,json=sourceDatabase,proto3" json:"source_database,omitempty"` -} - -func (x *BackupInfo) Reset() { - *x = BackupInfo{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BackupInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BackupInfo) ProtoMessage() {} - -func (x *BackupInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[12] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BackupInfo.ProtoReflect.Descriptor instead. -func (*BackupInfo) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{12} -} - -func (x *BackupInfo) GetBackup() string { - if x != nil { - return x.Backup - } - return "" -} - -func (x *BackupInfo) GetVersionTime() *timestamppb.Timestamp { - if x != nil { - return x.VersionTime - } - return nil -} - -func (x *BackupInfo) GetCreateTime() *timestamppb.Timestamp { - if x != nil { - return x.CreateTime - } - return nil -} - -func (x *BackupInfo) GetSourceDatabase() string { - if x != nil { - return x.SourceDatabase - } - return "" -} - -// Encryption configuration for the backup to create. -type CreateBackupEncryptionConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The encryption type of the backup. - EncryptionType CreateBackupEncryptionConfig_EncryptionType `protobuf:"varint,1,opt,name=encryption_type,json=encryptionType,proto3,enum=google.spanner.admin.database.v1.CreateBackupEncryptionConfig_EncryptionType" json:"encryption_type,omitempty"` - // Optional. The Cloud KMS key that will be used to protect the backup. - // This field should be set only when - // [encryption_type][google.spanner.admin.database.v1.CreateBackupEncryptionConfig.encryption_type] - // is `CUSTOMER_MANAGED_ENCRYPTION`. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - KmsKeyName string `protobuf:"bytes,2,opt,name=kms_key_name,json=kmsKeyName,proto3" json:"kms_key_name,omitempty"` - // Optional. Specifies the KMS configuration for the one or more keys used to - // protect the backup. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - // - // The keys referenced by kms_key_names must fully cover all - // regions of the backup's instance configuration. Some examples: - // * For single region instance configs, specify a single regional - // location KMS key. - // * For multi-regional instance configs of type GOOGLE_MANAGED, - // either specify a multi-regional location KMS key or multiple regional - // location KMS keys that cover all regions in the instance config. - // * For an instance config of type USER_MANAGED, please specify only - // regional location KMS keys to cover each region in the instance config. - // Multi-regional location KMS keys are not supported for USER_MANAGED - // instance configs. - KmsKeyNames []string `protobuf:"bytes,3,rep,name=kms_key_names,json=kmsKeyNames,proto3" json:"kms_key_names,omitempty"` -} - -func (x *CreateBackupEncryptionConfig) Reset() { - *x = CreateBackupEncryptionConfig{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateBackupEncryptionConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateBackupEncryptionConfig) ProtoMessage() {} - -func (x *CreateBackupEncryptionConfig) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[13] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateBackupEncryptionConfig.ProtoReflect.Descriptor instead. -func (*CreateBackupEncryptionConfig) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{13} -} - -func (x *CreateBackupEncryptionConfig) GetEncryptionType() CreateBackupEncryptionConfig_EncryptionType { - if x != nil { - return x.EncryptionType - } - return CreateBackupEncryptionConfig_ENCRYPTION_TYPE_UNSPECIFIED -} - -func (x *CreateBackupEncryptionConfig) GetKmsKeyName() string { - if x != nil { - return x.KmsKeyName - } - return "" -} - -func (x *CreateBackupEncryptionConfig) GetKmsKeyNames() []string { - if x != nil { - return x.KmsKeyNames - } - return nil -} - -// Encryption configuration for the copied backup. -type CopyBackupEncryptionConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The encryption type of the backup. - EncryptionType CopyBackupEncryptionConfig_EncryptionType `protobuf:"varint,1,opt,name=encryption_type,json=encryptionType,proto3,enum=google.spanner.admin.database.v1.CopyBackupEncryptionConfig_EncryptionType" json:"encryption_type,omitempty"` - // Optional. The Cloud KMS key that will be used to protect the backup. - // This field should be set only when - // [encryption_type][google.spanner.admin.database.v1.CopyBackupEncryptionConfig.encryption_type] - // is `CUSTOMER_MANAGED_ENCRYPTION`. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - KmsKeyName string `protobuf:"bytes,2,opt,name=kms_key_name,json=kmsKeyName,proto3" json:"kms_key_name,omitempty"` - // Optional. Specifies the KMS configuration for the one or more keys used to - // protect the backup. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - // Kms keys specified can be in any order. - // - // The keys referenced by kms_key_names must fully cover all - // regions of the backup's instance configuration. Some examples: - // * For single region instance configs, specify a single regional - // location KMS key. - // * For multi-regional instance configs of type GOOGLE_MANAGED, - // either specify a multi-regional location KMS key or multiple regional - // location KMS keys that cover all regions in the instance config. - // * For an instance config of type USER_MANAGED, please specify only - // regional location KMS keys to cover each region in the instance config. - // Multi-regional location KMS keys are not supported for USER_MANAGED - // instance configs. - KmsKeyNames []string `protobuf:"bytes,3,rep,name=kms_key_names,json=kmsKeyNames,proto3" json:"kms_key_names,omitempty"` -} - -func (x *CopyBackupEncryptionConfig) Reset() { - *x = CopyBackupEncryptionConfig{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CopyBackupEncryptionConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CopyBackupEncryptionConfig) ProtoMessage() {} - -func (x *CopyBackupEncryptionConfig) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[14] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CopyBackupEncryptionConfig.ProtoReflect.Descriptor instead. -func (*CopyBackupEncryptionConfig) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{14} -} - -func (x *CopyBackupEncryptionConfig) GetEncryptionType() CopyBackupEncryptionConfig_EncryptionType { - if x != nil { - return x.EncryptionType - } - return CopyBackupEncryptionConfig_ENCRYPTION_TYPE_UNSPECIFIED -} - -func (x *CopyBackupEncryptionConfig) GetKmsKeyName() string { - if x != nil { - return x.KmsKeyName - } - return "" -} - -func (x *CopyBackupEncryptionConfig) GetKmsKeyNames() []string { - if x != nil { - return x.KmsKeyNames - } - return nil -} - -// The specification for full backups. -// A full backup stores the entire contents of the database at a given -// version time. -type FullBackupSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *FullBackupSpec) Reset() { - *x = FullBackupSpec{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *FullBackupSpec) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FullBackupSpec) ProtoMessage() {} - -func (x *FullBackupSpec) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[15] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FullBackupSpec.ProtoReflect.Descriptor instead. -func (*FullBackupSpec) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{15} -} - -// The specification for incremental backup chains. -// An incremental backup stores the delta of changes between a previous -// backup and the database contents at a given version time. An -// incremental backup chain consists of a full backup and zero or more -// successive incremental backups. The first backup created for an -// incremental backup chain is always a full backup. -type IncrementalBackupSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *IncrementalBackupSpec) Reset() { - *x = IncrementalBackupSpec{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *IncrementalBackupSpec) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IncrementalBackupSpec) ProtoMessage() {} - -func (x *IncrementalBackupSpec) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[16] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IncrementalBackupSpec.ProtoReflect.Descriptor instead. -func (*IncrementalBackupSpec) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{16} -} - -// Instance partition information for the backup. -type BackupInstancePartition struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A unique identifier for the instance partition. Values are of the form - // `projects//instances//instancePartitions/` - InstancePartition string `protobuf:"bytes,1,opt,name=instance_partition,json=instancePartition,proto3" json:"instance_partition,omitempty"` -} - -func (x *BackupInstancePartition) Reset() { - *x = BackupInstancePartition{} - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BackupInstancePartition) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BackupInstancePartition) ProtoMessage() {} - -func (x *BackupInstancePartition) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_proto_msgTypes[17] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BackupInstancePartition.ProtoReflect.Descriptor instead. -func (*BackupInstancePartition) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP(), []int{17} -} - -func (x *BackupInstancePartition) GetInstancePartition() string { - if x != nil { - return x.InstancePartition - } - return "" -} - -var File_google_spanner_admin_database_v1_backup_proto protoreflect.FileDescriptor - -var file_google_spanner_admin_database_v1_backup_proto_rawDesc = []byte{ - 0x0a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x0c, 0x0a, 0x06, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, - 0x40, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x73, 0x69, - 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x13, 0x66, 0x72, 0x65, 0x65, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x11, 0x66, 0x72, 0x65, 0x65, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x14, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, - 0x12, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5c, - 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x27, 0xe0, - 0x41, 0x03, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0f, - 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x65, 0x6e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x6c, 0x0a, 0x16, - 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x03, - 0xe0, 0x41, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x61, 0x0a, 0x10, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x56, 0x0a, - 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x03, 0xfa, - 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x52, 0x12, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, - 0x0d, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x58, - 0x0a, 0x10, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x03, 0xfa, 0x41, 0x27, - 0x0a, 0x25, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, - 0x41, 0x03, 0x52, 0x18, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x13, - 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x11, 0x6f, 0x6c, 0x64, 0x65, - 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x6f, 0x0a, - 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x37, - 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, - 0x0a, 0x08, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x3a, 0x5c, 0xea, 0x41, 0x59, 0x0a, 0x1d, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x38, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x7d, 0x22, 0xb1, 0x02, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, - 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x0a, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x45, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, - 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x70, 0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x9e, 0x02, 0x0a, 0x14, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x36, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x22, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, - 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x08, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, - 0x0b, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf4, 0x02, 0x0a, 0x11, 0x43, - 0x6f, 0x70, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, - 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, - 0x40, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x6e, 0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x70, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, - 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0xa3, 0x02, 0x0a, 0x12, 0x43, 0x6f, 0x70, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x22, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x47, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x22, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x0c, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x4f, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x45, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x4d, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, - 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, - 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x12, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, - 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, - 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb2, 0x01, 0x0a, 0x1b, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, - 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x85, - 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, - 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, - 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x93, 0x02, 0x0a, 0x0a, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3a, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x22, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x12, 0x3d, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, - 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x0e, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0xc8, 0x03, 0x0a, - 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x7b, 0x0a, - 0x0f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0e, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x6b, 0x6d, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, - 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0a, 0x6b, 0x6d, 0x73, - 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x29, - 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x6b, 0x6d, 0x73, 0x4b, 0x65, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0e, 0x45, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x4e, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, - 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, - 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x47, 0x4f, 0x4f, 0x47, 0x4c, - 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, - 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x22, 0xd4, 0x03, 0x0a, 0x1a, 0x43, 0x6f, 0x70, 0x79, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x0e, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, - 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, - 0x65, 0x79, 0x52, 0x0a, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4d, - 0x0a, 0x0d, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, - 0x52, 0x0b, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x9e, 0x01, - 0x0a, 0x0e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, - 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x55, - 0x50, 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x1d, - 0x0a, 0x19, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1f, 0x0a, - 0x1b, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, - 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x22, 0x10, - 0x0a, 0x0e, 0x46, 0x75, 0x6c, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, - 0x22, 0x17, 0x0a, 0x15, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x22, 0x77, 0x0a, 0x17, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x2d, 0xfa, 0x41, 0x2a, 0x0a, 0x28, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0xfd, 0x01, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x46, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x70, 0x62, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x70, 0x62, 0xaa, 0x02, 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x26, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x2b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, - 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_admin_database_v1_backup_proto_rawDescOnce sync.Once - file_google_spanner_admin_database_v1_backup_proto_rawDescData = file_google_spanner_admin_database_v1_backup_proto_rawDesc -) - -func file_google_spanner_admin_database_v1_backup_proto_rawDescGZIP() []byte { - file_google_spanner_admin_database_v1_backup_proto_rawDescOnce.Do(func() { - file_google_spanner_admin_database_v1_backup_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_admin_database_v1_backup_proto_rawDescData) - }) - return file_google_spanner_admin_database_v1_backup_proto_rawDescData -} - -var file_google_spanner_admin_database_v1_backup_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_google_spanner_admin_database_v1_backup_proto_msgTypes = make([]protoimpl.MessageInfo, 18) -var file_google_spanner_admin_database_v1_backup_proto_goTypes = []any{ - (Backup_State)(0), // 0: google.spanner.admin.database.v1.Backup.State - (CreateBackupEncryptionConfig_EncryptionType)(0), // 1: google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType - (CopyBackupEncryptionConfig_EncryptionType)(0), // 2: google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType - (*Backup)(nil), // 3: google.spanner.admin.database.v1.Backup - (*CreateBackupRequest)(nil), // 4: google.spanner.admin.database.v1.CreateBackupRequest - (*CreateBackupMetadata)(nil), // 5: google.spanner.admin.database.v1.CreateBackupMetadata - (*CopyBackupRequest)(nil), // 6: google.spanner.admin.database.v1.CopyBackupRequest - (*CopyBackupMetadata)(nil), // 7: google.spanner.admin.database.v1.CopyBackupMetadata - (*UpdateBackupRequest)(nil), // 8: google.spanner.admin.database.v1.UpdateBackupRequest - (*GetBackupRequest)(nil), // 9: google.spanner.admin.database.v1.GetBackupRequest - (*DeleteBackupRequest)(nil), // 10: google.spanner.admin.database.v1.DeleteBackupRequest - (*ListBackupsRequest)(nil), // 11: google.spanner.admin.database.v1.ListBackupsRequest - (*ListBackupsResponse)(nil), // 12: google.spanner.admin.database.v1.ListBackupsResponse - (*ListBackupOperationsRequest)(nil), // 13: google.spanner.admin.database.v1.ListBackupOperationsRequest - (*ListBackupOperationsResponse)(nil), // 14: google.spanner.admin.database.v1.ListBackupOperationsResponse - (*BackupInfo)(nil), // 15: google.spanner.admin.database.v1.BackupInfo - (*CreateBackupEncryptionConfig)(nil), // 16: google.spanner.admin.database.v1.CreateBackupEncryptionConfig - (*CopyBackupEncryptionConfig)(nil), // 17: google.spanner.admin.database.v1.CopyBackupEncryptionConfig - (*FullBackupSpec)(nil), // 18: google.spanner.admin.database.v1.FullBackupSpec - (*IncrementalBackupSpec)(nil), // 19: google.spanner.admin.database.v1.IncrementalBackupSpec - (*BackupInstancePartition)(nil), // 20: google.spanner.admin.database.v1.BackupInstancePartition - (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp - (*EncryptionInfo)(nil), // 22: google.spanner.admin.database.v1.EncryptionInfo - (DatabaseDialect)(0), // 23: google.spanner.admin.database.v1.DatabaseDialect - (*OperationProgress)(nil), // 24: google.spanner.admin.database.v1.OperationProgress - (*fieldmaskpb.FieldMask)(nil), // 25: google.protobuf.FieldMask - (*longrunningpb.Operation)(nil), // 26: google.longrunning.Operation -} -var file_google_spanner_admin_database_v1_backup_proto_depIdxs = []int32{ - 21, // 0: google.spanner.admin.database.v1.Backup.version_time:type_name -> google.protobuf.Timestamp - 21, // 1: google.spanner.admin.database.v1.Backup.expire_time:type_name -> google.protobuf.Timestamp - 21, // 2: google.spanner.admin.database.v1.Backup.create_time:type_name -> google.protobuf.Timestamp - 0, // 3: google.spanner.admin.database.v1.Backup.state:type_name -> google.spanner.admin.database.v1.Backup.State - 22, // 4: google.spanner.admin.database.v1.Backup.encryption_info:type_name -> google.spanner.admin.database.v1.EncryptionInfo - 22, // 5: google.spanner.admin.database.v1.Backup.encryption_information:type_name -> google.spanner.admin.database.v1.EncryptionInfo - 23, // 6: google.spanner.admin.database.v1.Backup.database_dialect:type_name -> google.spanner.admin.database.v1.DatabaseDialect - 21, // 7: google.spanner.admin.database.v1.Backup.max_expire_time:type_name -> google.protobuf.Timestamp - 21, // 8: google.spanner.admin.database.v1.Backup.oldest_version_time:type_name -> google.protobuf.Timestamp - 20, // 9: google.spanner.admin.database.v1.Backup.instance_partitions:type_name -> google.spanner.admin.database.v1.BackupInstancePartition - 3, // 10: google.spanner.admin.database.v1.CreateBackupRequest.backup:type_name -> google.spanner.admin.database.v1.Backup - 16, // 11: google.spanner.admin.database.v1.CreateBackupRequest.encryption_config:type_name -> google.spanner.admin.database.v1.CreateBackupEncryptionConfig - 24, // 12: google.spanner.admin.database.v1.CreateBackupMetadata.progress:type_name -> google.spanner.admin.database.v1.OperationProgress - 21, // 13: google.spanner.admin.database.v1.CreateBackupMetadata.cancel_time:type_name -> google.protobuf.Timestamp - 21, // 14: google.spanner.admin.database.v1.CopyBackupRequest.expire_time:type_name -> google.protobuf.Timestamp - 17, // 15: google.spanner.admin.database.v1.CopyBackupRequest.encryption_config:type_name -> google.spanner.admin.database.v1.CopyBackupEncryptionConfig - 24, // 16: google.spanner.admin.database.v1.CopyBackupMetadata.progress:type_name -> google.spanner.admin.database.v1.OperationProgress - 21, // 17: google.spanner.admin.database.v1.CopyBackupMetadata.cancel_time:type_name -> google.protobuf.Timestamp - 3, // 18: google.spanner.admin.database.v1.UpdateBackupRequest.backup:type_name -> google.spanner.admin.database.v1.Backup - 25, // 19: google.spanner.admin.database.v1.UpdateBackupRequest.update_mask:type_name -> google.protobuf.FieldMask - 3, // 20: google.spanner.admin.database.v1.ListBackupsResponse.backups:type_name -> google.spanner.admin.database.v1.Backup - 26, // 21: google.spanner.admin.database.v1.ListBackupOperationsResponse.operations:type_name -> google.longrunning.Operation - 21, // 22: google.spanner.admin.database.v1.BackupInfo.version_time:type_name -> google.protobuf.Timestamp - 21, // 23: google.spanner.admin.database.v1.BackupInfo.create_time:type_name -> google.protobuf.Timestamp - 1, // 24: google.spanner.admin.database.v1.CreateBackupEncryptionConfig.encryption_type:type_name -> google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType - 2, // 25: google.spanner.admin.database.v1.CopyBackupEncryptionConfig.encryption_type:type_name -> google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType - 26, // [26:26] is the sub-list for method output_type - 26, // [26:26] is the sub-list for method input_type - 26, // [26:26] is the sub-list for extension type_name - 26, // [26:26] is the sub-list for extension extendee - 0, // [0:26] is the sub-list for field type_name -} - -func init() { file_google_spanner_admin_database_v1_backup_proto_init() } -func file_google_spanner_admin_database_v1_backup_proto_init() { - if File_google_spanner_admin_database_v1_backup_proto != nil { - return - } - file_google_spanner_admin_database_v1_common_proto_init() - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_admin_database_v1_backup_proto_rawDesc, - NumEnums: 3, - NumMessages: 18, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_admin_database_v1_backup_proto_goTypes, - DependencyIndexes: file_google_spanner_admin_database_v1_backup_proto_depIdxs, - EnumInfos: file_google_spanner_admin_database_v1_backup_proto_enumTypes, - MessageInfos: file_google_spanner_admin_database_v1_backup_proto_msgTypes, - }.Build() - File_google_spanner_admin_database_v1_backup_proto = out.File - file_google_spanner_admin_database_v1_backup_proto_rawDesc = nil - file_google_spanner_admin_database_v1_backup_proto_goTypes = nil - file_google_spanner_admin_database_v1_backup_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/backup_schedule.pb.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/backup_schedule.pb.go deleted file mode 100644 index 151c37051e..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/backup_schedule.pb.go +++ /dev/null @@ -1,951 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/admin/database/v1/backup_schedule.proto - -package databasepb - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" - fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Defines specifications of the backup schedule. -type BackupScheduleSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. - // - // Types that are assignable to ScheduleSpec: - // - // *BackupScheduleSpec_CronSpec - ScheduleSpec isBackupScheduleSpec_ScheduleSpec `protobuf_oneof:"schedule_spec"` -} - -func (x *BackupScheduleSpec) Reset() { - *x = BackupScheduleSpec{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BackupScheduleSpec) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BackupScheduleSpec) ProtoMessage() {} - -func (x *BackupScheduleSpec) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BackupScheduleSpec.ProtoReflect.Descriptor instead. -func (*BackupScheduleSpec) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{0} -} - -func (m *BackupScheduleSpec) GetScheduleSpec() isBackupScheduleSpec_ScheduleSpec { - if m != nil { - return m.ScheduleSpec - } - return nil -} - -func (x *BackupScheduleSpec) GetCronSpec() *CrontabSpec { - if x, ok := x.GetScheduleSpec().(*BackupScheduleSpec_CronSpec); ok { - return x.CronSpec - } - return nil -} - -type isBackupScheduleSpec_ScheduleSpec interface { - isBackupScheduleSpec_ScheduleSpec() -} - -type BackupScheduleSpec_CronSpec struct { - // Cron style schedule specification. - CronSpec *CrontabSpec `protobuf:"bytes,1,opt,name=cron_spec,json=cronSpec,proto3,oneof"` -} - -func (*BackupScheduleSpec_CronSpec) isBackupScheduleSpec_ScheduleSpec() {} - -// BackupSchedule expresses the automated backup creation specification for a -// Spanner database. -// Next ID: 10 -type BackupSchedule struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Identifier. Output only for the - // [CreateBackupSchedule][DatabaseAdmin.CreateBackupSchededule] operation. - // Required for the - // [UpdateBackupSchedule][google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackupSchedule] - // operation. A globally unique identifier for the backup schedule which - // cannot be changed. Values are of the form - // `projects//instances//databases//backupSchedules/[a-z][a-z0-9_\-]*[a-z0-9]` - // The final segment of the name must be between 2 and 60 characters in - // length. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Optional. The schedule specification based on which the backup creations - // are triggered. - Spec *BackupScheduleSpec `protobuf:"bytes,6,opt,name=spec,proto3" json:"spec,omitempty"` - // Optional. The retention duration of a backup that must be at least 6 hours - // and at most 366 days. The backup is eligible to be automatically deleted - // once the retention period has elapsed. - RetentionDuration *durationpb.Duration `protobuf:"bytes,3,opt,name=retention_duration,json=retentionDuration,proto3" json:"retention_duration,omitempty"` - // Optional. The encryption configuration that will be used to encrypt the - // backup. If this field is not specified, the backup will use the same - // encryption configuration as the database. - EncryptionConfig *CreateBackupEncryptionConfig `protobuf:"bytes,4,opt,name=encryption_config,json=encryptionConfig,proto3" json:"encryption_config,omitempty"` - // Required. Backup type spec determines the type of backup that is created by - // the backup schedule. Currently, only full backups are supported. - // - // Types that are assignable to BackupTypeSpec: - // - // *BackupSchedule_FullBackupSpec - // *BackupSchedule_IncrementalBackupSpec - BackupTypeSpec isBackupSchedule_BackupTypeSpec `protobuf_oneof:"backup_type_spec"` - // Output only. The timestamp at which the schedule was last updated. - // If the schedule has never been updated, this field contains the timestamp - // when the schedule was first created. - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` -} - -func (x *BackupSchedule) Reset() { - *x = BackupSchedule{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BackupSchedule) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BackupSchedule) ProtoMessage() {} - -func (x *BackupSchedule) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BackupSchedule.ProtoReflect.Descriptor instead. -func (*BackupSchedule) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{1} -} - -func (x *BackupSchedule) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *BackupSchedule) GetSpec() *BackupScheduleSpec { - if x != nil { - return x.Spec - } - return nil -} - -func (x *BackupSchedule) GetRetentionDuration() *durationpb.Duration { - if x != nil { - return x.RetentionDuration - } - return nil -} - -func (x *BackupSchedule) GetEncryptionConfig() *CreateBackupEncryptionConfig { - if x != nil { - return x.EncryptionConfig - } - return nil -} - -func (m *BackupSchedule) GetBackupTypeSpec() isBackupSchedule_BackupTypeSpec { - if m != nil { - return m.BackupTypeSpec - } - return nil -} - -func (x *BackupSchedule) GetFullBackupSpec() *FullBackupSpec { - if x, ok := x.GetBackupTypeSpec().(*BackupSchedule_FullBackupSpec); ok { - return x.FullBackupSpec - } - return nil -} - -func (x *BackupSchedule) GetIncrementalBackupSpec() *IncrementalBackupSpec { - if x, ok := x.GetBackupTypeSpec().(*BackupSchedule_IncrementalBackupSpec); ok { - return x.IncrementalBackupSpec - } - return nil -} - -func (x *BackupSchedule) GetUpdateTime() *timestamppb.Timestamp { - if x != nil { - return x.UpdateTime - } - return nil -} - -type isBackupSchedule_BackupTypeSpec interface { - isBackupSchedule_BackupTypeSpec() -} - -type BackupSchedule_FullBackupSpec struct { - // The schedule creates only full backups. - FullBackupSpec *FullBackupSpec `protobuf:"bytes,7,opt,name=full_backup_spec,json=fullBackupSpec,proto3,oneof"` -} - -type BackupSchedule_IncrementalBackupSpec struct { - // The schedule creates incremental backup chains. - IncrementalBackupSpec *IncrementalBackupSpec `protobuf:"bytes,8,opt,name=incremental_backup_spec,json=incrementalBackupSpec,proto3,oneof"` -} - -func (*BackupSchedule_FullBackupSpec) isBackupSchedule_BackupTypeSpec() {} - -func (*BackupSchedule_IncrementalBackupSpec) isBackupSchedule_BackupTypeSpec() {} - -// CrontabSpec can be used to specify the version time and frequency at -// which the backup should be created. -type CrontabSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. Textual representation of the crontab. User can customize the - // backup frequency and the backup version time using the cron - // expression. The version time must be in UTC timezone. - // - // The backup will contain an externally consistent copy of the - // database at the version time. Allowed frequencies are 12 hour, 1 day, - // 1 week and 1 month. Examples of valid cron specifications: - // - `0 2/12 * * * ` : every 12 hours at (2, 14) hours past midnight in UTC. - // - `0 2,14 * * * ` : every 12 hours at (2,14) hours past midnight in UTC. - // - `0 2 * * * ` : once a day at 2 past midnight in UTC. - // - `0 2 * * 0 ` : once a week every Sunday at 2 past midnight in UTC. - // - `0 2 8 * * ` : once a month on 8th day at 2 past midnight in UTC. - Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` - // Output only. The time zone of the times in `CrontabSpec.text`. Currently - // only UTC is supported. - TimeZone string `protobuf:"bytes,2,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` - // Output only. Schedule backups will contain an externally consistent copy - // of the database at the version time specified in - // `schedule_spec.cron_spec`. However, Spanner may not initiate the creation - // of the scheduled backups at that version time. Spanner will initiate - // the creation of scheduled backups within the time window bounded by the - // version_time specified in `schedule_spec.cron_spec` and version_time + - // `creation_window`. - CreationWindow *durationpb.Duration `protobuf:"bytes,3,opt,name=creation_window,json=creationWindow,proto3" json:"creation_window,omitempty"` -} - -func (x *CrontabSpec) Reset() { - *x = CrontabSpec{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CrontabSpec) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CrontabSpec) ProtoMessage() {} - -func (x *CrontabSpec) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CrontabSpec.ProtoReflect.Descriptor instead. -func (*CrontabSpec) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{2} -} - -func (x *CrontabSpec) GetText() string { - if x != nil { - return x.Text - } - return "" -} - -func (x *CrontabSpec) GetTimeZone() string { - if x != nil { - return x.TimeZone - } - return "" -} - -func (x *CrontabSpec) GetCreationWindow() *durationpb.Duration { - if x != nil { - return x.CreationWindow - } - return nil -} - -// The request for -// [CreateBackupSchedule][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackupSchedule]. -type CreateBackupScheduleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the database that this backup schedule applies to. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Required. The Id to use for the backup schedule. The `backup_schedule_id` - // appended to `parent` forms the full backup schedule name of the form - // `projects//instances//databases//backupSchedules/`. - BackupScheduleId string `protobuf:"bytes,2,opt,name=backup_schedule_id,json=backupScheduleId,proto3" json:"backup_schedule_id,omitempty"` - // Required. The backup schedule to create. - BackupSchedule *BackupSchedule `protobuf:"bytes,3,opt,name=backup_schedule,json=backupSchedule,proto3" json:"backup_schedule,omitempty"` -} - -func (x *CreateBackupScheduleRequest) Reset() { - *x = CreateBackupScheduleRequest{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateBackupScheduleRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateBackupScheduleRequest) ProtoMessage() {} - -func (x *CreateBackupScheduleRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateBackupScheduleRequest.ProtoReflect.Descriptor instead. -func (*CreateBackupScheduleRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{3} -} - -func (x *CreateBackupScheduleRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *CreateBackupScheduleRequest) GetBackupScheduleId() string { - if x != nil { - return x.BackupScheduleId - } - return "" -} - -func (x *CreateBackupScheduleRequest) GetBackupSchedule() *BackupSchedule { - if x != nil { - return x.BackupSchedule - } - return nil -} - -// The request for -// [GetBackupSchedule][google.spanner.admin.database.v1.DatabaseAdmin.GetBackupSchedule]. -type GetBackupScheduleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the schedule to retrieve. - // Values are of the form - // `projects//instances//databases//backupSchedules/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetBackupScheduleRequest) Reset() { - *x = GetBackupScheduleRequest{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetBackupScheduleRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetBackupScheduleRequest) ProtoMessage() {} - -func (x *GetBackupScheduleRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetBackupScheduleRequest.ProtoReflect.Descriptor instead. -func (*GetBackupScheduleRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{4} -} - -func (x *GetBackupScheduleRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for -// [DeleteBackupSchedule][google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackupSchedule]. -type DeleteBackupScheduleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the schedule to delete. - // Values are of the form - // `projects//instances//databases//backupSchedules/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *DeleteBackupScheduleRequest) Reset() { - *x = DeleteBackupScheduleRequest{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeleteBackupScheduleRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteBackupScheduleRequest) ProtoMessage() {} - -func (x *DeleteBackupScheduleRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteBackupScheduleRequest.ProtoReflect.Descriptor instead. -func (*DeleteBackupScheduleRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{5} -} - -func (x *DeleteBackupScheduleRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for -// [ListBackupSchedules][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupSchedules]. -type ListBackupSchedulesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. Database is the parent resource whose backup schedules should be - // listed. Values are of the form - // projects//instances//databases/ - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Optional. Number of backup schedules to be returned in the response. If 0 - // or less, defaults to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // Optional. If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListBackupSchedulesResponse.next_page_token] - // from a previous - // [ListBackupSchedulesResponse][google.spanner.admin.database.v1.ListBackupSchedulesResponse] - // to the same `parent`. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` -} - -func (x *ListBackupSchedulesRequest) Reset() { - *x = ListBackupSchedulesRequest{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListBackupSchedulesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListBackupSchedulesRequest) ProtoMessage() {} - -func (x *ListBackupSchedulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListBackupSchedulesRequest.ProtoReflect.Descriptor instead. -func (*ListBackupSchedulesRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{6} -} - -func (x *ListBackupSchedulesRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *ListBackupSchedulesRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListBackupSchedulesRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -// The response for -// [ListBackupSchedules][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupSchedules]. -type ListBackupSchedulesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The list of backup schedules for a database. - BackupSchedules []*BackupSchedule `protobuf:"bytes,1,rep,name=backup_schedules,json=backupSchedules,proto3" json:"backup_schedules,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListBackupSchedules][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupSchedules] - // call to fetch more of the schedules. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListBackupSchedulesResponse) Reset() { - *x = ListBackupSchedulesResponse{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListBackupSchedulesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListBackupSchedulesResponse) ProtoMessage() {} - -func (x *ListBackupSchedulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListBackupSchedulesResponse.ProtoReflect.Descriptor instead. -func (*ListBackupSchedulesResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{7} -} - -func (x *ListBackupSchedulesResponse) GetBackupSchedules() []*BackupSchedule { - if x != nil { - return x.BackupSchedules - } - return nil -} - -func (x *ListBackupSchedulesResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// The request for -// [UpdateBackupScheduleRequest][google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackupSchedule]. -type UpdateBackupScheduleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The backup schedule to update. `backup_schedule.name`, and the - // fields to be updated as specified by `update_mask` are required. Other - // fields are ignored. - BackupSchedule *BackupSchedule `protobuf:"bytes,1,opt,name=backup_schedule,json=backupSchedule,proto3" json:"backup_schedule,omitempty"` - // Required. A mask specifying which fields in the BackupSchedule resource - // should be updated. This mask is relative to the BackupSchedule resource, - // not to the request message. The field mask must always be - // specified; this prevents any future fields from being erased - // accidentally. - UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` -} - -func (x *UpdateBackupScheduleRequest) Reset() { - *x = UpdateBackupScheduleRequest{} - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateBackupScheduleRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateBackupScheduleRequest) ProtoMessage() {} - -func (x *UpdateBackupScheduleRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateBackupScheduleRequest.ProtoReflect.Descriptor instead. -func (*UpdateBackupScheduleRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP(), []int{8} -} - -func (x *UpdateBackupScheduleRequest) GetBackupSchedule() *BackupSchedule { - if x != nil { - return x.BackupSchedule - } - return nil -} - -func (x *UpdateBackupScheduleRequest) GetUpdateMask() *fieldmaskpb.FieldMask { - if x != nil { - return x.UpdateMask - } - return nil -} - -var File_google_spanner_admin_database_v1_backup_schedule_proto protoreflect.FileDescriptor - -var file_google_spanner_admin_database_v1_backup_schedule_proto_rawDesc = []byte{ - 0x0a, 0x36, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, - 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, - 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x73, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4c, - 0x0a, 0x09, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x53, 0x70, 0x65, 0x63, - 0x48, 0x00, 0x52, 0x08, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x42, 0x0f, 0x0a, 0x0d, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x22, 0x88, 0x06, - 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, - 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x03, 0xe0, - 0x41, 0x01, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x70, 0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5c, 0x0a, 0x10, 0x66, 0x75, 0x6c, - 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x71, 0x0a, 0x17, 0x69, 0x6e, 0x63, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x70, 0x65, - 0x63, 0x48, 0x00, 0x52, 0x15, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, - 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0xa5, 0x01, 0xea, - 0x41, 0xa1, 0x01, 0x0a, 0x25, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x57, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x7d, 0x2a, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x32, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x22, 0x91, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x6f, - 0x6e, 0x74, 0x61, 0x62, 0x53, 0x70, 0x65, 0x63, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x20, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, - 0x6f, 0x6e, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0xf1, 0x01, 0x0a, - 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, - 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, - 0x12, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x64, - 0x12, 0x5e, 0x0a, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, - 0x52, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x22, 0x5d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, - 0x41, 0x27, 0x0a, 0x25, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x60, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, - 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x10, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x52, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x01, 0x0a, - 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5e, 0x0a, 0x0f, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0e, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x85, - 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x46, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, - 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x70, 0x62, 0x3b, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x70, 0x62, 0xaa, 0x02, 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x2b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescOnce sync.Once - file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescData = file_google_spanner_admin_database_v1_backup_schedule_proto_rawDesc -) - -func file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescGZIP() []byte { - file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescOnce.Do(func() { - file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescData) - }) - return file_google_spanner_admin_database_v1_backup_schedule_proto_rawDescData -} - -var file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes = make([]protoimpl.MessageInfo, 9) -var file_google_spanner_admin_database_v1_backup_schedule_proto_goTypes = []any{ - (*BackupScheduleSpec)(nil), // 0: google.spanner.admin.database.v1.BackupScheduleSpec - (*BackupSchedule)(nil), // 1: google.spanner.admin.database.v1.BackupSchedule - (*CrontabSpec)(nil), // 2: google.spanner.admin.database.v1.CrontabSpec - (*CreateBackupScheduleRequest)(nil), // 3: google.spanner.admin.database.v1.CreateBackupScheduleRequest - (*GetBackupScheduleRequest)(nil), // 4: google.spanner.admin.database.v1.GetBackupScheduleRequest - (*DeleteBackupScheduleRequest)(nil), // 5: google.spanner.admin.database.v1.DeleteBackupScheduleRequest - (*ListBackupSchedulesRequest)(nil), // 6: google.spanner.admin.database.v1.ListBackupSchedulesRequest - (*ListBackupSchedulesResponse)(nil), // 7: google.spanner.admin.database.v1.ListBackupSchedulesResponse - (*UpdateBackupScheduleRequest)(nil), // 8: google.spanner.admin.database.v1.UpdateBackupScheduleRequest - (*durationpb.Duration)(nil), // 9: google.protobuf.Duration - (*CreateBackupEncryptionConfig)(nil), // 10: google.spanner.admin.database.v1.CreateBackupEncryptionConfig - (*FullBackupSpec)(nil), // 11: google.spanner.admin.database.v1.FullBackupSpec - (*IncrementalBackupSpec)(nil), // 12: google.spanner.admin.database.v1.IncrementalBackupSpec - (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp - (*fieldmaskpb.FieldMask)(nil), // 14: google.protobuf.FieldMask -} -var file_google_spanner_admin_database_v1_backup_schedule_proto_depIdxs = []int32{ - 2, // 0: google.spanner.admin.database.v1.BackupScheduleSpec.cron_spec:type_name -> google.spanner.admin.database.v1.CrontabSpec - 0, // 1: google.spanner.admin.database.v1.BackupSchedule.spec:type_name -> google.spanner.admin.database.v1.BackupScheduleSpec - 9, // 2: google.spanner.admin.database.v1.BackupSchedule.retention_duration:type_name -> google.protobuf.Duration - 10, // 3: google.spanner.admin.database.v1.BackupSchedule.encryption_config:type_name -> google.spanner.admin.database.v1.CreateBackupEncryptionConfig - 11, // 4: google.spanner.admin.database.v1.BackupSchedule.full_backup_spec:type_name -> google.spanner.admin.database.v1.FullBackupSpec - 12, // 5: google.spanner.admin.database.v1.BackupSchedule.incremental_backup_spec:type_name -> google.spanner.admin.database.v1.IncrementalBackupSpec - 13, // 6: google.spanner.admin.database.v1.BackupSchedule.update_time:type_name -> google.protobuf.Timestamp - 9, // 7: google.spanner.admin.database.v1.CrontabSpec.creation_window:type_name -> google.protobuf.Duration - 1, // 8: google.spanner.admin.database.v1.CreateBackupScheduleRequest.backup_schedule:type_name -> google.spanner.admin.database.v1.BackupSchedule - 1, // 9: google.spanner.admin.database.v1.ListBackupSchedulesResponse.backup_schedules:type_name -> google.spanner.admin.database.v1.BackupSchedule - 1, // 10: google.spanner.admin.database.v1.UpdateBackupScheduleRequest.backup_schedule:type_name -> google.spanner.admin.database.v1.BackupSchedule - 14, // 11: google.spanner.admin.database.v1.UpdateBackupScheduleRequest.update_mask:type_name -> google.protobuf.FieldMask - 12, // [12:12] is the sub-list for method output_type - 12, // [12:12] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name -} - -func init() { file_google_spanner_admin_database_v1_backup_schedule_proto_init() } -func file_google_spanner_admin_database_v1_backup_schedule_proto_init() { - if File_google_spanner_admin_database_v1_backup_schedule_proto != nil { - return - } - file_google_spanner_admin_database_v1_backup_proto_init() - file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[0].OneofWrappers = []any{ - (*BackupScheduleSpec_CronSpec)(nil), - } - file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes[1].OneofWrappers = []any{ - (*BackupSchedule_FullBackupSpec)(nil), - (*BackupSchedule_IncrementalBackupSpec)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_admin_database_v1_backup_schedule_proto_rawDesc, - NumEnums: 0, - NumMessages: 9, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_admin_database_v1_backup_schedule_proto_goTypes, - DependencyIndexes: file_google_spanner_admin_database_v1_backup_schedule_proto_depIdxs, - MessageInfos: file_google_spanner_admin_database_v1_backup_schedule_proto_msgTypes, - }.Build() - File_google_spanner_admin_database_v1_backup_schedule_proto = out.File - file_google_spanner_admin_database_v1_backup_schedule_proto_rawDesc = nil - file_google_spanner_admin_database_v1_backup_schedule_proto_goTypes = nil - file_google_spanner_admin_database_v1_backup_schedule_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/common.pb.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/common.pb.go deleted file mode 100644 index 0e8f4deea4..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/common.pb.go +++ /dev/null @@ -1,522 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/admin/database/v1/common.proto - -package databasepb - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - status "google.golang.org/genproto/googleapis/rpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Indicates the dialect type of a database. -type DatabaseDialect int32 - -const ( - // Default value. This value will create a database with the - // GOOGLE_STANDARD_SQL dialect. - DatabaseDialect_DATABASE_DIALECT_UNSPECIFIED DatabaseDialect = 0 - // GoogleSQL supported SQL. - DatabaseDialect_GOOGLE_STANDARD_SQL DatabaseDialect = 1 - // PostgreSQL supported SQL. - DatabaseDialect_POSTGRESQL DatabaseDialect = 2 -) - -// Enum value maps for DatabaseDialect. -var ( - DatabaseDialect_name = map[int32]string{ - 0: "DATABASE_DIALECT_UNSPECIFIED", - 1: "GOOGLE_STANDARD_SQL", - 2: "POSTGRESQL", - } - DatabaseDialect_value = map[string]int32{ - "DATABASE_DIALECT_UNSPECIFIED": 0, - "GOOGLE_STANDARD_SQL": 1, - "POSTGRESQL": 2, - } -) - -func (x DatabaseDialect) Enum() *DatabaseDialect { - p := new(DatabaseDialect) - *p = x - return p -} - -func (x DatabaseDialect) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DatabaseDialect) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_common_proto_enumTypes[0].Descriptor() -} - -func (DatabaseDialect) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_common_proto_enumTypes[0] -} - -func (x DatabaseDialect) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DatabaseDialect.Descriptor instead. -func (DatabaseDialect) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_common_proto_rawDescGZIP(), []int{0} -} - -// Possible encryption types. -type EncryptionInfo_Type int32 - -const ( - // Encryption type was not specified, though data at rest remains encrypted. - EncryptionInfo_TYPE_UNSPECIFIED EncryptionInfo_Type = 0 - // The data is encrypted at rest with a key that is - // fully managed by Google. No key version or status will be populated. - // This is the default state. - EncryptionInfo_GOOGLE_DEFAULT_ENCRYPTION EncryptionInfo_Type = 1 - // The data is encrypted at rest with a key that is - // managed by the customer. The active version of the key. `kms_key_version` - // will be populated, and `encryption_status` may be populated. - EncryptionInfo_CUSTOMER_MANAGED_ENCRYPTION EncryptionInfo_Type = 2 -) - -// Enum value maps for EncryptionInfo_Type. -var ( - EncryptionInfo_Type_name = map[int32]string{ - 0: "TYPE_UNSPECIFIED", - 1: "GOOGLE_DEFAULT_ENCRYPTION", - 2: "CUSTOMER_MANAGED_ENCRYPTION", - } - EncryptionInfo_Type_value = map[string]int32{ - "TYPE_UNSPECIFIED": 0, - "GOOGLE_DEFAULT_ENCRYPTION": 1, - "CUSTOMER_MANAGED_ENCRYPTION": 2, - } -) - -func (x EncryptionInfo_Type) Enum() *EncryptionInfo_Type { - p := new(EncryptionInfo_Type) - *p = x - return p -} - -func (x EncryptionInfo_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (EncryptionInfo_Type) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_common_proto_enumTypes[1].Descriptor() -} - -func (EncryptionInfo_Type) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_common_proto_enumTypes[1] -} - -func (x EncryptionInfo_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use EncryptionInfo_Type.Descriptor instead. -func (EncryptionInfo_Type) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_common_proto_rawDescGZIP(), []int{2, 0} -} - -// Encapsulates progress related information for a Cloud Spanner long -// running operation. -type OperationProgress struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Percent completion of the operation. - // Values are between 0 and 100 inclusive. - ProgressPercent int32 `protobuf:"varint,1,opt,name=progress_percent,json=progressPercent,proto3" json:"progress_percent,omitempty"` - // Time the request was received. - StartTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - // If set, the time at which this operation failed or was completed - // successfully. - EndTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` -} - -func (x *OperationProgress) Reset() { - *x = OperationProgress{} - mi := &file_google_spanner_admin_database_v1_common_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *OperationProgress) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OperationProgress) ProtoMessage() {} - -func (x *OperationProgress) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_common_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OperationProgress.ProtoReflect.Descriptor instead. -func (*OperationProgress) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_common_proto_rawDescGZIP(), []int{0} -} - -func (x *OperationProgress) GetProgressPercent() int32 { - if x != nil { - return x.ProgressPercent - } - return 0 -} - -func (x *OperationProgress) GetStartTime() *timestamppb.Timestamp { - if x != nil { - return x.StartTime - } - return nil -} - -func (x *OperationProgress) GetEndTime() *timestamppb.Timestamp { - if x != nil { - return x.EndTime - } - return nil -} - -// Encryption configuration for a Cloud Spanner database. -type EncryptionConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The Cloud KMS key to be used for encrypting and decrypting - // the database. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - KmsKeyName string `protobuf:"bytes,2,opt,name=kms_key_name,json=kmsKeyName,proto3" json:"kms_key_name,omitempty"` - // Specifies the KMS configuration for the one or more keys used to encrypt - // the database. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - // - // The keys referenced by kms_key_names must fully cover all - // regions of the database instance configuration. Some examples: - // * For single region database instance configs, specify a single regional - // location KMS key. - // * For multi-regional database instance configs of type GOOGLE_MANAGED, - // either specify a multi-regional location KMS key or multiple regional - // location KMS keys that cover all regions in the instance config. - // * For a database instance config of type USER_MANAGED, please specify only - // regional location KMS keys to cover each region in the instance config. - // Multi-regional location KMS keys are not supported for USER_MANAGED - // instance configs. - KmsKeyNames []string `protobuf:"bytes,3,rep,name=kms_key_names,json=kmsKeyNames,proto3" json:"kms_key_names,omitempty"` -} - -func (x *EncryptionConfig) Reset() { - *x = EncryptionConfig{} - mi := &file_google_spanner_admin_database_v1_common_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *EncryptionConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EncryptionConfig) ProtoMessage() {} - -func (x *EncryptionConfig) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_common_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EncryptionConfig.ProtoReflect.Descriptor instead. -func (*EncryptionConfig) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_common_proto_rawDescGZIP(), []int{1} -} - -func (x *EncryptionConfig) GetKmsKeyName() string { - if x != nil { - return x.KmsKeyName - } - return "" -} - -func (x *EncryptionConfig) GetKmsKeyNames() []string { - if x != nil { - return x.KmsKeyNames - } - return nil -} - -// Encryption information for a Cloud Spanner database or backup. -type EncryptionInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Output only. The type of encryption. - EncryptionType EncryptionInfo_Type `protobuf:"varint,3,opt,name=encryption_type,json=encryptionType,proto3,enum=google.spanner.admin.database.v1.EncryptionInfo_Type" json:"encryption_type,omitempty"` - // Output only. If present, the status of a recent encrypt/decrypt call on - // underlying data for this database or backup. Regardless of status, data is - // always encrypted at rest. - EncryptionStatus *status.Status `protobuf:"bytes,4,opt,name=encryption_status,json=encryptionStatus,proto3" json:"encryption_status,omitempty"` - // Output only. A Cloud KMS key version that is being used to protect the - // database or backup. - KmsKeyVersion string `protobuf:"bytes,2,opt,name=kms_key_version,json=kmsKeyVersion,proto3" json:"kms_key_version,omitempty"` -} - -func (x *EncryptionInfo) Reset() { - *x = EncryptionInfo{} - mi := &file_google_spanner_admin_database_v1_common_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *EncryptionInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EncryptionInfo) ProtoMessage() {} - -func (x *EncryptionInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_common_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EncryptionInfo.ProtoReflect.Descriptor instead. -func (*EncryptionInfo) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_common_proto_rawDescGZIP(), []int{2} -} - -func (x *EncryptionInfo) GetEncryptionType() EncryptionInfo_Type { - if x != nil { - return x.EncryptionType - } - return EncryptionInfo_TYPE_UNSPECIFIED -} - -func (x *EncryptionInfo) GetEncryptionStatus() *status.Status { - if x != nil { - return x.EncryptionStatus - } - return nil -} - -func (x *EncryptionInfo) GetKmsKeyVersion() string { - if x != nil { - return x.KmsKeyVersion - } - return "" -} - -var File_google_spanner_admin_database_v1_common_proto protoreflect.FileDescriptor - -var file_google_spanner_admin_database_v1_common_proto_rawDesc = []byte{ - 0x0a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x10, 0x45, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x48, 0x0a, 0x0c, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0a, 0x6b, - 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x0d, 0x6b, 0x6d, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, - 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xf3, 0x02, 0x0a, 0x0e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x63, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x65, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, - 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x30, 0xe0, 0x41, - 0x03, 0xfa, 0x41, 0x2a, 0x0a, 0x28, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, - 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, - 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x47, - 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x4e, - 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x55, - 0x53, 0x54, 0x4f, 0x4d, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x45, - 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x0f, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x20, - 0x0a, 0x1c, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x4c, 0x45, - 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x17, 0x0a, 0x13, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, - 0x41, 0x52, 0x44, 0x5f, 0x53, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x4f, 0x53, - 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x10, 0x02, 0x42, 0xa2, 0x04, 0xea, 0x41, 0x78, 0x0a, - 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, - 0x65, 0x79, 0x12, 0x53, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x52, - 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x2f, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x7d, 0xea, 0x41, 0xa6, 0x01, 0x0a, 0x28, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6b, - 0x65, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, - 0x67, 0x7d, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x7d, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x6f, 0x4b, 0x65, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x7d, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x46, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x70, 0x62, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x70, 0x62, 0xaa, 0x02, - 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5c, 0x56, 0x31, - 0xea, 0x02, 0x2b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, - 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_admin_database_v1_common_proto_rawDescOnce sync.Once - file_google_spanner_admin_database_v1_common_proto_rawDescData = file_google_spanner_admin_database_v1_common_proto_rawDesc -) - -func file_google_spanner_admin_database_v1_common_proto_rawDescGZIP() []byte { - file_google_spanner_admin_database_v1_common_proto_rawDescOnce.Do(func() { - file_google_spanner_admin_database_v1_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_admin_database_v1_common_proto_rawDescData) - }) - return file_google_spanner_admin_database_v1_common_proto_rawDescData -} - -var file_google_spanner_admin_database_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_google_spanner_admin_database_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_google_spanner_admin_database_v1_common_proto_goTypes = []any{ - (DatabaseDialect)(0), // 0: google.spanner.admin.database.v1.DatabaseDialect - (EncryptionInfo_Type)(0), // 1: google.spanner.admin.database.v1.EncryptionInfo.Type - (*OperationProgress)(nil), // 2: google.spanner.admin.database.v1.OperationProgress - (*EncryptionConfig)(nil), // 3: google.spanner.admin.database.v1.EncryptionConfig - (*EncryptionInfo)(nil), // 4: google.spanner.admin.database.v1.EncryptionInfo - (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp - (*status.Status)(nil), // 6: google.rpc.Status -} -var file_google_spanner_admin_database_v1_common_proto_depIdxs = []int32{ - 5, // 0: google.spanner.admin.database.v1.OperationProgress.start_time:type_name -> google.protobuf.Timestamp - 5, // 1: google.spanner.admin.database.v1.OperationProgress.end_time:type_name -> google.protobuf.Timestamp - 1, // 2: google.spanner.admin.database.v1.EncryptionInfo.encryption_type:type_name -> google.spanner.admin.database.v1.EncryptionInfo.Type - 6, // 3: google.spanner.admin.database.v1.EncryptionInfo.encryption_status:type_name -> google.rpc.Status - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name -} - -func init() { file_google_spanner_admin_database_v1_common_proto_init() } -func file_google_spanner_admin_database_v1_common_proto_init() { - if File_google_spanner_admin_database_v1_common_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_admin_database_v1_common_proto_rawDesc, - NumEnums: 2, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_admin_database_v1_common_proto_goTypes, - DependencyIndexes: file_google_spanner_admin_database_v1_common_proto_depIdxs, - EnumInfos: file_google_spanner_admin_database_v1_common_proto_enumTypes, - MessageInfos: file_google_spanner_admin_database_v1_common_proto_msgTypes, - }.Build() - File_google_spanner_admin_database_v1_common_proto = out.File - file_google_spanner_admin_database_v1_common_proto_rawDesc = nil - file_google_spanner_admin_database_v1_common_proto_goTypes = nil - file_google_spanner_admin_database_v1_common_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/spanner_database_admin.pb.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/spanner_database_admin.pb.go deleted file mode 100644 index a33e23cfd2..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/databasepb/spanner_database_admin.pb.go +++ /dev/null @@ -1,5025 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/admin/database/v1/spanner_database_admin.proto - -package databasepb - -import ( - iampb "cloud.google.com/go/iam/apiv1/iampb" - longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb" - context "context" - _ "google.golang.org/genproto/googleapis/api/annotations" - status "google.golang.org/genproto/googleapis/rpc/status" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status1 "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" - structpb "google.golang.org/protobuf/types/known/structpb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Indicates the type of the restore source. -type RestoreSourceType int32 - -const ( - // No restore associated. - RestoreSourceType_TYPE_UNSPECIFIED RestoreSourceType = 0 - // A backup was used as the source of the restore. - RestoreSourceType_BACKUP RestoreSourceType = 1 -) - -// Enum value maps for RestoreSourceType. -var ( - RestoreSourceType_name = map[int32]string{ - 0: "TYPE_UNSPECIFIED", - 1: "BACKUP", - } - RestoreSourceType_value = map[string]int32{ - "TYPE_UNSPECIFIED": 0, - "BACKUP": 1, - } -) - -func (x RestoreSourceType) Enum() *RestoreSourceType { - p := new(RestoreSourceType) - *p = x - return p -} - -func (x RestoreSourceType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (RestoreSourceType) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes[0].Descriptor() -} - -func (RestoreSourceType) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes[0] -} - -func (x RestoreSourceType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use RestoreSourceType.Descriptor instead. -func (RestoreSourceType) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{0} -} - -// Indicates the current state of the database. -type Database_State int32 - -const ( - // Not specified. - Database_STATE_UNSPECIFIED Database_State = 0 - // The database is still being created. Operations on the database may fail - // with `FAILED_PRECONDITION` in this state. - Database_CREATING Database_State = 1 - // The database is fully created and ready for use. - Database_READY Database_State = 2 - // The database is fully created and ready for use, but is still - // being optimized for performance and cannot handle full load. - // - // In this state, the database still references the backup - // it was restore from, preventing the backup - // from being deleted. When optimizations are complete, the full performance - // of the database will be restored, and the database will transition to - // `READY` state. - Database_READY_OPTIMIZING Database_State = 3 -) - -// Enum value maps for Database_State. -var ( - Database_State_name = map[int32]string{ - 0: "STATE_UNSPECIFIED", - 1: "CREATING", - 2: "READY", - 3: "READY_OPTIMIZING", - } - Database_State_value = map[string]int32{ - "STATE_UNSPECIFIED": 0, - "CREATING": 1, - "READY": 2, - "READY_OPTIMIZING": 3, - } -) - -func (x Database_State) Enum() *Database_State { - p := new(Database_State) - *p = x - return p -} - -func (x Database_State) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Database_State) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes[1].Descriptor() -} - -func (Database_State) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes[1] -} - -func (x Database_State) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Database_State.Descriptor instead. -func (Database_State) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{1, 0} -} - -// Encryption types for the database to be restored. -type RestoreDatabaseEncryptionConfig_EncryptionType int32 - -const ( - // Unspecified. Do not use. - RestoreDatabaseEncryptionConfig_ENCRYPTION_TYPE_UNSPECIFIED RestoreDatabaseEncryptionConfig_EncryptionType = 0 - // This is the default option when - // [encryption_config][google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig] - // is not specified. - RestoreDatabaseEncryptionConfig_USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION RestoreDatabaseEncryptionConfig_EncryptionType = 1 - // Use Google default encryption. - RestoreDatabaseEncryptionConfig_GOOGLE_DEFAULT_ENCRYPTION RestoreDatabaseEncryptionConfig_EncryptionType = 2 - // Use customer managed encryption. If specified, `kms_key_name` must - // must contain a valid Cloud KMS key. - RestoreDatabaseEncryptionConfig_CUSTOMER_MANAGED_ENCRYPTION RestoreDatabaseEncryptionConfig_EncryptionType = 3 -) - -// Enum value maps for RestoreDatabaseEncryptionConfig_EncryptionType. -var ( - RestoreDatabaseEncryptionConfig_EncryptionType_name = map[int32]string{ - 0: "ENCRYPTION_TYPE_UNSPECIFIED", - 1: "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION", - 2: "GOOGLE_DEFAULT_ENCRYPTION", - 3: "CUSTOMER_MANAGED_ENCRYPTION", - } - RestoreDatabaseEncryptionConfig_EncryptionType_value = map[string]int32{ - "ENCRYPTION_TYPE_UNSPECIFIED": 0, - "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION": 1, - "GOOGLE_DEFAULT_ENCRYPTION": 2, - "CUSTOMER_MANAGED_ENCRYPTION": 3, - } -) - -func (x RestoreDatabaseEncryptionConfig_EncryptionType) Enum() *RestoreDatabaseEncryptionConfig_EncryptionType { - p := new(RestoreDatabaseEncryptionConfig_EncryptionType) - *p = x - return p -} - -func (x RestoreDatabaseEncryptionConfig_EncryptionType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (RestoreDatabaseEncryptionConfig_EncryptionType) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes[2].Descriptor() -} - -func (RestoreDatabaseEncryptionConfig_EncryptionType) Type() protoreflect.EnumType { - return &file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes[2] -} - -func (x RestoreDatabaseEncryptionConfig_EncryptionType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use RestoreDatabaseEncryptionConfig_EncryptionType.Descriptor instead. -func (RestoreDatabaseEncryptionConfig_EncryptionType) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{18, 0} -} - -// Information about the database restore. -type RestoreInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The type of the restore source. - SourceType RestoreSourceType `protobuf:"varint,1,opt,name=source_type,json=sourceType,proto3,enum=google.spanner.admin.database.v1.RestoreSourceType" json:"source_type,omitempty"` - // Information about the source used to restore the database. - // - // Types that are assignable to SourceInfo: - // - // *RestoreInfo_BackupInfo - SourceInfo isRestoreInfo_SourceInfo `protobuf_oneof:"source_info"` -} - -func (x *RestoreInfo) Reset() { - *x = RestoreInfo{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RestoreInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RestoreInfo) ProtoMessage() {} - -func (x *RestoreInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RestoreInfo.ProtoReflect.Descriptor instead. -func (*RestoreInfo) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{0} -} - -func (x *RestoreInfo) GetSourceType() RestoreSourceType { - if x != nil { - return x.SourceType - } - return RestoreSourceType_TYPE_UNSPECIFIED -} - -func (m *RestoreInfo) GetSourceInfo() isRestoreInfo_SourceInfo { - if m != nil { - return m.SourceInfo - } - return nil -} - -func (x *RestoreInfo) GetBackupInfo() *BackupInfo { - if x, ok := x.GetSourceInfo().(*RestoreInfo_BackupInfo); ok { - return x.BackupInfo - } - return nil -} - -type isRestoreInfo_SourceInfo interface { - isRestoreInfo_SourceInfo() -} - -type RestoreInfo_BackupInfo struct { - // Information about the backup used to restore the database. The backup - // may no longer exist. - BackupInfo *BackupInfo `protobuf:"bytes,2,opt,name=backup_info,json=backupInfo,proto3,oneof"` -} - -func (*RestoreInfo_BackupInfo) isRestoreInfo_SourceInfo() {} - -// A Cloud Spanner database. -type Database struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the database. Values are of the form - // `projects//instances//databases/`, - // where `` is as specified in the `CREATE DATABASE` - // statement. This name can be passed to other API methods to - // identify the database. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Output only. The current database state. - State Database_State `protobuf:"varint,2,opt,name=state,proto3,enum=google.spanner.admin.database.v1.Database_State" json:"state,omitempty"` - // Output only. If exists, the time at which the database creation started. - CreateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - // Output only. Applicable only for restored databases. Contains information - // about the restore source. - RestoreInfo *RestoreInfo `protobuf:"bytes,4,opt,name=restore_info,json=restoreInfo,proto3" json:"restore_info,omitempty"` - // Output only. For databases that are using customer managed encryption, this - // field contains the encryption configuration for the database. - // For databases that are using Google default or other types of encryption, - // this field is empty. - EncryptionConfig *EncryptionConfig `protobuf:"bytes,5,opt,name=encryption_config,json=encryptionConfig,proto3" json:"encryption_config,omitempty"` - // Output only. For databases that are using customer managed encryption, this - // field contains the encryption information for the database, such as - // all Cloud KMS key versions that are in use. The `encryption_status' field - // inside of each `EncryptionInfo` is not populated. - // - // For databases that are using Google default or other types of encryption, - // this field is empty. - // - // This field is propagated lazily from the backend. There might be a delay - // from when a key version is being used and when it appears in this field. - EncryptionInfo []*EncryptionInfo `protobuf:"bytes,8,rep,name=encryption_info,json=encryptionInfo,proto3" json:"encryption_info,omitempty"` - // Output only. The period in which Cloud Spanner retains all versions of data - // for the database. This is the same as the value of version_retention_period - // database option set using - // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl]. - // Defaults to 1 hour, if not set. - VersionRetentionPeriod string `protobuf:"bytes,6,opt,name=version_retention_period,json=versionRetentionPeriod,proto3" json:"version_retention_period,omitempty"` - // Output only. Earliest timestamp at which older versions of the data can be - // read. This value is continuously updated by Cloud Spanner and becomes stale - // the moment it is queried. If you are using this value to recover data, make - // sure to account for the time from the moment when the value is queried to - // the moment when you initiate the recovery. - EarliestVersionTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=earliest_version_time,json=earliestVersionTime,proto3" json:"earliest_version_time,omitempty"` - // Output only. The read-write region which contains the database's leader - // replicas. - // - // This is the same as the value of default_leader - // database option set using DatabaseAdmin.CreateDatabase or - // DatabaseAdmin.UpdateDatabaseDdl. If not explicitly set, this is empty. - DefaultLeader string `protobuf:"bytes,9,opt,name=default_leader,json=defaultLeader,proto3" json:"default_leader,omitempty"` - // Output only. The dialect of the Cloud Spanner Database. - DatabaseDialect DatabaseDialect `protobuf:"varint,10,opt,name=database_dialect,json=databaseDialect,proto3,enum=google.spanner.admin.database.v1.DatabaseDialect" json:"database_dialect,omitempty"` - // Whether drop protection is enabled for this database. Defaults to false, - // if not set. For more details, please see how to [prevent accidental - // database - // deletion](https://cloud.google.com/spanner/docs/prevent-database-deletion). - EnableDropProtection bool `protobuf:"varint,11,opt,name=enable_drop_protection,json=enableDropProtection,proto3" json:"enable_drop_protection,omitempty"` - // Output only. If true, the database is being updated. If false, there are no - // ongoing update operations for the database. - Reconciling bool `protobuf:"varint,12,opt,name=reconciling,proto3" json:"reconciling,omitempty"` -} - -func (x *Database) Reset() { - *x = Database{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Database) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Database) ProtoMessage() {} - -func (x *Database) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Database.ProtoReflect.Descriptor instead. -func (*Database) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{1} -} - -func (x *Database) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Database) GetState() Database_State { - if x != nil { - return x.State - } - return Database_STATE_UNSPECIFIED -} - -func (x *Database) GetCreateTime() *timestamppb.Timestamp { - if x != nil { - return x.CreateTime - } - return nil -} - -func (x *Database) GetRestoreInfo() *RestoreInfo { - if x != nil { - return x.RestoreInfo - } - return nil -} - -func (x *Database) GetEncryptionConfig() *EncryptionConfig { - if x != nil { - return x.EncryptionConfig - } - return nil -} - -func (x *Database) GetEncryptionInfo() []*EncryptionInfo { - if x != nil { - return x.EncryptionInfo - } - return nil -} - -func (x *Database) GetVersionRetentionPeriod() string { - if x != nil { - return x.VersionRetentionPeriod - } - return "" -} - -func (x *Database) GetEarliestVersionTime() *timestamppb.Timestamp { - if x != nil { - return x.EarliestVersionTime - } - return nil -} - -func (x *Database) GetDefaultLeader() string { - if x != nil { - return x.DefaultLeader - } - return "" -} - -func (x *Database) GetDatabaseDialect() DatabaseDialect { - if x != nil { - return x.DatabaseDialect - } - return DatabaseDialect_DATABASE_DIALECT_UNSPECIFIED -} - -func (x *Database) GetEnableDropProtection() bool { - if x != nil { - return x.EnableDropProtection - } - return false -} - -func (x *Database) GetReconciling() bool { - if x != nil { - return x.Reconciling - } - return false -} - -// The request for -// [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. -type ListDatabasesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The instance whose databases should be listed. - // Values are of the form `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Number of databases to be returned in the response. If 0 or less, - // defaults to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListDatabasesResponse.next_page_token] - // from a previous - // [ListDatabasesResponse][google.spanner.admin.database.v1.ListDatabasesResponse]. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` -} - -func (x *ListDatabasesRequest) Reset() { - *x = ListDatabasesRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListDatabasesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListDatabasesRequest) ProtoMessage() {} - -func (x *ListDatabasesRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListDatabasesRequest.ProtoReflect.Descriptor instead. -func (*ListDatabasesRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{2} -} - -func (x *ListDatabasesRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *ListDatabasesRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListDatabasesRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -// The response for -// [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. -type ListDatabasesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Databases that matched the request. - Databases []*Database `protobuf:"bytes,1,rep,name=databases,proto3" json:"databases,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases] - // call to fetch more of the matching databases. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListDatabasesResponse) Reset() { - *x = ListDatabasesResponse{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListDatabasesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListDatabasesResponse) ProtoMessage() {} - -func (x *ListDatabasesResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListDatabasesResponse.ProtoReflect.Descriptor instead. -func (*ListDatabasesResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{3} -} - -func (x *ListDatabasesResponse) GetDatabases() []*Database { - if x != nil { - return x.Databases - } - return nil -} - -func (x *ListDatabasesResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// The request for -// [CreateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase]. -type CreateDatabaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the instance that will serve the new database. - // Values are of the form `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Required. A `CREATE DATABASE` statement, which specifies the ID of the - // new database. The database ID must conform to the regular expression - // `[a-z][a-z0-9_\-]*[a-z0-9]` and be between 2 and 30 characters in length. - // If the database ID is a reserved word or if it contains a hyphen, the - // database ID must be enclosed in backticks (“ ` “). - CreateStatement string `protobuf:"bytes,2,opt,name=create_statement,json=createStatement,proto3" json:"create_statement,omitempty"` - // Optional. A list of DDL statements to run inside the newly created - // database. Statements can create tables, indexes, etc. These - // statements execute atomically with the creation of the database: - // if there is an error in any statement, the database is not created. - ExtraStatements []string `protobuf:"bytes,3,rep,name=extra_statements,json=extraStatements,proto3" json:"extra_statements,omitempty"` - // Optional. The encryption configuration for the database. If this field is - // not specified, Cloud Spanner will encrypt/decrypt all data at rest using - // Google default encryption. - EncryptionConfig *EncryptionConfig `protobuf:"bytes,4,opt,name=encryption_config,json=encryptionConfig,proto3" json:"encryption_config,omitempty"` - // Optional. The dialect of the Cloud Spanner Database. - DatabaseDialect DatabaseDialect `protobuf:"varint,5,opt,name=database_dialect,json=databaseDialect,proto3,enum=google.spanner.admin.database.v1.DatabaseDialect" json:"database_dialect,omitempty"` - // Optional. Proto descriptors used by CREATE/ALTER PROTO BUNDLE statements in - // 'extra_statements' above. - // Contains a protobuf-serialized - // [google.protobuf.FileDescriptorSet](https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/descriptor.proto). - // To generate it, [install](https://grpc.io/docs/protoc-installation/) and - // run `protoc` with --include_imports and --descriptor_set_out. For example, - // to generate for moon/shot/app.proto, run - // ``` - // - // $protoc --proto_path=/app_path --proto_path=/lib_path \ - // --include_imports \ - // --descriptor_set_out=descriptors.data \ - // moon/shot/app.proto - // - // ``` - // For more details, see protobuffer [self - // description](https://developers.google.com/protocol-buffers/docs/techniques#self-description). - ProtoDescriptors []byte `protobuf:"bytes,6,opt,name=proto_descriptors,json=protoDescriptors,proto3" json:"proto_descriptors,omitempty"` -} - -func (x *CreateDatabaseRequest) Reset() { - *x = CreateDatabaseRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateDatabaseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateDatabaseRequest) ProtoMessage() {} - -func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateDatabaseRequest.ProtoReflect.Descriptor instead. -func (*CreateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{4} -} - -func (x *CreateDatabaseRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *CreateDatabaseRequest) GetCreateStatement() string { - if x != nil { - return x.CreateStatement - } - return "" -} - -func (x *CreateDatabaseRequest) GetExtraStatements() []string { - if x != nil { - return x.ExtraStatements - } - return nil -} - -func (x *CreateDatabaseRequest) GetEncryptionConfig() *EncryptionConfig { - if x != nil { - return x.EncryptionConfig - } - return nil -} - -func (x *CreateDatabaseRequest) GetDatabaseDialect() DatabaseDialect { - if x != nil { - return x.DatabaseDialect - } - return DatabaseDialect_DATABASE_DIALECT_UNSPECIFIED -} - -func (x *CreateDatabaseRequest) GetProtoDescriptors() []byte { - if x != nil { - return x.ProtoDescriptors - } - return nil -} - -// Metadata type for the operation returned by -// [CreateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase]. -type CreateDatabaseMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The database being created. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` -} - -func (x *CreateDatabaseMetadata) Reset() { - *x = CreateDatabaseMetadata{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateDatabaseMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateDatabaseMetadata) ProtoMessage() {} - -func (x *CreateDatabaseMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateDatabaseMetadata.ProtoReflect.Descriptor instead. -func (*CreateDatabaseMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{5} -} - -func (x *CreateDatabaseMetadata) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -// The request for -// [GetDatabase][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabase]. -type GetDatabaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the requested database. Values are of the form - // `projects//instances//databases/`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetDatabaseRequest) Reset() { - *x = GetDatabaseRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetDatabaseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDatabaseRequest) ProtoMessage() {} - -func (x *GetDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetDatabaseRequest.ProtoReflect.Descriptor instead. -func (*GetDatabaseRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{6} -} - -func (x *GetDatabaseRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for -// [UpdateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase]. -type UpdateDatabaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database to update. - // The `name` field of the database is of the form - // `projects//instances//databases/`. - Database *Database `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Required. The list of fields to update. Currently, only - // `enable_drop_protection` field can be updated. - UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` -} - -func (x *UpdateDatabaseRequest) Reset() { - *x = UpdateDatabaseRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateDatabaseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateDatabaseRequest) ProtoMessage() {} - -func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateDatabaseRequest.ProtoReflect.Descriptor instead. -func (*UpdateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{7} -} - -func (x *UpdateDatabaseRequest) GetDatabase() *Database { - if x != nil { - return x.Database - } - return nil -} - -func (x *UpdateDatabaseRequest) GetUpdateMask() *fieldmaskpb.FieldMask { - if x != nil { - return x.UpdateMask - } - return nil -} - -// Metadata type for the operation returned by -// [UpdateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase]. -type UpdateDatabaseMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The request for - // [UpdateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase]. - Request *UpdateDatabaseRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - // The progress of the - // [UpdateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase] - // operation. - Progress *OperationProgress `protobuf:"bytes,2,opt,name=progress,proto3" json:"progress,omitempty"` - // The time at which this operation was cancelled. If set, this operation is - // in the process of undoing itself (which is best-effort). - CancelTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=cancel_time,json=cancelTime,proto3" json:"cancel_time,omitempty"` -} - -func (x *UpdateDatabaseMetadata) Reset() { - *x = UpdateDatabaseMetadata{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateDatabaseMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateDatabaseMetadata) ProtoMessage() {} - -func (x *UpdateDatabaseMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateDatabaseMetadata.ProtoReflect.Descriptor instead. -func (*UpdateDatabaseMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{8} -} - -func (x *UpdateDatabaseMetadata) GetRequest() *UpdateDatabaseRequest { - if x != nil { - return x.Request - } - return nil -} - -func (x *UpdateDatabaseMetadata) GetProgress() *OperationProgress { - if x != nil { - return x.Progress - } - return nil -} - -func (x *UpdateDatabaseMetadata) GetCancelTime() *timestamppb.Timestamp { - if x != nil { - return x.CancelTime - } - return nil -} - -// Enqueues the given DDL statements to be applied, in order but not -// necessarily all at once, to the database schema at some point (or -// points) in the future. The server checks that the statements -// are executable (syntactically valid, name tables that exist, etc.) -// before enqueueing them, but they may still fail upon -// later execution (e.g., if a statement from another batch of -// statements is applied first and it conflicts in some way, or if -// there is some data-related problem like a `NULL` value in a column to -// which `NOT NULL` would be added). If a statement fails, all -// subsequent statements in the batch are automatically cancelled. -// -// Each batch of statements is assigned a name which can be used with -// the [Operations][google.longrunning.Operations] API to monitor -// progress. See the -// [operation_id][google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.operation_id] -// field for more details. -type UpdateDatabaseDdlRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database to update. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Required. DDL statements to be applied to the database. - Statements []string `protobuf:"bytes,2,rep,name=statements,proto3" json:"statements,omitempty"` - // If empty, the new update request is assigned an - // automatically-generated operation ID. Otherwise, `operation_id` - // is used to construct the name of the resulting - // [Operation][google.longrunning.Operation]. - // - // Specifying an explicit operation ID simplifies determining - // whether the statements were executed in the event that the - // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] - // call is replayed, or the return value is otherwise lost: the - // [database][google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.database] - // and `operation_id` fields can be combined to form the - // [name][google.longrunning.Operation.name] of the resulting - // [longrunning.Operation][google.longrunning.Operation]: - // `/operations/`. - // - // `operation_id` should be unique within the database, and must be - // a valid identifier: `[a-z][a-z0-9_]*`. Note that - // automatically-generated operation IDs always begin with an - // underscore. If the named operation already exists, - // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] - // returns `ALREADY_EXISTS`. - OperationId string `protobuf:"bytes,3,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` - // Optional. Proto descriptors used by CREATE/ALTER PROTO BUNDLE statements. - // Contains a protobuf-serialized - // [google.protobuf.FileDescriptorSet](https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/descriptor.proto). - // To generate it, [install](https://grpc.io/docs/protoc-installation/) and - // run `protoc` with --include_imports and --descriptor_set_out. For example, - // to generate for moon/shot/app.proto, run - // ``` - // - // $protoc --proto_path=/app_path --proto_path=/lib_path \ - // --include_imports \ - // --descriptor_set_out=descriptors.data \ - // moon/shot/app.proto - // - // ``` - // For more details, see protobuffer [self - // description](https://developers.google.com/protocol-buffers/docs/techniques#self-description). - ProtoDescriptors []byte `protobuf:"bytes,4,opt,name=proto_descriptors,json=protoDescriptors,proto3" json:"proto_descriptors,omitempty"` - // Optional. This field is exposed to be used by the Spanner Migration Tool. - // For more details, see - // [SMT](https://github.com/GoogleCloudPlatform/spanner-migration-tool). - ThroughputMode bool `protobuf:"varint,5,opt,name=throughput_mode,json=throughputMode,proto3" json:"throughput_mode,omitempty"` -} - -func (x *UpdateDatabaseDdlRequest) Reset() { - *x = UpdateDatabaseDdlRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateDatabaseDdlRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateDatabaseDdlRequest) ProtoMessage() {} - -func (x *UpdateDatabaseDdlRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateDatabaseDdlRequest.ProtoReflect.Descriptor instead. -func (*UpdateDatabaseDdlRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{9} -} - -func (x *UpdateDatabaseDdlRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *UpdateDatabaseDdlRequest) GetStatements() []string { - if x != nil { - return x.Statements - } - return nil -} - -func (x *UpdateDatabaseDdlRequest) GetOperationId() string { - if x != nil { - return x.OperationId - } - return "" -} - -func (x *UpdateDatabaseDdlRequest) GetProtoDescriptors() []byte { - if x != nil { - return x.ProtoDescriptors - } - return nil -} - -func (x *UpdateDatabaseDdlRequest) GetThroughputMode() bool { - if x != nil { - return x.ThroughputMode - } - return false -} - -// Action information extracted from a DDL statement. This proto is used to -// display the brief info of the DDL statement for the operation -// [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl]. -type DdlStatementActionInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The action for the DDL statement, e.g. CREATE, ALTER, DROP, GRANT, etc. - // This field is a non-empty string. - Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` - // The entity type for the DDL statement, e.g. TABLE, INDEX, VIEW, etc. - // This field can be empty string for some DDL statement, - // e.g. for statement "ANALYZE", `entity_type` = "". - EntityType string `protobuf:"bytes,2,opt,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"` - // The entity name(s) being operated on the DDL statement. - // E.g. - // 1. For statement "CREATE TABLE t1(...)", `entity_names` = ["t1"]. - // 2. For statement "GRANT ROLE r1, r2 ...", `entity_names` = ["r1", "r2"]. - // 3. For statement "ANALYZE", `entity_names` = []. - EntityNames []string `protobuf:"bytes,3,rep,name=entity_names,json=entityNames,proto3" json:"entity_names,omitempty"` -} - -func (x *DdlStatementActionInfo) Reset() { - *x = DdlStatementActionInfo{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DdlStatementActionInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DdlStatementActionInfo) ProtoMessage() {} - -func (x *DdlStatementActionInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DdlStatementActionInfo.ProtoReflect.Descriptor instead. -func (*DdlStatementActionInfo) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{10} -} - -func (x *DdlStatementActionInfo) GetAction() string { - if x != nil { - return x.Action - } - return "" -} - -func (x *DdlStatementActionInfo) GetEntityType() string { - if x != nil { - return x.EntityType - } - return "" -} - -func (x *DdlStatementActionInfo) GetEntityNames() []string { - if x != nil { - return x.EntityNames - } - return nil -} - -// Metadata type for the operation returned by -// [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl]. -type UpdateDatabaseDdlMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The database being modified. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // For an update this list contains all the statements. For an - // individual statement, this list contains only that statement. - Statements []string `protobuf:"bytes,2,rep,name=statements,proto3" json:"statements,omitempty"` - // Reports the commit timestamps of all statements that have - // succeeded so far, where `commit_timestamps[i]` is the commit - // timestamp for the statement `statements[i]`. - CommitTimestamps []*timestamppb.Timestamp `protobuf:"bytes,3,rep,name=commit_timestamps,json=commitTimestamps,proto3" json:"commit_timestamps,omitempty"` - // Output only. When true, indicates that the operation is throttled e.g. - // due to resource constraints. When resources become available the operation - // will resume and this field will be false again. - Throttled bool `protobuf:"varint,4,opt,name=throttled,proto3" json:"throttled,omitempty"` - // The progress of the - // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] - // operations. All DDL statements will have continuously updating progress, - // and `progress[i]` is the operation progress for `statements[i]`. Also, - // `progress[i]` will have start time and end time populated with commit - // timestamp of operation, as well as a progress of 100% once the operation - // has completed. - Progress []*OperationProgress `protobuf:"bytes,5,rep,name=progress,proto3" json:"progress,omitempty"` - // The brief action info for the DDL statements. - // `actions[i]` is the brief info for `statements[i]`. - Actions []*DdlStatementActionInfo `protobuf:"bytes,6,rep,name=actions,proto3" json:"actions,omitempty"` -} - -func (x *UpdateDatabaseDdlMetadata) Reset() { - *x = UpdateDatabaseDdlMetadata{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateDatabaseDdlMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateDatabaseDdlMetadata) ProtoMessage() {} - -func (x *UpdateDatabaseDdlMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateDatabaseDdlMetadata.ProtoReflect.Descriptor instead. -func (*UpdateDatabaseDdlMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{11} -} - -func (x *UpdateDatabaseDdlMetadata) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *UpdateDatabaseDdlMetadata) GetStatements() []string { - if x != nil { - return x.Statements - } - return nil -} - -func (x *UpdateDatabaseDdlMetadata) GetCommitTimestamps() []*timestamppb.Timestamp { - if x != nil { - return x.CommitTimestamps - } - return nil -} - -func (x *UpdateDatabaseDdlMetadata) GetThrottled() bool { - if x != nil { - return x.Throttled - } - return false -} - -func (x *UpdateDatabaseDdlMetadata) GetProgress() []*OperationProgress { - if x != nil { - return x.Progress - } - return nil -} - -func (x *UpdateDatabaseDdlMetadata) GetActions() []*DdlStatementActionInfo { - if x != nil { - return x.Actions - } - return nil -} - -// The request for -// [DropDatabase][google.spanner.admin.database.v1.DatabaseAdmin.DropDatabase]. -type DropDatabaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database to be dropped. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` -} - -func (x *DropDatabaseRequest) Reset() { - *x = DropDatabaseRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DropDatabaseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DropDatabaseRequest) ProtoMessage() {} - -func (x *DropDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[12] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DropDatabaseRequest.ProtoReflect.Descriptor instead. -func (*DropDatabaseRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{12} -} - -func (x *DropDatabaseRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -// The request for -// [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. -type GetDatabaseDdlRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database whose schema we wish to get. - // Values are of the form - // `projects//instances//databases/` - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` -} - -func (x *GetDatabaseDdlRequest) Reset() { - *x = GetDatabaseDdlRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetDatabaseDdlRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDatabaseDdlRequest) ProtoMessage() {} - -func (x *GetDatabaseDdlRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[13] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetDatabaseDdlRequest.ProtoReflect.Descriptor instead. -func (*GetDatabaseDdlRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{13} -} - -func (x *GetDatabaseDdlRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -// The response for -// [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. -type GetDatabaseDdlResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A list of formatted DDL statements defining the schema of the database - // specified in the request. - Statements []string `protobuf:"bytes,1,rep,name=statements,proto3" json:"statements,omitempty"` - // Proto descriptors stored in the database. - // Contains a protobuf-serialized - // [google.protobuf.FileDescriptorSet](https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/descriptor.proto). - // For more details, see protobuffer [self - // description](https://developers.google.com/protocol-buffers/docs/techniques#self-description). - ProtoDescriptors []byte `protobuf:"bytes,2,opt,name=proto_descriptors,json=protoDescriptors,proto3" json:"proto_descriptors,omitempty"` -} - -func (x *GetDatabaseDdlResponse) Reset() { - *x = GetDatabaseDdlResponse{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetDatabaseDdlResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDatabaseDdlResponse) ProtoMessage() {} - -func (x *GetDatabaseDdlResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[14] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetDatabaseDdlResponse.ProtoReflect.Descriptor instead. -func (*GetDatabaseDdlResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{14} -} - -func (x *GetDatabaseDdlResponse) GetStatements() []string { - if x != nil { - return x.Statements - } - return nil -} - -func (x *GetDatabaseDdlResponse) GetProtoDescriptors() []byte { - if x != nil { - return x.ProtoDescriptors - } - return nil -} - -// The request for -// [ListDatabaseOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperations]. -type ListDatabaseOperationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The instance of the database operations. - // Values are of the form `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // An expression that filters the list of returned operations. - // - // A filter expression consists of a field name, a - // comparison operator, and a value for filtering. - // The value must be a string, a number, or a boolean. The comparison operator - // must be one of: `<`, `>`, `<=`, `>=`, `!=`, `=`, or `:`. - // Colon `:` is the contains operator. Filter rules are not case sensitive. - // - // The following fields in the [Operation][google.longrunning.Operation] - // are eligible for filtering: - // - // - `name` - The name of the long-running operation - // - `done` - False if the operation is in progress, else true. - // - `metadata.@type` - the type of metadata. For example, the type string - // for - // [RestoreDatabaseMetadata][google.spanner.admin.database.v1.RestoreDatabaseMetadata] - // is - // `type.googleapis.com/google.spanner.admin.database.v1.RestoreDatabaseMetadata`. - // - `metadata.` - any field in metadata.value. - // `metadata.@type` must be specified first, if filtering on metadata - // fields. - // - `error` - Error associated with the long-running operation. - // - `response.@type` - the type of response. - // - `response.` - any field in response.value. - // - // You can combine multiple expressions by enclosing each expression in - // parentheses. By default, expressions are combined with AND logic. However, - // you can specify AND, OR, and NOT logic explicitly. - // - // Here are a few examples: - // - // - `done:true` - The operation is complete. - // - `(metadata.@type=type.googleapis.com/google.spanner.admin.database.v1.RestoreDatabaseMetadata) AND` \ - // `(metadata.source_type:BACKUP) AND` \ - // `(metadata.backup_info.backup:backup_howl) AND` \ - // `(metadata.name:restored_howl) AND` \ - // `(metadata.progress.start_time < \"2018-03-28T14:50:00Z\") AND` \ - // `(error:*)` - Return operations where: - // - The operation's metadata type is - // [RestoreDatabaseMetadata][google.spanner.admin.database.v1.RestoreDatabaseMetadata]. - // - The database is restored from a backup. - // - The backup name contains "backup_howl". - // - The restored database's name contains "restored_howl". - // - The operation started before 2018-03-28T14:50:00Z. - // - The operation resulted in an error. - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // Number of operations to be returned in the response. If 0 or - // less, defaults to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListDatabaseOperationsResponse.next_page_token] - // from a previous - // [ListDatabaseOperationsResponse][google.spanner.admin.database.v1.ListDatabaseOperationsResponse] - // to the same `parent` and with the same `filter`. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` -} - -func (x *ListDatabaseOperationsRequest) Reset() { - *x = ListDatabaseOperationsRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListDatabaseOperationsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListDatabaseOperationsRequest) ProtoMessage() {} - -func (x *ListDatabaseOperationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[15] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListDatabaseOperationsRequest.ProtoReflect.Descriptor instead. -func (*ListDatabaseOperationsRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{15} -} - -func (x *ListDatabaseOperationsRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *ListDatabaseOperationsRequest) GetFilter() string { - if x != nil { - return x.Filter - } - return "" -} - -func (x *ListDatabaseOperationsRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListDatabaseOperationsRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -// The response for -// [ListDatabaseOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperations]. -type ListDatabaseOperationsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The list of matching database [long-running - // operations][google.longrunning.Operation]. Each operation's name will be - // prefixed by the database's name. The operation's - // [metadata][google.longrunning.Operation.metadata] field type - // `metadata.type_url` describes the type of the metadata. - Operations []*longrunningpb.Operation `protobuf:"bytes,1,rep,name=operations,proto3" json:"operations,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListDatabaseOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperations] - // call to fetch more of the matching metadata. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListDatabaseOperationsResponse) Reset() { - *x = ListDatabaseOperationsResponse{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListDatabaseOperationsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListDatabaseOperationsResponse) ProtoMessage() {} - -func (x *ListDatabaseOperationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[16] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListDatabaseOperationsResponse.ProtoReflect.Descriptor instead. -func (*ListDatabaseOperationsResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{16} -} - -func (x *ListDatabaseOperationsResponse) GetOperations() []*longrunningpb.Operation { - if x != nil { - return x.Operations - } - return nil -} - -func (x *ListDatabaseOperationsResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// The request for -// [RestoreDatabase][google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabase]. -type RestoreDatabaseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the instance in which to create the - // restored database. This instance must be in the same project and - // have the same instance configuration as the instance containing - // the source backup. Values are of the form - // `projects//instances/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Required. The id of the database to create and restore to. This - // database must not already exist. The `database_id` appended to - // `parent` forms the full database name of the form - // `projects//instances//databases/`. - DatabaseId string `protobuf:"bytes,2,opt,name=database_id,json=databaseId,proto3" json:"database_id,omitempty"` - // Required. The source from which to restore. - // - // Types that are assignable to Source: - // - // *RestoreDatabaseRequest_Backup - Source isRestoreDatabaseRequest_Source `protobuf_oneof:"source"` - // Optional. An encryption configuration describing the encryption type and - // key resources in Cloud KMS used to encrypt/decrypt the database to restore - // to. If this field is not specified, the restored database will use the same - // encryption configuration as the backup by default, namely - // [encryption_type][google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.encryption_type] - // = `USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION`. - EncryptionConfig *RestoreDatabaseEncryptionConfig `protobuf:"bytes,4,opt,name=encryption_config,json=encryptionConfig,proto3" json:"encryption_config,omitempty"` -} - -func (x *RestoreDatabaseRequest) Reset() { - *x = RestoreDatabaseRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RestoreDatabaseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RestoreDatabaseRequest) ProtoMessage() {} - -func (x *RestoreDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[17] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RestoreDatabaseRequest.ProtoReflect.Descriptor instead. -func (*RestoreDatabaseRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{17} -} - -func (x *RestoreDatabaseRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *RestoreDatabaseRequest) GetDatabaseId() string { - if x != nil { - return x.DatabaseId - } - return "" -} - -func (m *RestoreDatabaseRequest) GetSource() isRestoreDatabaseRequest_Source { - if m != nil { - return m.Source - } - return nil -} - -func (x *RestoreDatabaseRequest) GetBackup() string { - if x, ok := x.GetSource().(*RestoreDatabaseRequest_Backup); ok { - return x.Backup - } - return "" -} - -func (x *RestoreDatabaseRequest) GetEncryptionConfig() *RestoreDatabaseEncryptionConfig { - if x != nil { - return x.EncryptionConfig - } - return nil -} - -type isRestoreDatabaseRequest_Source interface { - isRestoreDatabaseRequest_Source() -} - -type RestoreDatabaseRequest_Backup struct { - // Name of the backup from which to restore. Values are of the form - // `projects//instances//backups/`. - Backup string `protobuf:"bytes,3,opt,name=backup,proto3,oneof"` -} - -func (*RestoreDatabaseRequest_Backup) isRestoreDatabaseRequest_Source() {} - -// Encryption configuration for the restored database. -type RestoreDatabaseEncryptionConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The encryption type of the restored database. - EncryptionType RestoreDatabaseEncryptionConfig_EncryptionType `protobuf:"varint,1,opt,name=encryption_type,json=encryptionType,proto3,enum=google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig_EncryptionType" json:"encryption_type,omitempty"` - // Optional. The Cloud KMS key that will be used to encrypt/decrypt the - // restored database. This field should be set only when - // [encryption_type][google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.encryption_type] - // is `CUSTOMER_MANAGED_ENCRYPTION`. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - KmsKeyName string `protobuf:"bytes,2,opt,name=kms_key_name,json=kmsKeyName,proto3" json:"kms_key_name,omitempty"` - // Optional. Specifies the KMS configuration for the one or more keys used to - // encrypt the database. Values are of the form - // `projects//locations//keyRings//cryptoKeys/`. - // - // The keys referenced by kms_key_names must fully cover all - // regions of the database instance configuration. Some examples: - // * For single region database instance configs, specify a single regional - // location KMS key. - // * For multi-regional database instance configs of type GOOGLE_MANAGED, - // either specify a multi-regional location KMS key or multiple regional - // location KMS keys that cover all regions in the instance config. - // * For a database instance config of type USER_MANAGED, please specify only - // regional location KMS keys to cover each region in the instance config. - // Multi-regional location KMS keys are not supported for USER_MANAGED - // instance configs. - KmsKeyNames []string `protobuf:"bytes,3,rep,name=kms_key_names,json=kmsKeyNames,proto3" json:"kms_key_names,omitempty"` -} - -func (x *RestoreDatabaseEncryptionConfig) Reset() { - *x = RestoreDatabaseEncryptionConfig{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RestoreDatabaseEncryptionConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RestoreDatabaseEncryptionConfig) ProtoMessage() {} - -func (x *RestoreDatabaseEncryptionConfig) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[18] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RestoreDatabaseEncryptionConfig.ProtoReflect.Descriptor instead. -func (*RestoreDatabaseEncryptionConfig) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{18} -} - -func (x *RestoreDatabaseEncryptionConfig) GetEncryptionType() RestoreDatabaseEncryptionConfig_EncryptionType { - if x != nil { - return x.EncryptionType - } - return RestoreDatabaseEncryptionConfig_ENCRYPTION_TYPE_UNSPECIFIED -} - -func (x *RestoreDatabaseEncryptionConfig) GetKmsKeyName() string { - if x != nil { - return x.KmsKeyName - } - return "" -} - -func (x *RestoreDatabaseEncryptionConfig) GetKmsKeyNames() []string { - if x != nil { - return x.KmsKeyNames - } - return nil -} - -// Metadata type for the long-running operation returned by -// [RestoreDatabase][google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabase]. -type RestoreDatabaseMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Name of the database being created and restored to. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The type of the restore source. - SourceType RestoreSourceType `protobuf:"varint,2,opt,name=source_type,json=sourceType,proto3,enum=google.spanner.admin.database.v1.RestoreSourceType" json:"source_type,omitempty"` - // Information about the source used to restore the database, as specified by - // `source` in - // [RestoreDatabaseRequest][google.spanner.admin.database.v1.RestoreDatabaseRequest]. - // - // Types that are assignable to SourceInfo: - // - // *RestoreDatabaseMetadata_BackupInfo - SourceInfo isRestoreDatabaseMetadata_SourceInfo `protobuf_oneof:"source_info"` - // The progress of the - // [RestoreDatabase][google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabase] - // operation. - Progress *OperationProgress `protobuf:"bytes,4,opt,name=progress,proto3" json:"progress,omitempty"` - // The time at which cancellation of this operation was received. - // [Operations.CancelOperation][google.longrunning.Operations.CancelOperation] - // starts asynchronous cancellation on a long-running operation. The server - // makes a best effort to cancel the operation, but success is not guaranteed. - // Clients can use - // [Operations.GetOperation][google.longrunning.Operations.GetOperation] or - // other methods to check whether the cancellation succeeded or whether the - // operation completed despite cancellation. On successful cancellation, - // the operation is not deleted; instead, it becomes an operation with - // an [Operation.error][google.longrunning.Operation.error] value with a - // [google.rpc.Status.code][google.rpc.Status.code] of 1, corresponding to - // `Code.CANCELLED`. - CancelTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=cancel_time,json=cancelTime,proto3" json:"cancel_time,omitempty"` - // If exists, the name of the long-running operation that will be used to - // track the post-restore optimization process to optimize the performance of - // the restored database, and remove the dependency on the restore source. - // The name is of the form - // `projects//instances//databases//operations/` - // where the is the name of database being created and restored to. - // The metadata type of the long-running operation is - // [OptimizeRestoredDatabaseMetadata][google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata]. - // This long-running operation will be automatically created by the system - // after the RestoreDatabase long-running operation completes successfully. - // This operation will not be created if the restore was not successful. - OptimizeDatabaseOperationName string `protobuf:"bytes,6,opt,name=optimize_database_operation_name,json=optimizeDatabaseOperationName,proto3" json:"optimize_database_operation_name,omitempty"` -} - -func (x *RestoreDatabaseMetadata) Reset() { - *x = RestoreDatabaseMetadata{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RestoreDatabaseMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RestoreDatabaseMetadata) ProtoMessage() {} - -func (x *RestoreDatabaseMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[19] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RestoreDatabaseMetadata.ProtoReflect.Descriptor instead. -func (*RestoreDatabaseMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{19} -} - -func (x *RestoreDatabaseMetadata) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *RestoreDatabaseMetadata) GetSourceType() RestoreSourceType { - if x != nil { - return x.SourceType - } - return RestoreSourceType_TYPE_UNSPECIFIED -} - -func (m *RestoreDatabaseMetadata) GetSourceInfo() isRestoreDatabaseMetadata_SourceInfo { - if m != nil { - return m.SourceInfo - } - return nil -} - -func (x *RestoreDatabaseMetadata) GetBackupInfo() *BackupInfo { - if x, ok := x.GetSourceInfo().(*RestoreDatabaseMetadata_BackupInfo); ok { - return x.BackupInfo - } - return nil -} - -func (x *RestoreDatabaseMetadata) GetProgress() *OperationProgress { - if x != nil { - return x.Progress - } - return nil -} - -func (x *RestoreDatabaseMetadata) GetCancelTime() *timestamppb.Timestamp { - if x != nil { - return x.CancelTime - } - return nil -} - -func (x *RestoreDatabaseMetadata) GetOptimizeDatabaseOperationName() string { - if x != nil { - return x.OptimizeDatabaseOperationName - } - return "" -} - -type isRestoreDatabaseMetadata_SourceInfo interface { - isRestoreDatabaseMetadata_SourceInfo() -} - -type RestoreDatabaseMetadata_BackupInfo struct { - // Information about the backup used to restore the database. - BackupInfo *BackupInfo `protobuf:"bytes,3,opt,name=backup_info,json=backupInfo,proto3,oneof"` -} - -func (*RestoreDatabaseMetadata_BackupInfo) isRestoreDatabaseMetadata_SourceInfo() {} - -// Metadata type for the long-running operation used to track the progress -// of optimizations performed on a newly restored database. This long-running -// operation is automatically created by the system after the successful -// completion of a database restore, and cannot be cancelled. -type OptimizeRestoredDatabaseMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Name of the restored database being optimized. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The progress of the post-restore optimizations. - Progress *OperationProgress `protobuf:"bytes,2,opt,name=progress,proto3" json:"progress,omitempty"` -} - -func (x *OptimizeRestoredDatabaseMetadata) Reset() { - *x = OptimizeRestoredDatabaseMetadata{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *OptimizeRestoredDatabaseMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OptimizeRestoredDatabaseMetadata) ProtoMessage() {} - -func (x *OptimizeRestoredDatabaseMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[20] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OptimizeRestoredDatabaseMetadata.ProtoReflect.Descriptor instead. -func (*OptimizeRestoredDatabaseMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{20} -} - -func (x *OptimizeRestoredDatabaseMetadata) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *OptimizeRestoredDatabaseMetadata) GetProgress() *OperationProgress { - if x != nil { - return x.Progress - } - return nil -} - -// A Cloud Spanner database role. -type DatabaseRole struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the database role. Values are of the form - // `projects//instances//databases//databaseRoles/` - // where `` is as specified in the `CREATE ROLE` DDL statement. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *DatabaseRole) Reset() { - *x = DatabaseRole{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DatabaseRole) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DatabaseRole) ProtoMessage() {} - -func (x *DatabaseRole) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[21] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DatabaseRole.ProtoReflect.Descriptor instead. -func (*DatabaseRole) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{21} -} - -func (x *DatabaseRole) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for -// [ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles]. -type ListDatabaseRolesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database whose roles should be listed. - // Values are of the form - // `projects//instances//databases/`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Number of database roles to be returned in the response. If 0 or less, - // defaults to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListDatabaseRolesResponse.next_page_token] - // from a previous - // [ListDatabaseRolesResponse][google.spanner.admin.database.v1.ListDatabaseRolesResponse]. - PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` -} - -func (x *ListDatabaseRolesRequest) Reset() { - *x = ListDatabaseRolesRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListDatabaseRolesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListDatabaseRolesRequest) ProtoMessage() {} - -func (x *ListDatabaseRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[22] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListDatabaseRolesRequest.ProtoReflect.Descriptor instead. -func (*ListDatabaseRolesRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{22} -} - -func (x *ListDatabaseRolesRequest) GetParent() string { - if x != nil { - return x.Parent - } - return "" -} - -func (x *ListDatabaseRolesRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListDatabaseRolesRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -// The response for -// [ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles]. -type ListDatabaseRolesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Database roles that matched the request. - DatabaseRoles []*DatabaseRole `protobuf:"bytes,1,rep,name=database_roles,json=databaseRoles,proto3" json:"database_roles,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles] - // call to fetch more of the matching roles. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListDatabaseRolesResponse) Reset() { - *x = ListDatabaseRolesResponse{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListDatabaseRolesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListDatabaseRolesResponse) ProtoMessage() {} - -func (x *ListDatabaseRolesResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[23] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListDatabaseRolesResponse.ProtoReflect.Descriptor instead. -func (*ListDatabaseRolesResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{23} -} - -func (x *ListDatabaseRolesResponse) GetDatabaseRoles() []*DatabaseRole { - if x != nil { - return x.DatabaseRoles - } - return nil -} - -func (x *ListDatabaseRolesResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// The request for -// [AddSplitPoints][google.spanner.admin.database.v1.DatabaseAdmin.AddSplitPoints]. -type AddSplitPointsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database on whose tables/indexes split points are to be - // added. Values are of the form - // `projects//instances//databases/`. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Required. The split points to add. - SplitPoints []*SplitPoints `protobuf:"bytes,2,rep,name=split_points,json=splitPoints,proto3" json:"split_points,omitempty"` - // Optional. A user-supplied tag associated with the split points. - // For example, "intital_data_load", "special_event_1". - // Defaults to "CloudAddSplitPointsAPI" if not specified. - // The length of the tag must not exceed 50 characters,else will be trimmed. - // Only valid UTF8 characters are allowed. - Initiator string `protobuf:"bytes,3,opt,name=initiator,proto3" json:"initiator,omitempty"` -} - -func (x *AddSplitPointsRequest) Reset() { - *x = AddSplitPointsRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *AddSplitPointsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AddSplitPointsRequest) ProtoMessage() {} - -func (x *AddSplitPointsRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[24] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AddSplitPointsRequest.ProtoReflect.Descriptor instead. -func (*AddSplitPointsRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{24} -} - -func (x *AddSplitPointsRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *AddSplitPointsRequest) GetSplitPoints() []*SplitPoints { - if x != nil { - return x.SplitPoints - } - return nil -} - -func (x *AddSplitPointsRequest) GetInitiator() string { - if x != nil { - return x.Initiator - } - return "" -} - -// The response for -// [AddSplitPoints][google.spanner.admin.database.v1.DatabaseAdmin.AddSplitPoints]. -type AddSplitPointsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *AddSplitPointsResponse) Reset() { - *x = AddSplitPointsResponse{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *AddSplitPointsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AddSplitPointsResponse) ProtoMessage() {} - -func (x *AddSplitPointsResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[25] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AddSplitPointsResponse.ProtoReflect.Descriptor instead. -func (*AddSplitPointsResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{25} -} - -// The split points of a table/index. -type SplitPoints struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The table to split. - Table string `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` - // The index to split. - // If specified, the `table` field must refer to the index's base table. - Index string `protobuf:"bytes,2,opt,name=index,proto3" json:"index,omitempty"` - // Required. The list of split keys, i.e., the split boundaries. - Keys []*SplitPoints_Key `protobuf:"bytes,3,rep,name=keys,proto3" json:"keys,omitempty"` - // Optional. The expiration timestamp of the split points. - // A timestamp in the past means immediate expiration. - // The maximum value can be 30 days in the future. - // Defaults to 10 days in the future if not specified. - ExpireTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` -} - -func (x *SplitPoints) Reset() { - *x = SplitPoints{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SplitPoints) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SplitPoints) ProtoMessage() {} - -func (x *SplitPoints) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[26] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SplitPoints.ProtoReflect.Descriptor instead. -func (*SplitPoints) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{26} -} - -func (x *SplitPoints) GetTable() string { - if x != nil { - return x.Table - } - return "" -} - -func (x *SplitPoints) GetIndex() string { - if x != nil { - return x.Index - } - return "" -} - -func (x *SplitPoints) GetKeys() []*SplitPoints_Key { - if x != nil { - return x.Keys - } - return nil -} - -func (x *SplitPoints) GetExpireTime() *timestamppb.Timestamp { - if x != nil { - return x.ExpireTime - } - return nil -} - -// Internal request proto, do not use directly. -type InternalUpdateGraphOperationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Internal field, do not use directly. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Internal field, do not use directly. - OperationId string `protobuf:"bytes,2,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` - // Internal field, do not use directly. - VmIdentityToken string `protobuf:"bytes,5,opt,name=vm_identity_token,json=vmIdentityToken,proto3" json:"vm_identity_token,omitempty"` - // Internal field, do not use directly. - Progress float64 `protobuf:"fixed64,3,opt,name=progress,proto3" json:"progress,omitempty"` - // Internal field, do not use directly. - Status *status.Status `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` -} - -func (x *InternalUpdateGraphOperationRequest) Reset() { - *x = InternalUpdateGraphOperationRequest{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *InternalUpdateGraphOperationRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InternalUpdateGraphOperationRequest) ProtoMessage() {} - -func (x *InternalUpdateGraphOperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[27] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InternalUpdateGraphOperationRequest.ProtoReflect.Descriptor instead. -func (*InternalUpdateGraphOperationRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{27} -} - -func (x *InternalUpdateGraphOperationRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *InternalUpdateGraphOperationRequest) GetOperationId() string { - if x != nil { - return x.OperationId - } - return "" -} - -func (x *InternalUpdateGraphOperationRequest) GetVmIdentityToken() string { - if x != nil { - return x.VmIdentityToken - } - return "" -} - -func (x *InternalUpdateGraphOperationRequest) GetProgress() float64 { - if x != nil { - return x.Progress - } - return 0 -} - -func (x *InternalUpdateGraphOperationRequest) GetStatus() *status.Status { - if x != nil { - return x.Status - } - return nil -} - -// Internal response proto, do not use directly. -type InternalUpdateGraphOperationResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *InternalUpdateGraphOperationResponse) Reset() { - *x = InternalUpdateGraphOperationResponse{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *InternalUpdateGraphOperationResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InternalUpdateGraphOperationResponse) ProtoMessage() {} - -func (x *InternalUpdateGraphOperationResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[28] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InternalUpdateGraphOperationResponse.ProtoReflect.Descriptor instead. -func (*InternalUpdateGraphOperationResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{28} -} - -// A split key. -type SplitPoints_Key struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The column values making up the split key. - KeyParts *structpb.ListValue `protobuf:"bytes,1,opt,name=key_parts,json=keyParts,proto3" json:"key_parts,omitempty"` -} - -func (x *SplitPoints_Key) Reset() { - *x = SplitPoints_Key{} - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SplitPoints_Key) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SplitPoints_Key) ProtoMessage() {} - -func (x *SplitPoints_Key) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[29] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SplitPoints_Key.ProtoReflect.Descriptor instead. -func (*SplitPoints_Key) Descriptor() ([]byte, []int) { - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP(), []int{26, 0} -} - -func (x *SplitPoints_Key) GetKeyParts() *structpb.ListValue { - if x != nil { - return x.KeyParts - } - return nil -} - -var File_google_spanner_admin_database_v1_spanner_database_admin_proto protoreflect.FileDescriptor - -var file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDesc = []byte{ - 0x0a, 0x3d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x76, 0x31, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, - 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, - 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2d, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x36, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xc3, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x54, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0a, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x82, 0x08, 0x0a, 0x08, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4b, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, - 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x55, 0x0a, - 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x64, 0x0a, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5e, 0x0a, 0x0f, 0x65, 0x6e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x18, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x16, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x65, 0x61, 0x72, - 0x6c, 0x69, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x13, 0x65, 0x61, 0x72, 0x6c, 0x69, - 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2a, - 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0d, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x61, 0x0a, 0x10, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x34, 0x0a, - 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x70, 0x72, 0x6f, - 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x4d, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, - 0x59, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x4f, 0x50, 0x54, - 0x49, 0x4d, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x3a, 0x62, 0xea, 0x41, 0x5f, 0x0a, 0x1f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x3c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x7d, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x22, 0x93, 0x01, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x89, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, - 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xb3, 0x03, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, - 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x10, 0x65, 0x78, - 0x74, 0x72, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x64, 0x0a, 0x11, 0x65, 0x6e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, - 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x61, 0x0a, 0x10, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x61, - 0x6c, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, - 0x41, 0x01, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x69, 0x61, 0x6c, - 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, - 0xe0, 0x41, 0x01, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x40, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x51, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, - 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xf9, 0x01, - 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x51, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x18, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, - 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, - 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, - 0xe0, 0x41, 0x01, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, - 0x70, 0x75, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, - 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x64, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x8e, 0x03, 0x0a, 0x19, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x11, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x73, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x74, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x52, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x64, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5a, 0x0a, 0x13, 0x44, 0x72, - 0x6f, 0x70, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x5c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, - 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x1d, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, - 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x87, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbc, 0x02, 0x0a, - 0x16, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, - 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x3c, - 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x22, - 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x48, 0x00, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x73, 0x0a, 0x11, - 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, - 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xde, 0x03, 0x0a, 0x1f, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x7e, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x50, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, - 0x0e, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x4b, 0x0a, 0x0c, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, - 0x52, 0x0a, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0d, - 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0b, - 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x0e, - 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, - 0x0a, 0x1b, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x2b, 0x0a, 0x27, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x44, 0x45, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, - 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, - 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, - 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x43, - 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, - 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x22, 0xe0, 0x03, 0x0a, - 0x17, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0a, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4f, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x22, - 0xad, 0x01, 0x0a, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, - 0xa4, 0x01, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, - 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x7b, 0xea, 0x41, 0x78, 0x0a, 0x23, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x12, 0x51, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x7d, 0x2f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x2f, - 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x7d, 0x22, 0x97, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x9a, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, - 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, - 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd6, 0x01, - 0x0a, 0x15, 0x41, 0x64, 0x64, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, - 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0c, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x18, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x53, 0x70, 0x6c, - 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x8c, 0x02, 0x0a, 0x0b, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4a, 0x0a, 0x04, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, - 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x43, 0x0a, 0x03, 0x4b, 0x65, - 0x79, 0x12, 0x3c, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x50, 0x61, 0x72, 0x74, 0x73, 0x22, - 0x95, 0x02, 0x0a, 0x23, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, - 0x21, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0c, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x76, 0x6d, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x76, 0x6d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x26, 0x0a, 0x24, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, - 0x35, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x41, - 0x43, 0x4b, 0x55, 0x50, 0x10, 0x01, 0x32, 0xcd, 0x34, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0xc0, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0xda, 0x41, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, - 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, - 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0xa4, 0x02, 0x0a, 0x0e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x37, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x01, 0xca, 0x41, 0x64, 0x0a, 0x29, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x37, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xda, 0x41, 0x17, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, - 0x3a, 0x01, 0x2a, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x12, 0xad, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x22, 0x3c, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x2a, 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, - 0xca, 0x41, 0x22, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x14, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x42, 0x3a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x32, 0x36, 0x2f, 0x76, - 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x9d, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x12, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xac, 0x01, 0xca, 0x41, 0x53, 0x0a, 0x15, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x3a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, - 0x13, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x32, 0x35, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, - 0x2f, 0x64, 0x64, 0x6c, 0x12, 0xa3, 0x01, 0x0a, 0x0c, 0x44, 0x72, 0x6f, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0xda, 0x41, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x2a, 0x31, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcd, 0x01, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x12, 0x37, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x44, 0x64, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x48, 0xda, 0x41, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x64, 0x6c, 0x12, 0xc2, 0x02, 0x0a, 0x0c, 0x53, - 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x49, - 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xf6, 0x01, 0xda, 0x41, 0x0f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0xdd, 0x01, 0x3a, 0x01, 0x2a, 0x5a, 0x41, 0x3a, 0x01, 0x2a, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x2f, - 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, - 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x49, - 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5a, 0x55, 0x3a, 0x01, 0x2a, 0x22, 0x50, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, - 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, - 0x3e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0xbb, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xef, 0x01, 0xda, 0x41, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0xdd, 0x01, - 0x3a, 0x01, 0x2a, 0x5a, 0x41, 0x3a, 0x01, 0x2a, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x49, 0x61, 0x6d, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5a, 0x55, 0x3a, 0x01, 0x2a, 0x22, 0x50, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, - 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, - 0x3a, 0x67, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3e, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, - 0x3a, 0x67, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0xd4, 0x03, - 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe8, 0x02, 0xda, 0x41, 0x14, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0xca, 0x02, 0x3a, 0x01, 0x2a, 0x5a, 0x47, 0x3a, - 0x01, 0x2a, 0x22, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, - 0x2f, 0x2a, 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5a, 0x5b, 0x3a, 0x01, 0x2a, 0x22, 0x56, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, - 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, - 0x3a, 0x74, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x5a, 0x59, 0x3a, 0x01, 0x2a, 0x22, 0x54, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, - 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x44, - 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, - 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9f, 0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb8, 0x01, 0xca, 0x41, - 0x60, 0x0a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x35, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xda, 0x41, 0x17, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x2c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x35, 0x3a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0xac, 0x02, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc9, 0x01, 0xca, 0x41, 0x5e, 0x0a, - 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x33, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x2a, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x2c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2c, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, - 0x3a, 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, - 0x3a, 0x63, 0x6f, 0x70, 0x79, 0x12, 0xa5, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x22, 0x3a, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, - 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc8, 0x01, - 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x35, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, - 0x57, 0xda, 0x41, 0x12, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x06, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x32, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3a, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x2a, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x73, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x3c, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, - 0xb1, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc4, 0x01, 0xca, - 0x41, 0x65, 0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x38, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xda, 0x41, 0x19, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x2c, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, - 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, - 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x3a, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x12, 0xe4, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3f, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x40, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x47, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x38, 0x12, 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xdc, 0x01, 0x0a, 0x14, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x45, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xdc, 0x01, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0xe8, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, - 0x53, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x37, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x70, 0x6c, 0x69, 0x74, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, - 0xda, 0x41, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x73, 0x70, 0x6c, 0x69, - 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x01, - 0x2a, 0x22, 0x40, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x61, 0x64, 0x64, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x3d, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x84, 0x01, - 0xda, 0x41, 0x29, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x52, 0x3a, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x22, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0xd1, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x4e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x90, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x22, 0x86, 0x01, 0xda, 0x41, 0x1b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, - 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x62, 0x3a, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x32, 0x4f, 0x2f, 0x76, 0x31, 0x2f, - 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x14, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4e, 0xda, 0x41, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x2a, 0x3f, 0x2f, 0x76, 0x31, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xe4, 0x01, 0x0a, 0x13, - 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x50, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x41, 0x12, 0x3f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x2a, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x73, 0x12, 0xc7, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0xda, 0x41, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x1a, 0x78, 0xca, 0x41, - 0x16, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x5c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, - 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, - 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x42, 0xd6, 0x03, 0xea, 0x41, 0x4a, 0x0a, 0x1f, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x7d, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x7d, 0xea, 0x41, 0x7b, 0x0a, 0x28, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x7d, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x53, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x46, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x70, 0x62, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x70, 0x62, 0xaa, - 0x02, 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x26, 0x47, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5c, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5c, 0x56, - 0x31, 0xea, 0x02, 0x2b, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescOnce sync.Once - file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescData = file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDesc -) - -func file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescGZIP() []byte { - file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescOnce.Do(func() { - file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescData) - }) - return file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDescData -} - -var file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 30) -var file_google_spanner_admin_database_v1_spanner_database_admin_proto_goTypes = []any{ - (RestoreSourceType)(0), // 0: google.spanner.admin.database.v1.RestoreSourceType - (Database_State)(0), // 1: google.spanner.admin.database.v1.Database.State - (RestoreDatabaseEncryptionConfig_EncryptionType)(0), // 2: google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType - (*RestoreInfo)(nil), // 3: google.spanner.admin.database.v1.RestoreInfo - (*Database)(nil), // 4: google.spanner.admin.database.v1.Database - (*ListDatabasesRequest)(nil), // 5: google.spanner.admin.database.v1.ListDatabasesRequest - (*ListDatabasesResponse)(nil), // 6: google.spanner.admin.database.v1.ListDatabasesResponse - (*CreateDatabaseRequest)(nil), // 7: google.spanner.admin.database.v1.CreateDatabaseRequest - (*CreateDatabaseMetadata)(nil), // 8: google.spanner.admin.database.v1.CreateDatabaseMetadata - (*GetDatabaseRequest)(nil), // 9: google.spanner.admin.database.v1.GetDatabaseRequest - (*UpdateDatabaseRequest)(nil), // 10: google.spanner.admin.database.v1.UpdateDatabaseRequest - (*UpdateDatabaseMetadata)(nil), // 11: google.spanner.admin.database.v1.UpdateDatabaseMetadata - (*UpdateDatabaseDdlRequest)(nil), // 12: google.spanner.admin.database.v1.UpdateDatabaseDdlRequest - (*DdlStatementActionInfo)(nil), // 13: google.spanner.admin.database.v1.DdlStatementActionInfo - (*UpdateDatabaseDdlMetadata)(nil), // 14: google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata - (*DropDatabaseRequest)(nil), // 15: google.spanner.admin.database.v1.DropDatabaseRequest - (*GetDatabaseDdlRequest)(nil), // 16: google.spanner.admin.database.v1.GetDatabaseDdlRequest - (*GetDatabaseDdlResponse)(nil), // 17: google.spanner.admin.database.v1.GetDatabaseDdlResponse - (*ListDatabaseOperationsRequest)(nil), // 18: google.spanner.admin.database.v1.ListDatabaseOperationsRequest - (*ListDatabaseOperationsResponse)(nil), // 19: google.spanner.admin.database.v1.ListDatabaseOperationsResponse - (*RestoreDatabaseRequest)(nil), // 20: google.spanner.admin.database.v1.RestoreDatabaseRequest - (*RestoreDatabaseEncryptionConfig)(nil), // 21: google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig - (*RestoreDatabaseMetadata)(nil), // 22: google.spanner.admin.database.v1.RestoreDatabaseMetadata - (*OptimizeRestoredDatabaseMetadata)(nil), // 23: google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata - (*DatabaseRole)(nil), // 24: google.spanner.admin.database.v1.DatabaseRole - (*ListDatabaseRolesRequest)(nil), // 25: google.spanner.admin.database.v1.ListDatabaseRolesRequest - (*ListDatabaseRolesResponse)(nil), // 26: google.spanner.admin.database.v1.ListDatabaseRolesResponse - (*AddSplitPointsRequest)(nil), // 27: google.spanner.admin.database.v1.AddSplitPointsRequest - (*AddSplitPointsResponse)(nil), // 28: google.spanner.admin.database.v1.AddSplitPointsResponse - (*SplitPoints)(nil), // 29: google.spanner.admin.database.v1.SplitPoints - (*InternalUpdateGraphOperationRequest)(nil), // 30: google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest - (*InternalUpdateGraphOperationResponse)(nil), // 31: google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse - (*SplitPoints_Key)(nil), // 32: google.spanner.admin.database.v1.SplitPoints.Key - (*BackupInfo)(nil), // 33: google.spanner.admin.database.v1.BackupInfo - (*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp - (*EncryptionConfig)(nil), // 35: google.spanner.admin.database.v1.EncryptionConfig - (*EncryptionInfo)(nil), // 36: google.spanner.admin.database.v1.EncryptionInfo - (DatabaseDialect)(0), // 37: google.spanner.admin.database.v1.DatabaseDialect - (*fieldmaskpb.FieldMask)(nil), // 38: google.protobuf.FieldMask - (*OperationProgress)(nil), // 39: google.spanner.admin.database.v1.OperationProgress - (*longrunningpb.Operation)(nil), // 40: google.longrunning.Operation - (*status.Status)(nil), // 41: google.rpc.Status - (*structpb.ListValue)(nil), // 42: google.protobuf.ListValue - (*iampb.SetIamPolicyRequest)(nil), // 43: google.iam.v1.SetIamPolicyRequest - (*iampb.GetIamPolicyRequest)(nil), // 44: google.iam.v1.GetIamPolicyRequest - (*iampb.TestIamPermissionsRequest)(nil), // 45: google.iam.v1.TestIamPermissionsRequest - (*CreateBackupRequest)(nil), // 46: google.spanner.admin.database.v1.CreateBackupRequest - (*CopyBackupRequest)(nil), // 47: google.spanner.admin.database.v1.CopyBackupRequest - (*GetBackupRequest)(nil), // 48: google.spanner.admin.database.v1.GetBackupRequest - (*UpdateBackupRequest)(nil), // 49: google.spanner.admin.database.v1.UpdateBackupRequest - (*DeleteBackupRequest)(nil), // 50: google.spanner.admin.database.v1.DeleteBackupRequest - (*ListBackupsRequest)(nil), // 51: google.spanner.admin.database.v1.ListBackupsRequest - (*ListBackupOperationsRequest)(nil), // 52: google.spanner.admin.database.v1.ListBackupOperationsRequest - (*CreateBackupScheduleRequest)(nil), // 53: google.spanner.admin.database.v1.CreateBackupScheduleRequest - (*GetBackupScheduleRequest)(nil), // 54: google.spanner.admin.database.v1.GetBackupScheduleRequest - (*UpdateBackupScheduleRequest)(nil), // 55: google.spanner.admin.database.v1.UpdateBackupScheduleRequest - (*DeleteBackupScheduleRequest)(nil), // 56: google.spanner.admin.database.v1.DeleteBackupScheduleRequest - (*ListBackupSchedulesRequest)(nil), // 57: google.spanner.admin.database.v1.ListBackupSchedulesRequest - (*emptypb.Empty)(nil), // 58: google.protobuf.Empty - (*iampb.Policy)(nil), // 59: google.iam.v1.Policy - (*iampb.TestIamPermissionsResponse)(nil), // 60: google.iam.v1.TestIamPermissionsResponse - (*Backup)(nil), // 61: google.spanner.admin.database.v1.Backup - (*ListBackupsResponse)(nil), // 62: google.spanner.admin.database.v1.ListBackupsResponse - (*ListBackupOperationsResponse)(nil), // 63: google.spanner.admin.database.v1.ListBackupOperationsResponse - (*BackupSchedule)(nil), // 64: google.spanner.admin.database.v1.BackupSchedule - (*ListBackupSchedulesResponse)(nil), // 65: google.spanner.admin.database.v1.ListBackupSchedulesResponse -} -var file_google_spanner_admin_database_v1_spanner_database_admin_proto_depIdxs = []int32{ - 0, // 0: google.spanner.admin.database.v1.RestoreInfo.source_type:type_name -> google.spanner.admin.database.v1.RestoreSourceType - 33, // 1: google.spanner.admin.database.v1.RestoreInfo.backup_info:type_name -> google.spanner.admin.database.v1.BackupInfo - 1, // 2: google.spanner.admin.database.v1.Database.state:type_name -> google.spanner.admin.database.v1.Database.State - 34, // 3: google.spanner.admin.database.v1.Database.create_time:type_name -> google.protobuf.Timestamp - 3, // 4: google.spanner.admin.database.v1.Database.restore_info:type_name -> google.spanner.admin.database.v1.RestoreInfo - 35, // 5: google.spanner.admin.database.v1.Database.encryption_config:type_name -> google.spanner.admin.database.v1.EncryptionConfig - 36, // 6: google.spanner.admin.database.v1.Database.encryption_info:type_name -> google.spanner.admin.database.v1.EncryptionInfo - 34, // 7: google.spanner.admin.database.v1.Database.earliest_version_time:type_name -> google.protobuf.Timestamp - 37, // 8: google.spanner.admin.database.v1.Database.database_dialect:type_name -> google.spanner.admin.database.v1.DatabaseDialect - 4, // 9: google.spanner.admin.database.v1.ListDatabasesResponse.databases:type_name -> google.spanner.admin.database.v1.Database - 35, // 10: google.spanner.admin.database.v1.CreateDatabaseRequest.encryption_config:type_name -> google.spanner.admin.database.v1.EncryptionConfig - 37, // 11: google.spanner.admin.database.v1.CreateDatabaseRequest.database_dialect:type_name -> google.spanner.admin.database.v1.DatabaseDialect - 4, // 12: google.spanner.admin.database.v1.UpdateDatabaseRequest.database:type_name -> google.spanner.admin.database.v1.Database - 38, // 13: google.spanner.admin.database.v1.UpdateDatabaseRequest.update_mask:type_name -> google.protobuf.FieldMask - 10, // 14: google.spanner.admin.database.v1.UpdateDatabaseMetadata.request:type_name -> google.spanner.admin.database.v1.UpdateDatabaseRequest - 39, // 15: google.spanner.admin.database.v1.UpdateDatabaseMetadata.progress:type_name -> google.spanner.admin.database.v1.OperationProgress - 34, // 16: google.spanner.admin.database.v1.UpdateDatabaseMetadata.cancel_time:type_name -> google.protobuf.Timestamp - 34, // 17: google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.commit_timestamps:type_name -> google.protobuf.Timestamp - 39, // 18: google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.progress:type_name -> google.spanner.admin.database.v1.OperationProgress - 13, // 19: google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.actions:type_name -> google.spanner.admin.database.v1.DdlStatementActionInfo - 40, // 20: google.spanner.admin.database.v1.ListDatabaseOperationsResponse.operations:type_name -> google.longrunning.Operation - 21, // 21: google.spanner.admin.database.v1.RestoreDatabaseRequest.encryption_config:type_name -> google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig - 2, // 22: google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.encryption_type:type_name -> google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType - 0, // 23: google.spanner.admin.database.v1.RestoreDatabaseMetadata.source_type:type_name -> google.spanner.admin.database.v1.RestoreSourceType - 33, // 24: google.spanner.admin.database.v1.RestoreDatabaseMetadata.backup_info:type_name -> google.spanner.admin.database.v1.BackupInfo - 39, // 25: google.spanner.admin.database.v1.RestoreDatabaseMetadata.progress:type_name -> google.spanner.admin.database.v1.OperationProgress - 34, // 26: google.spanner.admin.database.v1.RestoreDatabaseMetadata.cancel_time:type_name -> google.protobuf.Timestamp - 39, // 27: google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata.progress:type_name -> google.spanner.admin.database.v1.OperationProgress - 24, // 28: google.spanner.admin.database.v1.ListDatabaseRolesResponse.database_roles:type_name -> google.spanner.admin.database.v1.DatabaseRole - 29, // 29: google.spanner.admin.database.v1.AddSplitPointsRequest.split_points:type_name -> google.spanner.admin.database.v1.SplitPoints - 32, // 30: google.spanner.admin.database.v1.SplitPoints.keys:type_name -> google.spanner.admin.database.v1.SplitPoints.Key - 34, // 31: google.spanner.admin.database.v1.SplitPoints.expire_time:type_name -> google.protobuf.Timestamp - 41, // 32: google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest.status:type_name -> google.rpc.Status - 42, // 33: google.spanner.admin.database.v1.SplitPoints.Key.key_parts:type_name -> google.protobuf.ListValue - 5, // 34: google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases:input_type -> google.spanner.admin.database.v1.ListDatabasesRequest - 7, // 35: google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase:input_type -> google.spanner.admin.database.v1.CreateDatabaseRequest - 9, // 36: google.spanner.admin.database.v1.DatabaseAdmin.GetDatabase:input_type -> google.spanner.admin.database.v1.GetDatabaseRequest - 10, // 37: google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase:input_type -> google.spanner.admin.database.v1.UpdateDatabaseRequest - 12, // 38: google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl:input_type -> google.spanner.admin.database.v1.UpdateDatabaseDdlRequest - 15, // 39: google.spanner.admin.database.v1.DatabaseAdmin.DropDatabase:input_type -> google.spanner.admin.database.v1.DropDatabaseRequest - 16, // 40: google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl:input_type -> google.spanner.admin.database.v1.GetDatabaseDdlRequest - 43, // 41: google.spanner.admin.database.v1.DatabaseAdmin.SetIamPolicy:input_type -> google.iam.v1.SetIamPolicyRequest - 44, // 42: google.spanner.admin.database.v1.DatabaseAdmin.GetIamPolicy:input_type -> google.iam.v1.GetIamPolicyRequest - 45, // 43: google.spanner.admin.database.v1.DatabaseAdmin.TestIamPermissions:input_type -> google.iam.v1.TestIamPermissionsRequest - 46, // 44: google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup:input_type -> google.spanner.admin.database.v1.CreateBackupRequest - 47, // 45: google.spanner.admin.database.v1.DatabaseAdmin.CopyBackup:input_type -> google.spanner.admin.database.v1.CopyBackupRequest - 48, // 46: google.spanner.admin.database.v1.DatabaseAdmin.GetBackup:input_type -> google.spanner.admin.database.v1.GetBackupRequest - 49, // 47: google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackup:input_type -> google.spanner.admin.database.v1.UpdateBackupRequest - 50, // 48: google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackup:input_type -> google.spanner.admin.database.v1.DeleteBackupRequest - 51, // 49: google.spanner.admin.database.v1.DatabaseAdmin.ListBackups:input_type -> google.spanner.admin.database.v1.ListBackupsRequest - 20, // 50: google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabase:input_type -> google.spanner.admin.database.v1.RestoreDatabaseRequest - 18, // 51: google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperations:input_type -> google.spanner.admin.database.v1.ListDatabaseOperationsRequest - 52, // 52: google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperations:input_type -> google.spanner.admin.database.v1.ListBackupOperationsRequest - 25, // 53: google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles:input_type -> google.spanner.admin.database.v1.ListDatabaseRolesRequest - 27, // 54: google.spanner.admin.database.v1.DatabaseAdmin.AddSplitPoints:input_type -> google.spanner.admin.database.v1.AddSplitPointsRequest - 53, // 55: google.spanner.admin.database.v1.DatabaseAdmin.CreateBackupSchedule:input_type -> google.spanner.admin.database.v1.CreateBackupScheduleRequest - 54, // 56: google.spanner.admin.database.v1.DatabaseAdmin.GetBackupSchedule:input_type -> google.spanner.admin.database.v1.GetBackupScheduleRequest - 55, // 57: google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackupSchedule:input_type -> google.spanner.admin.database.v1.UpdateBackupScheduleRequest - 56, // 58: google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackupSchedule:input_type -> google.spanner.admin.database.v1.DeleteBackupScheduleRequest - 57, // 59: google.spanner.admin.database.v1.DatabaseAdmin.ListBackupSchedules:input_type -> google.spanner.admin.database.v1.ListBackupSchedulesRequest - 30, // 60: google.spanner.admin.database.v1.DatabaseAdmin.InternalUpdateGraphOperation:input_type -> google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest - 6, // 61: google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases:output_type -> google.spanner.admin.database.v1.ListDatabasesResponse - 40, // 62: google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase:output_type -> google.longrunning.Operation - 4, // 63: google.spanner.admin.database.v1.DatabaseAdmin.GetDatabase:output_type -> google.spanner.admin.database.v1.Database - 40, // 64: google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase:output_type -> google.longrunning.Operation - 40, // 65: google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl:output_type -> google.longrunning.Operation - 58, // 66: google.spanner.admin.database.v1.DatabaseAdmin.DropDatabase:output_type -> google.protobuf.Empty - 17, // 67: google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl:output_type -> google.spanner.admin.database.v1.GetDatabaseDdlResponse - 59, // 68: google.spanner.admin.database.v1.DatabaseAdmin.SetIamPolicy:output_type -> google.iam.v1.Policy - 59, // 69: google.spanner.admin.database.v1.DatabaseAdmin.GetIamPolicy:output_type -> google.iam.v1.Policy - 60, // 70: google.spanner.admin.database.v1.DatabaseAdmin.TestIamPermissions:output_type -> google.iam.v1.TestIamPermissionsResponse - 40, // 71: google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup:output_type -> google.longrunning.Operation - 40, // 72: google.spanner.admin.database.v1.DatabaseAdmin.CopyBackup:output_type -> google.longrunning.Operation - 61, // 73: google.spanner.admin.database.v1.DatabaseAdmin.GetBackup:output_type -> google.spanner.admin.database.v1.Backup - 61, // 74: google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackup:output_type -> google.spanner.admin.database.v1.Backup - 58, // 75: google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackup:output_type -> google.protobuf.Empty - 62, // 76: google.spanner.admin.database.v1.DatabaseAdmin.ListBackups:output_type -> google.spanner.admin.database.v1.ListBackupsResponse - 40, // 77: google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabase:output_type -> google.longrunning.Operation - 19, // 78: google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperations:output_type -> google.spanner.admin.database.v1.ListDatabaseOperationsResponse - 63, // 79: google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperations:output_type -> google.spanner.admin.database.v1.ListBackupOperationsResponse - 26, // 80: google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles:output_type -> google.spanner.admin.database.v1.ListDatabaseRolesResponse - 28, // 81: google.spanner.admin.database.v1.DatabaseAdmin.AddSplitPoints:output_type -> google.spanner.admin.database.v1.AddSplitPointsResponse - 64, // 82: google.spanner.admin.database.v1.DatabaseAdmin.CreateBackupSchedule:output_type -> google.spanner.admin.database.v1.BackupSchedule - 64, // 83: google.spanner.admin.database.v1.DatabaseAdmin.GetBackupSchedule:output_type -> google.spanner.admin.database.v1.BackupSchedule - 64, // 84: google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackupSchedule:output_type -> google.spanner.admin.database.v1.BackupSchedule - 58, // 85: google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackupSchedule:output_type -> google.protobuf.Empty - 65, // 86: google.spanner.admin.database.v1.DatabaseAdmin.ListBackupSchedules:output_type -> google.spanner.admin.database.v1.ListBackupSchedulesResponse - 31, // 87: google.spanner.admin.database.v1.DatabaseAdmin.InternalUpdateGraphOperation:output_type -> google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse - 61, // [61:88] is the sub-list for method output_type - 34, // [34:61] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name -} - -func init() { file_google_spanner_admin_database_v1_spanner_database_admin_proto_init() } -func file_google_spanner_admin_database_v1_spanner_database_admin_proto_init() { - if File_google_spanner_admin_database_v1_spanner_database_admin_proto != nil { - return - } - file_google_spanner_admin_database_v1_backup_proto_init() - file_google_spanner_admin_database_v1_backup_schedule_proto_init() - file_google_spanner_admin_database_v1_common_proto_init() - file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[0].OneofWrappers = []any{ - (*RestoreInfo_BackupInfo)(nil), - } - file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[17].OneofWrappers = []any{ - (*RestoreDatabaseRequest_Backup)(nil), - } - file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes[19].OneofWrappers = []any{ - (*RestoreDatabaseMetadata_BackupInfo)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDesc, - NumEnums: 3, - NumMessages: 30, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_google_spanner_admin_database_v1_spanner_database_admin_proto_goTypes, - DependencyIndexes: file_google_spanner_admin_database_v1_spanner_database_admin_proto_depIdxs, - EnumInfos: file_google_spanner_admin_database_v1_spanner_database_admin_proto_enumTypes, - MessageInfos: file_google_spanner_admin_database_v1_spanner_database_admin_proto_msgTypes, - }.Build() - File_google_spanner_admin_database_v1_spanner_database_admin_proto = out.File - file_google_spanner_admin_database_v1_spanner_database_admin_proto_rawDesc = nil - file_google_spanner_admin_database_v1_spanner_database_admin_proto_goTypes = nil - file_google_spanner_admin_database_v1_spanner_database_admin_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// DatabaseAdminClient is the client API for DatabaseAdmin service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type DatabaseAdminClient interface { - // Lists Cloud Spanner databases. - ListDatabases(ctx context.Context, in *ListDatabasesRequest, opts ...grpc.CallOption) (*ListDatabasesResponse, error) - // Creates a new Cloud Spanner database and starts to prepare it for serving. - // The returned [long-running operation][google.longrunning.Operation] will - // have a name of the format `/operations/` and - // can be used to track preparation of the database. The - // [metadata][google.longrunning.Operation.metadata] field type is - // [CreateDatabaseMetadata][google.spanner.admin.database.v1.CreateDatabaseMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Database][google.spanner.admin.database.v1.Database], if successful. - CreateDatabase(ctx context.Context, in *CreateDatabaseRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) - // Gets the state of a Cloud Spanner database. - GetDatabase(ctx context.Context, in *GetDatabaseRequest, opts ...grpc.CallOption) (*Database, error) - // Updates a Cloud Spanner database. The returned - // [long-running operation][google.longrunning.Operation] can be used to track - // the progress of updating the database. If the named database does not - // exist, returns `NOT_FOUND`. - // - // While the operation is pending: - // - // - The database's - // [reconciling][google.spanner.admin.database.v1.Database.reconciling] - // field is set to true. - // - Cancelling the operation is best-effort. If the cancellation succeeds, - // the operation metadata's - // [cancel_time][google.spanner.admin.database.v1.UpdateDatabaseMetadata.cancel_time] - // is set, the updates are reverted, and the operation terminates with a - // `CANCELLED` status. - // - New UpdateDatabase requests will return a `FAILED_PRECONDITION` error - // until the pending operation is done (returns successfully or with - // error). - // - Reading the database via the API continues to give the pre-request - // values. - // - // Upon completion of the returned operation: - // - // - The new values are in effect and readable via the API. - // - The database's - // [reconciling][google.spanner.admin.database.v1.Database.reconciling] - // field becomes false. - // - // The returned [long-running operation][google.longrunning.Operation] will - // have a name of the format - // `projects//instances//databases//operations/` - // and can be used to track the database modification. The - // [metadata][google.longrunning.Operation.metadata] field type is - // [UpdateDatabaseMetadata][google.spanner.admin.database.v1.UpdateDatabaseMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Database][google.spanner.admin.database.v1.Database], if successful. - UpdateDatabase(ctx context.Context, in *UpdateDatabaseRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) - // Updates the schema of a Cloud Spanner database by - // creating/altering/dropping tables, columns, indexes, etc. The returned - // [long-running operation][google.longrunning.Operation] will have a name of - // the format `/operations/` and can be used to - // track execution of the schema change(s). The - // [metadata][google.longrunning.Operation.metadata] field type is - // [UpdateDatabaseDdlMetadata][google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata]. - // The operation has no response. - UpdateDatabaseDdl(ctx context.Context, in *UpdateDatabaseDdlRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) - // Drops (aka deletes) a Cloud Spanner database. - // Completed backups for the database will be retained according to their - // `expire_time`. - // Note: Cloud Spanner might continue to accept requests for a few seconds - // after the database has been deleted. - DropDatabase(ctx context.Context, in *DropDatabaseRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Returns the schema of a Cloud Spanner database as a list of formatted - // DDL statements. This method does not show pending schema updates, those may - // be queried using the [Operations][google.longrunning.Operations] API. - GetDatabaseDdl(ctx context.Context, in *GetDatabaseDdlRequest, opts ...grpc.CallOption) (*GetDatabaseDdlResponse, error) - // Sets the access control policy on a database or backup resource. - // Replaces any existing policy. - // - // Authorization requires `spanner.databases.setIamPolicy` - // permission on [resource][google.iam.v1.SetIamPolicyRequest.resource]. - // For backups, authorization requires `spanner.backups.setIamPolicy` - // permission on [resource][google.iam.v1.SetIamPolicyRequest.resource]. - SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) - // Gets the access control policy for a database or backup resource. - // Returns an empty policy if a database or backup exists but does not have a - // policy set. - // - // Authorization requires `spanner.databases.getIamPolicy` permission on - // [resource][google.iam.v1.GetIamPolicyRequest.resource]. - // For backups, authorization requires `spanner.backups.getIamPolicy` - // permission on [resource][google.iam.v1.GetIamPolicyRequest.resource]. - GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) - // Returns permissions that the caller has on the specified database or backup - // resource. - // - // Attempting this RPC on a non-existent Cloud Spanner database will - // result in a NOT_FOUND error if the user has - // `spanner.databases.list` permission on the containing Cloud - // Spanner instance. Otherwise returns an empty set of permissions. - // Calling this method on a backup that does not exist will - // result in a NOT_FOUND error if the user has - // `spanner.backups.list` permission on the containing instance. - TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) - // Starts creating a new Cloud Spanner Backup. - // The returned backup [long-running operation][google.longrunning.Operation] - // will have a name of the format - // `projects//instances//backups//operations/` - // and can be used to track creation of the backup. The - // [metadata][google.longrunning.Operation.metadata] field type is - // [CreateBackupMetadata][google.spanner.admin.database.v1.CreateBackupMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Backup][google.spanner.admin.database.v1.Backup], if successful. - // Cancelling the returned operation will stop the creation and delete the - // backup. There can be only one pending backup creation per database. Backup - // creation of different databases can run concurrently. - CreateBackup(ctx context.Context, in *CreateBackupRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) - // Starts copying a Cloud Spanner Backup. - // The returned backup [long-running operation][google.longrunning.Operation] - // will have a name of the format - // `projects//instances//backups//operations/` - // and can be used to track copying of the backup. The operation is associated - // with the destination backup. - // The [metadata][google.longrunning.Operation.metadata] field type is - // [CopyBackupMetadata][google.spanner.admin.database.v1.CopyBackupMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Backup][google.spanner.admin.database.v1.Backup], if successful. - // Cancelling the returned operation will stop the copying and delete the - // destination backup. Concurrent CopyBackup requests can run on the same - // source backup. - CopyBackup(ctx context.Context, in *CopyBackupRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) - // Gets metadata on a pending or completed - // [Backup][google.spanner.admin.database.v1.Backup]. - GetBackup(ctx context.Context, in *GetBackupRequest, opts ...grpc.CallOption) (*Backup, error) - // Updates a pending or completed - // [Backup][google.spanner.admin.database.v1.Backup]. - UpdateBackup(ctx context.Context, in *UpdateBackupRequest, opts ...grpc.CallOption) (*Backup, error) - // Deletes a pending or completed - // [Backup][google.spanner.admin.database.v1.Backup]. - DeleteBackup(ctx context.Context, in *DeleteBackupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Lists completed and pending backups. - // Backups returned are ordered by `create_time` in descending order, - // starting from the most recent `create_time`. - ListBackups(ctx context.Context, in *ListBackupsRequest, opts ...grpc.CallOption) (*ListBackupsResponse, error) - // Create a new database by restoring from a completed backup. The new - // database must be in the same project and in an instance with the same - // instance configuration as the instance containing - // the backup. The returned database [long-running - // operation][google.longrunning.Operation] has a name of the format - // `projects//instances//databases//operations/`, - // and can be used to track the progress of the operation, and to cancel it. - // The [metadata][google.longrunning.Operation.metadata] field type is - // [RestoreDatabaseMetadata][google.spanner.admin.database.v1.RestoreDatabaseMetadata]. - // The [response][google.longrunning.Operation.response] type - // is [Database][google.spanner.admin.database.v1.Database], if - // successful. Cancelling the returned operation will stop the restore and - // delete the database. - // There can be only one database being restored into an instance at a time. - // Once the restore operation completes, a new restore operation can be - // initiated, without waiting for the optimize operation associated with the - // first restore to complete. - RestoreDatabase(ctx context.Context, in *RestoreDatabaseRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) - // Lists database [longrunning-operations][google.longrunning.Operation]. - // A database operation has a name of the form - // `projects//instances//databases//operations/`. - // The long-running operation - // [metadata][google.longrunning.Operation.metadata] field type - // `metadata.type_url` describes the type of the metadata. Operations returned - // include those that have completed/failed/canceled within the last 7 days, - // and pending operations. - ListDatabaseOperations(ctx context.Context, in *ListDatabaseOperationsRequest, opts ...grpc.CallOption) (*ListDatabaseOperationsResponse, error) - // Lists the backup [long-running operations][google.longrunning.Operation] in - // the given instance. A backup operation has a name of the form - // `projects//instances//backups//operations/`. - // The long-running operation - // [metadata][google.longrunning.Operation.metadata] field type - // `metadata.type_url` describes the type of the metadata. Operations returned - // include those that have completed/failed/canceled within the last 7 days, - // and pending operations. Operations returned are ordered by - // `operation.metadata.value.progress.start_time` in descending order starting - // from the most recently started operation. - ListBackupOperations(ctx context.Context, in *ListBackupOperationsRequest, opts ...grpc.CallOption) (*ListBackupOperationsResponse, error) - // Lists Cloud Spanner database roles. - ListDatabaseRoles(ctx context.Context, in *ListDatabaseRolesRequest, opts ...grpc.CallOption) (*ListDatabaseRolesResponse, error) - // Adds split points to specified tables, indexes of a database. - AddSplitPoints(ctx context.Context, in *AddSplitPointsRequest, opts ...grpc.CallOption) (*AddSplitPointsResponse, error) - // Creates a new backup schedule. - CreateBackupSchedule(ctx context.Context, in *CreateBackupScheduleRequest, opts ...grpc.CallOption) (*BackupSchedule, error) - // Gets backup schedule for the input schedule name. - GetBackupSchedule(ctx context.Context, in *GetBackupScheduleRequest, opts ...grpc.CallOption) (*BackupSchedule, error) - // Updates a backup schedule. - UpdateBackupSchedule(ctx context.Context, in *UpdateBackupScheduleRequest, opts ...grpc.CallOption) (*BackupSchedule, error) - // Deletes a backup schedule. - DeleteBackupSchedule(ctx context.Context, in *DeleteBackupScheduleRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Lists all the backup schedules for the database. - ListBackupSchedules(ctx context.Context, in *ListBackupSchedulesRequest, opts ...grpc.CallOption) (*ListBackupSchedulesResponse, error) - // This is an internal API called by Spanner Graph jobs. You should never need - // to call this API directly. - InternalUpdateGraphOperation(ctx context.Context, in *InternalUpdateGraphOperationRequest, opts ...grpc.CallOption) (*InternalUpdateGraphOperationResponse, error) -} - -type databaseAdminClient struct { - cc grpc.ClientConnInterface -} - -func NewDatabaseAdminClient(cc grpc.ClientConnInterface) DatabaseAdminClient { - return &databaseAdminClient{cc} -} - -func (c *databaseAdminClient) ListDatabases(ctx context.Context, in *ListDatabasesRequest, opts ...grpc.CallOption) (*ListDatabasesResponse, error) { - out := new(ListDatabasesResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/ListDatabases", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) CreateDatabase(ctx context.Context, in *CreateDatabaseRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { - out := new(longrunningpb.Operation) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/CreateDatabase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) GetDatabase(ctx context.Context, in *GetDatabaseRequest, opts ...grpc.CallOption) (*Database, error) { - out := new(Database) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/GetDatabase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) UpdateDatabase(ctx context.Context, in *UpdateDatabaseRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { - out := new(longrunningpb.Operation) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateDatabase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) UpdateDatabaseDdl(ctx context.Context, in *UpdateDatabaseDdlRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { - out := new(longrunningpb.Operation) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateDatabaseDdl", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) DropDatabase(ctx context.Context, in *DropDatabaseRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/DropDatabase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) GetDatabaseDdl(ctx context.Context, in *GetDatabaseDdlRequest, opts ...grpc.CallOption) (*GetDatabaseDdlResponse, error) { - out := new(GetDatabaseDdlResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/GetDatabaseDdl", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { - out := new(iampb.Policy) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/SetIamPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { - out := new(iampb.Policy) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/GetIamPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) { - out := new(iampb.TestIamPermissionsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/TestIamPermissions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) CreateBackup(ctx context.Context, in *CreateBackupRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { - out := new(longrunningpb.Operation) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/CreateBackup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) CopyBackup(ctx context.Context, in *CopyBackupRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { - out := new(longrunningpb.Operation) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/CopyBackup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) GetBackup(ctx context.Context, in *GetBackupRequest, opts ...grpc.CallOption) (*Backup, error) { - out := new(Backup) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/GetBackup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) UpdateBackup(ctx context.Context, in *UpdateBackupRequest, opts ...grpc.CallOption) (*Backup, error) { - out := new(Backup) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateBackup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) DeleteBackup(ctx context.Context, in *DeleteBackupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/DeleteBackup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) ListBackups(ctx context.Context, in *ListBackupsRequest, opts ...grpc.CallOption) (*ListBackupsResponse, error) { - out := new(ListBackupsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/ListBackups", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) RestoreDatabase(ctx context.Context, in *RestoreDatabaseRequest, opts ...grpc.CallOption) (*longrunningpb.Operation, error) { - out := new(longrunningpb.Operation) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/RestoreDatabase", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) ListDatabaseOperations(ctx context.Context, in *ListDatabaseOperationsRequest, opts ...grpc.CallOption) (*ListDatabaseOperationsResponse, error) { - out := new(ListDatabaseOperationsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/ListDatabaseOperations", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) ListBackupOperations(ctx context.Context, in *ListBackupOperationsRequest, opts ...grpc.CallOption) (*ListBackupOperationsResponse, error) { - out := new(ListBackupOperationsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/ListBackupOperations", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) ListDatabaseRoles(ctx context.Context, in *ListDatabaseRolesRequest, opts ...grpc.CallOption) (*ListDatabaseRolesResponse, error) { - out := new(ListDatabaseRolesResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/ListDatabaseRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) AddSplitPoints(ctx context.Context, in *AddSplitPointsRequest, opts ...grpc.CallOption) (*AddSplitPointsResponse, error) { - out := new(AddSplitPointsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/AddSplitPoints", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) CreateBackupSchedule(ctx context.Context, in *CreateBackupScheduleRequest, opts ...grpc.CallOption) (*BackupSchedule, error) { - out := new(BackupSchedule) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/CreateBackupSchedule", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) GetBackupSchedule(ctx context.Context, in *GetBackupScheduleRequest, opts ...grpc.CallOption) (*BackupSchedule, error) { - out := new(BackupSchedule) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/GetBackupSchedule", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) UpdateBackupSchedule(ctx context.Context, in *UpdateBackupScheduleRequest, opts ...grpc.CallOption) (*BackupSchedule, error) { - out := new(BackupSchedule) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateBackupSchedule", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) DeleteBackupSchedule(ctx context.Context, in *DeleteBackupScheduleRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/DeleteBackupSchedule", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) ListBackupSchedules(ctx context.Context, in *ListBackupSchedulesRequest, opts ...grpc.CallOption) (*ListBackupSchedulesResponse, error) { - out := new(ListBackupSchedulesResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/ListBackupSchedules", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *databaseAdminClient) InternalUpdateGraphOperation(ctx context.Context, in *InternalUpdateGraphOperationRequest, opts ...grpc.CallOption) (*InternalUpdateGraphOperationResponse, error) { - out := new(InternalUpdateGraphOperationResponse) - err := c.cc.Invoke(ctx, "/google.spanner.admin.database.v1.DatabaseAdmin/InternalUpdateGraphOperation", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// DatabaseAdminServer is the server API for DatabaseAdmin service. -type DatabaseAdminServer interface { - // Lists Cloud Spanner databases. - ListDatabases(context.Context, *ListDatabasesRequest) (*ListDatabasesResponse, error) - // Creates a new Cloud Spanner database and starts to prepare it for serving. - // The returned [long-running operation][google.longrunning.Operation] will - // have a name of the format `/operations/` and - // can be used to track preparation of the database. The - // [metadata][google.longrunning.Operation.metadata] field type is - // [CreateDatabaseMetadata][google.spanner.admin.database.v1.CreateDatabaseMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Database][google.spanner.admin.database.v1.Database], if successful. - CreateDatabase(context.Context, *CreateDatabaseRequest) (*longrunningpb.Operation, error) - // Gets the state of a Cloud Spanner database. - GetDatabase(context.Context, *GetDatabaseRequest) (*Database, error) - // Updates a Cloud Spanner database. The returned - // [long-running operation][google.longrunning.Operation] can be used to track - // the progress of updating the database. If the named database does not - // exist, returns `NOT_FOUND`. - // - // While the operation is pending: - // - // - The database's - // [reconciling][google.spanner.admin.database.v1.Database.reconciling] - // field is set to true. - // - Cancelling the operation is best-effort. If the cancellation succeeds, - // the operation metadata's - // [cancel_time][google.spanner.admin.database.v1.UpdateDatabaseMetadata.cancel_time] - // is set, the updates are reverted, and the operation terminates with a - // `CANCELLED` status. - // - New UpdateDatabase requests will return a `FAILED_PRECONDITION` error - // until the pending operation is done (returns successfully or with - // error). - // - Reading the database via the API continues to give the pre-request - // values. - // - // Upon completion of the returned operation: - // - // - The new values are in effect and readable via the API. - // - The database's - // [reconciling][google.spanner.admin.database.v1.Database.reconciling] - // field becomes false. - // - // The returned [long-running operation][google.longrunning.Operation] will - // have a name of the format - // `projects//instances//databases//operations/` - // and can be used to track the database modification. The - // [metadata][google.longrunning.Operation.metadata] field type is - // [UpdateDatabaseMetadata][google.spanner.admin.database.v1.UpdateDatabaseMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Database][google.spanner.admin.database.v1.Database], if successful. - UpdateDatabase(context.Context, *UpdateDatabaseRequest) (*longrunningpb.Operation, error) - // Updates the schema of a Cloud Spanner database by - // creating/altering/dropping tables, columns, indexes, etc. The returned - // [long-running operation][google.longrunning.Operation] will have a name of - // the format `/operations/` and can be used to - // track execution of the schema change(s). The - // [metadata][google.longrunning.Operation.metadata] field type is - // [UpdateDatabaseDdlMetadata][google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata]. - // The operation has no response. - UpdateDatabaseDdl(context.Context, *UpdateDatabaseDdlRequest) (*longrunningpb.Operation, error) - // Drops (aka deletes) a Cloud Spanner database. - // Completed backups for the database will be retained according to their - // `expire_time`. - // Note: Cloud Spanner might continue to accept requests for a few seconds - // after the database has been deleted. - DropDatabase(context.Context, *DropDatabaseRequest) (*emptypb.Empty, error) - // Returns the schema of a Cloud Spanner database as a list of formatted - // DDL statements. This method does not show pending schema updates, those may - // be queried using the [Operations][google.longrunning.Operations] API. - GetDatabaseDdl(context.Context, *GetDatabaseDdlRequest) (*GetDatabaseDdlResponse, error) - // Sets the access control policy on a database or backup resource. - // Replaces any existing policy. - // - // Authorization requires `spanner.databases.setIamPolicy` - // permission on [resource][google.iam.v1.SetIamPolicyRequest.resource]. - // For backups, authorization requires `spanner.backups.setIamPolicy` - // permission on [resource][google.iam.v1.SetIamPolicyRequest.resource]. - SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) - // Gets the access control policy for a database or backup resource. - // Returns an empty policy if a database or backup exists but does not have a - // policy set. - // - // Authorization requires `spanner.databases.getIamPolicy` permission on - // [resource][google.iam.v1.GetIamPolicyRequest.resource]. - // For backups, authorization requires `spanner.backups.getIamPolicy` - // permission on [resource][google.iam.v1.GetIamPolicyRequest.resource]. - GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) - // Returns permissions that the caller has on the specified database or backup - // resource. - // - // Attempting this RPC on a non-existent Cloud Spanner database will - // result in a NOT_FOUND error if the user has - // `spanner.databases.list` permission on the containing Cloud - // Spanner instance. Otherwise returns an empty set of permissions. - // Calling this method on a backup that does not exist will - // result in a NOT_FOUND error if the user has - // `spanner.backups.list` permission on the containing instance. - TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) - // Starts creating a new Cloud Spanner Backup. - // The returned backup [long-running operation][google.longrunning.Operation] - // will have a name of the format - // `projects//instances//backups//operations/` - // and can be used to track creation of the backup. The - // [metadata][google.longrunning.Operation.metadata] field type is - // [CreateBackupMetadata][google.spanner.admin.database.v1.CreateBackupMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Backup][google.spanner.admin.database.v1.Backup], if successful. - // Cancelling the returned operation will stop the creation and delete the - // backup. There can be only one pending backup creation per database. Backup - // creation of different databases can run concurrently. - CreateBackup(context.Context, *CreateBackupRequest) (*longrunningpb.Operation, error) - // Starts copying a Cloud Spanner Backup. - // The returned backup [long-running operation][google.longrunning.Operation] - // will have a name of the format - // `projects//instances//backups//operations/` - // and can be used to track copying of the backup. The operation is associated - // with the destination backup. - // The [metadata][google.longrunning.Operation.metadata] field type is - // [CopyBackupMetadata][google.spanner.admin.database.v1.CopyBackupMetadata]. - // The [response][google.longrunning.Operation.response] field type is - // [Backup][google.spanner.admin.database.v1.Backup], if successful. - // Cancelling the returned operation will stop the copying and delete the - // destination backup. Concurrent CopyBackup requests can run on the same - // source backup. - CopyBackup(context.Context, *CopyBackupRequest) (*longrunningpb.Operation, error) - // Gets metadata on a pending or completed - // [Backup][google.spanner.admin.database.v1.Backup]. - GetBackup(context.Context, *GetBackupRequest) (*Backup, error) - // Updates a pending or completed - // [Backup][google.spanner.admin.database.v1.Backup]. - UpdateBackup(context.Context, *UpdateBackupRequest) (*Backup, error) - // Deletes a pending or completed - // [Backup][google.spanner.admin.database.v1.Backup]. - DeleteBackup(context.Context, *DeleteBackupRequest) (*emptypb.Empty, error) - // Lists completed and pending backups. - // Backups returned are ordered by `create_time` in descending order, - // starting from the most recent `create_time`. - ListBackups(context.Context, *ListBackupsRequest) (*ListBackupsResponse, error) - // Create a new database by restoring from a completed backup. The new - // database must be in the same project and in an instance with the same - // instance configuration as the instance containing - // the backup. The returned database [long-running - // operation][google.longrunning.Operation] has a name of the format - // `projects//instances//databases//operations/`, - // and can be used to track the progress of the operation, and to cancel it. - // The [metadata][google.longrunning.Operation.metadata] field type is - // [RestoreDatabaseMetadata][google.spanner.admin.database.v1.RestoreDatabaseMetadata]. - // The [response][google.longrunning.Operation.response] type - // is [Database][google.spanner.admin.database.v1.Database], if - // successful. Cancelling the returned operation will stop the restore and - // delete the database. - // There can be only one database being restored into an instance at a time. - // Once the restore operation completes, a new restore operation can be - // initiated, without waiting for the optimize operation associated with the - // first restore to complete. - RestoreDatabase(context.Context, *RestoreDatabaseRequest) (*longrunningpb.Operation, error) - // Lists database [longrunning-operations][google.longrunning.Operation]. - // A database operation has a name of the form - // `projects//instances//databases//operations/`. - // The long-running operation - // [metadata][google.longrunning.Operation.metadata] field type - // `metadata.type_url` describes the type of the metadata. Operations returned - // include those that have completed/failed/canceled within the last 7 days, - // and pending operations. - ListDatabaseOperations(context.Context, *ListDatabaseOperationsRequest) (*ListDatabaseOperationsResponse, error) - // Lists the backup [long-running operations][google.longrunning.Operation] in - // the given instance. A backup operation has a name of the form - // `projects//instances//backups//operations/`. - // The long-running operation - // [metadata][google.longrunning.Operation.metadata] field type - // `metadata.type_url` describes the type of the metadata. Operations returned - // include those that have completed/failed/canceled within the last 7 days, - // and pending operations. Operations returned are ordered by - // `operation.metadata.value.progress.start_time` in descending order starting - // from the most recently started operation. - ListBackupOperations(context.Context, *ListBackupOperationsRequest) (*ListBackupOperationsResponse, error) - // Lists Cloud Spanner database roles. - ListDatabaseRoles(context.Context, *ListDatabaseRolesRequest) (*ListDatabaseRolesResponse, error) - // Adds split points to specified tables, indexes of a database. - AddSplitPoints(context.Context, *AddSplitPointsRequest) (*AddSplitPointsResponse, error) - // Creates a new backup schedule. - CreateBackupSchedule(context.Context, *CreateBackupScheduleRequest) (*BackupSchedule, error) - // Gets backup schedule for the input schedule name. - GetBackupSchedule(context.Context, *GetBackupScheduleRequest) (*BackupSchedule, error) - // Updates a backup schedule. - UpdateBackupSchedule(context.Context, *UpdateBackupScheduleRequest) (*BackupSchedule, error) - // Deletes a backup schedule. - DeleteBackupSchedule(context.Context, *DeleteBackupScheduleRequest) (*emptypb.Empty, error) - // Lists all the backup schedules for the database. - ListBackupSchedules(context.Context, *ListBackupSchedulesRequest) (*ListBackupSchedulesResponse, error) - // This is an internal API called by Spanner Graph jobs. You should never need - // to call this API directly. - InternalUpdateGraphOperation(context.Context, *InternalUpdateGraphOperationRequest) (*InternalUpdateGraphOperationResponse, error) -} - -// UnimplementedDatabaseAdminServer can be embedded to have forward compatible implementations. -type UnimplementedDatabaseAdminServer struct { -} - -func (*UnimplementedDatabaseAdminServer) ListDatabases(context.Context, *ListDatabasesRequest) (*ListDatabasesResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListDatabases not implemented") -} -func (*UnimplementedDatabaseAdminServer) CreateDatabase(context.Context, *CreateDatabaseRequest) (*longrunningpb.Operation, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateDatabase not implemented") -} -func (*UnimplementedDatabaseAdminServer) GetDatabase(context.Context, *GetDatabaseRequest) (*Database, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetDatabase not implemented") -} -func (*UnimplementedDatabaseAdminServer) UpdateDatabase(context.Context, *UpdateDatabaseRequest) (*longrunningpb.Operation, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateDatabase not implemented") -} -func (*UnimplementedDatabaseAdminServer) UpdateDatabaseDdl(context.Context, *UpdateDatabaseDdlRequest) (*longrunningpb.Operation, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateDatabaseDdl not implemented") -} -func (*UnimplementedDatabaseAdminServer) DropDatabase(context.Context, *DropDatabaseRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DropDatabase not implemented") -} -func (*UnimplementedDatabaseAdminServer) GetDatabaseDdl(context.Context, *GetDatabaseDdlRequest) (*GetDatabaseDdlResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetDatabaseDdl not implemented") -} -func (*UnimplementedDatabaseAdminServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) { - return nil, status1.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") -} -func (*UnimplementedDatabaseAdminServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") -} -func (*UnimplementedDatabaseAdminServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") -} -func (*UnimplementedDatabaseAdminServer) CreateBackup(context.Context, *CreateBackupRequest) (*longrunningpb.Operation, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateBackup not implemented") -} -func (*UnimplementedDatabaseAdminServer) CopyBackup(context.Context, *CopyBackupRequest) (*longrunningpb.Operation, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CopyBackup not implemented") -} -func (*UnimplementedDatabaseAdminServer) GetBackup(context.Context, *GetBackupRequest) (*Backup, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetBackup not implemented") -} -func (*UnimplementedDatabaseAdminServer) UpdateBackup(context.Context, *UpdateBackupRequest) (*Backup, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateBackup not implemented") -} -func (*UnimplementedDatabaseAdminServer) DeleteBackup(context.Context, *DeleteBackupRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteBackup not implemented") -} -func (*UnimplementedDatabaseAdminServer) ListBackups(context.Context, *ListBackupsRequest) (*ListBackupsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListBackups not implemented") -} -func (*UnimplementedDatabaseAdminServer) RestoreDatabase(context.Context, *RestoreDatabaseRequest) (*longrunningpb.Operation, error) { - return nil, status1.Errorf(codes.Unimplemented, "method RestoreDatabase not implemented") -} -func (*UnimplementedDatabaseAdminServer) ListDatabaseOperations(context.Context, *ListDatabaseOperationsRequest) (*ListDatabaseOperationsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListDatabaseOperations not implemented") -} -func (*UnimplementedDatabaseAdminServer) ListBackupOperations(context.Context, *ListBackupOperationsRequest) (*ListBackupOperationsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListBackupOperations not implemented") -} -func (*UnimplementedDatabaseAdminServer) ListDatabaseRoles(context.Context, *ListDatabaseRolesRequest) (*ListDatabaseRolesResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListDatabaseRoles not implemented") -} -func (*UnimplementedDatabaseAdminServer) AddSplitPoints(context.Context, *AddSplitPointsRequest) (*AddSplitPointsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method AddSplitPoints not implemented") -} -func (*UnimplementedDatabaseAdminServer) CreateBackupSchedule(context.Context, *CreateBackupScheduleRequest) (*BackupSchedule, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateBackupSchedule not implemented") -} -func (*UnimplementedDatabaseAdminServer) GetBackupSchedule(context.Context, *GetBackupScheduleRequest) (*BackupSchedule, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetBackupSchedule not implemented") -} -func (*UnimplementedDatabaseAdminServer) UpdateBackupSchedule(context.Context, *UpdateBackupScheduleRequest) (*BackupSchedule, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateBackupSchedule not implemented") -} -func (*UnimplementedDatabaseAdminServer) DeleteBackupSchedule(context.Context, *DeleteBackupScheduleRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteBackupSchedule not implemented") -} -func (*UnimplementedDatabaseAdminServer) ListBackupSchedules(context.Context, *ListBackupSchedulesRequest) (*ListBackupSchedulesResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListBackupSchedules not implemented") -} -func (*UnimplementedDatabaseAdminServer) InternalUpdateGraphOperation(context.Context, *InternalUpdateGraphOperationRequest) (*InternalUpdateGraphOperationResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method InternalUpdateGraphOperation not implemented") -} - -func RegisterDatabaseAdminServer(s *grpc.Server, srv DatabaseAdminServer) { - s.RegisterService(&_DatabaseAdmin_serviceDesc, srv) -} - -func _DatabaseAdmin_ListDatabases_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListDatabasesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).ListDatabases(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/ListDatabases", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).ListDatabases(ctx, req.(*ListDatabasesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_CreateDatabase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateDatabaseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).CreateDatabase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/CreateDatabase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).CreateDatabase(ctx, req.(*CreateDatabaseRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_GetDatabase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetDatabaseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).GetDatabase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/GetDatabase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).GetDatabase(ctx, req.(*GetDatabaseRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_UpdateDatabase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateDatabaseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).UpdateDatabase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateDatabase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).UpdateDatabase(ctx, req.(*UpdateDatabaseRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_UpdateDatabaseDdl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateDatabaseDdlRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).UpdateDatabaseDdl(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateDatabaseDdl", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).UpdateDatabaseDdl(ctx, req.(*UpdateDatabaseDdlRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_DropDatabase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DropDatabaseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).DropDatabase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/DropDatabase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).DropDatabase(ctx, req.(*DropDatabaseRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_GetDatabaseDdl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetDatabaseDdlRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).GetDatabaseDdl(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/GetDatabaseDdl", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).GetDatabaseDdl(ctx, req.(*GetDatabaseDdlRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(iampb.SetIamPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).SetIamPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/SetIamPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(iampb.GetIamPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).GetIamPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/GetIamPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(iampb.TestIamPermissionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).TestIamPermissions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/TestIamPermissions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_CreateBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateBackupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).CreateBackup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/CreateBackup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).CreateBackup(ctx, req.(*CreateBackupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_CopyBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CopyBackupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).CopyBackup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/CopyBackup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).CopyBackup(ctx, req.(*CopyBackupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_GetBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetBackupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).GetBackup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/GetBackup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).GetBackup(ctx, req.(*GetBackupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_UpdateBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateBackupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).UpdateBackup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateBackup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).UpdateBackup(ctx, req.(*UpdateBackupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_DeleteBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteBackupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).DeleteBackup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/DeleteBackup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).DeleteBackup(ctx, req.(*DeleteBackupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_ListBackups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListBackupsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).ListBackups(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/ListBackups", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).ListBackups(ctx, req.(*ListBackupsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_RestoreDatabase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RestoreDatabaseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).RestoreDatabase(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/RestoreDatabase", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).RestoreDatabase(ctx, req.(*RestoreDatabaseRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_ListDatabaseOperations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListDatabaseOperationsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).ListDatabaseOperations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/ListDatabaseOperations", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).ListDatabaseOperations(ctx, req.(*ListDatabaseOperationsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_ListBackupOperations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListBackupOperationsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).ListBackupOperations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/ListBackupOperations", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).ListBackupOperations(ctx, req.(*ListBackupOperationsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_ListDatabaseRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListDatabaseRolesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).ListDatabaseRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/ListDatabaseRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).ListDatabaseRoles(ctx, req.(*ListDatabaseRolesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_AddSplitPoints_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddSplitPointsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).AddSplitPoints(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/AddSplitPoints", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).AddSplitPoints(ctx, req.(*AddSplitPointsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_CreateBackupSchedule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateBackupScheduleRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).CreateBackupSchedule(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/CreateBackupSchedule", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).CreateBackupSchedule(ctx, req.(*CreateBackupScheduleRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_GetBackupSchedule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetBackupScheduleRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).GetBackupSchedule(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/GetBackupSchedule", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).GetBackupSchedule(ctx, req.(*GetBackupScheduleRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_UpdateBackupSchedule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateBackupScheduleRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).UpdateBackupSchedule(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/UpdateBackupSchedule", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).UpdateBackupSchedule(ctx, req.(*UpdateBackupScheduleRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_DeleteBackupSchedule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteBackupScheduleRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).DeleteBackupSchedule(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/DeleteBackupSchedule", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).DeleteBackupSchedule(ctx, req.(*DeleteBackupScheduleRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_ListBackupSchedules_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListBackupSchedulesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).ListBackupSchedules(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/ListBackupSchedules", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).ListBackupSchedules(ctx, req.(*ListBackupSchedulesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DatabaseAdmin_InternalUpdateGraphOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InternalUpdateGraphOperationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DatabaseAdminServer).InternalUpdateGraphOperation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.admin.database.v1.DatabaseAdmin/InternalUpdateGraphOperation", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DatabaseAdminServer).InternalUpdateGraphOperation(ctx, req.(*InternalUpdateGraphOperationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _DatabaseAdmin_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.spanner.admin.database.v1.DatabaseAdmin", - HandlerType: (*DatabaseAdminServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListDatabases", - Handler: _DatabaseAdmin_ListDatabases_Handler, - }, - { - MethodName: "CreateDatabase", - Handler: _DatabaseAdmin_CreateDatabase_Handler, - }, - { - MethodName: "GetDatabase", - Handler: _DatabaseAdmin_GetDatabase_Handler, - }, - { - MethodName: "UpdateDatabase", - Handler: _DatabaseAdmin_UpdateDatabase_Handler, - }, - { - MethodName: "UpdateDatabaseDdl", - Handler: _DatabaseAdmin_UpdateDatabaseDdl_Handler, - }, - { - MethodName: "DropDatabase", - Handler: _DatabaseAdmin_DropDatabase_Handler, - }, - { - MethodName: "GetDatabaseDdl", - Handler: _DatabaseAdmin_GetDatabaseDdl_Handler, - }, - { - MethodName: "SetIamPolicy", - Handler: _DatabaseAdmin_SetIamPolicy_Handler, - }, - { - MethodName: "GetIamPolicy", - Handler: _DatabaseAdmin_GetIamPolicy_Handler, - }, - { - MethodName: "TestIamPermissions", - Handler: _DatabaseAdmin_TestIamPermissions_Handler, - }, - { - MethodName: "CreateBackup", - Handler: _DatabaseAdmin_CreateBackup_Handler, - }, - { - MethodName: "CopyBackup", - Handler: _DatabaseAdmin_CopyBackup_Handler, - }, - { - MethodName: "GetBackup", - Handler: _DatabaseAdmin_GetBackup_Handler, - }, - { - MethodName: "UpdateBackup", - Handler: _DatabaseAdmin_UpdateBackup_Handler, - }, - { - MethodName: "DeleteBackup", - Handler: _DatabaseAdmin_DeleteBackup_Handler, - }, - { - MethodName: "ListBackups", - Handler: _DatabaseAdmin_ListBackups_Handler, - }, - { - MethodName: "RestoreDatabase", - Handler: _DatabaseAdmin_RestoreDatabase_Handler, - }, - { - MethodName: "ListDatabaseOperations", - Handler: _DatabaseAdmin_ListDatabaseOperations_Handler, - }, - { - MethodName: "ListBackupOperations", - Handler: _DatabaseAdmin_ListBackupOperations_Handler, - }, - { - MethodName: "ListDatabaseRoles", - Handler: _DatabaseAdmin_ListDatabaseRoles_Handler, - }, - { - MethodName: "AddSplitPoints", - Handler: _DatabaseAdmin_AddSplitPoints_Handler, - }, - { - MethodName: "CreateBackupSchedule", - Handler: _DatabaseAdmin_CreateBackupSchedule_Handler, - }, - { - MethodName: "GetBackupSchedule", - Handler: _DatabaseAdmin_GetBackupSchedule_Handler, - }, - { - MethodName: "UpdateBackupSchedule", - Handler: _DatabaseAdmin_UpdateBackupSchedule_Handler, - }, - { - MethodName: "DeleteBackupSchedule", - Handler: _DatabaseAdmin_DeleteBackupSchedule_Handler, - }, - { - MethodName: "ListBackupSchedules", - Handler: _DatabaseAdmin_ListBackupSchedules_Handler, - }, - { - MethodName: "InternalUpdateGraphOperation", - Handler: _DatabaseAdmin_InternalUpdateGraphOperation_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/spanner/admin/database/v1/spanner_database_admin.proto", -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/doc.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/doc.go deleted file mode 100644 index b7e0863575..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/doc.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -// Package database is an auto-generated package for the -// Cloud Spanner API. -// -// Cloud Spanner is a managed, mission-critical, globally consistent and -// scalable relational database service. -// -// # General documentation -// -// For information that is relevant for all client libraries please reference -// https://pkg.go.dev/cloud.google.com/go#pkg-overview. Some information on this -// page includes: -// -// - [Authentication and Authorization] -// - [Timeouts and Cancellation] -// - [Testing against Client Libraries] -// - [Debugging Client Libraries] -// - [Inspecting errors] -// -// # Example usage -// -// To get started with this package, create a client. -// -// // go get cloud.google.com/go/spanner/admin/database/apiv1@latest -// ctx := context.Background() -// // This snippet has been automatically generated and should be regarded as a code template only. -// // It will require modifications to work: -// // - It may require correct/in-range values for request initialization. -// // - It may require specifying regional endpoints when creating the service client as shown in: -// // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options -// c, err := database.NewDatabaseAdminClient(ctx) -// if err != nil { -// // TODO: Handle error. -// } -// defer c.Close() -// -// The client will use your default application credentials. Clients should be reused instead of created as needed. -// The methods of Client are safe for concurrent use by multiple goroutines. -// The returned client must be Closed when it is done being used. -// -// # Using the Client -// -// The following is an example of making an API call with the newly created client, mentioned above. -// -// req := &databasepb.AddSplitPointsRequest{ -// // TODO: Fill request struct fields. -// // See https://pkg.go.dev/cloud.google.com/go/spanner/admin/database/apiv1/databasepb#AddSplitPointsRequest. -// } -// resp, err := c.AddSplitPoints(ctx, req) -// if err != nil { -// // TODO: Handle error. -// } -// // TODO: Use resp. -// _ = resp -// -// # Use of Context -// -// The ctx passed to NewDatabaseAdminClient is used for authentication requests and -// for creating the underlying connection, but is not used for subsequent calls. -// Individual methods on the client use the ctx given to them. -// -// To close the open connection, use the Close() method. -// -// [Authentication and Authorization]: https://pkg.go.dev/cloud.google.com/go#hdr-Authentication_and_Authorization -// [Timeouts and Cancellation]: https://pkg.go.dev/cloud.google.com/go#hdr-Timeouts_and_Cancellation -// [Testing against Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Testing -// [Debugging Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Debugging -// [Inspecting errors]: https://pkg.go.dev/cloud.google.com/go#hdr-Inspecting_errors -package database // import "cloud.google.com/go/spanner/admin/database/apiv1" diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/helpers.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/helpers.go deleted file mode 100644 index 4605effc4b..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/helpers.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -package database - -import ( - "context" - "fmt" - "io" - "log/slog" - "net/http" - - "github.com/googleapis/gax-go/v2/internallog" - "github.com/googleapis/gax-go/v2/internallog/grpclog" - "google.golang.org/api/googleapi" - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const serviceName = "spanner.googleapis.com" - -var protoVersion = fmt.Sprintf("1.%d", protoimpl.MaxVersion) - -// For more information on implementing a client constructor hook, see -// https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. -type clientHookParams struct{} -type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error) - -var versionClient string - -func getVersionClient() string { - if versionClient == "" { - return "UNKNOWN" - } - return versionClient -} - -// DefaultAuthScopes reports the default set of authentication scopes to use with this package. -func DefaultAuthScopes() []string { - return []string{ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/spanner.admin", - } -} - -func executeHTTPRequestWithResponse(ctx context.Context, client *http.Client, req *http.Request, logger *slog.Logger, body []byte, rpc string) ([]byte, *http.Response, error) { - logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", internallog.HTTPRequest(req, body)) - resp, err := client.Do(req) - if err != nil { - return nil, nil, err - } - defer resp.Body.Close() - buf, err := io.ReadAll(resp.Body) - if err != nil { - return nil, nil, err - } - logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", internallog.HTTPResponse(resp, buf)) - if err = googleapi.CheckResponseWithBody(resp, buf); err != nil { - return nil, nil, err - } - return buf, resp, nil -} - -func executeHTTPRequest(ctx context.Context, client *http.Client, req *http.Request, logger *slog.Logger, body []byte, rpc string) ([]byte, error) { - buf, _, err := executeHTTPRequestWithResponse(ctx, client, req, logger, body, rpc) - return buf, err -} - -func executeStreamingHTTPRequest(ctx context.Context, client *http.Client, req *http.Request, logger *slog.Logger, body []byte, rpc string) (*http.Response, error) { - logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", internallog.HTTPRequest(req, body)) - resp, err := client.Do(req) - if err != nil { - return nil, err - } - logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", internallog.HTTPResponse(resp, nil)) - if err = googleapi.CheckResponse(resp); err != nil { - return nil, err - } - return resp, nil -} - -func executeRPC[I proto.Message, O proto.Message](ctx context.Context, fn func(context.Context, I, ...grpc.CallOption) (O, error), req I, opts []grpc.CallOption, logger *slog.Logger, rpc string) (O, error) { - var zero O - logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", grpclog.ProtoMessageRequest(ctx, req)) - resp, err := fn(ctx, req, opts...) - if err != nil { - return zero, err - } - logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", grpclog.ProtoMessageResponse(resp)) - return resp, err -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/init.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/init.go deleted file mode 100644 index 1638b7d22a..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/init.go +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright 2020 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package database - -import ( - "context" - "os" - "regexp" - - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" -) - -func init() { - newDatabaseAdminClientHook = func(ctx context.Context, p clientHookParams) ([]option.ClientOption, error) { - if emulator := os.Getenv("SPANNER_EMULATOR_HOST"); emulator != "" { - schemeRemoved := regexp.MustCompile("^(http://|https://|passthrough:///)").ReplaceAllString(emulator, "") - return []option.ClientOption{ - option.WithEndpoint("passthrough:///" + schemeRemoved), - option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), - option.WithoutAuthentication(), - }, nil - } - - return nil, nil - } -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/path_funcs.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/path_funcs.go deleted file mode 100644 index d474b2cce2..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/path_funcs.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package database - -// DatabaseAdminInstancePath returns the path for the instance resource. -// -// Deprecated: Use -// -// fmt.Sprintf("projects/%s/instances/%s", project, instance) -// -// instead. -func DatabaseAdminInstancePath(project, instance string) string { - return "" + - "projects/" + - project + - "/instances/" + - instance + - "" -} - -// DatabaseAdminDatabasePath returns the path for the database resource. -// -// Deprecated: Use -// -// fmt.Sprintf("projects/%s/instances/%s/databases/%s", project, instance, database) -// -// instead. -func DatabaseAdminDatabasePath(project, instance, database string) string { - return "" + - "projects/" + - project + - "/instances/" + - instance + - "/databases/" + - database + - "" -} diff --git a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/version.go b/vendor/cloud.google.com/go/spanner/admin/database/apiv1/version.go deleted file mode 100644 index b0ba71de8a..0000000000 --- a/vendor/cloud.google.com/go/spanner/admin/database/apiv1/version.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2023 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapicgen. DO NOT EDIT. - -package database - -import "cloud.google.com/go/spanner/internal" - -func init() { - versionClient = internal.Version -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/auxiliary.go b/vendor/cloud.google.com/go/spanner/apiv1/auxiliary.go deleted file mode 100644 index 9f20fac7b5..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/auxiliary.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -package spanner - -import ( - spannerpb "cloud.google.com/go/spanner/apiv1/spannerpb" - "google.golang.org/api/iterator" -) - -// SessionIterator manages a stream of *spannerpb.Session. -type SessionIterator struct { - items []*spannerpb.Session - pageInfo *iterator.PageInfo - nextFunc func() error - - // Response is the raw response for the current page. - // It must be cast to the RPC response type. - // Calling Next() or InternalFetch() updates this value. - Response interface{} - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*spannerpb.Session, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. -func (it *SessionIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *SessionIterator) Next() (*spannerpb.Session, error) { - var item *spannerpb.Session - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *SessionIterator) bufLen() int { - return len(it.items) -} - -func (it *SessionIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/auxiliary_go123.go b/vendor/cloud.google.com/go/spanner/apiv1/auxiliary_go123.go deleted file mode 100644 index 759ecdb005..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/auxiliary_go123.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -//go:build go1.23 - -package spanner - -import ( - "iter" - - spannerpb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/googleapis/gax-go/v2/iterator" -) - -// All returns an iterator. If an error is returned by the iterator, the -// iterator will stop after that iteration. -func (it *SessionIterator) All() iter.Seq2[*spannerpb.Session, error] { - return iterator.RangeAdapter(it.Next) -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/doc.go b/vendor/cloud.google.com/go/spanner/apiv1/doc.go deleted file mode 100644 index b513cb6053..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/doc.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -// Package spanner is an auto-generated package for the -// Cloud Spanner API. -// -// Cloud Spanner is a managed, mission-critical, globally consistent and -// scalable relational database service. -// -// # General documentation -// -// For information that is relevant for all client libraries please reference -// https://pkg.go.dev/cloud.google.com/go#pkg-overview. Some information on this -// page includes: -// -// - [Authentication and Authorization] -// - [Timeouts and Cancellation] -// - [Testing against Client Libraries] -// - [Debugging Client Libraries] -// - [Inspecting errors] -// -// # Example usage -// -// To get started with this package, create a client. -// -// // go get cloud.google.com/go/spanner/apiv1@latest -// ctx := context.Background() -// // This snippet has been automatically generated and should be regarded as a code template only. -// // It will require modifications to work: -// // - It may require correct/in-range values for request initialization. -// // - It may require specifying regional endpoints when creating the service client as shown in: -// // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options -// c, err := spanner.NewClient(ctx) -// if err != nil { -// // TODO: Handle error. -// } -// defer c.Close() -// -// The client will use your default application credentials. Clients should be reused instead of created as needed. -// The methods of Client are safe for concurrent use by multiple goroutines. -// The returned client must be Closed when it is done being used. -// -// # Using the Client -// -// The following is an example of making an API call with the newly created client, mentioned above. -// -// req := &spannerpb.BatchCreateSessionsRequest{ -// // TODO: Fill request struct fields. -// // See https://pkg.go.dev/cloud.google.com/go/spanner/apiv1/spannerpb#BatchCreateSessionsRequest. -// } -// resp, err := c.BatchCreateSessions(ctx, req) -// if err != nil { -// // TODO: Handle error. -// } -// // TODO: Use resp. -// _ = resp -// -// # Use of Context -// -// The ctx passed to NewClient is used for authentication requests and -// for creating the underlying connection, but is not used for subsequent calls. -// Individual methods on the client use the ctx given to them. -// -// To close the open connection, use the Close() method. -// -// [Authentication and Authorization]: https://pkg.go.dev/cloud.google.com/go#hdr-Authentication_and_Authorization -// [Timeouts and Cancellation]: https://pkg.go.dev/cloud.google.com/go#hdr-Timeouts_and_Cancellation -// [Testing against Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Testing -// [Debugging Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Debugging -// [Inspecting errors]: https://pkg.go.dev/cloud.google.com/go#hdr-Inspecting_errors -package spanner // import "cloud.google.com/go/spanner/apiv1" diff --git a/vendor/cloud.google.com/go/spanner/apiv1/helpers.go b/vendor/cloud.google.com/go/spanner/apiv1/helpers.go deleted file mode 100644 index 36e582541a..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/helpers.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -package spanner - -import ( - "context" - "fmt" - "io" - "log/slog" - "net/http" - - "github.com/googleapis/gax-go/v2/internallog" - "github.com/googleapis/gax-go/v2/internallog/grpclog" - "google.golang.org/api/googleapi" - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const serviceName = "spanner.googleapis.com" - -var protoVersion = fmt.Sprintf("1.%d", protoimpl.MaxVersion) - -// For more information on implementing a client constructor hook, see -// https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. -type clientHookParams struct{} -type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error) - -var versionClient string - -func getVersionClient() string { - if versionClient == "" { - return "UNKNOWN" - } - return versionClient -} - -// DefaultAuthScopes reports the default set of authentication scopes to use with this package. -func DefaultAuthScopes() []string { - return []string{ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/spanner.data", - } -} - -func executeHTTPRequestWithResponse(ctx context.Context, client *http.Client, req *http.Request, logger *slog.Logger, body []byte, rpc string) ([]byte, *http.Response, error) { - logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", internallog.HTTPRequest(req, body)) - resp, err := client.Do(req) - if err != nil { - return nil, nil, err - } - defer resp.Body.Close() - buf, err := io.ReadAll(resp.Body) - if err != nil { - return nil, nil, err - } - logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", internallog.HTTPResponse(resp, buf)) - if err = googleapi.CheckResponseWithBody(resp, buf); err != nil { - return nil, nil, err - } - return buf, resp, nil -} - -func executeHTTPRequest(ctx context.Context, client *http.Client, req *http.Request, logger *slog.Logger, body []byte, rpc string) ([]byte, error) { - buf, _, err := executeHTTPRequestWithResponse(ctx, client, req, logger, body, rpc) - return buf, err -} - -func executeStreamingHTTPRequest(ctx context.Context, client *http.Client, req *http.Request, logger *slog.Logger, body []byte, rpc string) (*http.Response, error) { - logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", internallog.HTTPRequest(req, body)) - resp, err := client.Do(req) - if err != nil { - return nil, err - } - logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", internallog.HTTPResponse(resp, nil)) - if err = googleapi.CheckResponse(resp); err != nil { - return nil, err - } - return resp, nil -} - -func executeRPC[I proto.Message, O proto.Message](ctx context.Context, fn func(context.Context, I, ...grpc.CallOption) (O, error), req I, opts []grpc.CallOption, logger *slog.Logger, rpc string) (O, error) { - var zero O - logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", grpclog.ProtoMessageRequest(ctx, req)) - resp, err := fn(ctx, req, opts...) - if err != nil { - return zero, err - } - logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", grpclog.ProtoMessageResponse(resp)) - return resp, err -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/info.go b/vendor/cloud.google.com/go/spanner/apiv1/info.go deleted file mode 100644 index 4b7b796692..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/info.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -// SetGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Also passes any -// provided key-value pairs. Intended for use by Google-written clients. -// -// Internal use only. -func (c *Client) SetGoogleClientInfo(keyval ...string) { - c.setGoogleClientInfo(keyval...) -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/path_funcs.go b/vendor/cloud.google.com/go/spanner/apiv1/path_funcs.go deleted file mode 100644 index db29b0ba52..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/path_funcs.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -// DatabasePath returns the path for the database resource. -// -// Deprecated: Use -// -// fmt.Sprintf("projects/%s/instances/%s/databases/%s", project, instance, database) -// -// instead. -func DatabasePath(project, instance, database string) string { - return "" + - "projects/" + - project + - "/instances/" + - instance + - "/databases/" + - database + - "" -} - -// SessionPath returns the path for the session resource. -// -// Deprecated: Use -// -// fmt.Sprintf("projects/%s/instances/%s/databases/%s/sessions/%s", project, instance, database, session) -// -// instead. -func SessionPath(project, instance, database, session string) string { - return "" + - "projects/" + - project + - "/instances/" + - instance + - "/databases/" + - database + - "/sessions/" + - session + - "" -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spanner_client.go b/vendor/cloud.google.com/go/spanner/apiv1/spanner_client.go deleted file mode 100644 index 96748ab642..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spanner_client.go +++ /dev/null @@ -1,2321 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go_gapic. DO NOT EDIT. - -package spanner - -import ( - "bytes" - "context" - "errors" - "fmt" - "log/slog" - "math" - "net/http" - "net/url" - "time" - - spannerpb "cloud.google.com/go/spanner/apiv1/spannerpb" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/option/internaloption" - gtransport "google.golang.org/api/transport/grpc" - httptransport "google.golang.org/api/transport/http" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" -) - -var newClientHook clientHook - -// CallOptions contains the retry settings for each method of Client. -type CallOptions struct { - CreateSession []gax.CallOption - BatchCreateSessions []gax.CallOption - GetSession []gax.CallOption - ListSessions []gax.CallOption - DeleteSession []gax.CallOption - ExecuteSql []gax.CallOption - ExecuteStreamingSql []gax.CallOption - ExecuteBatchDml []gax.CallOption - Read []gax.CallOption - StreamingRead []gax.CallOption - BeginTransaction []gax.CallOption - Commit []gax.CallOption - Rollback []gax.CallOption - PartitionQuery []gax.CallOption - PartitionRead []gax.CallOption - BatchWrite []gax.CallOption -} - -func defaultGRPCClientOptions() []option.ClientOption { - return []option.ClientOption{ - internaloption.WithDefaultEndpoint("spanner.googleapis.com:443"), - internaloption.WithDefaultEndpointTemplate("spanner.UNIVERSE_DOMAIN:443"), - internaloption.WithDefaultMTLSEndpoint("spanner.mtls.googleapis.com:443"), - internaloption.WithDefaultUniverseDomain("googleapis.com"), - internaloption.WithDefaultAudience("https://spanner.googleapis.com/"), - internaloption.WithDefaultScopes(DefaultAuthScopes()...), - internaloption.EnableJwtWithScope(), - internaloption.EnableNewAuthLibrary(), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultCallOptions() *CallOptions { - return &CallOptions{ - CreateSession: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - BatchCreateSessions: []gax.CallOption{ - gax.WithTimeout(60000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - GetSession: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ListSessions: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - DeleteSession: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ExecuteSql: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - ExecuteStreamingSql: []gax.CallOption{}, - ExecuteBatchDml: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - Read: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - StreamingRead: []gax.CallOption{}, - BeginTransaction: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - Commit: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - Rollback: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - PartitionQuery: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - PartitionRead: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.Unavailable, - codes.ResourceExhausted, - }, gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }) - }), - }, - BatchWrite: []gax.CallOption{}, - } -} - -func defaultRESTCallOptions() *CallOptions { - return &CallOptions{ - CreateSession: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - BatchCreateSessions: []gax.CallOption{ - gax.WithTimeout(60000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - GetSession: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - ListSessions: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - DeleteSession: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - ExecuteSql: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - ExecuteStreamingSql: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - ExecuteBatchDml: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - Read: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - StreamingRead: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - BeginTransaction: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - Commit: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - Rollback: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - PartitionQuery: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - PartitionRead: []gax.CallOption{ - gax.WithTimeout(30000 * time.Millisecond), - gax.WithRetry(func() gax.Retryer { - return gax.OnHTTPCodes(gax.Backoff{ - Initial: 250 * time.Millisecond, - Max: 32000 * time.Millisecond, - Multiplier: 1.30, - }, - http.StatusServiceUnavailable, - http.StatusTooManyRequests) - }), - }, - BatchWrite: []gax.CallOption{ - gax.WithTimeout(3600000 * time.Millisecond), - }, - } -} - -// internalClient is an interface that defines the methods available from Cloud Spanner API. -type internalClient interface { - Close() error - setGoogleClientInfo(...string) - Connection() *grpc.ClientConn - CreateSession(context.Context, *spannerpb.CreateSessionRequest, ...gax.CallOption) (*spannerpb.Session, error) - BatchCreateSessions(context.Context, *spannerpb.BatchCreateSessionsRequest, ...gax.CallOption) (*spannerpb.BatchCreateSessionsResponse, error) - GetSession(context.Context, *spannerpb.GetSessionRequest, ...gax.CallOption) (*spannerpb.Session, error) - ListSessions(context.Context, *spannerpb.ListSessionsRequest, ...gax.CallOption) *SessionIterator - DeleteSession(context.Context, *spannerpb.DeleteSessionRequest, ...gax.CallOption) error - ExecuteSql(context.Context, *spannerpb.ExecuteSqlRequest, ...gax.CallOption) (*spannerpb.ResultSet, error) - ExecuteStreamingSql(context.Context, *spannerpb.ExecuteSqlRequest, ...gax.CallOption) (spannerpb.Spanner_ExecuteStreamingSqlClient, error) - ExecuteBatchDml(context.Context, *spannerpb.ExecuteBatchDmlRequest, ...gax.CallOption) (*spannerpb.ExecuteBatchDmlResponse, error) - Read(context.Context, *spannerpb.ReadRequest, ...gax.CallOption) (*spannerpb.ResultSet, error) - StreamingRead(context.Context, *spannerpb.ReadRequest, ...gax.CallOption) (spannerpb.Spanner_StreamingReadClient, error) - BeginTransaction(context.Context, *spannerpb.BeginTransactionRequest, ...gax.CallOption) (*spannerpb.Transaction, error) - Commit(context.Context, *spannerpb.CommitRequest, ...gax.CallOption) (*spannerpb.CommitResponse, error) - Rollback(context.Context, *spannerpb.RollbackRequest, ...gax.CallOption) error - PartitionQuery(context.Context, *spannerpb.PartitionQueryRequest, ...gax.CallOption) (*spannerpb.PartitionResponse, error) - PartitionRead(context.Context, *spannerpb.PartitionReadRequest, ...gax.CallOption) (*spannerpb.PartitionResponse, error) - BatchWrite(context.Context, *spannerpb.BatchWriteRequest, ...gax.CallOption) (spannerpb.Spanner_BatchWriteClient, error) -} - -// Client is a client for interacting with Cloud Spanner API. -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -// -// # Cloud Spanner API -// -// The Cloud Spanner API can be used to manage sessions and execute -// transactions on data stored in Cloud Spanner databases. -type Client struct { - // The internal transport-dependent client. - internalClient internalClient - - // The call options for this service. - CallOptions *CallOptions -} - -// Wrapper methods routed to the internal client. - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *Client) Close() error { - return c.internalClient.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *Client) setGoogleClientInfo(keyval ...string) { - c.internalClient.setGoogleClientInfo(keyval...) -} - -// Connection returns a connection to the API service. -// -// Deprecated: Connections are now pooled so this method does not always -// return the same resource. -func (c *Client) Connection() *grpc.ClientConn { - return c.internalClient.Connection() -} - -// CreateSession creates a new session. A session can be used to perform -// transactions that read and/or modify data in a Cloud Spanner database. -// Sessions are meant to be reused for many consecutive -// transactions. -// -// Sessions can only execute one transaction at a time. To execute -// multiple concurrent read-write/write-only transactions, create -// multiple sessions. Note that standalone reads and queries use a -// transaction internally, and count toward the one transaction -// limit. -// -// Active sessions use additional server resources, so it is a good idea to -// delete idle and unneeded sessions. -// Aside from explicit deletes, Cloud Spanner may delete sessions for which no -// operations are sent for more than an hour. If a session is deleted, -// requests to it return NOT_FOUND. -// -// Idle sessions can be kept alive by sending a trivial SQL query -// periodically, e.g., "SELECT 1". -func (c *Client) CreateSession(ctx context.Context, req *spannerpb.CreateSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - return c.internalClient.CreateSession(ctx, req, opts...) -} - -// BatchCreateSessions creates multiple new sessions. -// -// This API can be used to initialize a session cache on the clients. -// See https://goo.gl/TgSFN2 (at https://goo.gl/TgSFN2) for best practices on session cache management. -func (c *Client) BatchCreateSessions(ctx context.Context, req *spannerpb.BatchCreateSessionsRequest, opts ...gax.CallOption) (*spannerpb.BatchCreateSessionsResponse, error) { - return c.internalClient.BatchCreateSessions(ctx, req, opts...) -} - -// GetSession gets a session. Returns NOT_FOUND if the session does not exist. -// This is mainly useful for determining whether a session is still -// alive. -func (c *Client) GetSession(ctx context.Context, req *spannerpb.GetSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - return c.internalClient.GetSession(ctx, req, opts...) -} - -// ListSessions lists all sessions in a given database. -func (c *Client) ListSessions(ctx context.Context, req *spannerpb.ListSessionsRequest, opts ...gax.CallOption) *SessionIterator { - return c.internalClient.ListSessions(ctx, req, opts...) -} - -// DeleteSession ends a session, releasing server resources associated with it. This will -// asynchronously trigger cancellation of any operations that are running with -// this session. -func (c *Client) DeleteSession(ctx context.Context, req *spannerpb.DeleteSessionRequest, opts ...gax.CallOption) error { - return c.internalClient.DeleteSession(ctx, req, opts...) -} - -// ExecuteSql executes an SQL statement, returning all results in a single reply. This -// method cannot be used to return a result set larger than 10 MiB; -// if the query yields more data than that, the query fails with -// a FAILED_PRECONDITION error. -// -// Operations inside read-write transactions might return ABORTED. If -// this occurs, the application should restart the transaction from -// the beginning. See Transaction for more -// details. -// -// Larger result sets can be fetched in streaming fashion by calling -// ExecuteStreamingSql -// instead. -func (c *Client) ExecuteSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - return c.internalClient.ExecuteSql(ctx, req, opts...) -} - -// ExecuteStreamingSql like ExecuteSql, except returns the -// result set as a stream. Unlike -// ExecuteSql, there is no limit on -// the size of the returned result set. However, no individual row in the -// result set can exceed 100 MiB, and no column value can exceed 10 MiB. -func (c *Client) ExecuteStreamingSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (spannerpb.Spanner_ExecuteStreamingSqlClient, error) { - return c.internalClient.ExecuteStreamingSql(ctx, req, opts...) -} - -// ExecuteBatchDml executes a batch of SQL DML statements. This method allows many statements -// to be run with lower latency than submitting them sequentially with -// ExecuteSql. -// -// Statements are executed in sequential order. A request can succeed even if -// a statement fails. The -// ExecuteBatchDmlResponse.status -// field in the response provides information about the statement that failed. -// Clients must inspect this field to determine whether an error occurred. -// -// Execution stops after the first failed statement; the remaining statements -// are not executed. -func (c *Client) ExecuteBatchDml(ctx context.Context, req *spannerpb.ExecuteBatchDmlRequest, opts ...gax.CallOption) (*spannerpb.ExecuteBatchDmlResponse, error) { - return c.internalClient.ExecuteBatchDml(ctx, req, opts...) -} - -// Read reads rows from the database using key lookups and scans, as a -// simple key/value style alternative to -// ExecuteSql. This method cannot be -// used to return a result set larger than 10 MiB; if the read matches more -// data than that, the read fails with a FAILED_PRECONDITION -// error. -// -// Reads inside read-write transactions might return ABORTED. If -// this occurs, the application should restart the transaction from -// the beginning. See Transaction for more -// details. -// -// Larger result sets can be yielded in streaming fashion by calling -// StreamingRead instead. -func (c *Client) Read(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - return c.internalClient.Read(ctx, req, opts...) -} - -// StreamingRead like Read, except returns the result set -// as a stream. Unlike Read, there is no -// limit on the size of the returned result set. However, no individual row in -// the result set can exceed 100 MiB, and no column value can exceed -// 10 MiB. -func (c *Client) StreamingRead(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (spannerpb.Spanner_StreamingReadClient, error) { - return c.internalClient.StreamingRead(ctx, req, opts...) -} - -// BeginTransaction begins a new transaction. This step can often be skipped: -// Read, -// ExecuteSql and -// Commit can begin a new transaction as a -// side-effect. -func (c *Client) BeginTransaction(ctx context.Context, req *spannerpb.BeginTransactionRequest, opts ...gax.CallOption) (*spannerpb.Transaction, error) { - return c.internalClient.BeginTransaction(ctx, req, opts...) -} - -// Commit commits a transaction. The request includes the mutations to be -// applied to rows in the database. -// -// Commit might return an ABORTED error. This can occur at any time; -// commonly, the cause is conflicts with concurrent -// transactions. However, it can also happen for a variety of other -// reasons. If Commit returns ABORTED, the caller should re-attempt -// the transaction from the beginning, re-using the same session. -// -// On very rare occasions, Commit might return UNKNOWN. This can happen, -// for example, if the client job experiences a 1+ hour networking failure. -// At that point, Cloud Spanner has lost track of the transaction outcome and -// we recommend that you perform another read from the database to see the -// state of things as they are now. -func (c *Client) Commit(ctx context.Context, req *spannerpb.CommitRequest, opts ...gax.CallOption) (*spannerpb.CommitResponse, error) { - return c.internalClient.Commit(ctx, req, opts...) -} - -// Rollback rolls back a transaction, releasing any locks it holds. It is a good -// idea to call this for any transaction that includes one or more -// Read or -// ExecuteSql requests and ultimately -// decides not to commit. -// -// Rollback returns OK if it successfully aborts the transaction, the -// transaction was already aborted, or the transaction is not -// found. Rollback never returns ABORTED. -func (c *Client) Rollback(ctx context.Context, req *spannerpb.RollbackRequest, opts ...gax.CallOption) error { - return c.internalClient.Rollback(ctx, req, opts...) -} - -// PartitionQuery creates a set of partition tokens that can be used to execute a query -// operation in parallel. Each of the returned partition tokens can be used -// by ExecuteStreamingSql to -// specify a subset of the query result to read. The same session and -// read-only transaction must be used by the PartitionQueryRequest used to -// create the partition tokens and the ExecuteSqlRequests that use the -// partition tokens. -// -// Partition tokens become invalid when the session used to create them -// is deleted, is idle for too long, begins a new transaction, or becomes too -// old. When any of these happen, it is not possible to resume the query, and -// the whole operation must be restarted from the beginning. -func (c *Client) PartitionQuery(ctx context.Context, req *spannerpb.PartitionQueryRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - return c.internalClient.PartitionQuery(ctx, req, opts...) -} - -// PartitionRead creates a set of partition tokens that can be used to execute a read -// operation in parallel. Each of the returned partition tokens can be used -// by StreamingRead to specify a -// subset of the read result to read. The same session and read-only -// transaction must be used by the PartitionReadRequest used to create the -// partition tokens and the ReadRequests that use the partition tokens. There -// are no ordering guarantees on rows returned among the returned partition -// tokens, or even within each individual StreamingRead call issued with a -// partition_token. -// -// Partition tokens become invalid when the session used to create them -// is deleted, is idle for too long, begins a new transaction, or becomes too -// old. When any of these happen, it is not possible to resume the read, and -// the whole operation must be restarted from the beginning. -func (c *Client) PartitionRead(ctx context.Context, req *spannerpb.PartitionReadRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - return c.internalClient.PartitionRead(ctx, req, opts...) -} - -// BatchWrite batches the supplied mutation groups in a collection of efficient -// transactions. All mutations in a group are committed atomically. However, -// mutations across groups can be committed non-atomically in an unspecified -// order and thus, they must be independent of each other. Partial failure is -// possible, i.e., some groups may have been committed successfully, while -// some may have failed. The results of individual batches are streamed into -// the response as the batches are applied. -// -// BatchWrite requests are not replay protected, meaning that each mutation -// group may be applied more than once. Replays of non-idempotent mutations -// may have undesirable effects. For example, replays of an insert mutation -// may produce an already exists error or if you use generated or commit -// timestamp-based keys, it may result in additional rows being added to the -// mutation’s table. We recommend structuring your mutation groups to be -// idempotent to avoid this issue. -func (c *Client) BatchWrite(ctx context.Context, req *spannerpb.BatchWriteRequest, opts ...gax.CallOption) (spannerpb.Spanner_BatchWriteClient, error) { - return c.internalClient.BatchWrite(ctx, req, opts...) -} - -// gRPCClient is a client for interacting with Cloud Spanner API over gRPC transport. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type gRPCClient struct { - // Connection pool of gRPC connections to the service. - connPool gtransport.ConnPool - - // Points back to the CallOptions field of the containing Client - CallOptions **CallOptions - - // The gRPC API client. - client spannerpb.SpannerClient - - // The x-goog-* metadata to be sent with each request. - xGoogHeaders []string - - logger *slog.Logger -} - -// NewClient creates a new spanner client based on gRPC. -// The returned client must be Closed when it is done being used to clean up its underlying connections. -// -// # Cloud Spanner API -// -// The Cloud Spanner API can be used to manage sessions and execute -// transactions on data stored in Cloud Spanner databases. -func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { - clientOpts := defaultGRPCClientOptions() - if newClientHook != nil { - hookOpts, err := newClientHook(ctx, clientHookParams{}) - if err != nil { - return nil, err - } - clientOpts = append(clientOpts, hookOpts...) - } - - connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) - if err != nil { - return nil, err - } - client := Client{CallOptions: defaultCallOptions()} - - c := &gRPCClient{ - connPool: connPool, - client: spannerpb.NewSpannerClient(connPool), - CallOptions: &client.CallOptions, - logger: internaloption.GetLogger(opts), - } - c.setGoogleClientInfo() - - client.internalClient = c - - return &client, nil -} - -// Connection returns a connection to the API service. -// -// Deprecated: Connections are now pooled so this method does not always -// return the same resource. -func (c *gRPCClient) Connection() *grpc.ClientConn { - return c.connPool.Conn() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *gRPCClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version, "pb", protoVersion) - c.xGoogHeaders = []string{ - "x-goog-api-client", gax.XGoogHeader(kv...), - } -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *gRPCClient) Close() error { - return c.connPool.Close() -} - -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type restClient struct { - // The http endpoint to connect to. - endpoint string - - // The http client. - httpClient *http.Client - - // The x-goog-* headers to be sent with each request. - xGoogHeaders []string - - // Points back to the CallOptions field of the containing Client - CallOptions **CallOptions - - logger *slog.Logger -} - -// NewRESTClient creates a new spanner rest client. -// -// # Cloud Spanner API -// -// The Cloud Spanner API can be used to manage sessions and execute -// transactions on data stored in Cloud Spanner databases. -func NewRESTClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { - clientOpts := append(defaultRESTClientOptions(), opts...) - httpClient, endpoint, err := httptransport.NewClient(ctx, clientOpts...) - if err != nil { - return nil, err - } - - callOpts := defaultRESTCallOptions() - c := &restClient{ - endpoint: endpoint, - httpClient: httpClient, - CallOptions: &callOpts, - logger: internaloption.GetLogger(opts), - } - c.setGoogleClientInfo() - - return &Client{internalClient: c, CallOptions: callOpts}, nil -} - -func defaultRESTClientOptions() []option.ClientOption { - return []option.ClientOption{ - internaloption.WithDefaultEndpoint("https://spanner.googleapis.com"), - internaloption.WithDefaultEndpointTemplate("https://spanner.UNIVERSE_DOMAIN"), - internaloption.WithDefaultMTLSEndpoint("https://spanner.mtls.googleapis.com"), - internaloption.WithDefaultUniverseDomain("googleapis.com"), - internaloption.WithDefaultAudience("https://spanner.googleapis.com/"), - internaloption.WithDefaultScopes(DefaultAuthScopes()...), - internaloption.EnableNewAuthLibrary(), - } -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *restClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", gax.GoVersion}, keyval...) - kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN", "pb", protoVersion) - c.xGoogHeaders = []string{ - "x-goog-api-client", gax.XGoogHeader(kv...), - } -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *restClient) Close() error { - // Replace httpClient with nil to force cleanup. - c.httpClient = nil - return nil -} - -// Connection returns a connection to the API service. -// -// Deprecated: This method always returns nil. -func (c *restClient) Connection() *grpc.ClientConn { - return nil -} -func (c *gRPCClient) CreateSession(ctx context.Context, req *spannerpb.CreateSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).CreateSession[0:len((*c.CallOptions).CreateSession):len((*c.CallOptions).CreateSession)], opts...) - var resp *spannerpb.Session - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.CreateSession, req, settings.GRPC, c.logger, "CreateSession") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) BatchCreateSessions(ctx context.Context, req *spannerpb.BatchCreateSessionsRequest, opts ...gax.CallOption) (*spannerpb.BatchCreateSessionsResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).BatchCreateSessions[0:len((*c.CallOptions).BatchCreateSessions):len((*c.CallOptions).BatchCreateSessions)], opts...) - var resp *spannerpb.BatchCreateSessionsResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.BatchCreateSessions, req, settings.GRPC, c.logger, "BatchCreateSessions") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) GetSession(ctx context.Context, req *spannerpb.GetSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).GetSession[0:len((*c.CallOptions).GetSession):len((*c.CallOptions).GetSession)], opts...) - var resp *spannerpb.Session - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.GetSession, req, settings.GRPC, c.logger, "GetSession") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) ListSessions(ctx context.Context, req *spannerpb.ListSessionsRequest, opts ...gax.CallOption) *SessionIterator { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ListSessions[0:len((*c.CallOptions).ListSessions):len((*c.CallOptions).ListSessions)], opts...) - it := &SessionIterator{} - req = proto.Clone(req).(*spannerpb.ListSessionsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*spannerpb.Session, string, error) { - resp := &spannerpb.ListSessionsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.ListSessions, req, settings.GRPC, c.logger, "ListSessions") - return err - }, opts...) - if err != nil { - return nil, "", err - } - - it.Response = resp - return resp.GetSessions(), resp.GetNextPageToken(), nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -func (c *gRPCClient) DeleteSession(ctx context.Context, req *spannerpb.DeleteSessionRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).DeleteSession[0:len((*c.CallOptions).DeleteSession):len((*c.CallOptions).DeleteSession)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.client.DeleteSession, req, settings.GRPC, c.logger, "DeleteSession") - return err - }, opts...) - return err -} - -func (c *gRPCClient) ExecuteSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ExecuteSql[0:len((*c.CallOptions).ExecuteSql):len((*c.CallOptions).ExecuteSql)], opts...) - var resp *spannerpb.ResultSet - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.ExecuteSql, req, settings.GRPC, c.logger, "ExecuteSql") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) ExecuteStreamingSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (spannerpb.Spanner_ExecuteStreamingSqlClient, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ExecuteStreamingSql[0:len((*c.CallOptions).ExecuteStreamingSql):len((*c.CallOptions).ExecuteStreamingSql)], opts...) - var resp spannerpb.Spanner_ExecuteStreamingSqlClient - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "ExecuteStreamingSql") - resp, err = c.client.ExecuteStreamingSql(ctx, req, settings.GRPC...) - c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "ExecuteStreamingSql") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) ExecuteBatchDml(ctx context.Context, req *spannerpb.ExecuteBatchDmlRequest, opts ...gax.CallOption) (*spannerpb.ExecuteBatchDmlResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).ExecuteBatchDml[0:len((*c.CallOptions).ExecuteBatchDml):len((*c.CallOptions).ExecuteBatchDml)], opts...) - var resp *spannerpb.ExecuteBatchDmlResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.ExecuteBatchDml, req, settings.GRPC, c.logger, "ExecuteBatchDml") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) Read(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).Read[0:len((*c.CallOptions).Read):len((*c.CallOptions).Read)], opts...) - var resp *spannerpb.ResultSet - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.Read, req, settings.GRPC, c.logger, "Read") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) StreamingRead(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (spannerpb.Spanner_StreamingReadClient, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).StreamingRead[0:len((*c.CallOptions).StreamingRead):len((*c.CallOptions).StreamingRead)], opts...) - var resp spannerpb.Spanner_StreamingReadClient - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "StreamingRead") - resp, err = c.client.StreamingRead(ctx, req, settings.GRPC...) - c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "StreamingRead") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) BeginTransaction(ctx context.Context, req *spannerpb.BeginTransactionRequest, opts ...gax.CallOption) (*spannerpb.Transaction, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).BeginTransaction[0:len((*c.CallOptions).BeginTransaction):len((*c.CallOptions).BeginTransaction)], opts...) - var resp *spannerpb.Transaction - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.BeginTransaction, req, settings.GRPC, c.logger, "BeginTransaction") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) Commit(ctx context.Context, req *spannerpb.CommitRequest, opts ...gax.CallOption) (*spannerpb.CommitResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).Commit[0:len((*c.CallOptions).Commit):len((*c.CallOptions).Commit)], opts...) - var resp *spannerpb.CommitResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.Commit, req, settings.GRPC, c.logger, "Commit") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) Rollback(ctx context.Context, req *spannerpb.RollbackRequest, opts ...gax.CallOption) error { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).Rollback[0:len((*c.CallOptions).Rollback):len((*c.CallOptions).Rollback)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = executeRPC(ctx, c.client.Rollback, req, settings.GRPC, c.logger, "Rollback") - return err - }, opts...) - return err -} - -func (c *gRPCClient) PartitionQuery(ctx context.Context, req *spannerpb.PartitionQueryRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).PartitionQuery[0:len((*c.CallOptions).PartitionQuery):len((*c.CallOptions).PartitionQuery)], opts...) - var resp *spannerpb.PartitionResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.PartitionQuery, req, settings.GRPC, c.logger, "PartitionQuery") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) PartitionRead(ctx context.Context, req *spannerpb.PartitionReadRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).PartitionRead[0:len((*c.CallOptions).PartitionRead):len((*c.CallOptions).PartitionRead)], opts...) - var resp *spannerpb.PartitionResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = executeRPC(ctx, c.client.PartitionRead, req, settings.GRPC, c.logger, "PartitionRead") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -func (c *gRPCClient) BatchWrite(ctx context.Context, req *spannerpb.BatchWriteRequest, opts ...gax.CallOption) (spannerpb.Spanner_BatchWriteClient, error) { - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) - opts = append((*c.CallOptions).BatchWrite[0:len((*c.CallOptions).BatchWrite):len((*c.CallOptions).BatchWrite)], opts...) - var resp spannerpb.Spanner_BatchWriteClient - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "BatchWrite") - resp, err = c.client.BatchWrite(ctx, req, settings.GRPC...) - c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "BatchWrite") - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateSession creates a new session. A session can be used to perform -// transactions that read and/or modify data in a Cloud Spanner database. -// Sessions are meant to be reused for many consecutive -// transactions. -// -// Sessions can only execute one transaction at a time. To execute -// multiple concurrent read-write/write-only transactions, create -// multiple sessions. Note that standalone reads and queries use a -// transaction internally, and count toward the one transaction -// limit. -// -// Active sessions use additional server resources, so it is a good idea to -// delete idle and unneeded sessions. -// Aside from explicit deletes, Cloud Spanner may delete sessions for which no -// operations are sent for more than an hour. If a session is deleted, -// requests to it return NOT_FOUND. -// -// Idle sessions can be kept alive by sending a trivial SQL query -// periodically, e.g., "SELECT 1". -func (c *restClient) CreateSession(ctx context.Context, req *spannerpb.CreateSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/sessions", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).CreateSession[0:len((*c.CallOptions).CreateSession):len((*c.CallOptions).CreateSession)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.Session{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "CreateSession") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// BatchCreateSessions creates multiple new sessions. -// -// This API can be used to initialize a session cache on the clients. -// See https://goo.gl/TgSFN2 (at https://goo.gl/TgSFN2) for best practices on session cache management. -func (c *restClient) BatchCreateSessions(ctx context.Context, req *spannerpb.BatchCreateSessionsRequest, opts ...gax.CallOption) (*spannerpb.BatchCreateSessionsResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/sessions:batchCreate", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "database", url.QueryEscape(req.GetDatabase()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).BatchCreateSessions[0:len((*c.CallOptions).BatchCreateSessions):len((*c.CallOptions).BatchCreateSessions)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.BatchCreateSessionsResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "BatchCreateSessions") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// GetSession gets a session. Returns NOT_FOUND if the session does not exist. -// This is mainly useful for determining whether a session is still -// alive. -func (c *restClient) GetSession(ctx context.Context, req *spannerpb.GetSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).GetSession[0:len((*c.CallOptions).GetSession):len((*c.CallOptions).GetSession)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.Session{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "GetSession") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// ListSessions lists all sessions in a given database. -func (c *restClient) ListSessions(ctx context.Context, req *spannerpb.ListSessionsRequest, opts ...gax.CallOption) *SessionIterator { - it := &SessionIterator{} - req = proto.Clone(req).(*spannerpb.ListSessionsRequest) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - it.InternalFetch = func(pageSize int, pageToken string) ([]*spannerpb.Session, string, error) { - resp := &spannerpb.ListSessionsResponse{} - if pageToken != "" { - req.PageToken = pageToken - } - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else if pageSize != 0 { - req.PageSize = int32(pageSize) - } - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, "", err - } - baseUrl.Path += fmt.Sprintf("/v1/%v/sessions", req.GetDatabase()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - if req.GetFilter() != "" { - params.Add("filter", fmt.Sprintf("%v", req.GetFilter())) - } - if req.GetPageSize() != 0 { - params.Add("pageSize", fmt.Sprintf("%v", req.GetPageSize())) - } - if req.GetPageToken() != "" { - params.Add("pageToken", fmt.Sprintf("%v", req.GetPageToken())) - } - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := append(c.xGoogHeaders, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("GET", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "ListSessions") - if err != nil { - return err - } - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, "", e - } - it.Response = resp - return resp.GetSessions(), resp.GetNextPageToken(), nil - } - - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.GetPageSize()) - it.pageInfo.Token = req.GetPageToken() - - return it -} - -// DeleteSession ends a session, releasing server resources associated with it. This will -// asynchronously trigger cancellation of any operations that are running with -// this session. -func (c *restClient) DeleteSession(ctx context.Context, req *spannerpb.DeleteSessionRequest, opts ...gax.CallOption) error { - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v", req.GetName()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("DELETE", baseUrl.String(), nil) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, nil, "DeleteSession") - return err - }, opts...) -} - -// ExecuteSql executes an SQL statement, returning all results in a single reply. This -// method cannot be used to return a result set larger than 10 MiB; -// if the query yields more data than that, the query fails with -// a FAILED_PRECONDITION error. -// -// Operations inside read-write transactions might return ABORTED. If -// this occurs, the application should restart the transaction from -// the beginning. See Transaction for more -// details. -// -// Larger result sets can be fetched in streaming fashion by calling -// ExecuteStreamingSql -// instead. -func (c *restClient) ExecuteSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:executeSql", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).ExecuteSql[0:len((*c.CallOptions).ExecuteSql):len((*c.CallOptions).ExecuteSql)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.ResultSet{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "ExecuteSql") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// ExecuteStreamingSql like ExecuteSql, except returns the -// result set as a stream. Unlike -// ExecuteSql, there is no limit on -// the size of the returned result set. However, no individual row in the -// result set can exceed 100 MiB, and no column value can exceed 10 MiB. -func (c *restClient) ExecuteStreamingSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (spannerpb.Spanner_ExecuteStreamingSqlClient, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:executeStreamingSql", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - var streamClient *executeStreamingSqlRESTStreamClient - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - httpRsp, err := executeStreamingHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "ExecuteStreamingSql") - if err != nil { - return err - } - - streamClient = &executeStreamingSqlRESTStreamClient{ - ctx: ctx, - md: metadata.MD(httpRsp.Header), - stream: gax.NewProtoJSONStreamReader(httpRsp.Body, (&spannerpb.PartialResultSet{}).ProtoReflect().Type()), - } - return nil - }, opts...) - - return streamClient, e -} - -// executeStreamingSqlRESTStreamClient is the stream client used to consume the server stream created by -// the REST implementation of ExecuteStreamingSql. -type executeStreamingSqlRESTStreamClient struct { - ctx context.Context - md metadata.MD - stream *gax.ProtoJSONStream -} - -func (c *executeStreamingSqlRESTStreamClient) Recv() (*spannerpb.PartialResultSet, error) { - if err := c.ctx.Err(); err != nil { - defer c.stream.Close() - return nil, err - } - msg, err := c.stream.Recv() - if err != nil { - defer c.stream.Close() - return nil, err - } - res := msg.(*spannerpb.PartialResultSet) - return res, nil -} - -func (c *executeStreamingSqlRESTStreamClient) Header() (metadata.MD, error) { - return c.md, nil -} - -func (c *executeStreamingSqlRESTStreamClient) Trailer() metadata.MD { - return c.md -} - -func (c *executeStreamingSqlRESTStreamClient) CloseSend() error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented for a server-stream") -} - -func (c *executeStreamingSqlRESTStreamClient) Context() context.Context { - return c.ctx -} - -func (c *executeStreamingSqlRESTStreamClient) SendMsg(m interface{}) error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented for a server-stream") -} - -func (c *executeStreamingSqlRESTStreamClient) RecvMsg(m interface{}) error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented, use Recv") -} - -// ExecuteBatchDml executes a batch of SQL DML statements. This method allows many statements -// to be run with lower latency than submitting them sequentially with -// ExecuteSql. -// -// Statements are executed in sequential order. A request can succeed even if -// a statement fails. The -// ExecuteBatchDmlResponse.status -// field in the response provides information about the statement that failed. -// Clients must inspect this field to determine whether an error occurred. -// -// Execution stops after the first failed statement; the remaining statements -// are not executed. -func (c *restClient) ExecuteBatchDml(ctx context.Context, req *spannerpb.ExecuteBatchDmlRequest, opts ...gax.CallOption) (*spannerpb.ExecuteBatchDmlResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:executeBatchDml", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).ExecuteBatchDml[0:len((*c.CallOptions).ExecuteBatchDml):len((*c.CallOptions).ExecuteBatchDml)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.ExecuteBatchDmlResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "ExecuteBatchDml") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// Read reads rows from the database using key lookups and scans, as a -// simple key/value style alternative to -// ExecuteSql. This method cannot be -// used to return a result set larger than 10 MiB; if the read matches more -// data than that, the read fails with a FAILED_PRECONDITION -// error. -// -// Reads inside read-write transactions might return ABORTED. If -// this occurs, the application should restart the transaction from -// the beginning. See Transaction for more -// details. -// -// Larger result sets can be yielded in streaming fashion by calling -// StreamingRead instead. -func (c *restClient) Read(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:read", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).Read[0:len((*c.CallOptions).Read):len((*c.CallOptions).Read)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.ResultSet{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "Read") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// StreamingRead like Read, except returns the result set -// as a stream. Unlike Read, there is no -// limit on the size of the returned result set. However, no individual row in -// the result set can exceed 100 MiB, and no column value can exceed -// 10 MiB. -func (c *restClient) StreamingRead(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (spannerpb.Spanner_StreamingReadClient, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:streamingRead", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - var streamClient *streamingReadRESTStreamClient - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - httpRsp, err := executeStreamingHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "StreamingRead") - if err != nil { - return err - } - - streamClient = &streamingReadRESTStreamClient{ - ctx: ctx, - md: metadata.MD(httpRsp.Header), - stream: gax.NewProtoJSONStreamReader(httpRsp.Body, (&spannerpb.PartialResultSet{}).ProtoReflect().Type()), - } - return nil - }, opts...) - - return streamClient, e -} - -// streamingReadRESTStreamClient is the stream client used to consume the server stream created by -// the REST implementation of StreamingRead. -type streamingReadRESTStreamClient struct { - ctx context.Context - md metadata.MD - stream *gax.ProtoJSONStream -} - -func (c *streamingReadRESTStreamClient) Recv() (*spannerpb.PartialResultSet, error) { - if err := c.ctx.Err(); err != nil { - defer c.stream.Close() - return nil, err - } - msg, err := c.stream.Recv() - if err != nil { - defer c.stream.Close() - return nil, err - } - res := msg.(*spannerpb.PartialResultSet) - return res, nil -} - -func (c *streamingReadRESTStreamClient) Header() (metadata.MD, error) { - return c.md, nil -} - -func (c *streamingReadRESTStreamClient) Trailer() metadata.MD { - return c.md -} - -func (c *streamingReadRESTStreamClient) CloseSend() error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented for a server-stream") -} - -func (c *streamingReadRESTStreamClient) Context() context.Context { - return c.ctx -} - -func (c *streamingReadRESTStreamClient) SendMsg(m interface{}) error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented for a server-stream") -} - -func (c *streamingReadRESTStreamClient) RecvMsg(m interface{}) error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented, use Recv") -} - -// BeginTransaction begins a new transaction. This step can often be skipped: -// Read, -// ExecuteSql and -// Commit can begin a new transaction as a -// side-effect. -func (c *restClient) BeginTransaction(ctx context.Context, req *spannerpb.BeginTransactionRequest, opts ...gax.CallOption) (*spannerpb.Transaction, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:beginTransaction", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).BeginTransaction[0:len((*c.CallOptions).BeginTransaction):len((*c.CallOptions).BeginTransaction)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.Transaction{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "BeginTransaction") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// Commit commits a transaction. The request includes the mutations to be -// applied to rows in the database. -// -// Commit might return an ABORTED error. This can occur at any time; -// commonly, the cause is conflicts with concurrent -// transactions. However, it can also happen for a variety of other -// reasons. If Commit returns ABORTED, the caller should re-attempt -// the transaction from the beginning, re-using the same session. -// -// On very rare occasions, Commit might return UNKNOWN. This can happen, -// for example, if the client job experiences a 1+ hour networking failure. -// At that point, Cloud Spanner has lost track of the transaction outcome and -// we recommend that you perform another read from the database to see the -// state of things as they are now. -func (c *restClient) Commit(ctx context.Context, req *spannerpb.CommitRequest, opts ...gax.CallOption) (*spannerpb.CommitResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:commit", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).Commit[0:len((*c.CallOptions).Commit):len((*c.CallOptions).Commit)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.CommitResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "Commit") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// Rollback rolls back a transaction, releasing any locks it holds. It is a good -// idea to call this for any transaction that includes one or more -// Read or -// ExecuteSql requests and ultimately -// decides not to commit. -// -// Rollback returns OK if it successfully aborts the transaction, the -// transaction was already aborted, or the transaction is not -// found. Rollback never returns ABORTED. -func (c *restClient) Rollback(ctx context.Context, req *spannerpb.RollbackRequest, opts ...gax.CallOption) error { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:rollback", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - _, err = executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "Rollback") - return err - }, opts...) -} - -// PartitionQuery creates a set of partition tokens that can be used to execute a query -// operation in parallel. Each of the returned partition tokens can be used -// by ExecuteStreamingSql to -// specify a subset of the query result to read. The same session and -// read-only transaction must be used by the PartitionQueryRequest used to -// create the partition tokens and the ExecuteSqlRequests that use the -// partition tokens. -// -// Partition tokens become invalid when the session used to create them -// is deleted, is idle for too long, begins a new transaction, or becomes too -// old. When any of these happen, it is not possible to resume the query, and -// the whole operation must be restarted from the beginning. -func (c *restClient) PartitionQuery(ctx context.Context, req *spannerpb.PartitionQueryRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:partitionQuery", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).PartitionQuery[0:len((*c.CallOptions).PartitionQuery):len((*c.CallOptions).PartitionQuery)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.PartitionResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "PartitionQuery") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// PartitionRead creates a set of partition tokens that can be used to execute a read -// operation in parallel. Each of the returned partition tokens can be used -// by StreamingRead to specify a -// subset of the read result to read. The same session and read-only -// transaction must be used by the PartitionReadRequest used to create the -// partition tokens and the ReadRequests that use the partition tokens. There -// are no ordering guarantees on rows returned among the returned partition -// tokens, or even within each individual StreamingRead call issued with a -// partition_token. -// -// Partition tokens become invalid when the session used to create them -// is deleted, is idle for too long, begins a new transaction, or becomes too -// old. When any of these happen, it is not possible to resume the read, and -// the whole operation must be restarted from the beginning. -func (c *restClient) PartitionRead(ctx context.Context, req *spannerpb.PartitionReadRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:partitionRead", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - opts = append((*c.CallOptions).PartitionRead[0:len((*c.CallOptions).PartitionRead):len((*c.CallOptions).PartitionRead)], opts...) - unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} - resp := &spannerpb.PartitionResponse{} - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - buf, err := executeHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "PartitionRead") - if err != nil { - return err - } - - if err := unm.Unmarshal(buf, resp); err != nil { - return err - } - - return nil - }, opts...) - if e != nil { - return nil, e - } - return resp, nil -} - -// BatchWrite batches the supplied mutation groups in a collection of efficient -// transactions. All mutations in a group are committed atomically. However, -// mutations across groups can be committed non-atomically in an unspecified -// order and thus, they must be independent of each other. Partial failure is -// possible, i.e., some groups may have been committed successfully, while -// some may have failed. The results of individual batches are streamed into -// the response as the batches are applied. -// -// BatchWrite requests are not replay protected, meaning that each mutation -// group may be applied more than once. Replays of non-idempotent mutations -// may have undesirable effects. For example, replays of an insert mutation -// may produce an already exists error or if you use generated or commit -// timestamp-based keys, it may result in additional rows being added to the -// mutation’s table. We recommend structuring your mutation groups to be -// idempotent to avoid this issue. -func (c *restClient) BatchWrite(ctx context.Context, req *spannerpb.BatchWriteRequest, opts ...gax.CallOption) (spannerpb.Spanner_BatchWriteClient, error) { - m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} - jsonReq, err := m.Marshal(req) - if err != nil { - return nil, err - } - - baseUrl, err := url.Parse(c.endpoint) - if err != nil { - return nil, err - } - baseUrl.Path += fmt.Sprintf("/v1/%v:batchWrite", req.GetSession()) - - params := url.Values{} - params.Add("$alt", "json;enum-encoding=int") - - baseUrl.RawQuery = params.Encode() - - // Build HTTP headers from client and context metadata. - hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "session", url.QueryEscape(req.GetSession()))} - - hds = append(c.xGoogHeaders, hds...) - hds = append(hds, "Content-Type", "application/json") - headers := gax.BuildHeaders(ctx, hds...) - var streamClient *batchWriteRESTStreamClient - e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - if settings.Path != "" { - baseUrl.Path = settings.Path - } - httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) - if err != nil { - return err - } - httpReq = httpReq.WithContext(ctx) - httpReq.Header = headers - - httpRsp, err := executeStreamingHTTPRequest(ctx, c.httpClient, httpReq, c.logger, jsonReq, "BatchWrite") - if err != nil { - return err - } - - streamClient = &batchWriteRESTStreamClient{ - ctx: ctx, - md: metadata.MD(httpRsp.Header), - stream: gax.NewProtoJSONStreamReader(httpRsp.Body, (&spannerpb.BatchWriteResponse{}).ProtoReflect().Type()), - } - return nil - }, opts...) - - return streamClient, e -} - -// batchWriteRESTStreamClient is the stream client used to consume the server stream created by -// the REST implementation of BatchWrite. -type batchWriteRESTStreamClient struct { - ctx context.Context - md metadata.MD - stream *gax.ProtoJSONStream -} - -func (c *batchWriteRESTStreamClient) Recv() (*spannerpb.BatchWriteResponse, error) { - if err := c.ctx.Err(); err != nil { - defer c.stream.Close() - return nil, err - } - msg, err := c.stream.Recv() - if err != nil { - defer c.stream.Close() - return nil, err - } - res := msg.(*spannerpb.BatchWriteResponse) - return res, nil -} - -func (c *batchWriteRESTStreamClient) Header() (metadata.MD, error) { - return c.md, nil -} - -func (c *batchWriteRESTStreamClient) Trailer() metadata.MD { - return c.md -} - -func (c *batchWriteRESTStreamClient) CloseSend() error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented for a server-stream") -} - -func (c *batchWriteRESTStreamClient) Context() context.Context { - return c.ctx -} - -func (c *batchWriteRESTStreamClient) SendMsg(m interface{}) error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented for a server-stream") -} - -func (c *batchWriteRESTStreamClient) RecvMsg(m interface{}) error { - // This is a no-op to fulfill the interface. - return errors.New("this method is not implemented, use Recv") -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spanner_client_options.go b/vendor/cloud.google.com/go/spanner/apiv1/spanner_client_options.go deleted file mode 100644 index 5b924b5d1d..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spanner_client_options.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import "google.golang.org/api/option" - -// Returns the default client options used by the generated Spanner client. -// -// This function is only intended for use by the client library, and may be -// removed at any time without any warning. -func DefaultClientOptions() []option.ClientOption { - return defaultGRPCClientOptions() -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/change_stream.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/change_stream.pb.go deleted file mode 100644 index a1e7dc2fbb..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/change_stream.pb.go +++ /dev/null @@ -1,1545 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/change_stream.proto - -package spannerpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - structpb "google.golang.org/protobuf/types/known/structpb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Mod type describes the type of change Spanner applied to the data. For -// example, if the client submits an INSERT_OR_UPDATE request, Spanner will -// perform an insert if there is no existing row and return ModType INSERT. -// Alternatively, if there is an existing row, Spanner will perform an -// update and return ModType UPDATE. -type ChangeStreamRecord_DataChangeRecord_ModType int32 - -const ( - // Not specified. - ChangeStreamRecord_DataChangeRecord_MOD_TYPE_UNSPECIFIED ChangeStreamRecord_DataChangeRecord_ModType = 0 - // Indicates data was inserted. - ChangeStreamRecord_DataChangeRecord_INSERT ChangeStreamRecord_DataChangeRecord_ModType = 10 - // Indicates existing data was updated. - ChangeStreamRecord_DataChangeRecord_UPDATE ChangeStreamRecord_DataChangeRecord_ModType = 20 - // Indicates existing data was deleted. - ChangeStreamRecord_DataChangeRecord_DELETE ChangeStreamRecord_DataChangeRecord_ModType = 30 -) - -// Enum value maps for ChangeStreamRecord_DataChangeRecord_ModType. -var ( - ChangeStreamRecord_DataChangeRecord_ModType_name = map[int32]string{ - 0: "MOD_TYPE_UNSPECIFIED", - 10: "INSERT", - 20: "UPDATE", - 30: "DELETE", - } - ChangeStreamRecord_DataChangeRecord_ModType_value = map[string]int32{ - "MOD_TYPE_UNSPECIFIED": 0, - "INSERT": 10, - "UPDATE": 20, - "DELETE": 30, - } -) - -func (x ChangeStreamRecord_DataChangeRecord_ModType) Enum() *ChangeStreamRecord_DataChangeRecord_ModType { - p := new(ChangeStreamRecord_DataChangeRecord_ModType) - *p = x - return p -} - -func (x ChangeStreamRecord_DataChangeRecord_ModType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ChangeStreamRecord_DataChangeRecord_ModType) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_change_stream_proto_enumTypes[0].Descriptor() -} - -func (ChangeStreamRecord_DataChangeRecord_ModType) Type() protoreflect.EnumType { - return &file_google_spanner_v1_change_stream_proto_enumTypes[0] -} - -func (x ChangeStreamRecord_DataChangeRecord_ModType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ChangeStreamRecord_DataChangeRecord_ModType.Descriptor instead. -func (ChangeStreamRecord_DataChangeRecord_ModType) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 0, 0} -} - -// Value capture type describes which values are recorded in the data -// change record. -type ChangeStreamRecord_DataChangeRecord_ValueCaptureType int32 - -const ( - // Not specified. - ChangeStreamRecord_DataChangeRecord_VALUE_CAPTURE_TYPE_UNSPECIFIED ChangeStreamRecord_DataChangeRecord_ValueCaptureType = 0 - // Records both old and new values of the modified watched columns. - ChangeStreamRecord_DataChangeRecord_OLD_AND_NEW_VALUES ChangeStreamRecord_DataChangeRecord_ValueCaptureType = 10 - // Records only new values of the modified watched columns. - ChangeStreamRecord_DataChangeRecord_NEW_VALUES ChangeStreamRecord_DataChangeRecord_ValueCaptureType = 20 - // Records new values of all watched columns, including modified and - // unmodified columns. - ChangeStreamRecord_DataChangeRecord_NEW_ROW ChangeStreamRecord_DataChangeRecord_ValueCaptureType = 30 - // Records the new values of all watched columns, including modified and - // unmodified columns. Also records the old values of the modified - // columns. - ChangeStreamRecord_DataChangeRecord_NEW_ROW_AND_OLD_VALUES ChangeStreamRecord_DataChangeRecord_ValueCaptureType = 40 -) - -// Enum value maps for ChangeStreamRecord_DataChangeRecord_ValueCaptureType. -var ( - ChangeStreamRecord_DataChangeRecord_ValueCaptureType_name = map[int32]string{ - 0: "VALUE_CAPTURE_TYPE_UNSPECIFIED", - 10: "OLD_AND_NEW_VALUES", - 20: "NEW_VALUES", - 30: "NEW_ROW", - 40: "NEW_ROW_AND_OLD_VALUES", - } - ChangeStreamRecord_DataChangeRecord_ValueCaptureType_value = map[string]int32{ - "VALUE_CAPTURE_TYPE_UNSPECIFIED": 0, - "OLD_AND_NEW_VALUES": 10, - "NEW_VALUES": 20, - "NEW_ROW": 30, - "NEW_ROW_AND_OLD_VALUES": 40, - } -) - -func (x ChangeStreamRecord_DataChangeRecord_ValueCaptureType) Enum() *ChangeStreamRecord_DataChangeRecord_ValueCaptureType { - p := new(ChangeStreamRecord_DataChangeRecord_ValueCaptureType) - *p = x - return p -} - -func (x ChangeStreamRecord_DataChangeRecord_ValueCaptureType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ChangeStreamRecord_DataChangeRecord_ValueCaptureType) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_change_stream_proto_enumTypes[1].Descriptor() -} - -func (ChangeStreamRecord_DataChangeRecord_ValueCaptureType) Type() protoreflect.EnumType { - return &file_google_spanner_v1_change_stream_proto_enumTypes[1] -} - -func (x ChangeStreamRecord_DataChangeRecord_ValueCaptureType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ChangeStreamRecord_DataChangeRecord_ValueCaptureType.Descriptor instead. -func (ChangeStreamRecord_DataChangeRecord_ValueCaptureType) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 0, 1} -} - -// Spanner Change Streams enable customers to capture and stream out changes to -// their Spanner databases in real-time. A change stream -// can be created with option partition_mode='IMMUTABLE_KEY_RANGE' or -// partition_mode='MUTABLE_KEY_RANGE'. -// -// This message is only used in Change Streams created with the option -// partition_mode='MUTABLE_KEY_RANGE'. Spanner automatically creates a special -// Table-Valued Function (TVF) along with each Change Streams. The function -// provides access to the change stream's records. The function is named -// READ_ (where is the -// name of the change stream), and it returns a table with only one column -// called ChangeRecord. -type ChangeStreamRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // One of the change stream subrecords. - // - // Types that are assignable to Record: - // - // *ChangeStreamRecord_DataChangeRecord_ - // *ChangeStreamRecord_HeartbeatRecord_ - // *ChangeStreamRecord_PartitionStartRecord_ - // *ChangeStreamRecord_PartitionEndRecord_ - // *ChangeStreamRecord_PartitionEventRecord_ - Record isChangeStreamRecord_Record `protobuf_oneof:"record"` -} - -func (x *ChangeStreamRecord) Reset() { - *x = ChangeStreamRecord{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord) ProtoMessage() {} - -func (x *ChangeStreamRecord) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0} -} - -func (m *ChangeStreamRecord) GetRecord() isChangeStreamRecord_Record { - if m != nil { - return m.Record - } - return nil -} - -func (x *ChangeStreamRecord) GetDataChangeRecord() *ChangeStreamRecord_DataChangeRecord { - if x, ok := x.GetRecord().(*ChangeStreamRecord_DataChangeRecord_); ok { - return x.DataChangeRecord - } - return nil -} - -func (x *ChangeStreamRecord) GetHeartbeatRecord() *ChangeStreamRecord_HeartbeatRecord { - if x, ok := x.GetRecord().(*ChangeStreamRecord_HeartbeatRecord_); ok { - return x.HeartbeatRecord - } - return nil -} - -func (x *ChangeStreamRecord) GetPartitionStartRecord() *ChangeStreamRecord_PartitionStartRecord { - if x, ok := x.GetRecord().(*ChangeStreamRecord_PartitionStartRecord_); ok { - return x.PartitionStartRecord - } - return nil -} - -func (x *ChangeStreamRecord) GetPartitionEndRecord() *ChangeStreamRecord_PartitionEndRecord { - if x, ok := x.GetRecord().(*ChangeStreamRecord_PartitionEndRecord_); ok { - return x.PartitionEndRecord - } - return nil -} - -func (x *ChangeStreamRecord) GetPartitionEventRecord() *ChangeStreamRecord_PartitionEventRecord { - if x, ok := x.GetRecord().(*ChangeStreamRecord_PartitionEventRecord_); ok { - return x.PartitionEventRecord - } - return nil -} - -type isChangeStreamRecord_Record interface { - isChangeStreamRecord_Record() -} - -type ChangeStreamRecord_DataChangeRecord_ struct { - // Data change record describing a data change for a change stream - // partition. - DataChangeRecord *ChangeStreamRecord_DataChangeRecord `protobuf:"bytes,1,opt,name=data_change_record,json=dataChangeRecord,proto3,oneof"` -} - -type ChangeStreamRecord_HeartbeatRecord_ struct { - // Heartbeat record describing a heartbeat for a change stream partition. - HeartbeatRecord *ChangeStreamRecord_HeartbeatRecord `protobuf:"bytes,2,opt,name=heartbeat_record,json=heartbeatRecord,proto3,oneof"` -} - -type ChangeStreamRecord_PartitionStartRecord_ struct { - // Partition start record describing a new change stream partition. - PartitionStartRecord *ChangeStreamRecord_PartitionStartRecord `protobuf:"bytes,3,opt,name=partition_start_record,json=partitionStartRecord,proto3,oneof"` -} - -type ChangeStreamRecord_PartitionEndRecord_ struct { - // Partition end record describing a terminated change stream partition. - PartitionEndRecord *ChangeStreamRecord_PartitionEndRecord `protobuf:"bytes,4,opt,name=partition_end_record,json=partitionEndRecord,proto3,oneof"` -} - -type ChangeStreamRecord_PartitionEventRecord_ struct { - // Partition event record describing key range changes for a change stream - // partition. - PartitionEventRecord *ChangeStreamRecord_PartitionEventRecord `protobuf:"bytes,5,opt,name=partition_event_record,json=partitionEventRecord,proto3,oneof"` -} - -func (*ChangeStreamRecord_DataChangeRecord_) isChangeStreamRecord_Record() {} - -func (*ChangeStreamRecord_HeartbeatRecord_) isChangeStreamRecord_Record() {} - -func (*ChangeStreamRecord_PartitionStartRecord_) isChangeStreamRecord_Record() {} - -func (*ChangeStreamRecord_PartitionEndRecord_) isChangeStreamRecord_Record() {} - -func (*ChangeStreamRecord_PartitionEventRecord_) isChangeStreamRecord_Record() {} - -// A data change record contains a set of changes to a table with the same -// modification type (insert, update, or delete) committed at the same commit -// timestamp in one change stream partition for the same transaction. Multiple -// data change records can be returned for the same transaction across -// multiple change stream partitions. -type ChangeStreamRecord_DataChangeRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Indicates the timestamp in which the change was committed. - // DataChangeRecord.commit_timestamps, - // PartitionStartRecord.start_timestamps, - // PartitionEventRecord.commit_timestamps, and - // PartitionEndRecord.end_timestamps can have the same value in the same - // partition. - CommitTimestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=commit_timestamp,json=commitTimestamp,proto3" json:"commit_timestamp,omitempty"` - // Record sequence numbers are unique and monotonically increasing (but not - // necessarily contiguous) for a specific timestamp across record - // types in the same partition. To guarantee ordered processing, the reader - // should process records (of potentially different types) in - // record_sequence order for a specific timestamp in the same partition. - // - // The record sequence number ordering across partitions is only meaningful - // in the context of a specific transaction. Record sequence numbers are - // unique across partitions for a specific transaction. Sort the - // DataChangeRecords for the same - // [server_transaction_id][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.server_transaction_id] - // by - // [record_sequence][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.record_sequence] - // to reconstruct the ordering of the changes within the transaction. - RecordSequence string `protobuf:"bytes,2,opt,name=record_sequence,json=recordSequence,proto3" json:"record_sequence,omitempty"` - // Provides a globally unique string that represents the transaction in - // which the change was committed. Multiple transactions can have the same - // commit timestamp, but each transaction has a unique - // server_transaction_id. - ServerTransactionId string `protobuf:"bytes,3,opt,name=server_transaction_id,json=serverTransactionId,proto3" json:"server_transaction_id,omitempty"` - // Indicates whether this is the last record for a transaction in the - // - // current partition. Clients can use this field to determine when all - // records for a transaction in the current partition have been received. - IsLastRecordInTransactionInPartition bool `protobuf:"varint,4,opt,name=is_last_record_in_transaction_in_partition,json=isLastRecordInTransactionInPartition,proto3" json:"is_last_record_in_transaction_in_partition,omitempty"` - // Name of the table affected by the change. - Table string `protobuf:"bytes,5,opt,name=table,proto3" json:"table,omitempty"` - // Provides metadata describing the columns associated with the - // [mods][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.mods] listed - // below. - ColumnMetadata []*ChangeStreamRecord_DataChangeRecord_ColumnMetadata `protobuf:"bytes,6,rep,name=column_metadata,json=columnMetadata,proto3" json:"column_metadata,omitempty"` - // Describes the changes that were made. - Mods []*ChangeStreamRecord_DataChangeRecord_Mod `protobuf:"bytes,7,rep,name=mods,proto3" json:"mods,omitempty"` - // Describes the type of change. - ModType ChangeStreamRecord_DataChangeRecord_ModType `protobuf:"varint,8,opt,name=mod_type,json=modType,proto3,enum=google.spanner.v1.ChangeStreamRecord_DataChangeRecord_ModType" json:"mod_type,omitempty"` - // Describes the value capture type that was specified in the change stream - // configuration when this change was captured. - ValueCaptureType ChangeStreamRecord_DataChangeRecord_ValueCaptureType `protobuf:"varint,9,opt,name=value_capture_type,json=valueCaptureType,proto3,enum=google.spanner.v1.ChangeStreamRecord_DataChangeRecord_ValueCaptureType" json:"value_capture_type,omitempty"` - // Indicates the number of data change records that are part of this - // transaction across all change stream partitions. This value can be used - // to assemble all the records associated with a particular transaction. - NumberOfRecordsInTransaction int32 `protobuf:"varint,10,opt,name=number_of_records_in_transaction,json=numberOfRecordsInTransaction,proto3" json:"number_of_records_in_transaction,omitempty"` - // Indicates the number of partitions that return data change records for - // this transaction. This value can be helpful in assembling all records - // associated with a particular transaction. - NumberOfPartitionsInTransaction int32 `protobuf:"varint,11,opt,name=number_of_partitions_in_transaction,json=numberOfPartitionsInTransaction,proto3" json:"number_of_partitions_in_transaction,omitempty"` - // Indicates the transaction tag associated with this transaction. - TransactionTag string `protobuf:"bytes,12,opt,name=transaction_tag,json=transactionTag,proto3" json:"transaction_tag,omitempty"` - // Indicates whether the transaction is a system transaction. System - // transactions include those issued by time-to-live (TTL), column backfill, - // etc. - IsSystemTransaction bool `protobuf:"varint,13,opt,name=is_system_transaction,json=isSystemTransaction,proto3" json:"is_system_transaction,omitempty"` -} - -func (x *ChangeStreamRecord_DataChangeRecord) Reset() { - *x = ChangeStreamRecord_DataChangeRecord{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_DataChangeRecord) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_DataChangeRecord) ProtoMessage() {} - -func (x *ChangeStreamRecord_DataChangeRecord) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_DataChangeRecord.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_DataChangeRecord) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetCommitTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.CommitTimestamp - } - return nil -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetRecordSequence() string { - if x != nil { - return x.RecordSequence - } - return "" -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetServerTransactionId() string { - if x != nil { - return x.ServerTransactionId - } - return "" -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetIsLastRecordInTransactionInPartition() bool { - if x != nil { - return x.IsLastRecordInTransactionInPartition - } - return false -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetTable() string { - if x != nil { - return x.Table - } - return "" -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetColumnMetadata() []*ChangeStreamRecord_DataChangeRecord_ColumnMetadata { - if x != nil { - return x.ColumnMetadata - } - return nil -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetMods() []*ChangeStreamRecord_DataChangeRecord_Mod { - if x != nil { - return x.Mods - } - return nil -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetModType() ChangeStreamRecord_DataChangeRecord_ModType { - if x != nil { - return x.ModType - } - return ChangeStreamRecord_DataChangeRecord_MOD_TYPE_UNSPECIFIED -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetValueCaptureType() ChangeStreamRecord_DataChangeRecord_ValueCaptureType { - if x != nil { - return x.ValueCaptureType - } - return ChangeStreamRecord_DataChangeRecord_VALUE_CAPTURE_TYPE_UNSPECIFIED -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetNumberOfRecordsInTransaction() int32 { - if x != nil { - return x.NumberOfRecordsInTransaction - } - return 0 -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetNumberOfPartitionsInTransaction() int32 { - if x != nil { - return x.NumberOfPartitionsInTransaction - } - return 0 -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetTransactionTag() string { - if x != nil { - return x.TransactionTag - } - return "" -} - -func (x *ChangeStreamRecord_DataChangeRecord) GetIsSystemTransaction() bool { - if x != nil { - return x.IsSystemTransaction - } - return false -} - -// A heartbeat record is returned as a progress indicator, when there are no -// data changes or any other partition record types in the change stream -// partition. -type ChangeStreamRecord_HeartbeatRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Indicates the timestamp at which the query has returned all the records - // in the change stream partition with timestamp <= heartbeat timestamp. - // The heartbeat timestamp will not be the same as the timestamps of other - // record types in the same partition. - Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (x *ChangeStreamRecord_HeartbeatRecord) Reset() { - *x = ChangeStreamRecord_HeartbeatRecord{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_HeartbeatRecord) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_HeartbeatRecord) ProtoMessage() {} - -func (x *ChangeStreamRecord_HeartbeatRecord) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_HeartbeatRecord.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_HeartbeatRecord) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 1} -} - -func (x *ChangeStreamRecord_HeartbeatRecord) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -// A partition start record serves as a notification that the client should -// schedule the partitions to be queried. PartitionStartRecord returns -// information about one or more partitions. -type ChangeStreamRecord_PartitionStartRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Start timestamp at which the partitions should be queried to return - // change stream records with timestamps >= start_timestamp. - // DataChangeRecord.commit_timestamps, - // PartitionStartRecord.start_timestamps, - // PartitionEventRecord.commit_timestamps, and - // PartitionEndRecord.end_timestamps can have the same value in the same - // partition. - StartTimestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"` - // Record sequence numbers are unique and monotonically increasing (but not - // necessarily contiguous) for a specific timestamp across record - // types in the same partition. To guarantee ordered processing, the reader - // should process records (of potentially different types) in - // record_sequence order for a specific timestamp in the same partition. - RecordSequence string `protobuf:"bytes,2,opt,name=record_sequence,json=recordSequence,proto3" json:"record_sequence,omitempty"` - // Unique partition identifiers to be used in queries. - PartitionTokens []string `protobuf:"bytes,3,rep,name=partition_tokens,json=partitionTokens,proto3" json:"partition_tokens,omitempty"` -} - -func (x *ChangeStreamRecord_PartitionStartRecord) Reset() { - *x = ChangeStreamRecord_PartitionStartRecord{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_PartitionStartRecord) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_PartitionStartRecord) ProtoMessage() {} - -func (x *ChangeStreamRecord_PartitionStartRecord) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_PartitionStartRecord.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_PartitionStartRecord) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 2} -} - -func (x *ChangeStreamRecord_PartitionStartRecord) GetStartTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.StartTimestamp - } - return nil -} - -func (x *ChangeStreamRecord_PartitionStartRecord) GetRecordSequence() string { - if x != nil { - return x.RecordSequence - } - return "" -} - -func (x *ChangeStreamRecord_PartitionStartRecord) GetPartitionTokens() []string { - if x != nil { - return x.PartitionTokens - } - return nil -} - -// A partition end record serves as a notification that the client should stop -// reading the partition. No further records are expected to be retrieved on -// it. -type ChangeStreamRecord_PartitionEndRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // End timestamp at which the change stream partition is terminated. All - // changes generated by this partition will have timestamps <= - // end_timestamp. DataChangeRecord.commit_timestamps, - // PartitionStartRecord.start_timestamps, - // PartitionEventRecord.commit_timestamps, and - // PartitionEndRecord.end_timestamps can have the same value in the same - // partition. PartitionEndRecord is the last record returned for a - // partition. - EndTimestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=end_timestamp,json=endTimestamp,proto3" json:"end_timestamp,omitempty"` - // Record sequence numbers are unique and monotonically increasing (but not - // necessarily contiguous) for a specific timestamp across record - // types in the same partition. To guarantee ordered processing, the reader - // should process records (of potentially different types) in - // record_sequence order for a specific timestamp in the same partition. - RecordSequence string `protobuf:"bytes,2,opt,name=record_sequence,json=recordSequence,proto3" json:"record_sequence,omitempty"` - // Unique partition identifier describing the terminated change stream - // partition. - // [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.partition_token] - // is equal to the partition token of the change stream partition currently - // queried to return this PartitionEndRecord. - PartitionToken string `protobuf:"bytes,3,opt,name=partition_token,json=partitionToken,proto3" json:"partition_token,omitempty"` -} - -func (x *ChangeStreamRecord_PartitionEndRecord) Reset() { - *x = ChangeStreamRecord_PartitionEndRecord{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_PartitionEndRecord) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_PartitionEndRecord) ProtoMessage() {} - -func (x *ChangeStreamRecord_PartitionEndRecord) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_PartitionEndRecord.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_PartitionEndRecord) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 3} -} - -func (x *ChangeStreamRecord_PartitionEndRecord) GetEndTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.EndTimestamp - } - return nil -} - -func (x *ChangeStreamRecord_PartitionEndRecord) GetRecordSequence() string { - if x != nil { - return x.RecordSequence - } - return "" -} - -func (x *ChangeStreamRecord_PartitionEndRecord) GetPartitionToken() string { - if x != nil { - return x.PartitionToken - } - return "" -} - -// A partition event record describes key range changes for a change stream -// partition. The changes to a row defined by its primary key can be captured -// in one change stream partition for a specific time range, and then be -// captured in a different change stream partition for a different time range. -// This movement of key ranges across change stream partitions is a reflection -// of activities, such as Spanner's dynamic splitting and load balancing, etc. -// Processing this event is needed if users want to guarantee processing of -// the changes for any key in timestamp order. If time ordered processing of -// changes for a primary key is not needed, this event can be ignored. -// To guarantee time ordered processing for each primary key, if the event -// describes move-ins, the reader of this partition needs to wait until the -// readers of the source partitions have processed all records with timestamps -// <= this PartitionEventRecord.commit_timestamp, before advancing beyond this -// PartitionEventRecord. If the event describes move-outs, the reader can -// notify the readers of the destination partitions that they can continue -// processing. -type ChangeStreamRecord_PartitionEventRecord struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Indicates the commit timestamp at which the key range change occurred. - // DataChangeRecord.commit_timestamps, - // PartitionStartRecord.start_timestamps, - // PartitionEventRecord.commit_timestamps, and - // PartitionEndRecord.end_timestamps can have the same value in the same - // partition. - CommitTimestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=commit_timestamp,json=commitTimestamp,proto3" json:"commit_timestamp,omitempty"` - // Record sequence numbers are unique and monotonically increasing (but not - // necessarily contiguous) for a specific timestamp across record - // types in the same partition. To guarantee ordered processing, the reader - // should process records (of potentially different types) in - // record_sequence order for a specific timestamp in the same partition. - RecordSequence string `protobuf:"bytes,2,opt,name=record_sequence,json=recordSequence,proto3" json:"record_sequence,omitempty"` - // Unique partition identifier describing the partition this event - // occurred on. - // [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token] - // is equal to the partition token of the change stream partition currently - // queried to return this PartitionEventRecord. - PartitionToken string `protobuf:"bytes,3,opt,name=partition_token,json=partitionToken,proto3" json:"partition_token,omitempty"` - // Set when one or more key ranges are moved into the change stream - // partition identified by - // [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token]. - // - // Example: Two key ranges are moved into partition (P1) from partition (P2) - // and partition (P3) in a single transaction at timestamp T. - // - // The PartitionEventRecord returned in P1 will reflect the move as: - // - // PartitionEventRecord { - // commit_timestamp: T - // partition_token: "P1" - // move_in_events { - // source_partition_token: "P2" - // } - // move_in_events { - // source_partition_token: "P3" - // } - // } - // - // The PartitionEventRecord returned in P2 will reflect the move as: - // - // PartitionEventRecord { - // commit_timestamp: T - // partition_token: "P2" - // move_out_events { - // destination_partition_token: "P1" - // } - // } - // - // The PartitionEventRecord returned in P3 will reflect the move as: - // - // PartitionEventRecord { - // commit_timestamp: T - // partition_token: "P3" - // move_out_events { - // destination_partition_token: "P1" - // } - // } - MoveInEvents []*ChangeStreamRecord_PartitionEventRecord_MoveInEvent `protobuf:"bytes,4,rep,name=move_in_events,json=moveInEvents,proto3" json:"move_in_events,omitempty"` - // Set when one or more key ranges are moved out of the change stream - // partition identified by - // [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token]. - // - // Example: Two key ranges are moved out of partition (P1) to partition (P2) - // and partition (P3) in a single transaction at timestamp T. - // - // The PartitionEventRecord returned in P1 will reflect the move as: - // - // PartitionEventRecord { - // commit_timestamp: T - // partition_token: "P1" - // move_out_events { - // destination_partition_token: "P2" - // } - // move_out_events { - // destination_partition_token: "P3" - // } - // } - // - // The PartitionEventRecord returned in P2 will reflect the move as: - // - // PartitionEventRecord { - // commit_timestamp: T - // partition_token: "P2" - // move_in_events { - // source_partition_token: "P1" - // } - // } - // - // The PartitionEventRecord returned in P3 will reflect the move as: - // - // PartitionEventRecord { - // commit_timestamp: T - // partition_token: "P3" - // move_in_events { - // source_partition_token: "P1" - // } - // } - MoveOutEvents []*ChangeStreamRecord_PartitionEventRecord_MoveOutEvent `protobuf:"bytes,5,rep,name=move_out_events,json=moveOutEvents,proto3" json:"move_out_events,omitempty"` -} - -func (x *ChangeStreamRecord_PartitionEventRecord) Reset() { - *x = ChangeStreamRecord_PartitionEventRecord{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_PartitionEventRecord) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_PartitionEventRecord) ProtoMessage() {} - -func (x *ChangeStreamRecord_PartitionEventRecord) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_PartitionEventRecord.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_PartitionEventRecord) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 4} -} - -func (x *ChangeStreamRecord_PartitionEventRecord) GetCommitTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.CommitTimestamp - } - return nil -} - -func (x *ChangeStreamRecord_PartitionEventRecord) GetRecordSequence() string { - if x != nil { - return x.RecordSequence - } - return "" -} - -func (x *ChangeStreamRecord_PartitionEventRecord) GetPartitionToken() string { - if x != nil { - return x.PartitionToken - } - return "" -} - -func (x *ChangeStreamRecord_PartitionEventRecord) GetMoveInEvents() []*ChangeStreamRecord_PartitionEventRecord_MoveInEvent { - if x != nil { - return x.MoveInEvents - } - return nil -} - -func (x *ChangeStreamRecord_PartitionEventRecord) GetMoveOutEvents() []*ChangeStreamRecord_PartitionEventRecord_MoveOutEvent { - if x != nil { - return x.MoveOutEvents - } - return nil -} - -// Metadata for a column. -type ChangeStreamRecord_DataChangeRecord_ColumnMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Name of the column. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Type of the column. - Type *Type `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - // Indicates whether the column is a primary key column. - IsPrimaryKey bool `protobuf:"varint,3,opt,name=is_primary_key,json=isPrimaryKey,proto3" json:"is_primary_key,omitempty"` - // Ordinal position of the column based on the original table definition - // in the schema starting with a value of 1. - OrdinalPosition int64 `protobuf:"varint,4,opt,name=ordinal_position,json=ordinalPosition,proto3" json:"ordinal_position,omitempty"` -} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) Reset() { - *x = ChangeStreamRecord_DataChangeRecord_ColumnMetadata{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_DataChangeRecord_ColumnMetadata) ProtoMessage() {} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_DataChangeRecord_ColumnMetadata.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_DataChangeRecord_ColumnMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 0, 0} -} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) GetType() *Type { - if x != nil { - return x.Type - } - return nil -} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) GetIsPrimaryKey() bool { - if x != nil { - return x.IsPrimaryKey - } - return false -} - -func (x *ChangeStreamRecord_DataChangeRecord_ColumnMetadata) GetOrdinalPosition() int64 { - if x != nil { - return x.OrdinalPosition - } - return 0 -} - -// Returns the value and associated metadata for a particular field of the -// [Mod][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod]. -type ChangeStreamRecord_DataChangeRecord_ModValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Index within the repeated - // [column_metadata][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.column_metadata] - // field, to obtain the column metadata for the column that was modified. - ColumnMetadataIndex int32 `protobuf:"varint,1,opt,name=column_metadata_index,json=columnMetadataIndex,proto3" json:"column_metadata_index,omitempty"` - // The value of the column. - Value *structpb.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *ChangeStreamRecord_DataChangeRecord_ModValue) Reset() { - *x = ChangeStreamRecord_DataChangeRecord_ModValue{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_DataChangeRecord_ModValue) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_DataChangeRecord_ModValue) ProtoMessage() {} - -func (x *ChangeStreamRecord_DataChangeRecord_ModValue) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_DataChangeRecord_ModValue.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_DataChangeRecord_ModValue) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 0, 1} -} - -func (x *ChangeStreamRecord_DataChangeRecord_ModValue) GetColumnMetadataIndex() int32 { - if x != nil { - return x.ColumnMetadataIndex - } - return 0 -} - -func (x *ChangeStreamRecord_DataChangeRecord_ModValue) GetValue() *structpb.Value { - if x != nil { - return x.Value - } - return nil -} - -// A mod describes all data changes in a watched table row. -type ChangeStreamRecord_DataChangeRecord_Mod struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Returns the value of the primary key of the modified row. - Keys []*ChangeStreamRecord_DataChangeRecord_ModValue `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` - // Returns the old values before the change for the modified columns. - // Always empty for - // [INSERT][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType.INSERT], - // or if old values are not being captured specified by - // [value_capture_type][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType]. - OldValues []*ChangeStreamRecord_DataChangeRecord_ModValue `protobuf:"bytes,2,rep,name=old_values,json=oldValues,proto3" json:"old_values,omitempty"` - // Returns the new values after the change for the modified columns. - // Always empty for - // [DELETE][google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType.DELETE]. - NewValues []*ChangeStreamRecord_DataChangeRecord_ModValue `protobuf:"bytes,3,rep,name=new_values,json=newValues,proto3" json:"new_values,omitempty"` -} - -func (x *ChangeStreamRecord_DataChangeRecord_Mod) Reset() { - *x = ChangeStreamRecord_DataChangeRecord_Mod{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_DataChangeRecord_Mod) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_DataChangeRecord_Mod) ProtoMessage() {} - -func (x *ChangeStreamRecord_DataChangeRecord_Mod) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_DataChangeRecord_Mod.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_DataChangeRecord_Mod) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 0, 2} -} - -func (x *ChangeStreamRecord_DataChangeRecord_Mod) GetKeys() []*ChangeStreamRecord_DataChangeRecord_ModValue { - if x != nil { - return x.Keys - } - return nil -} - -func (x *ChangeStreamRecord_DataChangeRecord_Mod) GetOldValues() []*ChangeStreamRecord_DataChangeRecord_ModValue { - if x != nil { - return x.OldValues - } - return nil -} - -func (x *ChangeStreamRecord_DataChangeRecord_Mod) GetNewValues() []*ChangeStreamRecord_DataChangeRecord_ModValue { - if x != nil { - return x.NewValues - } - return nil -} - -// Describes move-in of the key ranges into the change stream partition -// identified by -// [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token]. -// -// To maintain processing the changes for a particular key in timestamp -// order, the query processing the change stream partition identified by -// [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token] -// should not advance beyond the partition event record commit timestamp -// until the queries processing the source change stream partitions have -// processed all change stream records with timestamps <= the partition -// event record commit timestamp. -type ChangeStreamRecord_PartitionEventRecord_MoveInEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // An unique partition identifier describing the source change stream - // partition that recorded changes for the key range that is moving - // into this partition. - SourcePartitionToken string `protobuf:"bytes,1,opt,name=source_partition_token,json=sourcePartitionToken,proto3" json:"source_partition_token,omitempty"` -} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveInEvent) Reset() { - *x = ChangeStreamRecord_PartitionEventRecord_MoveInEvent{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveInEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_PartitionEventRecord_MoveInEvent) ProtoMessage() {} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveInEvent) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_PartitionEventRecord_MoveInEvent.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_PartitionEventRecord_MoveInEvent) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 4, 0} -} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveInEvent) GetSourcePartitionToken() string { - if x != nil { - return x.SourcePartitionToken - } - return "" -} - -// Describes move-out of the key ranges out of the change stream partition -// identified by -// [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token]. -// -// To maintain processing the changes for a particular key in timestamp -// order, the query processing the -// [MoveOutEvent][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent] -// in the partition identified by -// [partition_token][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.partition_token] -// should inform the queries processing the destination partitions that -// they can unblock and proceed processing records past the -// [commit_timestamp][google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.commit_timestamp]. -type ChangeStreamRecord_PartitionEventRecord_MoveOutEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // An unique partition identifier describing the destination change - // stream partition that will record changes for the key range that is - // moving out of this partition. - DestinationPartitionToken string `protobuf:"bytes,1,opt,name=destination_partition_token,json=destinationPartitionToken,proto3" json:"destination_partition_token,omitempty"` -} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveOutEvent) Reset() { - *x = ChangeStreamRecord_PartitionEventRecord_MoveOutEvent{} - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveOutEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeStreamRecord_PartitionEventRecord_MoveOutEvent) ProtoMessage() {} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveOutEvent) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_change_stream_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeStreamRecord_PartitionEventRecord_MoveOutEvent.ProtoReflect.Descriptor instead. -func (*ChangeStreamRecord_PartitionEventRecord_MoveOutEvent) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_change_stream_proto_rawDescGZIP(), []int{0, 4, 1} -} - -func (x *ChangeStreamRecord_PartitionEventRecord_MoveOutEvent) GetDestinationPartitionToken() string { - if x != nil { - return x.DestinationPartitionToken - } - return "" -} - -var File_google_spanner_v1_change_stream_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_change_stream_proto_rawDesc = []byte{ - 0x0a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x19, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x66, - 0x0a, 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x48, 0x00, 0x52, 0x10, 0x64, 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x62, 0x0a, 0x10, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x0f, 0x68, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x72, 0x0a, 0x16, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x6c, - 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x72, 0x0a, 0x16, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x1a, 0xae, 0x0d, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x2a, 0x69, 0x73, 0x5f, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x24, 0x69, - 0x73, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x6e, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, - 0x4d, 0x6f, 0x64, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x73, 0x12, 0x59, 0x0a, 0x08, 0x6d, 0x6f, 0x64, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x2e, 0x4d, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x75, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, - 0x70, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x47, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x61, - 0x70, 0x74, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, - 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x23, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x1f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x61, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x12, 0x32, 0x0a, 0x15, 0x69, 0x73, - 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x73, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa2, - 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x6c, 0x0a, 0x08, 0x4d, 0x6f, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x32, 0x0a, 0x15, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x1a, 0x9a, 0x02, 0x0a, 0x03, 0x4d, 0x6f, 0x64, 0x12, 0x53, 0x0a, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, - 0x4d, 0x6f, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x5e, - 0x0a, 0x0a, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x4d, 0x6f, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x5e, - 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x4d, 0x6f, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x47, - 0x0a, 0x07, 0x4d, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x4f, 0x44, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x0a, 0x12, - 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x14, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x1e, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e, - 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x43, 0x41, 0x50, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x4c, 0x44, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x4e, 0x45, 0x57, 0x5f, - 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x57, 0x5f, - 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x10, 0x14, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x45, 0x57, 0x5f, - 0x52, 0x4f, 0x57, 0x10, 0x1e, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x45, 0x57, 0x5f, 0x52, 0x4f, 0x57, - 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x4f, 0x4c, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x10, - 0x28, 0x1a, 0x4b, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0xaf, - 0x01, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x43, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x1a, 0xa7, 0x01, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0xa3, 0x04, 0x0a, 0x14, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x6c, 0x0a, 0x0e, - 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x6d, 0x6f, - 0x76, 0x65, 0x49, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x6f, 0x0a, 0x0f, 0x6d, 0x6f, - 0x76, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, - 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6d, 0x6f, - 0x76, 0x65, 0x4f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x43, 0x0a, 0x0b, 0x4d, - 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x1a, 0x4e, 0x0a, 0x0c, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x3e, 0x0a, 0x1b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x42, 0xb4, 0x01, 0x0a, 0x15, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x42, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, - 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, - 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x56, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_change_stream_proto_rawDescOnce sync.Once - file_google_spanner_v1_change_stream_proto_rawDescData = file_google_spanner_v1_change_stream_proto_rawDesc -) - -func file_google_spanner_v1_change_stream_proto_rawDescGZIP() []byte { - file_google_spanner_v1_change_stream_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_change_stream_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_change_stream_proto_rawDescData) - }) - return file_google_spanner_v1_change_stream_proto_rawDescData -} - -var file_google_spanner_v1_change_stream_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_google_spanner_v1_change_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 11) -var file_google_spanner_v1_change_stream_proto_goTypes = []any{ - (ChangeStreamRecord_DataChangeRecord_ModType)(0), // 0: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType - (ChangeStreamRecord_DataChangeRecord_ValueCaptureType)(0), // 1: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType - (*ChangeStreamRecord)(nil), // 2: google.spanner.v1.ChangeStreamRecord - (*ChangeStreamRecord_DataChangeRecord)(nil), // 3: google.spanner.v1.ChangeStreamRecord.DataChangeRecord - (*ChangeStreamRecord_HeartbeatRecord)(nil), // 4: google.spanner.v1.ChangeStreamRecord.HeartbeatRecord - (*ChangeStreamRecord_PartitionStartRecord)(nil), // 5: google.spanner.v1.ChangeStreamRecord.PartitionStartRecord - (*ChangeStreamRecord_PartitionEndRecord)(nil), // 6: google.spanner.v1.ChangeStreamRecord.PartitionEndRecord - (*ChangeStreamRecord_PartitionEventRecord)(nil), // 7: google.spanner.v1.ChangeStreamRecord.PartitionEventRecord - (*ChangeStreamRecord_DataChangeRecord_ColumnMetadata)(nil), // 8: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata - (*ChangeStreamRecord_DataChangeRecord_ModValue)(nil), // 9: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue - (*ChangeStreamRecord_DataChangeRecord_Mod)(nil), // 10: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod - (*ChangeStreamRecord_PartitionEventRecord_MoveInEvent)(nil), // 11: google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent - (*ChangeStreamRecord_PartitionEventRecord_MoveOutEvent)(nil), // 12: google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent - (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp - (*Type)(nil), // 14: google.spanner.v1.Type - (*structpb.Value)(nil), // 15: google.protobuf.Value -} -var file_google_spanner_v1_change_stream_proto_depIdxs = []int32{ - 3, // 0: google.spanner.v1.ChangeStreamRecord.data_change_record:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord - 4, // 1: google.spanner.v1.ChangeStreamRecord.heartbeat_record:type_name -> google.spanner.v1.ChangeStreamRecord.HeartbeatRecord - 5, // 2: google.spanner.v1.ChangeStreamRecord.partition_start_record:type_name -> google.spanner.v1.ChangeStreamRecord.PartitionStartRecord - 6, // 3: google.spanner.v1.ChangeStreamRecord.partition_end_record:type_name -> google.spanner.v1.ChangeStreamRecord.PartitionEndRecord - 7, // 4: google.spanner.v1.ChangeStreamRecord.partition_event_record:type_name -> google.spanner.v1.ChangeStreamRecord.PartitionEventRecord - 13, // 5: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.commit_timestamp:type_name -> google.protobuf.Timestamp - 8, // 6: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.column_metadata:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata - 10, // 7: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.mods:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod - 0, // 8: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.mod_type:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType - 1, // 9: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.value_capture_type:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType - 13, // 10: google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.timestamp:type_name -> google.protobuf.Timestamp - 13, // 11: google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.start_timestamp:type_name -> google.protobuf.Timestamp - 13, // 12: google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.end_timestamp:type_name -> google.protobuf.Timestamp - 13, // 13: google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.commit_timestamp:type_name -> google.protobuf.Timestamp - 11, // 14: google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.move_in_events:type_name -> google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent - 12, // 15: google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.move_out_events:type_name -> google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent - 14, // 16: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.type:type_name -> google.spanner.v1.Type - 15, // 17: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.value:type_name -> google.protobuf.Value - 9, // 18: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.keys:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue - 9, // 19: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.old_values:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue - 9, // 20: google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.new_values:type_name -> google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue - 21, // [21:21] is the sub-list for method output_type - 21, // [21:21] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_change_stream_proto_init() } -func file_google_spanner_v1_change_stream_proto_init() { - if File_google_spanner_v1_change_stream_proto != nil { - return - } - file_google_spanner_v1_type_proto_init() - file_google_spanner_v1_change_stream_proto_msgTypes[0].OneofWrappers = []any{ - (*ChangeStreamRecord_DataChangeRecord_)(nil), - (*ChangeStreamRecord_HeartbeatRecord_)(nil), - (*ChangeStreamRecord_PartitionStartRecord_)(nil), - (*ChangeStreamRecord_PartitionEndRecord_)(nil), - (*ChangeStreamRecord_PartitionEventRecord_)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_change_stream_proto_rawDesc, - NumEnums: 2, - NumMessages: 11, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_change_stream_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_change_stream_proto_depIdxs, - EnumInfos: file_google_spanner_v1_change_stream_proto_enumTypes, - MessageInfos: file_google_spanner_v1_change_stream_proto_msgTypes, - }.Build() - File_google_spanner_v1_change_stream_proto = out.File - file_google_spanner_v1_change_stream_proto_rawDesc = nil - file_google_spanner_v1_change_stream_proto_goTypes = nil - file_google_spanner_v1_change_stream_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/commit_response.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/commit_response.pb.go deleted file mode 100644 index ce31f15243..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/commit_response.pb.go +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/commit_response.proto - -package spannerpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The response for [Commit][google.spanner.v1.Spanner.Commit]. -type CommitResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The Cloud Spanner timestamp at which the transaction committed. - CommitTimestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=commit_timestamp,json=commitTimestamp,proto3" json:"commit_timestamp,omitempty"` - // The statistics about this `Commit`. Not returned by default. - // For more information, see - // [CommitRequest.return_commit_stats][google.spanner.v1.CommitRequest.return_commit_stats]. - CommitStats *CommitResponse_CommitStats `protobuf:"bytes,2,opt,name=commit_stats,json=commitStats,proto3" json:"commit_stats,omitempty"` - // You must examine and retry the commit if the following is populated. - // - // Types that are assignable to MultiplexedSessionRetry: - // - // *CommitResponse_PrecommitToken - MultiplexedSessionRetry isCommitResponse_MultiplexedSessionRetry `protobuf_oneof:"MultiplexedSessionRetry"` - // If `TransactionOptions.isolation_level` is set to - // `IsolationLevel.REPEATABLE_READ`, then the snapshot timestamp is the - // timestamp at which all reads in the transaction ran. This timestamp is - // never returned. - SnapshotTimestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=snapshot_timestamp,json=snapshotTimestamp,proto3" json:"snapshot_timestamp,omitempty"` -} - -func (x *CommitResponse) Reset() { - *x = CommitResponse{} - mi := &file_google_spanner_v1_commit_response_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CommitResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CommitResponse) ProtoMessage() {} - -func (x *CommitResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_commit_response_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CommitResponse.ProtoReflect.Descriptor instead. -func (*CommitResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_commit_response_proto_rawDescGZIP(), []int{0} -} - -func (x *CommitResponse) GetCommitTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.CommitTimestamp - } - return nil -} - -func (x *CommitResponse) GetCommitStats() *CommitResponse_CommitStats { - if x != nil { - return x.CommitStats - } - return nil -} - -func (m *CommitResponse) GetMultiplexedSessionRetry() isCommitResponse_MultiplexedSessionRetry { - if m != nil { - return m.MultiplexedSessionRetry - } - return nil -} - -func (x *CommitResponse) GetPrecommitToken() *MultiplexedSessionPrecommitToken { - if x, ok := x.GetMultiplexedSessionRetry().(*CommitResponse_PrecommitToken); ok { - return x.PrecommitToken - } - return nil -} - -func (x *CommitResponse) GetSnapshotTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.SnapshotTimestamp - } - return nil -} - -type isCommitResponse_MultiplexedSessionRetry interface { - isCommitResponse_MultiplexedSessionRetry() -} - -type CommitResponse_PrecommitToken struct { - // If specified, transaction has not committed yet. - // You must retry the commit with the new precommit token. - PrecommitToken *MultiplexedSessionPrecommitToken `protobuf:"bytes,4,opt,name=precommit_token,json=precommitToken,proto3,oneof"` -} - -func (*CommitResponse_PrecommitToken) isCommitResponse_MultiplexedSessionRetry() {} - -// Additional statistics about a commit. -type CommitResponse_CommitStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The total number of mutations for the transaction. Knowing the - // `mutation_count` value can help you maximize the number of mutations - // in a transaction and minimize the number of API round trips. You can - // also monitor this value to prevent transactions from exceeding the system - // [limit](https://cloud.google.com/spanner/quotas#limits_for_creating_reading_updating_and_deleting_data). - // If the number of mutations exceeds the limit, the server returns - // [INVALID_ARGUMENT](https://cloud.google.com/spanner/docs/reference/rest/v1/Code#ENUM_VALUES.INVALID_ARGUMENT). - MutationCount int64 `protobuf:"varint,1,opt,name=mutation_count,json=mutationCount,proto3" json:"mutation_count,omitempty"` -} - -func (x *CommitResponse_CommitStats) Reset() { - *x = CommitResponse_CommitStats{} - mi := &file_google_spanner_v1_commit_response_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CommitResponse_CommitStats) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CommitResponse_CommitStats) ProtoMessage() {} - -func (x *CommitResponse_CommitStats) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_commit_response_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CommitResponse_CommitStats.ProtoReflect.Descriptor instead. -func (*CommitResponse_CommitStats) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_commit_response_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *CommitResponse_CommitStats) GetMutationCount() int64 { - if x != nil { - return x.MutationCount - } - return 0 -} - -var File_google_spanner_v1_commit_response_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_commit_response_proto_rawDesc = []byte{ - 0x0a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, - 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xa5, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x50, 0x0a, 0x0c, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x5e, - 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0e, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x49, - 0x0a, 0x12, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x34, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x75, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0d, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x42, - 0x19, 0x0a, 0x17, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x42, 0xb6, 0x01, 0x0a, 0x15, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x70, 0x62, 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, - 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_commit_response_proto_rawDescOnce sync.Once - file_google_spanner_v1_commit_response_proto_rawDescData = file_google_spanner_v1_commit_response_proto_rawDesc -) - -func file_google_spanner_v1_commit_response_proto_rawDescGZIP() []byte { - file_google_spanner_v1_commit_response_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_commit_response_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_commit_response_proto_rawDescData) - }) - return file_google_spanner_v1_commit_response_proto_rawDescData -} - -var file_google_spanner_v1_commit_response_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_google_spanner_v1_commit_response_proto_goTypes = []any{ - (*CommitResponse)(nil), // 0: google.spanner.v1.CommitResponse - (*CommitResponse_CommitStats)(nil), // 1: google.spanner.v1.CommitResponse.CommitStats - (*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp - (*MultiplexedSessionPrecommitToken)(nil), // 3: google.spanner.v1.MultiplexedSessionPrecommitToken -} -var file_google_spanner_v1_commit_response_proto_depIdxs = []int32{ - 2, // 0: google.spanner.v1.CommitResponse.commit_timestamp:type_name -> google.protobuf.Timestamp - 1, // 1: google.spanner.v1.CommitResponse.commit_stats:type_name -> google.spanner.v1.CommitResponse.CommitStats - 3, // 2: google.spanner.v1.CommitResponse.precommit_token:type_name -> google.spanner.v1.MultiplexedSessionPrecommitToken - 2, // 3: google.spanner.v1.CommitResponse.snapshot_timestamp:type_name -> google.protobuf.Timestamp - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_commit_response_proto_init() } -func file_google_spanner_v1_commit_response_proto_init() { - if File_google_spanner_v1_commit_response_proto != nil { - return - } - file_google_spanner_v1_transaction_proto_init() - file_google_spanner_v1_commit_response_proto_msgTypes[0].OneofWrappers = []any{ - (*CommitResponse_PrecommitToken)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_commit_response_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_commit_response_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_commit_response_proto_depIdxs, - MessageInfos: file_google_spanner_v1_commit_response_proto_msgTypes, - }.Build() - File_google_spanner_v1_commit_response_proto = out.File - file_google_spanner_v1_commit_response_proto_rawDesc = nil - file_google_spanner_v1_commit_response_proto_goTypes = nil - file_google_spanner_v1_commit_response_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/keys.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/keys.pb.go deleted file mode 100644 index 0445f6e2f9..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/keys.pb.go +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/keys.proto - -package spannerpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - structpb "google.golang.org/protobuf/types/known/structpb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// KeyRange represents a range of rows in a table or index. -// -// A range has a start key and an end key. These keys can be open or -// closed, indicating if the range includes rows with that key. -// -// Keys are represented by lists, where the ith value in the list -// corresponds to the ith component of the table or index primary key. -// Individual values are encoded as described -// [here][google.spanner.v1.TypeCode]. -// -// For example, consider the following table definition: -// -// CREATE TABLE UserEvents ( -// UserName STRING(MAX), -// EventDate STRING(10) -// ) PRIMARY KEY(UserName, EventDate); -// -// The following keys name rows in this table: -// -// ["Bob", "2014-09-23"] -// ["Alfred", "2015-06-12"] -// -// Since the `UserEvents` table's `PRIMARY KEY` clause names two -// columns, each `UserEvents` key has two elements; the first is the -// `UserName`, and the second is the `EventDate`. -// -// Key ranges with multiple components are interpreted -// lexicographically by component using the table or index key's declared -// sort order. For example, the following range returns all events for -// user `"Bob"` that occurred in the year 2015: -// -// "start_closed": ["Bob", "2015-01-01"] -// "end_closed": ["Bob", "2015-12-31"] -// -// Start and end keys can omit trailing key components. This affects the -// inclusion and exclusion of rows that exactly match the provided key -// components: if the key is closed, then rows that exactly match the -// provided components are included; if the key is open, then rows -// that exactly match are not included. -// -// For example, the following range includes all events for `"Bob"` that -// occurred during and after the year 2000: -// -// "start_closed": ["Bob", "2000-01-01"] -// "end_closed": ["Bob"] -// -// The next example retrieves all events for `"Bob"`: -// -// "start_closed": ["Bob"] -// "end_closed": ["Bob"] -// -// To retrieve events before the year 2000: -// -// "start_closed": ["Bob"] -// "end_open": ["Bob", "2000-01-01"] -// -// The following range includes all rows in the table: -// -// "start_closed": [] -// "end_closed": [] -// -// This range returns all users whose `UserName` begins with any -// character from A to C: -// -// "start_closed": ["A"] -// "end_open": ["D"] -// -// This range returns all users whose `UserName` begins with B: -// -// "start_closed": ["B"] -// "end_open": ["C"] -// -// Key ranges honor column sort order. For example, suppose a table is -// defined as follows: -// -// CREATE TABLE DescendingSortedTable { -// Key INT64, -// ... -// ) PRIMARY KEY(Key DESC); -// -// The following range retrieves all rows with key values between 1 -// and 100 inclusive: -// -// "start_closed": ["100"] -// "end_closed": ["1"] -// -// Note that 100 is passed as the start, and 1 is passed as the end, -// because `Key` is a descending column in the schema. -type KeyRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The start key must be provided. It can be either closed or open. - // - // Types that are assignable to StartKeyType: - // - // *KeyRange_StartClosed - // *KeyRange_StartOpen - StartKeyType isKeyRange_StartKeyType `protobuf_oneof:"start_key_type"` - // The end key must be provided. It can be either closed or open. - // - // Types that are assignable to EndKeyType: - // - // *KeyRange_EndClosed - // *KeyRange_EndOpen - EndKeyType isKeyRange_EndKeyType `protobuf_oneof:"end_key_type"` -} - -func (x *KeyRange) Reset() { - *x = KeyRange{} - mi := &file_google_spanner_v1_keys_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *KeyRange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*KeyRange) ProtoMessage() {} - -func (x *KeyRange) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_keys_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use KeyRange.ProtoReflect.Descriptor instead. -func (*KeyRange) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_keys_proto_rawDescGZIP(), []int{0} -} - -func (m *KeyRange) GetStartKeyType() isKeyRange_StartKeyType { - if m != nil { - return m.StartKeyType - } - return nil -} - -func (x *KeyRange) GetStartClosed() *structpb.ListValue { - if x, ok := x.GetStartKeyType().(*KeyRange_StartClosed); ok { - return x.StartClosed - } - return nil -} - -func (x *KeyRange) GetStartOpen() *structpb.ListValue { - if x, ok := x.GetStartKeyType().(*KeyRange_StartOpen); ok { - return x.StartOpen - } - return nil -} - -func (m *KeyRange) GetEndKeyType() isKeyRange_EndKeyType { - if m != nil { - return m.EndKeyType - } - return nil -} - -func (x *KeyRange) GetEndClosed() *structpb.ListValue { - if x, ok := x.GetEndKeyType().(*KeyRange_EndClosed); ok { - return x.EndClosed - } - return nil -} - -func (x *KeyRange) GetEndOpen() *structpb.ListValue { - if x, ok := x.GetEndKeyType().(*KeyRange_EndOpen); ok { - return x.EndOpen - } - return nil -} - -type isKeyRange_StartKeyType interface { - isKeyRange_StartKeyType() -} - -type KeyRange_StartClosed struct { - // If the start is closed, then the range includes all rows whose - // first `len(start_closed)` key columns exactly match `start_closed`. - StartClosed *structpb.ListValue `protobuf:"bytes,1,opt,name=start_closed,json=startClosed,proto3,oneof"` -} - -type KeyRange_StartOpen struct { - // If the start is open, then the range excludes rows whose first - // `len(start_open)` key columns exactly match `start_open`. - StartOpen *structpb.ListValue `protobuf:"bytes,2,opt,name=start_open,json=startOpen,proto3,oneof"` -} - -func (*KeyRange_StartClosed) isKeyRange_StartKeyType() {} - -func (*KeyRange_StartOpen) isKeyRange_StartKeyType() {} - -type isKeyRange_EndKeyType interface { - isKeyRange_EndKeyType() -} - -type KeyRange_EndClosed struct { - // If the end is closed, then the range includes all rows whose - // first `len(end_closed)` key columns exactly match `end_closed`. - EndClosed *structpb.ListValue `protobuf:"bytes,3,opt,name=end_closed,json=endClosed,proto3,oneof"` -} - -type KeyRange_EndOpen struct { - // If the end is open, then the range excludes rows whose first - // `len(end_open)` key columns exactly match `end_open`. - EndOpen *structpb.ListValue `protobuf:"bytes,4,opt,name=end_open,json=endOpen,proto3,oneof"` -} - -func (*KeyRange_EndClosed) isKeyRange_EndKeyType() {} - -func (*KeyRange_EndOpen) isKeyRange_EndKeyType() {} - -// `KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All -// the keys are expected to be in the same table or index. The keys need -// not be sorted in any particular way. -// -// If the same key is specified multiple times in the set (for example -// if two ranges, two keys, or a key and a range overlap), Cloud Spanner -// behaves as if the key were only specified once. -type KeySet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A list of specific keys. Entries in `keys` should have exactly as - // many elements as there are columns in the primary or index key - // with which this `KeySet` is used. Individual key values are - // encoded as described [here][google.spanner.v1.TypeCode]. - Keys []*structpb.ListValue `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` - // A list of key ranges. See [KeyRange][google.spanner.v1.KeyRange] for more information about - // key range specifications. - Ranges []*KeyRange `protobuf:"bytes,2,rep,name=ranges,proto3" json:"ranges,omitempty"` - // For convenience `all` can be set to `true` to indicate that this - // `KeySet` matches all keys in the table or index. Note that any keys - // specified in `keys` or `ranges` are only yielded once. - All bool `protobuf:"varint,3,opt,name=all,proto3" json:"all,omitempty"` -} - -func (x *KeySet) Reset() { - *x = KeySet{} - mi := &file_google_spanner_v1_keys_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *KeySet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*KeySet) ProtoMessage() {} - -func (x *KeySet) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_keys_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use KeySet.ProtoReflect.Descriptor instead. -func (*KeySet) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_keys_proto_rawDescGZIP(), []int{1} -} - -func (x *KeySet) GetKeys() []*structpb.ListValue { - if x != nil { - return x.Keys - } - return nil -} - -func (x *KeySet) GetRanges() []*KeyRange { - if x != nil { - return x.Ranges - } - return nil -} - -func (x *KeySet) GetAll() bool { - if x != nil { - return x.All - } - return false -} - -var File_google_spanner_v1_keys_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_keys_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xa0, 0x02, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x3b, 0x0a, - 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x6e, - 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x01, 0x52, 0x09, 0x65, 0x6e, - 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x6f, - 0x70, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x65, 0x6e, - 0x42, 0x10, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x7f, 0x0a, 0x06, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x04, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x33, 0x0a, 0x06, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, - 0x61, 0x6c, 0x6c, 0x42, 0xac, 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4b, - 0x65, 0x79, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, - 0x62, 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, - 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_keys_proto_rawDescOnce sync.Once - file_google_spanner_v1_keys_proto_rawDescData = file_google_spanner_v1_keys_proto_rawDesc -) - -func file_google_spanner_v1_keys_proto_rawDescGZIP() []byte { - file_google_spanner_v1_keys_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_keys_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_keys_proto_rawDescData) - }) - return file_google_spanner_v1_keys_proto_rawDescData -} - -var file_google_spanner_v1_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_google_spanner_v1_keys_proto_goTypes = []any{ - (*KeyRange)(nil), // 0: google.spanner.v1.KeyRange - (*KeySet)(nil), // 1: google.spanner.v1.KeySet - (*structpb.ListValue)(nil), // 2: google.protobuf.ListValue -} -var file_google_spanner_v1_keys_proto_depIdxs = []int32{ - 2, // 0: google.spanner.v1.KeyRange.start_closed:type_name -> google.protobuf.ListValue - 2, // 1: google.spanner.v1.KeyRange.start_open:type_name -> google.protobuf.ListValue - 2, // 2: google.spanner.v1.KeyRange.end_closed:type_name -> google.protobuf.ListValue - 2, // 3: google.spanner.v1.KeyRange.end_open:type_name -> google.protobuf.ListValue - 2, // 4: google.spanner.v1.KeySet.keys:type_name -> google.protobuf.ListValue - 0, // 5: google.spanner.v1.KeySet.ranges:type_name -> google.spanner.v1.KeyRange - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_keys_proto_init() } -func file_google_spanner_v1_keys_proto_init() { - if File_google_spanner_v1_keys_proto != nil { - return - } - file_google_spanner_v1_keys_proto_msgTypes[0].OneofWrappers = []any{ - (*KeyRange_StartClosed)(nil), - (*KeyRange_StartOpen)(nil), - (*KeyRange_EndClosed)(nil), - (*KeyRange_EndOpen)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_keys_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_keys_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_keys_proto_depIdxs, - MessageInfos: file_google_spanner_v1_keys_proto_msgTypes, - }.Build() - File_google_spanner_v1_keys_proto = out.File - file_google_spanner_v1_keys_proto_rawDesc = nil - file_google_spanner_v1_keys_proto_goTypes = nil - file_google_spanner_v1_keys_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/mutation.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/mutation.pb.go deleted file mode 100644 index 1bf770de4a..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/mutation.pb.go +++ /dev/null @@ -1,452 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/mutation.proto - -package spannerpb - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - structpb "google.golang.org/protobuf/types/known/structpb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A modification to one or more Cloud Spanner rows. Mutations can be -// applied to a Cloud Spanner database by sending them in a -// [Commit][google.spanner.v1.Spanner.Commit] call. -type Mutation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The operation to perform. - // - // Types that are assignable to Operation: - // - // *Mutation_Insert - // *Mutation_Update - // *Mutation_InsertOrUpdate - // *Mutation_Replace - // *Mutation_Delete_ - Operation isMutation_Operation `protobuf_oneof:"operation"` -} - -func (x *Mutation) Reset() { - *x = Mutation{} - mi := &file_google_spanner_v1_mutation_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Mutation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Mutation) ProtoMessage() {} - -func (x *Mutation) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_mutation_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Mutation.ProtoReflect.Descriptor instead. -func (*Mutation) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_mutation_proto_rawDescGZIP(), []int{0} -} - -func (m *Mutation) GetOperation() isMutation_Operation { - if m != nil { - return m.Operation - } - return nil -} - -func (x *Mutation) GetInsert() *Mutation_Write { - if x, ok := x.GetOperation().(*Mutation_Insert); ok { - return x.Insert - } - return nil -} - -func (x *Mutation) GetUpdate() *Mutation_Write { - if x, ok := x.GetOperation().(*Mutation_Update); ok { - return x.Update - } - return nil -} - -func (x *Mutation) GetInsertOrUpdate() *Mutation_Write { - if x, ok := x.GetOperation().(*Mutation_InsertOrUpdate); ok { - return x.InsertOrUpdate - } - return nil -} - -func (x *Mutation) GetReplace() *Mutation_Write { - if x, ok := x.GetOperation().(*Mutation_Replace); ok { - return x.Replace - } - return nil -} - -func (x *Mutation) GetDelete() *Mutation_Delete { - if x, ok := x.GetOperation().(*Mutation_Delete_); ok { - return x.Delete - } - return nil -} - -type isMutation_Operation interface { - isMutation_Operation() -} - -type Mutation_Insert struct { - // Insert new rows in a table. If any of the rows already exist, - // the write or transaction fails with error `ALREADY_EXISTS`. - Insert *Mutation_Write `protobuf:"bytes,1,opt,name=insert,proto3,oneof"` -} - -type Mutation_Update struct { - // Update existing rows in a table. If any of the rows does not - // already exist, the transaction fails with error `NOT_FOUND`. - Update *Mutation_Write `protobuf:"bytes,2,opt,name=update,proto3,oneof"` -} - -type Mutation_InsertOrUpdate struct { - // Like [insert][google.spanner.v1.Mutation.insert], except that if the row already exists, then - // its column values are overwritten with the ones provided. Any - // column values not explicitly written are preserved. - // - // When using [insert_or_update][google.spanner.v1.Mutation.insert_or_update], just as when using [insert][google.spanner.v1.Mutation.insert], all `NOT - // NULL` columns in the table must be given a value. This holds true - // even when the row already exists and will therefore actually be updated. - InsertOrUpdate *Mutation_Write `protobuf:"bytes,3,opt,name=insert_or_update,json=insertOrUpdate,proto3,oneof"` -} - -type Mutation_Replace struct { - // Like [insert][google.spanner.v1.Mutation.insert], except that if the row already exists, it is - // deleted, and the column values provided are inserted - // instead. Unlike [insert_or_update][google.spanner.v1.Mutation.insert_or_update], this means any values not - // explicitly written become `NULL`. - // - // In an interleaved table, if you create the child table with the - // `ON DELETE CASCADE` annotation, then replacing a parent row - // also deletes the child rows. Otherwise, you must delete the - // child rows before you replace the parent row. - Replace *Mutation_Write `protobuf:"bytes,4,opt,name=replace,proto3,oneof"` -} - -type Mutation_Delete_ struct { - // Delete rows from a table. Succeeds whether or not the named - // rows were present. - Delete *Mutation_Delete `protobuf:"bytes,5,opt,name=delete,proto3,oneof"` -} - -func (*Mutation_Insert) isMutation_Operation() {} - -func (*Mutation_Update) isMutation_Operation() {} - -func (*Mutation_InsertOrUpdate) isMutation_Operation() {} - -func (*Mutation_Replace) isMutation_Operation() {} - -func (*Mutation_Delete_) isMutation_Operation() {} - -// Arguments to [insert][google.spanner.v1.Mutation.insert], [update][google.spanner.v1.Mutation.update], [insert_or_update][google.spanner.v1.Mutation.insert_or_update], and -// [replace][google.spanner.v1.Mutation.replace] operations. -type Mutation_Write struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The table whose rows will be written. - Table string `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` - // The names of the columns in [table][google.spanner.v1.Mutation.Write.table] to be written. - // - // The list of columns must contain enough columns to allow - // Cloud Spanner to derive values for all primary key columns in the - // row(s) to be modified. - Columns []string `protobuf:"bytes,2,rep,name=columns,proto3" json:"columns,omitempty"` - // The values to be written. `values` can contain more than one - // list of values. If it does, then multiple rows are written, one - // for each entry in `values`. Each list in `values` must have - // exactly as many entries as there are entries in [columns][google.spanner.v1.Mutation.Write.columns] - // above. Sending multiple lists is equivalent to sending multiple - // `Mutation`s, each containing one `values` entry and repeating - // [table][google.spanner.v1.Mutation.Write.table] and [columns][google.spanner.v1.Mutation.Write.columns]. Individual values in each list are - // encoded as described [here][google.spanner.v1.TypeCode]. - Values []*structpb.ListValue `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` -} - -func (x *Mutation_Write) Reset() { - *x = Mutation_Write{} - mi := &file_google_spanner_v1_mutation_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Mutation_Write) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Mutation_Write) ProtoMessage() {} - -func (x *Mutation_Write) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_mutation_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Mutation_Write.ProtoReflect.Descriptor instead. -func (*Mutation_Write) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_mutation_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *Mutation_Write) GetTable() string { - if x != nil { - return x.Table - } - return "" -} - -func (x *Mutation_Write) GetColumns() []string { - if x != nil { - return x.Columns - } - return nil -} - -func (x *Mutation_Write) GetValues() []*structpb.ListValue { - if x != nil { - return x.Values - } - return nil -} - -// Arguments to [delete][google.spanner.v1.Mutation.delete] operations. -type Mutation_Delete struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The table whose rows will be deleted. - Table string `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` - // Required. The primary keys of the rows within [table][google.spanner.v1.Mutation.Delete.table] to delete. The - // primary keys must be specified in the order in which they appear in the - // `PRIMARY KEY()` clause of the table's equivalent DDL statement (the DDL - // statement used to create the table). - // Delete is idempotent. The transaction will succeed even if some or all - // rows do not exist. - KeySet *KeySet `protobuf:"bytes,2,opt,name=key_set,json=keySet,proto3" json:"key_set,omitempty"` -} - -func (x *Mutation_Delete) Reset() { - *x = Mutation_Delete{} - mi := &file_google_spanner_v1_mutation_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Mutation_Delete) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Mutation_Delete) ProtoMessage() {} - -func (x *Mutation_Delete) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_mutation_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Mutation_Delete.ProtoReflect.Descriptor instead. -func (*Mutation_Delete) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_mutation_proto_rawDescGZIP(), []int{0, 1} -} - -func (x *Mutation_Delete) GetTable() string { - if x != nil { - return x.Table - } - return "" -} - -func (x *Mutation_Delete) GetKeySet() *KeySet { - if x != nil { - return x.KeySet - } - return nil -} - -var File_google_spanner_v1_mutation_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_mutation_proto_rawDesc = []byte{ - 0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xad, 0x04, 0x0a, 0x08, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3b, 0x0a, 0x06, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x48, 0x00, 0x52, 0x06, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x3b, 0x0a, 0x06, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, - 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x10, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x00, 0x52, 0x07, - 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x06, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x70, 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x19, - 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x5c, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x07, - 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6b, - 0x65, 0x79, 0x53, 0x65, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0xb0, 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x4d, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x70, 0x62, 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, - 0x6f, 0x75, 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, - 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_mutation_proto_rawDescOnce sync.Once - file_google_spanner_v1_mutation_proto_rawDescData = file_google_spanner_v1_mutation_proto_rawDesc -) - -func file_google_spanner_v1_mutation_proto_rawDescGZIP() []byte { - file_google_spanner_v1_mutation_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_mutation_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_mutation_proto_rawDescData) - }) - return file_google_spanner_v1_mutation_proto_rawDescData -} - -var file_google_spanner_v1_mutation_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_google_spanner_v1_mutation_proto_goTypes = []any{ - (*Mutation)(nil), // 0: google.spanner.v1.Mutation - (*Mutation_Write)(nil), // 1: google.spanner.v1.Mutation.Write - (*Mutation_Delete)(nil), // 2: google.spanner.v1.Mutation.Delete - (*structpb.ListValue)(nil), // 3: google.protobuf.ListValue - (*KeySet)(nil), // 4: google.spanner.v1.KeySet -} -var file_google_spanner_v1_mutation_proto_depIdxs = []int32{ - 1, // 0: google.spanner.v1.Mutation.insert:type_name -> google.spanner.v1.Mutation.Write - 1, // 1: google.spanner.v1.Mutation.update:type_name -> google.spanner.v1.Mutation.Write - 1, // 2: google.spanner.v1.Mutation.insert_or_update:type_name -> google.spanner.v1.Mutation.Write - 1, // 3: google.spanner.v1.Mutation.replace:type_name -> google.spanner.v1.Mutation.Write - 2, // 4: google.spanner.v1.Mutation.delete:type_name -> google.spanner.v1.Mutation.Delete - 3, // 5: google.spanner.v1.Mutation.Write.values:type_name -> google.protobuf.ListValue - 4, // 6: google.spanner.v1.Mutation.Delete.key_set:type_name -> google.spanner.v1.KeySet - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_mutation_proto_init() } -func file_google_spanner_v1_mutation_proto_init() { - if File_google_spanner_v1_mutation_proto != nil { - return - } - file_google_spanner_v1_keys_proto_init() - file_google_spanner_v1_mutation_proto_msgTypes[0].OneofWrappers = []any{ - (*Mutation_Insert)(nil), - (*Mutation_Update)(nil), - (*Mutation_InsertOrUpdate)(nil), - (*Mutation_Replace)(nil), - (*Mutation_Delete_)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_mutation_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_mutation_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_mutation_proto_depIdxs, - MessageInfos: file_google_spanner_v1_mutation_proto_msgTypes, - }.Build() - File_google_spanner_v1_mutation_proto = out.File - file_google_spanner_v1_mutation_proto_rawDesc = nil - file_google_spanner_v1_mutation_proto_goTypes = nil - file_google_spanner_v1_mutation_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/query_plan.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/query_plan.pb.go deleted file mode 100644 index dea81bc47b..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/query_plan.pb.go +++ /dev/null @@ -1,536 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/query_plan.proto - -package spannerpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - structpb "google.golang.org/protobuf/types/known/structpb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The kind of [PlanNode][google.spanner.v1.PlanNode]. Distinguishes between the two different kinds of -// nodes that can appear in a query plan. -type PlanNode_Kind int32 - -const ( - // Not specified. - PlanNode_KIND_UNSPECIFIED PlanNode_Kind = 0 - // Denotes a Relational operator node in the expression tree. Relational - // operators represent iterative processing of rows during query execution. - // For example, a `TableScan` operation that reads rows from a table. - PlanNode_RELATIONAL PlanNode_Kind = 1 - // Denotes a Scalar node in the expression tree. Scalar nodes represent - // non-iterable entities in the query plan. For example, constants or - // arithmetic operators appearing inside predicate expressions or references - // to column names. - PlanNode_SCALAR PlanNode_Kind = 2 -) - -// Enum value maps for PlanNode_Kind. -var ( - PlanNode_Kind_name = map[int32]string{ - 0: "KIND_UNSPECIFIED", - 1: "RELATIONAL", - 2: "SCALAR", - } - PlanNode_Kind_value = map[string]int32{ - "KIND_UNSPECIFIED": 0, - "RELATIONAL": 1, - "SCALAR": 2, - } -) - -func (x PlanNode_Kind) Enum() *PlanNode_Kind { - p := new(PlanNode_Kind) - *p = x - return p -} - -func (x PlanNode_Kind) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (PlanNode_Kind) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_query_plan_proto_enumTypes[0].Descriptor() -} - -func (PlanNode_Kind) Type() protoreflect.EnumType { - return &file_google_spanner_v1_query_plan_proto_enumTypes[0] -} - -func (x PlanNode_Kind) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use PlanNode_Kind.Descriptor instead. -func (PlanNode_Kind) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_query_plan_proto_rawDescGZIP(), []int{0, 0} -} - -// Node information for nodes appearing in a [QueryPlan.plan_nodes][google.spanner.v1.QueryPlan.plan_nodes]. -type PlanNode struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The `PlanNode`'s index in [node list][google.spanner.v1.QueryPlan.plan_nodes]. - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - // Used to determine the type of node. May be needed for visualizing - // different kinds of nodes differently. For example, If the node is a - // [SCALAR][google.spanner.v1.PlanNode.Kind.SCALAR] node, it will have a condensed representation - // which can be used to directly embed a description of the node in its - // parent. - Kind PlanNode_Kind `protobuf:"varint,2,opt,name=kind,proto3,enum=google.spanner.v1.PlanNode_Kind" json:"kind,omitempty"` - // The display name for the node. - DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // List of child node `index`es and their relationship to this parent. - ChildLinks []*PlanNode_ChildLink `protobuf:"bytes,4,rep,name=child_links,json=childLinks,proto3" json:"child_links,omitempty"` - // Condensed representation for [SCALAR][google.spanner.v1.PlanNode.Kind.SCALAR] nodes. - ShortRepresentation *PlanNode_ShortRepresentation `protobuf:"bytes,5,opt,name=short_representation,json=shortRepresentation,proto3" json:"short_representation,omitempty"` - // Attributes relevant to the node contained in a group of key-value pairs. - // For example, a Parameter Reference node could have the following - // information in its metadata: - // - // { - // "parameter_reference": "param1", - // "parameter_type": "array" - // } - Metadata *structpb.Struct `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` - // The execution statistics associated with the node, contained in a group of - // key-value pairs. Only present if the plan was returned as a result of a - // profile query. For example, number of executions, number of rows/time per - // execution etc. - ExecutionStats *structpb.Struct `protobuf:"bytes,7,opt,name=execution_stats,json=executionStats,proto3" json:"execution_stats,omitempty"` -} - -func (x *PlanNode) Reset() { - *x = PlanNode{} - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PlanNode) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PlanNode) ProtoMessage() {} - -func (x *PlanNode) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PlanNode.ProtoReflect.Descriptor instead. -func (*PlanNode) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_query_plan_proto_rawDescGZIP(), []int{0} -} - -func (x *PlanNode) GetIndex() int32 { - if x != nil { - return x.Index - } - return 0 -} - -func (x *PlanNode) GetKind() PlanNode_Kind { - if x != nil { - return x.Kind - } - return PlanNode_KIND_UNSPECIFIED -} - -func (x *PlanNode) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" -} - -func (x *PlanNode) GetChildLinks() []*PlanNode_ChildLink { - if x != nil { - return x.ChildLinks - } - return nil -} - -func (x *PlanNode) GetShortRepresentation() *PlanNode_ShortRepresentation { - if x != nil { - return x.ShortRepresentation - } - return nil -} - -func (x *PlanNode) GetMetadata() *structpb.Struct { - if x != nil { - return x.Metadata - } - return nil -} - -func (x *PlanNode) GetExecutionStats() *structpb.Struct { - if x != nil { - return x.ExecutionStats - } - return nil -} - -// Contains an ordered list of nodes appearing in the query plan. -type QueryPlan struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The nodes in the query plan. Plan nodes are returned in pre-order starting - // with the plan root. Each [PlanNode][google.spanner.v1.PlanNode]'s `id` corresponds to its index in - // `plan_nodes`. - PlanNodes []*PlanNode `protobuf:"bytes,1,rep,name=plan_nodes,json=planNodes,proto3" json:"plan_nodes,omitempty"` -} - -func (x *QueryPlan) Reset() { - *x = QueryPlan{} - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *QueryPlan) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*QueryPlan) ProtoMessage() {} - -func (x *QueryPlan) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use QueryPlan.ProtoReflect.Descriptor instead. -func (*QueryPlan) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_query_plan_proto_rawDescGZIP(), []int{1} -} - -func (x *QueryPlan) GetPlanNodes() []*PlanNode { - if x != nil { - return x.PlanNodes - } - return nil -} - -// Metadata associated with a parent-child relationship appearing in a -// [PlanNode][google.spanner.v1.PlanNode]. -type PlanNode_ChildLink struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The node to which the link points. - ChildIndex int32 `protobuf:"varint,1,opt,name=child_index,json=childIndex,proto3" json:"child_index,omitempty"` - // The type of the link. For example, in Hash Joins this could be used to - // distinguish between the build child and the probe child, or in the case - // of the child being an output variable, to represent the tag associated - // with the output variable. - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - // Only present if the child node is [SCALAR][google.spanner.v1.PlanNode.Kind.SCALAR] and corresponds - // to an output variable of the parent node. The field carries the name of - // the output variable. - // For example, a `TableScan` operator that reads rows from a table will - // have child links to the `SCALAR` nodes representing the output variables - // created for each column that is read by the operator. The corresponding - // `variable` fields will be set to the variable names assigned to the - // columns. - Variable string `protobuf:"bytes,3,opt,name=variable,proto3" json:"variable,omitempty"` -} - -func (x *PlanNode_ChildLink) Reset() { - *x = PlanNode_ChildLink{} - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PlanNode_ChildLink) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PlanNode_ChildLink) ProtoMessage() {} - -func (x *PlanNode_ChildLink) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PlanNode_ChildLink.ProtoReflect.Descriptor instead. -func (*PlanNode_ChildLink) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_query_plan_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *PlanNode_ChildLink) GetChildIndex() int32 { - if x != nil { - return x.ChildIndex - } - return 0 -} - -func (x *PlanNode_ChildLink) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *PlanNode_ChildLink) GetVariable() string { - if x != nil { - return x.Variable - } - return "" -} - -// Condensed representation of a node and its subtree. Only present for -// `SCALAR` [PlanNode(s)][google.spanner.v1.PlanNode]. -type PlanNode_ShortRepresentation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A string representation of the expression subtree rooted at this node. - Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` - // A mapping of (subquery variable name) -> (subquery node id) for cases - // where the `description` string of this node references a `SCALAR` - // subquery contained in the expression subtree rooted at this node. The - // referenced `SCALAR` subquery may not necessarily be a direct child of - // this node. - Subqueries map[string]int32 `protobuf:"bytes,2,rep,name=subqueries,proto3" json:"subqueries,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` -} - -func (x *PlanNode_ShortRepresentation) Reset() { - *x = PlanNode_ShortRepresentation{} - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PlanNode_ShortRepresentation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PlanNode_ShortRepresentation) ProtoMessage() {} - -func (x *PlanNode_ShortRepresentation) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_query_plan_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PlanNode_ShortRepresentation.ProtoReflect.Descriptor instead. -func (*PlanNode_ShortRepresentation) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_query_plan_proto_rawDescGZIP(), []int{0, 1} -} - -func (x *PlanNode_ShortRepresentation) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PlanNode_ShortRepresentation) GetSubqueries() map[string]int32 { - if x != nil { - return x.Subqueries - } - return nil -} - -var File_google_spanner_v1_query_plan_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_query_plan_proto_rawDesc = []byte{ - 0x0a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8e, 0x06, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x34, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4e, - 0x6f, 0x64, 0x65, 0x2e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4e, - 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x0a, 0x63, - 0x68, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x62, 0x0a, 0x14, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x1a, 0x5c, 0x0a, 0x09, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x6e, - 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x1a, 0xd7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0a, - 0x73, 0x75, 0x62, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x53, 0x75, 0x62, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x53, 0x75, 0x62, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x38, 0x0a, 0x04, - 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x10, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, - 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x43, - 0x41, 0x4c, 0x41, 0x52, 0x10, 0x02, 0x22, 0x47, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x6c, 0x61, 0x6e, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x42, - 0xb1, 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x50, 0x6c, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x70, 0x62, 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, - 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_query_plan_proto_rawDescOnce sync.Once - file_google_spanner_v1_query_plan_proto_rawDescData = file_google_spanner_v1_query_plan_proto_rawDesc -) - -func file_google_spanner_v1_query_plan_proto_rawDescGZIP() []byte { - file_google_spanner_v1_query_plan_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_query_plan_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_query_plan_proto_rawDescData) - }) - return file_google_spanner_v1_query_plan_proto_rawDescData -} - -var file_google_spanner_v1_query_plan_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_google_spanner_v1_query_plan_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_google_spanner_v1_query_plan_proto_goTypes = []any{ - (PlanNode_Kind)(0), // 0: google.spanner.v1.PlanNode.Kind - (*PlanNode)(nil), // 1: google.spanner.v1.PlanNode - (*QueryPlan)(nil), // 2: google.spanner.v1.QueryPlan - (*PlanNode_ChildLink)(nil), // 3: google.spanner.v1.PlanNode.ChildLink - (*PlanNode_ShortRepresentation)(nil), // 4: google.spanner.v1.PlanNode.ShortRepresentation - nil, // 5: google.spanner.v1.PlanNode.ShortRepresentation.SubqueriesEntry - (*structpb.Struct)(nil), // 6: google.protobuf.Struct -} -var file_google_spanner_v1_query_plan_proto_depIdxs = []int32{ - 0, // 0: google.spanner.v1.PlanNode.kind:type_name -> google.spanner.v1.PlanNode.Kind - 3, // 1: google.spanner.v1.PlanNode.child_links:type_name -> google.spanner.v1.PlanNode.ChildLink - 4, // 2: google.spanner.v1.PlanNode.short_representation:type_name -> google.spanner.v1.PlanNode.ShortRepresentation - 6, // 3: google.spanner.v1.PlanNode.metadata:type_name -> google.protobuf.Struct - 6, // 4: google.spanner.v1.PlanNode.execution_stats:type_name -> google.protobuf.Struct - 1, // 5: google.spanner.v1.QueryPlan.plan_nodes:type_name -> google.spanner.v1.PlanNode - 5, // 6: google.spanner.v1.PlanNode.ShortRepresentation.subqueries:type_name -> google.spanner.v1.PlanNode.ShortRepresentation.SubqueriesEntry - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_query_plan_proto_init() } -func file_google_spanner_v1_query_plan_proto_init() { - if File_google_spanner_v1_query_plan_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_query_plan_proto_rawDesc, - NumEnums: 1, - NumMessages: 5, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_query_plan_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_query_plan_proto_depIdxs, - EnumInfos: file_google_spanner_v1_query_plan_proto_enumTypes, - MessageInfos: file_google_spanner_v1_query_plan_proto_msgTypes, - }.Build() - File_google_spanner_v1_query_plan_proto = out.File - file_google_spanner_v1_query_plan_proto_rawDesc = nil - file_google_spanner_v1_query_plan_proto_goTypes = nil - file_google_spanner_v1_query_plan_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/result_set.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/result_set.pb.go deleted file mode 100644 index 70096fd920..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/result_set.pb.go +++ /dev/null @@ -1,702 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/result_set.proto - -package spannerpb - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - structpb "google.golang.org/protobuf/types/known/structpb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Results from [Read][google.spanner.v1.Spanner.Read] or -// [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. -type ResultSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Metadata about the result set, such as row type information. - Metadata *ResultSetMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` - // Each element in `rows` is a row whose format is defined by - // [metadata.row_type][google.spanner.v1.ResultSetMetadata.row_type]. The ith - // element in each row matches the ith field in - // [metadata.row_type][google.spanner.v1.ResultSetMetadata.row_type]. Elements - // are encoded based on type as described [here][google.spanner.v1.TypeCode]. - Rows []*structpb.ListValue `protobuf:"bytes,2,rep,name=rows,proto3" json:"rows,omitempty"` - // Query plan and execution statistics for the SQL statement that - // produced this result set. These can be requested by setting - // [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode]. - // DML statements always produce stats containing the number of rows - // modified, unless executed using the - // [ExecuteSqlRequest.QueryMode.PLAN][google.spanner.v1.ExecuteSqlRequest.QueryMode.PLAN] - // [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode]. - // Other fields might or might not be populated, based on the - // [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode]. - Stats *ResultSetStats `protobuf:"bytes,3,opt,name=stats,proto3" json:"stats,omitempty"` - // Optional. A precommit token is included if the read-write transaction is on - // a multiplexed session. Pass the precommit token with the highest sequence - // number from this transaction attempt to the - // [Commit][google.spanner.v1.Spanner.Commit] request for this transaction. - PrecommitToken *MultiplexedSessionPrecommitToken `protobuf:"bytes,5,opt,name=precommit_token,json=precommitToken,proto3" json:"precommit_token,omitempty"` -} - -func (x *ResultSet) Reset() { - *x = ResultSet{} - mi := &file_google_spanner_v1_result_set_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ResultSet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResultSet) ProtoMessage() {} - -func (x *ResultSet) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_result_set_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResultSet.ProtoReflect.Descriptor instead. -func (*ResultSet) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_result_set_proto_rawDescGZIP(), []int{0} -} - -func (x *ResultSet) GetMetadata() *ResultSetMetadata { - if x != nil { - return x.Metadata - } - return nil -} - -func (x *ResultSet) GetRows() []*structpb.ListValue { - if x != nil { - return x.Rows - } - return nil -} - -func (x *ResultSet) GetStats() *ResultSetStats { - if x != nil { - return x.Stats - } - return nil -} - -func (x *ResultSet) GetPrecommitToken() *MultiplexedSessionPrecommitToken { - if x != nil { - return x.PrecommitToken - } - return nil -} - -// Partial results from a streaming read or SQL query. Streaming reads and -// SQL queries better tolerate large result sets, large rows, and large -// values, but are a little trickier to consume. -type PartialResultSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Metadata about the result set, such as row type information. - // Only present in the first response. - Metadata *ResultSetMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` - // A streamed result set consists of a stream of values, which might - // be split into many `PartialResultSet` messages to accommodate - // large rows and/or large values. Every N complete values defines a - // row, where N is equal to the number of entries in - // [metadata.row_type.fields][google.spanner.v1.StructType.fields]. - // - // Most values are encoded based on type as described - // [here][google.spanner.v1.TypeCode]. - // - // It's possible that the last value in values is "chunked", - // meaning that the rest of the value is sent in subsequent - // `PartialResultSet`(s). This is denoted by the - // [chunked_value][google.spanner.v1.PartialResultSet.chunked_value] field. - // Two or more chunked values can be merged to form a complete value as - // follows: - // - // - `bool/number/null`: can't be chunked - // - `string`: concatenate the strings - // - `list`: concatenate the lists. If the last element in a list is a - // `string`, `list`, or `object`, merge it with the first element in - // the next list by applying these rules recursively. - // - `object`: concatenate the (field name, field value) pairs. If a - // field name is duplicated, then apply these rules recursively - // to merge the field values. - // - // Some examples of merging: - // - // Strings are concatenated. - // "foo", "bar" => "foobar" - // - // Lists of non-strings are concatenated. - // [2, 3], [4] => [2, 3, 4] - // - // Lists are concatenated, but the last and first elements are merged - // because they are strings. - // ["a", "b"], ["c", "d"] => ["a", "bc", "d"] - // - // Lists are concatenated, but the last and first elements are merged - // because they are lists. Recursively, the last and first elements - // of the inner lists are merged because they are strings. - // ["a", ["b", "c"]], [["d"], "e"] => ["a", ["b", "cd"], "e"] - // - // Non-overlapping object fields are combined. - // {"a": "1"}, {"b": "2"} => {"a": "1", "b": 2"} - // - // Overlapping object fields are merged. - // {"a": "1"}, {"a": "2"} => {"a": "12"} - // - // Examples of merging objects containing lists of strings. - // {"a": ["1"]}, {"a": ["2"]} => {"a": ["12"]} - // - // For a more complete example, suppose a streaming SQL query is - // yielding a result set whose rows contain a single string - // field. The following `PartialResultSet`s might be yielded: - // - // { - // "metadata": { ... } - // "values": ["Hello", "W"] - // "chunked_value": true - // "resume_token": "Af65..." - // } - // { - // "values": ["orl"] - // "chunked_value": true - // } - // { - // "values": ["d"] - // "resume_token": "Zx1B..." - // } - // - // This sequence of `PartialResultSet`s encodes two rows, one - // containing the field value `"Hello"`, and a second containing the - // field value `"World" = "W" + "orl" + "d"`. - // - // Not all `PartialResultSet`s contain a `resume_token`. Execution can only be - // resumed from a previously yielded `resume_token`. For the above sequence of - // `PartialResultSet`s, resuming the query with `"resume_token": "Af65..."` - // yields results from the `PartialResultSet` with value "orl". - Values []*structpb.Value `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` - // If true, then the final value in - // [values][google.spanner.v1.PartialResultSet.values] is chunked, and must be - // combined with more values from subsequent `PartialResultSet`s to obtain a - // complete field value. - ChunkedValue bool `protobuf:"varint,3,opt,name=chunked_value,json=chunkedValue,proto3" json:"chunked_value,omitempty"` - // Streaming calls might be interrupted for a variety of reasons, such - // as TCP connection loss. If this occurs, the stream of results can - // be resumed by re-sending the original request and including - // `resume_token`. Note that executing any other transaction in the - // same session invalidates the token. - ResumeToken []byte `protobuf:"bytes,4,opt,name=resume_token,json=resumeToken,proto3" json:"resume_token,omitempty"` - // Query plan and execution statistics for the statement that produced this - // streaming result set. These can be requested by setting - // [ExecuteSqlRequest.query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode] - // and are sent only once with the last response in the stream. This field is - // also present in the last response for DML statements. - Stats *ResultSetStats `protobuf:"bytes,5,opt,name=stats,proto3" json:"stats,omitempty"` - // Optional. A precommit token is included if the read-write transaction - // has multiplexed sessions enabled. Pass the precommit token with the highest - // sequence number from this transaction attempt to the - // [Commit][google.spanner.v1.Spanner.Commit] request for this transaction. - PrecommitToken *MultiplexedSessionPrecommitToken `protobuf:"bytes,8,opt,name=precommit_token,json=precommitToken,proto3" json:"precommit_token,omitempty"` - // Optional. Indicates whether this is the last `PartialResultSet` in the - // stream. The server might optionally set this field. Clients shouldn't rely - // on this field being set in all cases. - Last bool `protobuf:"varint,9,opt,name=last,proto3" json:"last,omitempty"` -} - -func (x *PartialResultSet) Reset() { - *x = PartialResultSet{} - mi := &file_google_spanner_v1_result_set_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PartialResultSet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PartialResultSet) ProtoMessage() {} - -func (x *PartialResultSet) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_result_set_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PartialResultSet.ProtoReflect.Descriptor instead. -func (*PartialResultSet) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_result_set_proto_rawDescGZIP(), []int{1} -} - -func (x *PartialResultSet) GetMetadata() *ResultSetMetadata { - if x != nil { - return x.Metadata - } - return nil -} - -func (x *PartialResultSet) GetValues() []*structpb.Value { - if x != nil { - return x.Values - } - return nil -} - -func (x *PartialResultSet) GetChunkedValue() bool { - if x != nil { - return x.ChunkedValue - } - return false -} - -func (x *PartialResultSet) GetResumeToken() []byte { - if x != nil { - return x.ResumeToken - } - return nil -} - -func (x *PartialResultSet) GetStats() *ResultSetStats { - if x != nil { - return x.Stats - } - return nil -} - -func (x *PartialResultSet) GetPrecommitToken() *MultiplexedSessionPrecommitToken { - if x != nil { - return x.PrecommitToken - } - return nil -} - -func (x *PartialResultSet) GetLast() bool { - if x != nil { - return x.Last - } - return false -} - -// Metadata about a [ResultSet][google.spanner.v1.ResultSet] or -// [PartialResultSet][google.spanner.v1.PartialResultSet]. -type ResultSetMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Indicates the field names and types for the rows in the result - // set. For example, a SQL query like `"SELECT UserId, UserName FROM - // Users"` could return a `row_type` value like: - // - // "fields": [ - // { "name": "UserId", "type": { "code": "INT64" } }, - // { "name": "UserName", "type": { "code": "STRING" } }, - // ] - RowType *StructType `protobuf:"bytes,1,opt,name=row_type,json=rowType,proto3" json:"row_type,omitempty"` - // If the read or SQL query began a transaction as a side-effect, the - // information about the new transaction is yielded here. - Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` - // A SQL query can be parameterized. In PLAN mode, these parameters can be - // undeclared. This indicates the field names and types for those undeclared - // parameters in the SQL query. For example, a SQL query like `"SELECT * FROM - // Users where UserId = @userId and UserName = @userName "` could return a - // `undeclared_parameters` value like: - // - // "fields": [ - // { "name": "UserId", "type": { "code": "INT64" } }, - // { "name": "UserName", "type": { "code": "STRING" } }, - // ] - UndeclaredParameters *StructType `protobuf:"bytes,3,opt,name=undeclared_parameters,json=undeclaredParameters,proto3" json:"undeclared_parameters,omitempty"` -} - -func (x *ResultSetMetadata) Reset() { - *x = ResultSetMetadata{} - mi := &file_google_spanner_v1_result_set_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ResultSetMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResultSetMetadata) ProtoMessage() {} - -func (x *ResultSetMetadata) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_result_set_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResultSetMetadata.ProtoReflect.Descriptor instead. -func (*ResultSetMetadata) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_result_set_proto_rawDescGZIP(), []int{2} -} - -func (x *ResultSetMetadata) GetRowType() *StructType { - if x != nil { - return x.RowType - } - return nil -} - -func (x *ResultSetMetadata) GetTransaction() *Transaction { - if x != nil { - return x.Transaction - } - return nil -} - -func (x *ResultSetMetadata) GetUndeclaredParameters() *StructType { - if x != nil { - return x.UndeclaredParameters - } - return nil -} - -// Additional statistics about a [ResultSet][google.spanner.v1.ResultSet] or -// [PartialResultSet][google.spanner.v1.PartialResultSet]. -type ResultSetStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // [QueryPlan][google.spanner.v1.QueryPlan] for the query associated with this - // result. - QueryPlan *QueryPlan `protobuf:"bytes,1,opt,name=query_plan,json=queryPlan,proto3" json:"query_plan,omitempty"` - // Aggregated statistics from the execution of the query. Only present when - // the query is profiled. For example, a query could return the statistics as - // follows: - // - // { - // "rows_returned": "3", - // "elapsed_time": "1.22 secs", - // "cpu_time": "1.19 secs" - // } - QueryStats *structpb.Struct `protobuf:"bytes,2,opt,name=query_stats,json=queryStats,proto3" json:"query_stats,omitempty"` - // The number of rows modified by the DML statement. - // - // Types that are assignable to RowCount: - // - // *ResultSetStats_RowCountExact - // *ResultSetStats_RowCountLowerBound - RowCount isResultSetStats_RowCount `protobuf_oneof:"row_count"` -} - -func (x *ResultSetStats) Reset() { - *x = ResultSetStats{} - mi := &file_google_spanner_v1_result_set_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ResultSetStats) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResultSetStats) ProtoMessage() {} - -func (x *ResultSetStats) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_result_set_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResultSetStats.ProtoReflect.Descriptor instead. -func (*ResultSetStats) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_result_set_proto_rawDescGZIP(), []int{3} -} - -func (x *ResultSetStats) GetQueryPlan() *QueryPlan { - if x != nil { - return x.QueryPlan - } - return nil -} - -func (x *ResultSetStats) GetQueryStats() *structpb.Struct { - if x != nil { - return x.QueryStats - } - return nil -} - -func (m *ResultSetStats) GetRowCount() isResultSetStats_RowCount { - if m != nil { - return m.RowCount - } - return nil -} - -func (x *ResultSetStats) GetRowCountExact() int64 { - if x, ok := x.GetRowCount().(*ResultSetStats_RowCountExact); ok { - return x.RowCountExact - } - return 0 -} - -func (x *ResultSetStats) GetRowCountLowerBound() int64 { - if x, ok := x.GetRowCount().(*ResultSetStats_RowCountLowerBound); ok { - return x.RowCountLowerBound - } - return 0 -} - -type isResultSetStats_RowCount interface { - isResultSetStats_RowCount() -} - -type ResultSetStats_RowCountExact struct { - // Standard DML returns an exact count of rows that were modified. - RowCountExact int64 `protobuf:"varint,3,opt,name=row_count_exact,json=rowCountExact,proto3,oneof"` -} - -type ResultSetStats_RowCountLowerBound struct { - // Partitioned DML doesn't offer exactly-once semantics, so it - // returns a lower bound of the rows modified. - RowCountLowerBound int64 `protobuf:"varint,4,opt,name=row_count_lower_bound,json=rowCountLowerBound,proto3,oneof"` -} - -func (*ResultSetStats_RowCountExact) isResultSetStats_RowCount() {} - -func (*ResultSetStats_RowCountLowerBound) isResultSetStats_RowCount() {} - -var File_google_spanner_v1_result_set_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_result_set_proto_rawDesc = []byte{ - 0x0a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, - 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x99, 0x02, - 0x0a, 0x09, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x12, 0x40, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x37, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x81, 0x03, 0x0a, 0x10, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x12, 0x40, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x2e, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x61, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, - 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x22, 0xe3, 0x01, - 0x0a, 0x11, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x40, 0x0a, - 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x52, 0x0a, 0x15, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x14, 0x75, - 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x6c, 0x61, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x28, 0x0a, - 0x0f, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x65, 0x78, 0x61, 0x63, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x45, 0x78, 0x61, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x15, 0x72, 0x6f, 0x77, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x12, 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x0b, 0x0a, 0x09, - 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0xb1, 0x01, 0x0a, 0x15, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0xaa, 0x02, 0x17, 0x47, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, - 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, - 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, - 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_result_set_proto_rawDescOnce sync.Once - file_google_spanner_v1_result_set_proto_rawDescData = file_google_spanner_v1_result_set_proto_rawDesc -) - -func file_google_spanner_v1_result_set_proto_rawDescGZIP() []byte { - file_google_spanner_v1_result_set_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_result_set_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_result_set_proto_rawDescData) - }) - return file_google_spanner_v1_result_set_proto_rawDescData -} - -var file_google_spanner_v1_result_set_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_google_spanner_v1_result_set_proto_goTypes = []any{ - (*ResultSet)(nil), // 0: google.spanner.v1.ResultSet - (*PartialResultSet)(nil), // 1: google.spanner.v1.PartialResultSet - (*ResultSetMetadata)(nil), // 2: google.spanner.v1.ResultSetMetadata - (*ResultSetStats)(nil), // 3: google.spanner.v1.ResultSetStats - (*structpb.ListValue)(nil), // 4: google.protobuf.ListValue - (*MultiplexedSessionPrecommitToken)(nil), // 5: google.spanner.v1.MultiplexedSessionPrecommitToken - (*structpb.Value)(nil), // 6: google.protobuf.Value - (*StructType)(nil), // 7: google.spanner.v1.StructType - (*Transaction)(nil), // 8: google.spanner.v1.Transaction - (*QueryPlan)(nil), // 9: google.spanner.v1.QueryPlan - (*structpb.Struct)(nil), // 10: google.protobuf.Struct -} -var file_google_spanner_v1_result_set_proto_depIdxs = []int32{ - 2, // 0: google.spanner.v1.ResultSet.metadata:type_name -> google.spanner.v1.ResultSetMetadata - 4, // 1: google.spanner.v1.ResultSet.rows:type_name -> google.protobuf.ListValue - 3, // 2: google.spanner.v1.ResultSet.stats:type_name -> google.spanner.v1.ResultSetStats - 5, // 3: google.spanner.v1.ResultSet.precommit_token:type_name -> google.spanner.v1.MultiplexedSessionPrecommitToken - 2, // 4: google.spanner.v1.PartialResultSet.metadata:type_name -> google.spanner.v1.ResultSetMetadata - 6, // 5: google.spanner.v1.PartialResultSet.values:type_name -> google.protobuf.Value - 3, // 6: google.spanner.v1.PartialResultSet.stats:type_name -> google.spanner.v1.ResultSetStats - 5, // 7: google.spanner.v1.PartialResultSet.precommit_token:type_name -> google.spanner.v1.MultiplexedSessionPrecommitToken - 7, // 8: google.spanner.v1.ResultSetMetadata.row_type:type_name -> google.spanner.v1.StructType - 8, // 9: google.spanner.v1.ResultSetMetadata.transaction:type_name -> google.spanner.v1.Transaction - 7, // 10: google.spanner.v1.ResultSetMetadata.undeclared_parameters:type_name -> google.spanner.v1.StructType - 9, // 11: google.spanner.v1.ResultSetStats.query_plan:type_name -> google.spanner.v1.QueryPlan - 10, // 12: google.spanner.v1.ResultSetStats.query_stats:type_name -> google.protobuf.Struct - 13, // [13:13] is the sub-list for method output_type - 13, // [13:13] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_result_set_proto_init() } -func file_google_spanner_v1_result_set_proto_init() { - if File_google_spanner_v1_result_set_proto != nil { - return - } - file_google_spanner_v1_query_plan_proto_init() - file_google_spanner_v1_transaction_proto_init() - file_google_spanner_v1_type_proto_init() - file_google_spanner_v1_result_set_proto_msgTypes[3].OneofWrappers = []any{ - (*ResultSetStats_RowCountExact)(nil), - (*ResultSetStats_RowCountLowerBound)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_result_set_proto_rawDesc, - NumEnums: 0, - NumMessages: 4, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_result_set_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_result_set_proto_depIdxs, - MessageInfos: file_google_spanner_v1_result_set_proto_msgTypes, - }.Build() - File_google_spanner_v1_result_set_proto = out.File - file_google_spanner_v1_result_set_proto_rawDesc = nil - file_google_spanner_v1_result_set_proto_goTypes = nil - file_google_spanner_v1_result_set_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/spanner.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/spanner.pb.go deleted file mode 100644 index 8ae5058ae6..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/spanner.pb.go +++ /dev/null @@ -1,4998 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/spanner.proto - -package spannerpb - -import ( - context "context" - _ "google.golang.org/genproto/googleapis/api/annotations" - status "google.golang.org/genproto/googleapis/rpc/status" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status1 "google.golang.org/grpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" - emptypb "google.golang.org/protobuf/types/known/emptypb" - structpb "google.golang.org/protobuf/types/known/structpb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// The relative priority for requests. Note that priority is not applicable -// for [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction]. -// -// The priority acts as a hint to the Cloud Spanner scheduler and does not -// guarantee priority or order of execution. For example: -// -// - Some parts of a write operation always execute at `PRIORITY_HIGH`, -// regardless of the specified priority. This may cause you to see an -// increase in high priority workload even when executing a low priority -// request. This can also potentially cause a priority inversion where a -// lower priority request will be fulfilled ahead of a higher priority -// request. -// - If a transaction contains multiple operations with different priorities, -// Cloud Spanner does not guarantee to process the higher priority -// operations first. There may be other constraints to satisfy, such as -// order of operations. -type RequestOptions_Priority int32 - -const ( - // `PRIORITY_UNSPECIFIED` is equivalent to `PRIORITY_HIGH`. - RequestOptions_PRIORITY_UNSPECIFIED RequestOptions_Priority = 0 - // This specifies that the request is low priority. - RequestOptions_PRIORITY_LOW RequestOptions_Priority = 1 - // This specifies that the request is medium priority. - RequestOptions_PRIORITY_MEDIUM RequestOptions_Priority = 2 - // This specifies that the request is high priority. - RequestOptions_PRIORITY_HIGH RequestOptions_Priority = 3 -) - -// Enum value maps for RequestOptions_Priority. -var ( - RequestOptions_Priority_name = map[int32]string{ - 0: "PRIORITY_UNSPECIFIED", - 1: "PRIORITY_LOW", - 2: "PRIORITY_MEDIUM", - 3: "PRIORITY_HIGH", - } - RequestOptions_Priority_value = map[string]int32{ - "PRIORITY_UNSPECIFIED": 0, - "PRIORITY_LOW": 1, - "PRIORITY_MEDIUM": 2, - "PRIORITY_HIGH": 3, - } -) - -func (x RequestOptions_Priority) Enum() *RequestOptions_Priority { - p := new(RequestOptions_Priority) - *p = x - return p -} - -func (x RequestOptions_Priority) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (RequestOptions_Priority) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_spanner_proto_enumTypes[0].Descriptor() -} - -func (RequestOptions_Priority) Type() protoreflect.EnumType { - return &file_google_spanner_v1_spanner_proto_enumTypes[0] -} - -func (x RequestOptions_Priority) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use RequestOptions_Priority.Descriptor instead. -func (RequestOptions_Priority) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{8, 0} -} - -// Indicates the type of replica. -type DirectedReadOptions_ReplicaSelection_Type int32 - -const ( - // Not specified. - DirectedReadOptions_ReplicaSelection_TYPE_UNSPECIFIED DirectedReadOptions_ReplicaSelection_Type = 0 - // Read-write replicas support both reads and writes. - DirectedReadOptions_ReplicaSelection_READ_WRITE DirectedReadOptions_ReplicaSelection_Type = 1 - // Read-only replicas only support reads (not writes). - DirectedReadOptions_ReplicaSelection_READ_ONLY DirectedReadOptions_ReplicaSelection_Type = 2 -) - -// Enum value maps for DirectedReadOptions_ReplicaSelection_Type. -var ( - DirectedReadOptions_ReplicaSelection_Type_name = map[int32]string{ - 0: "TYPE_UNSPECIFIED", - 1: "READ_WRITE", - 2: "READ_ONLY", - } - DirectedReadOptions_ReplicaSelection_Type_value = map[string]int32{ - "TYPE_UNSPECIFIED": 0, - "READ_WRITE": 1, - "READ_ONLY": 2, - } -) - -func (x DirectedReadOptions_ReplicaSelection_Type) Enum() *DirectedReadOptions_ReplicaSelection_Type { - p := new(DirectedReadOptions_ReplicaSelection_Type) - *p = x - return p -} - -func (x DirectedReadOptions_ReplicaSelection_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DirectedReadOptions_ReplicaSelection_Type) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_spanner_proto_enumTypes[1].Descriptor() -} - -func (DirectedReadOptions_ReplicaSelection_Type) Type() protoreflect.EnumType { - return &file_google_spanner_v1_spanner_proto_enumTypes[1] -} - -func (x DirectedReadOptions_ReplicaSelection_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DirectedReadOptions_ReplicaSelection_Type.Descriptor instead. -func (DirectedReadOptions_ReplicaSelection_Type) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{9, 0, 0} -} - -// Mode in which the statement must be processed. -type ExecuteSqlRequest_QueryMode int32 - -const ( - // The default mode. Only the statement results are returned. - ExecuteSqlRequest_NORMAL ExecuteSqlRequest_QueryMode = 0 - // This mode returns only the query plan, without any results or - // execution statistics information. - ExecuteSqlRequest_PLAN ExecuteSqlRequest_QueryMode = 1 - // This mode returns the query plan, overall execution statistics, - // operator level execution statistics along with the results. This has a - // performance overhead compared to the other modes. It is not recommended - // to use this mode for production traffic. - ExecuteSqlRequest_PROFILE ExecuteSqlRequest_QueryMode = 2 - // This mode returns the overall (but not operator-level) execution - // statistics along with the results. - ExecuteSqlRequest_WITH_STATS ExecuteSqlRequest_QueryMode = 3 - // This mode returns the query plan, overall (but not operator-level) - // execution statistics along with the results. - ExecuteSqlRequest_WITH_PLAN_AND_STATS ExecuteSqlRequest_QueryMode = 4 -) - -// Enum value maps for ExecuteSqlRequest_QueryMode. -var ( - ExecuteSqlRequest_QueryMode_name = map[int32]string{ - 0: "NORMAL", - 1: "PLAN", - 2: "PROFILE", - 3: "WITH_STATS", - 4: "WITH_PLAN_AND_STATS", - } - ExecuteSqlRequest_QueryMode_value = map[string]int32{ - "NORMAL": 0, - "PLAN": 1, - "PROFILE": 2, - "WITH_STATS": 3, - "WITH_PLAN_AND_STATS": 4, - } -) - -func (x ExecuteSqlRequest_QueryMode) Enum() *ExecuteSqlRequest_QueryMode { - p := new(ExecuteSqlRequest_QueryMode) - *p = x - return p -} - -func (x ExecuteSqlRequest_QueryMode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ExecuteSqlRequest_QueryMode) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_spanner_proto_enumTypes[2].Descriptor() -} - -func (ExecuteSqlRequest_QueryMode) Type() protoreflect.EnumType { - return &file_google_spanner_v1_spanner_proto_enumTypes[2] -} - -func (x ExecuteSqlRequest_QueryMode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ExecuteSqlRequest_QueryMode.Descriptor instead. -func (ExecuteSqlRequest_QueryMode) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{10, 0} -} - -// An option to control the order in which rows are returned from a read. -type ReadRequest_OrderBy int32 - -const ( - // Default value. - // - // ORDER_BY_UNSPECIFIED is equivalent to ORDER_BY_PRIMARY_KEY. - ReadRequest_ORDER_BY_UNSPECIFIED ReadRequest_OrderBy = 0 - // Read rows are returned in primary key order. - // - // In the event that this option is used in conjunction with the - // `partition_token` field, the API will return an `INVALID_ARGUMENT` error. - ReadRequest_ORDER_BY_PRIMARY_KEY ReadRequest_OrderBy = 1 - // Read rows are returned in any order. - ReadRequest_ORDER_BY_NO_ORDER ReadRequest_OrderBy = 2 -) - -// Enum value maps for ReadRequest_OrderBy. -var ( - ReadRequest_OrderBy_name = map[int32]string{ - 0: "ORDER_BY_UNSPECIFIED", - 1: "ORDER_BY_PRIMARY_KEY", - 2: "ORDER_BY_NO_ORDER", - } - ReadRequest_OrderBy_value = map[string]int32{ - "ORDER_BY_UNSPECIFIED": 0, - "ORDER_BY_PRIMARY_KEY": 1, - "ORDER_BY_NO_ORDER": 2, - } -) - -func (x ReadRequest_OrderBy) Enum() *ReadRequest_OrderBy { - p := new(ReadRequest_OrderBy) - *p = x - return p -} - -func (x ReadRequest_OrderBy) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ReadRequest_OrderBy) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_spanner_proto_enumTypes[3].Descriptor() -} - -func (ReadRequest_OrderBy) Type() protoreflect.EnumType { - return &file_google_spanner_v1_spanner_proto_enumTypes[3] -} - -func (x ReadRequest_OrderBy) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ReadRequest_OrderBy.Descriptor instead. -func (ReadRequest_OrderBy) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{18, 0} -} - -// A lock hint mechanism for reads done within a transaction. -type ReadRequest_LockHint int32 - -const ( - // Default value. - // - // LOCK_HINT_UNSPECIFIED is equivalent to LOCK_HINT_SHARED. - ReadRequest_LOCK_HINT_UNSPECIFIED ReadRequest_LockHint = 0 - // Acquire shared locks. - // - // By default when you perform a read as part of a read-write transaction, - // Spanner acquires shared read locks, which allows other reads to still - // access the data until your transaction is ready to commit. When your - // transaction is committing and writes are being applied, the transaction - // attempts to upgrade to an exclusive lock for any data you are writing. - // For more information about locks, see [Lock - // modes](https://cloud.google.com/spanner/docs/introspection/lock-statistics#explain-lock-modes). - ReadRequest_LOCK_HINT_SHARED ReadRequest_LockHint = 1 - // Acquire exclusive locks. - // - // Requesting exclusive locks is beneficial if you observe high write - // contention, which means you notice that multiple transactions are - // concurrently trying to read and write to the same data, resulting in a - // large number of aborts. This problem occurs when two transactions - // initially acquire shared locks and then both try to upgrade to exclusive - // locks at the same time. In this situation both transactions are waiting - // for the other to give up their lock, resulting in a deadlocked situation. - // Spanner is able to detect this occurring and force one of the - // transactions to abort. However, this is a slow and expensive operation - // and results in lower performance. In this case it makes sense to acquire - // exclusive locks at the start of the transaction because then when - // multiple transactions try to act on the same data, they automatically get - // serialized. Each transaction waits its turn to acquire the lock and - // avoids getting into deadlock situations. - // - // Because the exclusive lock hint is just a hint, it should not be - // considered equivalent to a mutex. In other words, you should not use - // Spanner exclusive locks as a mutual exclusion mechanism for the execution - // of code outside of Spanner. - // - // **Note:** Request exclusive locks judiciously because they block others - // from reading that data for the entire transaction, rather than just when - // the writes are being performed. Unless you observe high write contention, - // you should use the default of shared read locks so you don't prematurely - // block other clients from reading the data that you're writing to. - ReadRequest_LOCK_HINT_EXCLUSIVE ReadRequest_LockHint = 2 -) - -// Enum value maps for ReadRequest_LockHint. -var ( - ReadRequest_LockHint_name = map[int32]string{ - 0: "LOCK_HINT_UNSPECIFIED", - 1: "LOCK_HINT_SHARED", - 2: "LOCK_HINT_EXCLUSIVE", - } - ReadRequest_LockHint_value = map[string]int32{ - "LOCK_HINT_UNSPECIFIED": 0, - "LOCK_HINT_SHARED": 1, - "LOCK_HINT_EXCLUSIVE": 2, - } -) - -func (x ReadRequest_LockHint) Enum() *ReadRequest_LockHint { - p := new(ReadRequest_LockHint) - *p = x - return p -} - -func (x ReadRequest_LockHint) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ReadRequest_LockHint) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_spanner_proto_enumTypes[4].Descriptor() -} - -func (ReadRequest_LockHint) Type() protoreflect.EnumType { - return &file_google_spanner_v1_spanner_proto_enumTypes[4] -} - -func (x ReadRequest_LockHint) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ReadRequest_LockHint.Descriptor instead. -func (ReadRequest_LockHint) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{18, 1} -} - -// The request for [CreateSession][google.spanner.v1.Spanner.CreateSession]. -type CreateSessionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database in which the new session is created. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Required. The session to create. - Session *Session `protobuf:"bytes,2,opt,name=session,proto3" json:"session,omitempty"` -} - -func (x *CreateSessionRequest) Reset() { - *x = CreateSessionRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CreateSessionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateSessionRequest) ProtoMessage() {} - -func (x *CreateSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateSessionRequest.ProtoReflect.Descriptor instead. -func (*CreateSessionRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{0} -} - -func (x *CreateSessionRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *CreateSessionRequest) GetSession() *Session { - if x != nil { - return x.Session - } - return nil -} - -// The request for -// [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. -type BatchCreateSessionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database in which the new sessions are created. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Parameters to be applied to each created session. - SessionTemplate *Session `protobuf:"bytes,2,opt,name=session_template,json=sessionTemplate,proto3" json:"session_template,omitempty"` - // Required. The number of sessions to be created in this batch call. - // The API may return fewer than the requested number of sessions. If a - // specific number of sessions are desired, the client can make additional - // calls to BatchCreateSessions (adjusting - // [session_count][google.spanner.v1.BatchCreateSessionsRequest.session_count] - // as necessary). - SessionCount int32 `protobuf:"varint,3,opt,name=session_count,json=sessionCount,proto3" json:"session_count,omitempty"` -} - -func (x *BatchCreateSessionsRequest) Reset() { - *x = BatchCreateSessionsRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BatchCreateSessionsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchCreateSessionsRequest) ProtoMessage() {} - -func (x *BatchCreateSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchCreateSessionsRequest.ProtoReflect.Descriptor instead. -func (*BatchCreateSessionsRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{1} -} - -func (x *BatchCreateSessionsRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *BatchCreateSessionsRequest) GetSessionTemplate() *Session { - if x != nil { - return x.SessionTemplate - } - return nil -} - -func (x *BatchCreateSessionsRequest) GetSessionCount() int32 { - if x != nil { - return x.SessionCount - } - return 0 -} - -// The response for -// [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. -type BatchCreateSessionsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The freshly created sessions. - Session []*Session `protobuf:"bytes,1,rep,name=session,proto3" json:"session,omitempty"` -} - -func (x *BatchCreateSessionsResponse) Reset() { - *x = BatchCreateSessionsResponse{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BatchCreateSessionsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchCreateSessionsResponse) ProtoMessage() {} - -func (x *BatchCreateSessionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchCreateSessionsResponse.ProtoReflect.Descriptor instead. -func (*BatchCreateSessionsResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{2} -} - -func (x *BatchCreateSessionsResponse) GetSession() []*Session { - if x != nil { - return x.Session - } - return nil -} - -// A session in the Cloud Spanner API. -type Session struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Output only. The name of the session. This is always system-assigned. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The labels for the session. - // - // - Label keys must be between 1 and 63 characters long and must conform to - // the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`. - // - Label values must be between 0 and 63 characters long and must conform - // to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`. - // - No more than 64 labels can be associated with a given session. - // - // See https://goo.gl/xmQnxf for more information on and examples of labels. - Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Output only. The timestamp when the session is created. - CreateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - // Output only. The approximate timestamp when the session is last used. It is - // typically earlier than the actual last use time. - ApproximateLastUseTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=approximate_last_use_time,json=approximateLastUseTime,proto3" json:"approximate_last_use_time,omitempty"` - // The database role which created this session. - CreatorRole string `protobuf:"bytes,5,opt,name=creator_role,json=creatorRole,proto3" json:"creator_role,omitempty"` - // Optional. If true, specifies a multiplexed session. A multiplexed session - // may be used for multiple, concurrent read-only operations but can not be - // used for read-write transactions, partitioned reads, or partitioned - // queries. Multiplexed sessions can be created via - // [CreateSession][google.spanner.v1.Spanner.CreateSession] but not via - // [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. - // Multiplexed sessions may not be deleted nor listed. - Multiplexed bool `protobuf:"varint,6,opt,name=multiplexed,proto3" json:"multiplexed,omitempty"` -} - -func (x *Session) Reset() { - *x = Session{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Session) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Session) ProtoMessage() {} - -func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Session.ProtoReflect.Descriptor instead. -func (*Session) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{3} -} - -func (x *Session) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Session) GetLabels() map[string]string { - if x != nil { - return x.Labels - } - return nil -} - -func (x *Session) GetCreateTime() *timestamppb.Timestamp { - if x != nil { - return x.CreateTime - } - return nil -} - -func (x *Session) GetApproximateLastUseTime() *timestamppb.Timestamp { - if x != nil { - return x.ApproximateLastUseTime - } - return nil -} - -func (x *Session) GetCreatorRole() string { - if x != nil { - return x.CreatorRole - } - return "" -} - -func (x *Session) GetMultiplexed() bool { - if x != nil { - return x.Multiplexed - } - return false -} - -// The request for [GetSession][google.spanner.v1.Spanner.GetSession]. -type GetSessionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the session to retrieve. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *GetSessionRequest) Reset() { - *x = GetSessionRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetSessionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetSessionRequest) ProtoMessage() {} - -func (x *GetSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetSessionRequest.ProtoReflect.Descriptor instead. -func (*GetSessionRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{4} -} - -func (x *GetSessionRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// The request for [ListSessions][google.spanner.v1.Spanner.ListSessions]. -type ListSessionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The database in which to list sessions. - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - // Number of sessions to be returned in the response. If 0 or less, defaults - // to the server's maximum allowed page size. - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.v1.ListSessionsResponse.next_page_token] - // from a previous - // [ListSessionsResponse][google.spanner.v1.ListSessionsResponse]. - PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - // An expression for filtering the results of the request. Filter rules are - // case insensitive. The fields eligible for filtering are: - // - // - `labels.key` where key is the name of a label - // - // Some examples of using filters are: - // - // - `labels.env:*` --> The session has the label "env". - // - `labels.env:dev` --> The session has the label "env" and the value of - // the label contains the string "dev". - Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` -} - -func (x *ListSessionsRequest) Reset() { - *x = ListSessionsRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListSessionsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListSessionsRequest) ProtoMessage() {} - -func (x *ListSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListSessionsRequest.ProtoReflect.Descriptor instead. -func (*ListSessionsRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{5} -} - -func (x *ListSessionsRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *ListSessionsRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListSessionsRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -func (x *ListSessionsRequest) GetFilter() string { - if x != nil { - return x.Filter - } - return "" -} - -// The response for [ListSessions][google.spanner.v1.Spanner.ListSessions]. -type ListSessionsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The list of requested sessions. - Sessions []*Session `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"` - // `next_page_token` can be sent in a subsequent - // [ListSessions][google.spanner.v1.Spanner.ListSessions] call to fetch more - // of the matching sessions. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` -} - -func (x *ListSessionsResponse) Reset() { - *x = ListSessionsResponse{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListSessionsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListSessionsResponse) ProtoMessage() {} - -func (x *ListSessionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListSessionsResponse.ProtoReflect.Descriptor instead. -func (*ListSessionsResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{6} -} - -func (x *ListSessionsResponse) GetSessions() []*Session { - if x != nil { - return x.Sessions - } - return nil -} - -func (x *ListSessionsResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// The request for [DeleteSession][google.spanner.v1.Spanner.DeleteSession]. -type DeleteSessionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of the session to delete. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *DeleteSessionRequest) Reset() { - *x = DeleteSessionRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeleteSessionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteSessionRequest) ProtoMessage() {} - -func (x *DeleteSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteSessionRequest.ProtoReflect.Descriptor instead. -func (*DeleteSessionRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{7} -} - -func (x *DeleteSessionRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -// Common request options for various APIs. -type RequestOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Priority for the request. - Priority RequestOptions_Priority `protobuf:"varint,1,opt,name=priority,proto3,enum=google.spanner.v1.RequestOptions_Priority" json:"priority,omitempty"` - // A per-request tag which can be applied to queries or reads, used for - // statistics collection. - // Both request_tag and transaction_tag can be specified for a read or query - // that belongs to a transaction. - // This field is ignored for requests where it's not applicable (e.g. - // CommitRequest). - // Legal characters for `request_tag` values are all printable characters - // (ASCII 32 - 126) and the length of a request_tag is limited to 50 - // characters. Values that exceed this limit are truncated. - // Any leading underscore (_) characters will be removed from the string. - RequestTag string `protobuf:"bytes,2,opt,name=request_tag,json=requestTag,proto3" json:"request_tag,omitempty"` - // A tag used for statistics collection about this transaction. - // Both request_tag and transaction_tag can be specified for a read or query - // that belongs to a transaction. - // The value of transaction_tag should be the same for all requests belonging - // to the same transaction. - // If this request doesn't belong to any transaction, transaction_tag will be - // ignored. - // Legal characters for `transaction_tag` values are all printable characters - // (ASCII 32 - 126) and the length of a transaction_tag is limited to 50 - // characters. Values that exceed this limit are truncated. - // Any leading underscore (_) characters will be removed from the string. - TransactionTag string `protobuf:"bytes,3,opt,name=transaction_tag,json=transactionTag,proto3" json:"transaction_tag,omitempty"` -} - -func (x *RequestOptions) Reset() { - *x = RequestOptions{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RequestOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RequestOptions) ProtoMessage() {} - -func (x *RequestOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RequestOptions.ProtoReflect.Descriptor instead. -func (*RequestOptions) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{8} -} - -func (x *RequestOptions) GetPriority() RequestOptions_Priority { - if x != nil { - return x.Priority - } - return RequestOptions_PRIORITY_UNSPECIFIED -} - -func (x *RequestOptions) GetRequestTag() string { - if x != nil { - return x.RequestTag - } - return "" -} - -func (x *RequestOptions) GetTransactionTag() string { - if x != nil { - return x.TransactionTag - } - return "" -} - -// The DirectedReadOptions can be used to indicate which replicas or regions -// should be used for non-transactional reads or queries. -// -// DirectedReadOptions may only be specified for a read-only transaction, -// otherwise the API will return an `INVALID_ARGUMENT` error. -type DirectedReadOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. At most one of either include_replicas or exclude_replicas - // should be present in the message. - // - // Types that are assignable to Replicas: - // - // *DirectedReadOptions_IncludeReplicas_ - // *DirectedReadOptions_ExcludeReplicas_ - Replicas isDirectedReadOptions_Replicas `protobuf_oneof:"replicas"` -} - -func (x *DirectedReadOptions) Reset() { - *x = DirectedReadOptions{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DirectedReadOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DirectedReadOptions) ProtoMessage() {} - -func (x *DirectedReadOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DirectedReadOptions.ProtoReflect.Descriptor instead. -func (*DirectedReadOptions) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{9} -} - -func (m *DirectedReadOptions) GetReplicas() isDirectedReadOptions_Replicas { - if m != nil { - return m.Replicas - } - return nil -} - -func (x *DirectedReadOptions) GetIncludeReplicas() *DirectedReadOptions_IncludeReplicas { - if x, ok := x.GetReplicas().(*DirectedReadOptions_IncludeReplicas_); ok { - return x.IncludeReplicas - } - return nil -} - -func (x *DirectedReadOptions) GetExcludeReplicas() *DirectedReadOptions_ExcludeReplicas { - if x, ok := x.GetReplicas().(*DirectedReadOptions_ExcludeReplicas_); ok { - return x.ExcludeReplicas - } - return nil -} - -type isDirectedReadOptions_Replicas interface { - isDirectedReadOptions_Replicas() -} - -type DirectedReadOptions_IncludeReplicas_ struct { - // Include_replicas indicates the order of replicas (as they appear in - // this list) to process the request. If auto_failover_disabled is set to - // true and all replicas are exhausted without finding a healthy replica, - // Spanner will wait for a replica in the list to become available, requests - // may fail due to `DEADLINE_EXCEEDED` errors. - IncludeReplicas *DirectedReadOptions_IncludeReplicas `protobuf:"bytes,1,opt,name=include_replicas,json=includeReplicas,proto3,oneof"` -} - -type DirectedReadOptions_ExcludeReplicas_ struct { - // Exclude_replicas indicates that specified replicas should be excluded - // from serving requests. Spanner will not route requests to the replicas - // in this list. - ExcludeReplicas *DirectedReadOptions_ExcludeReplicas `protobuf:"bytes,2,opt,name=exclude_replicas,json=excludeReplicas,proto3,oneof"` -} - -func (*DirectedReadOptions_IncludeReplicas_) isDirectedReadOptions_Replicas() {} - -func (*DirectedReadOptions_ExcludeReplicas_) isDirectedReadOptions_Replicas() {} - -// The request for [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and -// [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql]. -type ExecuteSqlRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the SQL query should be performed. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // The transaction to use. - // - // For queries, if none is provided, the default is a temporary read-only - // transaction with strong concurrency. - // - // Standard DML statements require a read-write transaction. To protect - // against replays, single-use transactions are not supported. The caller - // must either supply an existing transaction ID or begin a new transaction. - // - // Partitioned DML requires an existing Partitioned DML transaction ID. - Transaction *TransactionSelector `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` - // Required. The SQL string. - Sql string `protobuf:"bytes,3,opt,name=sql,proto3" json:"sql,omitempty"` - // Parameter names and values that bind to placeholders in the SQL string. - // - // A parameter placeholder consists of the `@` character followed by the - // parameter name (for example, `@firstName`). Parameter names must conform - // to the naming requirements of identifiers as specified at - // https://cloud.google.com/spanner/docs/lexical#identifiers. - // - // Parameters can appear anywhere that a literal value is expected. The same - // parameter name can be used more than once, for example: - // - // `"WHERE id > @msg_id AND id < @msg_id + 100"` - // - // It is an error to execute a SQL statement with unbound parameters. - Params *structpb.Struct `protobuf:"bytes,4,opt,name=params,proto3" json:"params,omitempty"` - // It is not always possible for Cloud Spanner to infer the right SQL type - // from a JSON value. For example, values of type `BYTES` and values - // of type `STRING` both appear in - // [params][google.spanner.v1.ExecuteSqlRequest.params] as JSON strings. - // - // In these cases, `param_types` can be used to specify the exact - // SQL type for some or all of the SQL statement parameters. See the - // definition of [Type][google.spanner.v1.Type] for more information - // about SQL types. - ParamTypes map[string]*Type `protobuf:"bytes,5,rep,name=param_types,json=paramTypes,proto3" json:"param_types,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // If this request is resuming a previously interrupted SQL statement - // execution, `resume_token` should be copied from the last - // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the - // interruption. Doing this enables the new SQL statement execution to resume - // where the last one left off. The rest of the request parameters must - // exactly match the request that yielded this token. - ResumeToken []byte `protobuf:"bytes,6,opt,name=resume_token,json=resumeToken,proto3" json:"resume_token,omitempty"` - // Used to control the amount of debugging information returned in - // [ResultSetStats][google.spanner.v1.ResultSetStats]. If - // [partition_token][google.spanner.v1.ExecuteSqlRequest.partition_token] is - // set, [query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode] can only - // be set to - // [QueryMode.NORMAL][google.spanner.v1.ExecuteSqlRequest.QueryMode.NORMAL]. - QueryMode ExecuteSqlRequest_QueryMode `protobuf:"varint,7,opt,name=query_mode,json=queryMode,proto3,enum=google.spanner.v1.ExecuteSqlRequest_QueryMode" json:"query_mode,omitempty"` - // If present, results will be restricted to the specified partition - // previously created using PartitionQuery(). There must be an exact - // match for the values of fields common to this message and the - // PartitionQueryRequest message used to create this partition_token. - PartitionToken []byte `protobuf:"bytes,8,opt,name=partition_token,json=partitionToken,proto3" json:"partition_token,omitempty"` - // A per-transaction sequence number used to identify this request. This field - // makes each request idempotent such that if the request is received multiple - // times, at most one will succeed. - // - // The sequence number must be monotonically increasing within the - // transaction. If a request arrives for the first time with an out-of-order - // sequence number, the transaction may be aborted. Replays of previously - // handled requests will yield the same response as the first execution. - // - // Required for DML statements. Ignored for queries. - Seqno int64 `protobuf:"varint,9,opt,name=seqno,proto3" json:"seqno,omitempty"` - // Query optimizer configuration to use for the given query. - QueryOptions *ExecuteSqlRequest_QueryOptions `protobuf:"bytes,10,opt,name=query_options,json=queryOptions,proto3" json:"query_options,omitempty"` - // Common options for this request. - RequestOptions *RequestOptions `protobuf:"bytes,11,opt,name=request_options,json=requestOptions,proto3" json:"request_options,omitempty"` - // Directed read options for this request. - DirectedReadOptions *DirectedReadOptions `protobuf:"bytes,15,opt,name=directed_read_options,json=directedReadOptions,proto3" json:"directed_read_options,omitempty"` - // If this is for a partitioned query and this field is set to `true`, the - // request is executed with Spanner Data Boost independent compute resources. - // - // If the field is set to `true` but the request does not set - // `partition_token`, the API returns an `INVALID_ARGUMENT` error. - DataBoostEnabled bool `protobuf:"varint,16,opt,name=data_boost_enabled,json=dataBoostEnabled,proto3" json:"data_boost_enabled,omitempty"` - // Optional. If set to true, this statement marks the end of the transaction. - // The transaction should be committed or aborted after this statement - // executes, and attempts to execute any other requests against this - // transaction (including reads and queries) will be rejected. - // - // For DML statements, setting this option may cause some error reporting to - // be deferred until commit time (e.g. validation of unique constraints). - // Given this, successful execution of a DML statement should not be assumed - // until a subsequent Commit call completes successfully. - LastStatement bool `protobuf:"varint,17,opt,name=last_statement,json=lastStatement,proto3" json:"last_statement,omitempty"` -} - -func (x *ExecuteSqlRequest) Reset() { - *x = ExecuteSqlRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteSqlRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteSqlRequest) ProtoMessage() {} - -func (x *ExecuteSqlRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteSqlRequest.ProtoReflect.Descriptor instead. -func (*ExecuteSqlRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{10} -} - -func (x *ExecuteSqlRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *ExecuteSqlRequest) GetTransaction() *TransactionSelector { - if x != nil { - return x.Transaction - } - return nil -} - -func (x *ExecuteSqlRequest) GetSql() string { - if x != nil { - return x.Sql - } - return "" -} - -func (x *ExecuteSqlRequest) GetParams() *structpb.Struct { - if x != nil { - return x.Params - } - return nil -} - -func (x *ExecuteSqlRequest) GetParamTypes() map[string]*Type { - if x != nil { - return x.ParamTypes - } - return nil -} - -func (x *ExecuteSqlRequest) GetResumeToken() []byte { - if x != nil { - return x.ResumeToken - } - return nil -} - -func (x *ExecuteSqlRequest) GetQueryMode() ExecuteSqlRequest_QueryMode { - if x != nil { - return x.QueryMode - } - return ExecuteSqlRequest_NORMAL -} - -func (x *ExecuteSqlRequest) GetPartitionToken() []byte { - if x != nil { - return x.PartitionToken - } - return nil -} - -func (x *ExecuteSqlRequest) GetSeqno() int64 { - if x != nil { - return x.Seqno - } - return 0 -} - -func (x *ExecuteSqlRequest) GetQueryOptions() *ExecuteSqlRequest_QueryOptions { - if x != nil { - return x.QueryOptions - } - return nil -} - -func (x *ExecuteSqlRequest) GetRequestOptions() *RequestOptions { - if x != nil { - return x.RequestOptions - } - return nil -} - -func (x *ExecuteSqlRequest) GetDirectedReadOptions() *DirectedReadOptions { - if x != nil { - return x.DirectedReadOptions - } - return nil -} - -func (x *ExecuteSqlRequest) GetDataBoostEnabled() bool { - if x != nil { - return x.DataBoostEnabled - } - return false -} - -func (x *ExecuteSqlRequest) GetLastStatement() bool { - if x != nil { - return x.LastStatement - } - return false -} - -// The request for [ExecuteBatchDml][google.spanner.v1.Spanner.ExecuteBatchDml]. -type ExecuteBatchDmlRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the DML statements should be performed. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Required. The transaction to use. Must be a read-write transaction. - // - // To protect against replays, single-use transactions are not supported. The - // caller must either supply an existing transaction ID or begin a new - // transaction. - Transaction *TransactionSelector `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` - // Required. The list of statements to execute in this batch. Statements are - // executed serially, such that the effects of statement `i` are visible to - // statement `i+1`. Each statement must be a DML statement. Execution stops at - // the first failed statement; the remaining statements are not executed. - // - // Callers must provide at least one statement. - Statements []*ExecuteBatchDmlRequest_Statement `protobuf:"bytes,3,rep,name=statements,proto3" json:"statements,omitempty"` - // Required. A per-transaction sequence number used to identify this request. - // This field makes each request idempotent such that if the request is - // received multiple times, at most one will succeed. - // - // The sequence number must be monotonically increasing within the - // transaction. If a request arrives for the first time with an out-of-order - // sequence number, the transaction may be aborted. Replays of previously - // handled requests will yield the same response as the first execution. - Seqno int64 `protobuf:"varint,4,opt,name=seqno,proto3" json:"seqno,omitempty"` - // Common options for this request. - RequestOptions *RequestOptions `protobuf:"bytes,5,opt,name=request_options,json=requestOptions,proto3" json:"request_options,omitempty"` - // Optional. If set to true, this request marks the end of the transaction. - // The transaction should be committed or aborted after these statements - // execute, and attempts to execute any other requests against this - // transaction (including reads and queries) will be rejected. - // - // Setting this option may cause some error reporting to be deferred until - // commit time (e.g. validation of unique constraints). Given this, successful - // execution of statements should not be assumed until a subsequent Commit - // call completes successfully. - LastStatements bool `protobuf:"varint,6,opt,name=last_statements,json=lastStatements,proto3" json:"last_statements,omitempty"` -} - -func (x *ExecuteBatchDmlRequest) Reset() { - *x = ExecuteBatchDmlRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteBatchDmlRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteBatchDmlRequest) ProtoMessage() {} - -func (x *ExecuteBatchDmlRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteBatchDmlRequest.ProtoReflect.Descriptor instead. -func (*ExecuteBatchDmlRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{11} -} - -func (x *ExecuteBatchDmlRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *ExecuteBatchDmlRequest) GetTransaction() *TransactionSelector { - if x != nil { - return x.Transaction - } - return nil -} - -func (x *ExecuteBatchDmlRequest) GetStatements() []*ExecuteBatchDmlRequest_Statement { - if x != nil { - return x.Statements - } - return nil -} - -func (x *ExecuteBatchDmlRequest) GetSeqno() int64 { - if x != nil { - return x.Seqno - } - return 0 -} - -func (x *ExecuteBatchDmlRequest) GetRequestOptions() *RequestOptions { - if x != nil { - return x.RequestOptions - } - return nil -} - -func (x *ExecuteBatchDmlRequest) GetLastStatements() bool { - if x != nil { - return x.LastStatements - } - return false -} - -// The response for -// [ExecuteBatchDml][google.spanner.v1.Spanner.ExecuteBatchDml]. Contains a list -// of [ResultSet][google.spanner.v1.ResultSet] messages, one for each DML -// statement that has successfully executed, in the same order as the statements -// in the request. If a statement fails, the status in the response body -// identifies the cause of the failure. -// -// To check for DML statements that failed, use the following approach: -// -// 1. Check the status in the response message. The -// [google.rpc.Code][google.rpc.Code] enum -// -// value `OK` indicates that all statements were executed successfully. -// 2. If the status was not `OK`, check the number of result sets in the -// response. If the response contains `N` -// [ResultSet][google.spanner.v1.ResultSet] messages, then statement `N+1` in -// the request failed. -// -// Example 1: -// -// * Request: 5 DML statements, all executed successfully. -// * Response: 5 [ResultSet][google.spanner.v1.ResultSet] messages, with the -// status `OK`. -// -// Example 2: -// -// * Request: 5 DML statements. The third statement has a syntax error. -// * Response: 2 [ResultSet][google.spanner.v1.ResultSet] messages, and a syntax -// error (`INVALID_ARGUMENT`) -// -// status. The number of [ResultSet][google.spanner.v1.ResultSet] messages -// indicates that the third statement failed, and the fourth and fifth -// statements were not executed. -type ExecuteBatchDmlResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // One [ResultSet][google.spanner.v1.ResultSet] for each statement in the - // request that ran successfully, in the same order as the statements in the - // request. Each [ResultSet][google.spanner.v1.ResultSet] does not contain any - // rows. The [ResultSetStats][google.spanner.v1.ResultSetStats] in each - // [ResultSet][google.spanner.v1.ResultSet] contain the number of rows - // modified by the statement. - // - // Only the first [ResultSet][google.spanner.v1.ResultSet] in the response - // contains valid [ResultSetMetadata][google.spanner.v1.ResultSetMetadata]. - ResultSets []*ResultSet `protobuf:"bytes,1,rep,name=result_sets,json=resultSets,proto3" json:"result_sets,omitempty"` - // If all DML statements are executed successfully, the status is `OK`. - // Otherwise, the error status of the first failed statement. - Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - // Optional. A precommit token will be included if the read-write transaction - // is on a multiplexed session. - // The precommit token with the highest sequence number from this transaction - // attempt should be passed to the - // [Commit][google.spanner.v1.Spanner.Commit] request for this transaction. - // This feature is not yet supported and will result in an UNIMPLEMENTED - // error. - PrecommitToken *MultiplexedSessionPrecommitToken `protobuf:"bytes,3,opt,name=precommit_token,json=precommitToken,proto3" json:"precommit_token,omitempty"` -} - -func (x *ExecuteBatchDmlResponse) Reset() { - *x = ExecuteBatchDmlResponse{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteBatchDmlResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteBatchDmlResponse) ProtoMessage() {} - -func (x *ExecuteBatchDmlResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[12] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteBatchDmlResponse.ProtoReflect.Descriptor instead. -func (*ExecuteBatchDmlResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{12} -} - -func (x *ExecuteBatchDmlResponse) GetResultSets() []*ResultSet { - if x != nil { - return x.ResultSets - } - return nil -} - -func (x *ExecuteBatchDmlResponse) GetStatus() *status.Status { - if x != nil { - return x.Status - } - return nil -} - -func (x *ExecuteBatchDmlResponse) GetPrecommitToken() *MultiplexedSessionPrecommitToken { - if x != nil { - return x.PrecommitToken - } - return nil -} - -// Options for a PartitionQueryRequest and -// PartitionReadRequest. -type PartitionOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // **Note:** This hint is currently ignored by PartitionQuery and - // PartitionRead requests. - // - // The desired data size for each partition generated. The default for this - // option is currently 1 GiB. This is only a hint. The actual size of each - // partition may be smaller or larger than this size request. - PartitionSizeBytes int64 `protobuf:"varint,1,opt,name=partition_size_bytes,json=partitionSizeBytes,proto3" json:"partition_size_bytes,omitempty"` - // **Note:** This hint is currently ignored by PartitionQuery and - // PartitionRead requests. - // - // The desired maximum number of partitions to return. For example, this may - // be set to the number of workers available. The default for this option - // is currently 10,000. The maximum value is currently 200,000. This is only - // a hint. The actual number of partitions returned may be smaller or larger - // than this maximum count request. - MaxPartitions int64 `protobuf:"varint,2,opt,name=max_partitions,json=maxPartitions,proto3" json:"max_partitions,omitempty"` -} - -func (x *PartitionOptions) Reset() { - *x = PartitionOptions{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PartitionOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PartitionOptions) ProtoMessage() {} - -func (x *PartitionOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[13] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PartitionOptions.ProtoReflect.Descriptor instead. -func (*PartitionOptions) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{13} -} - -func (x *PartitionOptions) GetPartitionSizeBytes() int64 { - if x != nil { - return x.PartitionSizeBytes - } - return 0 -} - -func (x *PartitionOptions) GetMaxPartitions() int64 { - if x != nil { - return x.MaxPartitions - } - return 0 -} - -// The request for [PartitionQuery][google.spanner.v1.Spanner.PartitionQuery] -type PartitionQueryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session used to create the partitions. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Read only snapshot transactions are supported, read/write and single use - // transactions are not. - Transaction *TransactionSelector `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` - // Required. The query request to generate partitions for. The request will - // fail if the query is not root partitionable. For a query to be root - // partitionable, it needs to satisfy a few conditions. For example, if the - // query execution plan contains a distributed union operator, then it must be - // the first operator in the plan. For more information about other - // conditions, see [Read data in - // parallel](https://cloud.google.com/spanner/docs/reads#read_data_in_parallel). - // - // The query request must not contain DML commands, such as INSERT, UPDATE, or - // DELETE. Use - // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] with a - // PartitionedDml transaction for large, partition-friendly DML operations. - Sql string `protobuf:"bytes,3,opt,name=sql,proto3" json:"sql,omitempty"` - // Parameter names and values that bind to placeholders in the SQL string. - // - // A parameter placeholder consists of the `@` character followed by the - // parameter name (for example, `@firstName`). Parameter names can contain - // letters, numbers, and underscores. - // - // Parameters can appear anywhere that a literal value is expected. The same - // parameter name can be used more than once, for example: - // - // `"WHERE id > @msg_id AND id < @msg_id + 100"` - // - // It is an error to execute a SQL statement with unbound parameters. - Params *structpb.Struct `protobuf:"bytes,4,opt,name=params,proto3" json:"params,omitempty"` - // It is not always possible for Cloud Spanner to infer the right SQL type - // from a JSON value. For example, values of type `BYTES` and values - // of type `STRING` both appear in - // [params][google.spanner.v1.PartitionQueryRequest.params] as JSON strings. - // - // In these cases, `param_types` can be used to specify the exact - // SQL type for some or all of the SQL query parameters. See the - // definition of [Type][google.spanner.v1.Type] for more information - // about SQL types. - ParamTypes map[string]*Type `protobuf:"bytes,5,rep,name=param_types,json=paramTypes,proto3" json:"param_types,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Additional options that affect how many partitions are created. - PartitionOptions *PartitionOptions `protobuf:"bytes,6,opt,name=partition_options,json=partitionOptions,proto3" json:"partition_options,omitempty"` -} - -func (x *PartitionQueryRequest) Reset() { - *x = PartitionQueryRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PartitionQueryRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PartitionQueryRequest) ProtoMessage() {} - -func (x *PartitionQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[14] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PartitionQueryRequest.ProtoReflect.Descriptor instead. -func (*PartitionQueryRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{14} -} - -func (x *PartitionQueryRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *PartitionQueryRequest) GetTransaction() *TransactionSelector { - if x != nil { - return x.Transaction - } - return nil -} - -func (x *PartitionQueryRequest) GetSql() string { - if x != nil { - return x.Sql - } - return "" -} - -func (x *PartitionQueryRequest) GetParams() *structpb.Struct { - if x != nil { - return x.Params - } - return nil -} - -func (x *PartitionQueryRequest) GetParamTypes() map[string]*Type { - if x != nil { - return x.ParamTypes - } - return nil -} - -func (x *PartitionQueryRequest) GetPartitionOptions() *PartitionOptions { - if x != nil { - return x.PartitionOptions - } - return nil -} - -// The request for [PartitionRead][google.spanner.v1.Spanner.PartitionRead] -type PartitionReadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session used to create the partitions. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Read only snapshot transactions are supported, read/write and single use - // transactions are not. - Transaction *TransactionSelector `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` - // Required. The name of the table in the database to be read. - Table string `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"` - // If non-empty, the name of an index on - // [table][google.spanner.v1.PartitionReadRequest.table]. This index is used - // instead of the table primary key when interpreting - // [key_set][google.spanner.v1.PartitionReadRequest.key_set] and sorting - // result rows. See [key_set][google.spanner.v1.PartitionReadRequest.key_set] - // for further information. - Index string `protobuf:"bytes,4,opt,name=index,proto3" json:"index,omitempty"` - // The columns of [table][google.spanner.v1.PartitionReadRequest.table] to be - // returned for each row matching this request. - Columns []string `protobuf:"bytes,5,rep,name=columns,proto3" json:"columns,omitempty"` - // Required. `key_set` identifies the rows to be yielded. `key_set` names the - // primary keys of the rows in - // [table][google.spanner.v1.PartitionReadRequest.table] to be yielded, unless - // [index][google.spanner.v1.PartitionReadRequest.index] is present. If - // [index][google.spanner.v1.PartitionReadRequest.index] is present, then - // [key_set][google.spanner.v1.PartitionReadRequest.key_set] instead names - // index keys in [index][google.spanner.v1.PartitionReadRequest.index]. - // - // It is not an error for the `key_set` to name rows that do not - // exist in the database. Read yields nothing for nonexistent rows. - KeySet *KeySet `protobuf:"bytes,6,opt,name=key_set,json=keySet,proto3" json:"key_set,omitempty"` - // Additional options that affect how many partitions are created. - PartitionOptions *PartitionOptions `protobuf:"bytes,9,opt,name=partition_options,json=partitionOptions,proto3" json:"partition_options,omitempty"` -} - -func (x *PartitionReadRequest) Reset() { - *x = PartitionReadRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PartitionReadRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PartitionReadRequest) ProtoMessage() {} - -func (x *PartitionReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[15] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PartitionReadRequest.ProtoReflect.Descriptor instead. -func (*PartitionReadRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{15} -} - -func (x *PartitionReadRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *PartitionReadRequest) GetTransaction() *TransactionSelector { - if x != nil { - return x.Transaction - } - return nil -} - -func (x *PartitionReadRequest) GetTable() string { - if x != nil { - return x.Table - } - return "" -} - -func (x *PartitionReadRequest) GetIndex() string { - if x != nil { - return x.Index - } - return "" -} - -func (x *PartitionReadRequest) GetColumns() []string { - if x != nil { - return x.Columns - } - return nil -} - -func (x *PartitionReadRequest) GetKeySet() *KeySet { - if x != nil { - return x.KeySet - } - return nil -} - -func (x *PartitionReadRequest) GetPartitionOptions() *PartitionOptions { - if x != nil { - return x.PartitionOptions - } - return nil -} - -// Information returned for each partition returned in a -// PartitionResponse. -type Partition struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // This token can be passed to Read, StreamingRead, ExecuteSql, or - // ExecuteStreamingSql requests to restrict the results to those identified by - // this partition token. - PartitionToken []byte `protobuf:"bytes,1,opt,name=partition_token,json=partitionToken,proto3" json:"partition_token,omitempty"` -} - -func (x *Partition) Reset() { - *x = Partition{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Partition) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Partition) ProtoMessage() {} - -func (x *Partition) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[16] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Partition.ProtoReflect.Descriptor instead. -func (*Partition) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{16} -} - -func (x *Partition) GetPartitionToken() []byte { - if x != nil { - return x.PartitionToken - } - return nil -} - -// The response for [PartitionQuery][google.spanner.v1.Spanner.PartitionQuery] -// or [PartitionRead][google.spanner.v1.Spanner.PartitionRead] -type PartitionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Partitions created by this request. - Partitions []*Partition `protobuf:"bytes,1,rep,name=partitions,proto3" json:"partitions,omitempty"` - // Transaction created by this request. - Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` -} - -func (x *PartitionResponse) Reset() { - *x = PartitionResponse{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *PartitionResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PartitionResponse) ProtoMessage() {} - -func (x *PartitionResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[17] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PartitionResponse.ProtoReflect.Descriptor instead. -func (*PartitionResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{17} -} - -func (x *PartitionResponse) GetPartitions() []*Partition { - if x != nil { - return x.Partitions - } - return nil -} - -func (x *PartitionResponse) GetTransaction() *Transaction { - if x != nil { - return x.Transaction - } - return nil -} - -// The request for [Read][google.spanner.v1.Spanner.Read] and -// [StreamingRead][google.spanner.v1.Spanner.StreamingRead]. -type ReadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the read should be performed. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // The transaction to use. If none is provided, the default is a - // temporary read-only transaction with strong concurrency. - Transaction *TransactionSelector `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"` - // Required. The name of the table in the database to be read. - Table string `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"` - // If non-empty, the name of an index on - // [table][google.spanner.v1.ReadRequest.table]. This index is used instead of - // the table primary key when interpreting - // [key_set][google.spanner.v1.ReadRequest.key_set] and sorting result rows. - // See [key_set][google.spanner.v1.ReadRequest.key_set] for further - // information. - Index string `protobuf:"bytes,4,opt,name=index,proto3" json:"index,omitempty"` - // Required. The columns of [table][google.spanner.v1.ReadRequest.table] to be - // returned for each row matching this request. - Columns []string `protobuf:"bytes,5,rep,name=columns,proto3" json:"columns,omitempty"` - // Required. `key_set` identifies the rows to be yielded. `key_set` names the - // primary keys of the rows in [table][google.spanner.v1.ReadRequest.table] to - // be yielded, unless [index][google.spanner.v1.ReadRequest.index] is present. - // If [index][google.spanner.v1.ReadRequest.index] is present, then - // [key_set][google.spanner.v1.ReadRequest.key_set] instead names index keys - // in [index][google.spanner.v1.ReadRequest.index]. - // - // If the [partition_token][google.spanner.v1.ReadRequest.partition_token] - // field is empty, rows are yielded in table primary key order (if - // [index][google.spanner.v1.ReadRequest.index] is empty) or index key order - // (if [index][google.spanner.v1.ReadRequest.index] is non-empty). If the - // [partition_token][google.spanner.v1.ReadRequest.partition_token] field is - // not empty, rows will be yielded in an unspecified order. - // - // It is not an error for the `key_set` to name rows that do not - // exist in the database. Read yields nothing for nonexistent rows. - KeySet *KeySet `protobuf:"bytes,6,opt,name=key_set,json=keySet,proto3" json:"key_set,omitempty"` - // If greater than zero, only the first `limit` rows are yielded. If `limit` - // is zero, the default is no limit. A limit cannot be specified if - // `partition_token` is set. - Limit int64 `protobuf:"varint,8,opt,name=limit,proto3" json:"limit,omitempty"` - // If this request is resuming a previously interrupted read, - // `resume_token` should be copied from the last - // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the - // interruption. Doing this enables the new read to resume where the last read - // left off. The rest of the request parameters must exactly match the request - // that yielded this token. - ResumeToken []byte `protobuf:"bytes,9,opt,name=resume_token,json=resumeToken,proto3" json:"resume_token,omitempty"` - // If present, results will be restricted to the specified partition - // previously created using PartitionRead(). There must be an exact - // match for the values of fields common to this message and the - // PartitionReadRequest message used to create this partition_token. - PartitionToken []byte `protobuf:"bytes,10,opt,name=partition_token,json=partitionToken,proto3" json:"partition_token,omitempty"` - // Common options for this request. - RequestOptions *RequestOptions `protobuf:"bytes,11,opt,name=request_options,json=requestOptions,proto3" json:"request_options,omitempty"` - // Directed read options for this request. - DirectedReadOptions *DirectedReadOptions `protobuf:"bytes,14,opt,name=directed_read_options,json=directedReadOptions,proto3" json:"directed_read_options,omitempty"` - // If this is for a partitioned read and this field is set to `true`, the - // request is executed with Spanner Data Boost independent compute resources. - // - // If the field is set to `true` but the request does not set - // `partition_token`, the API returns an `INVALID_ARGUMENT` error. - DataBoostEnabled bool `protobuf:"varint,15,opt,name=data_boost_enabled,json=dataBoostEnabled,proto3" json:"data_boost_enabled,omitempty"` - // Optional. Order for the returned rows. - // - // By default, Spanner will return result rows in primary key order except for - // PartitionRead requests. For applications that do not require rows to be - // returned in primary key (`ORDER_BY_PRIMARY_KEY`) order, setting - // `ORDER_BY_NO_ORDER` option allows Spanner to optimize row retrieval, - // resulting in lower latencies in certain cases (e.g. bulk point lookups). - OrderBy ReadRequest_OrderBy `protobuf:"varint,16,opt,name=order_by,json=orderBy,proto3,enum=google.spanner.v1.ReadRequest_OrderBy" json:"order_by,omitempty"` - // Optional. Lock Hint for the request, it can only be used with read-write - // transactions. - LockHint ReadRequest_LockHint `protobuf:"varint,17,opt,name=lock_hint,json=lockHint,proto3,enum=google.spanner.v1.ReadRequest_LockHint" json:"lock_hint,omitempty"` -} - -func (x *ReadRequest) Reset() { - *x = ReadRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ReadRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReadRequest) ProtoMessage() {} - -func (x *ReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[18] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReadRequest.ProtoReflect.Descriptor instead. -func (*ReadRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{18} -} - -func (x *ReadRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *ReadRequest) GetTransaction() *TransactionSelector { - if x != nil { - return x.Transaction - } - return nil -} - -func (x *ReadRequest) GetTable() string { - if x != nil { - return x.Table - } - return "" -} - -func (x *ReadRequest) GetIndex() string { - if x != nil { - return x.Index - } - return "" -} - -func (x *ReadRequest) GetColumns() []string { - if x != nil { - return x.Columns - } - return nil -} - -func (x *ReadRequest) GetKeySet() *KeySet { - if x != nil { - return x.KeySet - } - return nil -} - -func (x *ReadRequest) GetLimit() int64 { - if x != nil { - return x.Limit - } - return 0 -} - -func (x *ReadRequest) GetResumeToken() []byte { - if x != nil { - return x.ResumeToken - } - return nil -} - -func (x *ReadRequest) GetPartitionToken() []byte { - if x != nil { - return x.PartitionToken - } - return nil -} - -func (x *ReadRequest) GetRequestOptions() *RequestOptions { - if x != nil { - return x.RequestOptions - } - return nil -} - -func (x *ReadRequest) GetDirectedReadOptions() *DirectedReadOptions { - if x != nil { - return x.DirectedReadOptions - } - return nil -} - -func (x *ReadRequest) GetDataBoostEnabled() bool { - if x != nil { - return x.DataBoostEnabled - } - return false -} - -func (x *ReadRequest) GetOrderBy() ReadRequest_OrderBy { - if x != nil { - return x.OrderBy - } - return ReadRequest_ORDER_BY_UNSPECIFIED -} - -func (x *ReadRequest) GetLockHint() ReadRequest_LockHint { - if x != nil { - return x.LockHint - } - return ReadRequest_LOCK_HINT_UNSPECIFIED -} - -// The request for -// [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction]. -type BeginTransactionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the transaction runs. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Required. Options for the new transaction. - Options *TransactionOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` - // Common options for this request. - // Priority is ignored for this request. Setting the priority in this - // request_options struct will not do anything. To set the priority for a - // transaction, set it on the reads and writes that are part of this - // transaction instead. - RequestOptions *RequestOptions `protobuf:"bytes,3,opt,name=request_options,json=requestOptions,proto3" json:"request_options,omitempty"` - // Optional. Required for read-write transactions on a multiplexed session - // that commit mutations but do not perform any reads or queries. Clients - // should randomly select one of the mutations from the mutation set and send - // it as a part of this request. - // This feature is not yet supported and will result in an UNIMPLEMENTED - // error. - MutationKey *Mutation `protobuf:"bytes,4,opt,name=mutation_key,json=mutationKey,proto3" json:"mutation_key,omitempty"` -} - -func (x *BeginTransactionRequest) Reset() { - *x = BeginTransactionRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BeginTransactionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BeginTransactionRequest) ProtoMessage() {} - -func (x *BeginTransactionRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[19] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BeginTransactionRequest.ProtoReflect.Descriptor instead. -func (*BeginTransactionRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{19} -} - -func (x *BeginTransactionRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *BeginTransactionRequest) GetOptions() *TransactionOptions { - if x != nil { - return x.Options - } - return nil -} - -func (x *BeginTransactionRequest) GetRequestOptions() *RequestOptions { - if x != nil { - return x.RequestOptions - } - return nil -} - -func (x *BeginTransactionRequest) GetMutationKey() *Mutation { - if x != nil { - return x.MutationKey - } - return nil -} - -// The request for [Commit][google.spanner.v1.Spanner.Commit]. -type CommitRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the transaction to be committed is running. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Required. The transaction in which to commit. - // - // Types that are assignable to Transaction: - // - // *CommitRequest_TransactionId - // *CommitRequest_SingleUseTransaction - Transaction isCommitRequest_Transaction `protobuf_oneof:"transaction"` - // The mutations to be executed when this transaction commits. All - // mutations are applied atomically, in the order they appear in - // this list. - Mutations []*Mutation `protobuf:"bytes,4,rep,name=mutations,proto3" json:"mutations,omitempty"` - // If `true`, then statistics related to the transaction will be included in - // the [CommitResponse][google.spanner.v1.CommitResponse.commit_stats]. - // Default value is `false`. - ReturnCommitStats bool `protobuf:"varint,5,opt,name=return_commit_stats,json=returnCommitStats,proto3" json:"return_commit_stats,omitempty"` - // Optional. The amount of latency this request is willing to incur in order - // to improve throughput. If this field is not set, Spanner assumes requests - // are relatively latency sensitive and automatically determines an - // appropriate delay time. You can specify a batching delay value between 0 - // and 500 ms. - MaxCommitDelay *durationpb.Duration `protobuf:"bytes,8,opt,name=max_commit_delay,json=maxCommitDelay,proto3" json:"max_commit_delay,omitempty"` - // Common options for this request. - RequestOptions *RequestOptions `protobuf:"bytes,6,opt,name=request_options,json=requestOptions,proto3" json:"request_options,omitempty"` - // Optional. If the read-write transaction was executed on a multiplexed - // session, the precommit token with the highest sequence number received in - // this transaction attempt, should be included here. Failing to do so will - // result in a FailedPrecondition error. - // This feature is not yet supported and will result in an UNIMPLEMENTED - // error. - PrecommitToken *MultiplexedSessionPrecommitToken `protobuf:"bytes,9,opt,name=precommit_token,json=precommitToken,proto3" json:"precommit_token,omitempty"` -} - -func (x *CommitRequest) Reset() { - *x = CommitRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *CommitRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CommitRequest) ProtoMessage() {} - -func (x *CommitRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[20] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CommitRequest.ProtoReflect.Descriptor instead. -func (*CommitRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{20} -} - -func (x *CommitRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (m *CommitRequest) GetTransaction() isCommitRequest_Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (x *CommitRequest) GetTransactionId() []byte { - if x, ok := x.GetTransaction().(*CommitRequest_TransactionId); ok { - return x.TransactionId - } - return nil -} - -func (x *CommitRequest) GetSingleUseTransaction() *TransactionOptions { - if x, ok := x.GetTransaction().(*CommitRequest_SingleUseTransaction); ok { - return x.SingleUseTransaction - } - return nil -} - -func (x *CommitRequest) GetMutations() []*Mutation { - if x != nil { - return x.Mutations - } - return nil -} - -func (x *CommitRequest) GetReturnCommitStats() bool { - if x != nil { - return x.ReturnCommitStats - } - return false -} - -func (x *CommitRequest) GetMaxCommitDelay() *durationpb.Duration { - if x != nil { - return x.MaxCommitDelay - } - return nil -} - -func (x *CommitRequest) GetRequestOptions() *RequestOptions { - if x != nil { - return x.RequestOptions - } - return nil -} - -func (x *CommitRequest) GetPrecommitToken() *MultiplexedSessionPrecommitToken { - if x != nil { - return x.PrecommitToken - } - return nil -} - -type isCommitRequest_Transaction interface { - isCommitRequest_Transaction() -} - -type CommitRequest_TransactionId struct { - // Commit a previously-started transaction. - TransactionId []byte `protobuf:"bytes,2,opt,name=transaction_id,json=transactionId,proto3,oneof"` -} - -type CommitRequest_SingleUseTransaction struct { - // Execute mutations in a temporary transaction. Note that unlike - // commit of a previously-started transaction, commit with a - // temporary transaction is non-idempotent. That is, if the - // `CommitRequest` is sent to Cloud Spanner more than once (for - // instance, due to retries in the application, or in the - // transport library), it is possible that the mutations are - // executed more than once. If this is undesirable, use - // [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction] and - // [Commit][google.spanner.v1.Spanner.Commit] instead. - SingleUseTransaction *TransactionOptions `protobuf:"bytes,3,opt,name=single_use_transaction,json=singleUseTransaction,proto3,oneof"` -} - -func (*CommitRequest_TransactionId) isCommitRequest_Transaction() {} - -func (*CommitRequest_SingleUseTransaction) isCommitRequest_Transaction() {} - -// The request for [Rollback][google.spanner.v1.Spanner.Rollback]. -type RollbackRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the transaction to roll back is running. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Required. The transaction to roll back. - TransactionId []byte `protobuf:"bytes,2,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` -} - -func (x *RollbackRequest) Reset() { - *x = RollbackRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RollbackRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RollbackRequest) ProtoMessage() {} - -func (x *RollbackRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[21] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RollbackRequest.ProtoReflect.Descriptor instead. -func (*RollbackRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{21} -} - -func (x *RollbackRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *RollbackRequest) GetTransactionId() []byte { - if x != nil { - return x.TransactionId - } - return nil -} - -// The request for [BatchWrite][google.spanner.v1.Spanner.BatchWrite]. -type BatchWriteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The session in which the batch request is to be run. - Session string `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` - // Common options for this request. - RequestOptions *RequestOptions `protobuf:"bytes,3,opt,name=request_options,json=requestOptions,proto3" json:"request_options,omitempty"` - // Required. The groups of mutations to be applied. - MutationGroups []*BatchWriteRequest_MutationGroup `protobuf:"bytes,4,rep,name=mutation_groups,json=mutationGroups,proto3" json:"mutation_groups,omitempty"` - // Optional. When `exclude_txn_from_change_streams` is set to `true`: - // - Mutations from all transactions in this batch write operation will not - // be recorded in change streams with DDL option `allow_txn_exclusion=true` - // that are tracking columns modified by these transactions. - // - Mutations from all transactions in this batch write operation will be - // recorded in change streams with DDL option `allow_txn_exclusion=false or - // not set` that are tracking columns modified by these transactions. - // - // When `exclude_txn_from_change_streams` is set to `false` or not set, - // mutations from all transactions in this batch write operation will be - // recorded in all change streams that are tracking columns modified by these - // transactions. - ExcludeTxnFromChangeStreams bool `protobuf:"varint,5,opt,name=exclude_txn_from_change_streams,json=excludeTxnFromChangeStreams,proto3" json:"exclude_txn_from_change_streams,omitempty"` -} - -func (x *BatchWriteRequest) Reset() { - *x = BatchWriteRequest{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BatchWriteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchWriteRequest) ProtoMessage() {} - -func (x *BatchWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[22] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchWriteRequest.ProtoReflect.Descriptor instead. -func (*BatchWriteRequest) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{22} -} - -func (x *BatchWriteRequest) GetSession() string { - if x != nil { - return x.Session - } - return "" -} - -func (x *BatchWriteRequest) GetRequestOptions() *RequestOptions { - if x != nil { - return x.RequestOptions - } - return nil -} - -func (x *BatchWriteRequest) GetMutationGroups() []*BatchWriteRequest_MutationGroup { - if x != nil { - return x.MutationGroups - } - return nil -} - -func (x *BatchWriteRequest) GetExcludeTxnFromChangeStreams() bool { - if x != nil { - return x.ExcludeTxnFromChangeStreams - } - return false -} - -// The result of applying a batch of mutations. -type BatchWriteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The mutation groups applied in this batch. The values index into the - // `mutation_groups` field in the corresponding `BatchWriteRequest`. - Indexes []int32 `protobuf:"varint,1,rep,packed,name=indexes,proto3" json:"indexes,omitempty"` - // An `OK` status indicates success. Any other status indicates a failure. - Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - // The commit timestamp of the transaction that applied this batch. - // Present if `status` is `OK`, absent otherwise. - CommitTimestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=commit_timestamp,json=commitTimestamp,proto3" json:"commit_timestamp,omitempty"` -} - -func (x *BatchWriteResponse) Reset() { - *x = BatchWriteResponse{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BatchWriteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchWriteResponse) ProtoMessage() {} - -func (x *BatchWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[23] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchWriteResponse.ProtoReflect.Descriptor instead. -func (*BatchWriteResponse) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{23} -} - -func (x *BatchWriteResponse) GetIndexes() []int32 { - if x != nil { - return x.Indexes - } - return nil -} - -func (x *BatchWriteResponse) GetStatus() *status.Status { - if x != nil { - return x.Status - } - return nil -} - -func (x *BatchWriteResponse) GetCommitTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.CommitTimestamp - } - return nil -} - -// The directed read replica selector. -// Callers must provide one or more of the following fields for replica -// selection: -// -// - `location` - The location must be one of the regions within the -// multi-region configuration of your database. -// - `type` - The type of the replica. -// -// Some examples of using replica_selectors are: -// -// - `location:us-east1` --> The "us-east1" replica(s) of any available type -// will be used to process the request. -// - `type:READ_ONLY` --> The "READ_ONLY" type replica(s) in nearest -// available location will be used to process the -// request. -// - `location:us-east1 type:READ_ONLY` --> The "READ_ONLY" type replica(s) -// in location "us-east1" will be used to process -// the request. -type DirectedReadOptions_ReplicaSelection struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The location or region of the serving requests, e.g. "us-east1". - Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` - // The type of replica. - Type DirectedReadOptions_ReplicaSelection_Type `protobuf:"varint,2,opt,name=type,proto3,enum=google.spanner.v1.DirectedReadOptions_ReplicaSelection_Type" json:"type,omitempty"` -} - -func (x *DirectedReadOptions_ReplicaSelection) Reset() { - *x = DirectedReadOptions_ReplicaSelection{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DirectedReadOptions_ReplicaSelection) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DirectedReadOptions_ReplicaSelection) ProtoMessage() {} - -func (x *DirectedReadOptions_ReplicaSelection) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[25] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DirectedReadOptions_ReplicaSelection.ProtoReflect.Descriptor instead. -func (*DirectedReadOptions_ReplicaSelection) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{9, 0} -} - -func (x *DirectedReadOptions_ReplicaSelection) GetLocation() string { - if x != nil { - return x.Location - } - return "" -} - -func (x *DirectedReadOptions_ReplicaSelection) GetType() DirectedReadOptions_ReplicaSelection_Type { - if x != nil { - return x.Type - } - return DirectedReadOptions_ReplicaSelection_TYPE_UNSPECIFIED -} - -// An IncludeReplicas contains a repeated set of ReplicaSelection which -// indicates the order in which replicas should be considered. -type DirectedReadOptions_IncludeReplicas struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The directed read replica selector. - ReplicaSelections []*DirectedReadOptions_ReplicaSelection `protobuf:"bytes,1,rep,name=replica_selections,json=replicaSelections,proto3" json:"replica_selections,omitempty"` - // If true, Spanner will not route requests to a replica outside the - // include_replicas list when all of the specified replicas are unavailable - // or unhealthy. Default value is `false`. - AutoFailoverDisabled bool `protobuf:"varint,2,opt,name=auto_failover_disabled,json=autoFailoverDisabled,proto3" json:"auto_failover_disabled,omitempty"` -} - -func (x *DirectedReadOptions_IncludeReplicas) Reset() { - *x = DirectedReadOptions_IncludeReplicas{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DirectedReadOptions_IncludeReplicas) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DirectedReadOptions_IncludeReplicas) ProtoMessage() {} - -func (x *DirectedReadOptions_IncludeReplicas) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[26] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DirectedReadOptions_IncludeReplicas.ProtoReflect.Descriptor instead. -func (*DirectedReadOptions_IncludeReplicas) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{9, 1} -} - -func (x *DirectedReadOptions_IncludeReplicas) GetReplicaSelections() []*DirectedReadOptions_ReplicaSelection { - if x != nil { - return x.ReplicaSelections - } - return nil -} - -func (x *DirectedReadOptions_IncludeReplicas) GetAutoFailoverDisabled() bool { - if x != nil { - return x.AutoFailoverDisabled - } - return false -} - -// An ExcludeReplicas contains a repeated set of ReplicaSelection that should -// be excluded from serving requests. -type DirectedReadOptions_ExcludeReplicas struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The directed read replica selector. - ReplicaSelections []*DirectedReadOptions_ReplicaSelection `protobuf:"bytes,1,rep,name=replica_selections,json=replicaSelections,proto3" json:"replica_selections,omitempty"` -} - -func (x *DirectedReadOptions_ExcludeReplicas) Reset() { - *x = DirectedReadOptions_ExcludeReplicas{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DirectedReadOptions_ExcludeReplicas) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DirectedReadOptions_ExcludeReplicas) ProtoMessage() {} - -func (x *DirectedReadOptions_ExcludeReplicas) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[27] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DirectedReadOptions_ExcludeReplicas.ProtoReflect.Descriptor instead. -func (*DirectedReadOptions_ExcludeReplicas) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{9, 2} -} - -func (x *DirectedReadOptions_ExcludeReplicas) GetReplicaSelections() []*DirectedReadOptions_ReplicaSelection { - if x != nil { - return x.ReplicaSelections - } - return nil -} - -// Query optimizer configuration. -type ExecuteSqlRequest_QueryOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // An option to control the selection of optimizer version. - // - // This parameter allows individual queries to pick different query - // optimizer versions. - // - // Specifying `latest` as a value instructs Cloud Spanner to use the - // latest supported query optimizer version. If not specified, Cloud Spanner - // uses the optimizer version set at the database level options. Any other - // positive integer (from the list of supported optimizer versions) - // overrides the default optimizer version for query execution. - // - // The list of supported optimizer versions can be queried from - // SPANNER_SYS.SUPPORTED_OPTIMIZER_VERSIONS. - // - // Executing a SQL statement with an invalid optimizer version fails with - // an `INVALID_ARGUMENT` error. - // - // See - // https://cloud.google.com/spanner/docs/query-optimizer/manage-query-optimizer - // for more information on managing the query optimizer. - // - // The `optimizer_version` statement hint has precedence over this setting. - OptimizerVersion string `protobuf:"bytes,1,opt,name=optimizer_version,json=optimizerVersion,proto3" json:"optimizer_version,omitempty"` - // An option to control the selection of optimizer statistics package. - // - // This parameter allows individual queries to use a different query - // optimizer statistics package. - // - // Specifying `latest` as a value instructs Cloud Spanner to use the latest - // generated statistics package. If not specified, Cloud Spanner uses - // the statistics package set at the database level options, or the latest - // package if the database option is not set. - // - // The statistics package requested by the query has to be exempt from - // garbage collection. This can be achieved with the following DDL - // statement: - // - // ``` - // ALTER STATISTICS SET OPTIONS (allow_gc=false) - // ``` - // - // The list of available statistics packages can be queried from - // `INFORMATION_SCHEMA.SPANNER_STATISTICS`. - // - // Executing a SQL statement with an invalid optimizer statistics package - // or with a statistics package that allows garbage collection fails with - // an `INVALID_ARGUMENT` error. - OptimizerStatisticsPackage string `protobuf:"bytes,2,opt,name=optimizer_statistics_package,json=optimizerStatisticsPackage,proto3" json:"optimizer_statistics_package,omitempty"` -} - -func (x *ExecuteSqlRequest_QueryOptions) Reset() { - *x = ExecuteSqlRequest_QueryOptions{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteSqlRequest_QueryOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteSqlRequest_QueryOptions) ProtoMessage() {} - -func (x *ExecuteSqlRequest_QueryOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[28] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteSqlRequest_QueryOptions.ProtoReflect.Descriptor instead. -func (*ExecuteSqlRequest_QueryOptions) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{10, 0} -} - -func (x *ExecuteSqlRequest_QueryOptions) GetOptimizerVersion() string { - if x != nil { - return x.OptimizerVersion - } - return "" -} - -func (x *ExecuteSqlRequest_QueryOptions) GetOptimizerStatisticsPackage() string { - if x != nil { - return x.OptimizerStatisticsPackage - } - return "" -} - -// A single DML statement. -type ExecuteBatchDmlRequest_Statement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The DML string. - Sql string `protobuf:"bytes,1,opt,name=sql,proto3" json:"sql,omitempty"` - // Parameter names and values that bind to placeholders in the DML string. - // - // A parameter placeholder consists of the `@` character followed by the - // parameter name (for example, `@firstName`). Parameter names can contain - // letters, numbers, and underscores. - // - // Parameters can appear anywhere that a literal value is expected. The - // same parameter name can be used more than once, for example: - // - // `"WHERE id > @msg_id AND id < @msg_id + 100"` - // - // It is an error to execute a SQL statement with unbound parameters. - Params *structpb.Struct `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` - // It is not always possible for Cloud Spanner to infer the right SQL type - // from a JSON value. For example, values of type `BYTES` and values - // of type `STRING` both appear in - // [params][google.spanner.v1.ExecuteBatchDmlRequest.Statement.params] as - // JSON strings. - // - // In these cases, `param_types` can be used to specify the exact - // SQL type for some or all of the SQL statement parameters. See the - // definition of [Type][google.spanner.v1.Type] for more information - // about SQL types. - ParamTypes map[string]*Type `protobuf:"bytes,3,rep,name=param_types,json=paramTypes,proto3" json:"param_types,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *ExecuteBatchDmlRequest_Statement) Reset() { - *x = ExecuteBatchDmlRequest_Statement{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExecuteBatchDmlRequest_Statement) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExecuteBatchDmlRequest_Statement) ProtoMessage() {} - -func (x *ExecuteBatchDmlRequest_Statement) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[30] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExecuteBatchDmlRequest_Statement.ProtoReflect.Descriptor instead. -func (*ExecuteBatchDmlRequest_Statement) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{11, 0} -} - -func (x *ExecuteBatchDmlRequest_Statement) GetSql() string { - if x != nil { - return x.Sql - } - return "" -} - -func (x *ExecuteBatchDmlRequest_Statement) GetParams() *structpb.Struct { - if x != nil { - return x.Params - } - return nil -} - -func (x *ExecuteBatchDmlRequest_Statement) GetParamTypes() map[string]*Type { - if x != nil { - return x.ParamTypes - } - return nil -} - -// A group of mutations to be committed together. Related mutations should be -// placed in a group. For example, two mutations inserting rows with the same -// primary key prefix in both parent and child tables are related. -type BatchWriteRequest_MutationGroup struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The mutations in this group. - Mutations []*Mutation `protobuf:"bytes,1,rep,name=mutations,proto3" json:"mutations,omitempty"` -} - -func (x *BatchWriteRequest_MutationGroup) Reset() { - *x = BatchWriteRequest_MutationGroup{} - mi := &file_google_spanner_v1_spanner_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *BatchWriteRequest_MutationGroup) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchWriteRequest_MutationGroup) ProtoMessage() {} - -func (x *BatchWriteRequest_MutationGroup) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_spanner_proto_msgTypes[33] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchWriteRequest_MutationGroup.ProtoReflect.Descriptor instead. -func (*BatchWriteRequest_MutationGroup) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_spanner_proto_rawDescGZIP(), []int{22, 0} -} - -func (x *BatchWriteRequest_MutationGroup) GetMutations() []*Mutation { - if x != nil { - return x.Mutations - } - return nil -} - -var File_google_spanner_v1_spanner_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_spanner_proto_rawDesc = []byte{ - 0x0a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, - 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, - 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x96, 0x01, 0x0a, - 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, - 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x0f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x53, 0x0a, 0x1b, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0xfb, 0x03, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x19, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x16, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x55, 0x73, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x78, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, - 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x1a, 0x39, 0x0a, 0x0b, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x74, 0xea, 0x41, 0x71, 0x0a, 0x1e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x22, 0x4f, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xae, - 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, - 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, - 0x76, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3a, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, - 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, - 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, - 0x22, 0x5e, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x14, - 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, - 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x52, 0x49, 0x4f, - 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x11, 0x0a, - 0x0d, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, - 0x22, 0xd8, 0x05, 0x0a, 0x13, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x63, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x63, 0x0a, - 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x48, - 0x00, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x1a, 0xbd, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, - 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, - 0x10, 0x02, 0x1a, 0xaf, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x66, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, - 0x0a, 0x16, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x5f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x61, 0x75, 0x74, 0x6f, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x79, 0x0a, 0x0f, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x66, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, - 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0xf9, 0x08, 0x0a, 0x11, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x71, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, - 0x03, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, - 0x03, 0x73, 0x71, 0x6c, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x55, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x71, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x4d, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, - 0x71, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x65, 0x71, 0x6e, 0x6f, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x65, 0x71, 0x6e, 0x6f, 0x12, 0x56, 0x0a, - 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x53, 0x71, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x5a, 0x0a, 0x15, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x62, 0x6f, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x64, 0x61, 0x74, 0x61, 0x42, - 0x6f, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x7d, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, - 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x56, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, - 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, - 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4c, 0x41, 0x4e, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0e, - 0x0a, 0x0a, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x10, 0x03, 0x12, 0x17, - 0x0a, 0x13, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x50, 0x4c, 0x41, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x53, 0x10, 0x04, 0x22, 0xac, 0x05, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x19, 0x0a, - 0x05, 0x73, 0x65, 0x71, 0x6e, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x05, 0x73, 0x65, 0x71, 0x6e, 0x6f, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, - 0x41, 0x01, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x1a, 0x91, 0x02, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x15, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, - 0x41, 0x02, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x64, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x56, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe7, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x53, 0x65, 0x74, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, - 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x61, 0x0a, - 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, - 0x52, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x6b, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, - 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf0, 0x03, - 0x0a, 0x15, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, - 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x56, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xf8, 0x02, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, - 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, - 0x12, 0x37, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x42, 0x03, 0xe0, 0x41, - 0x02, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x34, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x07, 0x0a, 0x0b, 0x52, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, - 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x42, - 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4a, - 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x15, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x13, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x62, - 0x6f, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x64, 0x61, 0x74, 0x61, 0x42, 0x6f, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x46, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x42, 0x03, - 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x49, 0x0a, 0x09, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4c, 0x6f, 0x63, 0x6b, 0x48, 0x69, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x69, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x07, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x42, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, - 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x42, 0x59, 0x5f, 0x4e, 0x4f, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x02, 0x22, 0x54, 0x0a, - 0x08, 0x4c, 0x6f, 0x63, 0x6b, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x43, - 0x4b, 0x5f, 0x48, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x48, 0x49, 0x4e, - 0x54, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, - 0x43, 0x4b, 0x5f, 0x48, 0x49, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x53, 0x49, 0x56, - 0x45, 0x10, 0x02, 0x22, 0xb2, 0x02, 0x0a, 0x17, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x40, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x44, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x6d, 0x75, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0xcc, 0x04, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, - 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5d, 0x0a, 0x16, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, - 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, - 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x55, 0x73, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x48, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x61, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xe0, 0x41, 0x02, - 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x0e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x9f, 0x03, 0x0a, 0x11, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, - 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x26, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x20, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x60, 0x0a, 0x0f, - 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x75, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0e, - 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x49, - 0x0a, 0x1f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x66, 0x72, - 0x6f, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1b, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x4f, 0x0a, 0x0d, 0x4d, 0x75, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x3e, 0x0a, 0x09, 0x6d, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, - 0x09, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x12, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x45, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x8b, - 0x18, 0x0a, 0x07, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0xa6, 0x01, 0x0a, 0x0d, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x50, 0xda, 0x41, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0xe0, 0x01, 0x0a, 0x13, 0x42, 0x61, 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xda, 0x41, 0x16, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, - 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, - 0x7d, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x47, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, - 0x12, 0xae, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4d, 0xda, 0x41, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x47, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3a, 0x2a, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa3, 0x01, - 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x71, 0x6c, 0x12, 0x24, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x71, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, - 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, - 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x53, 0x71, 0x6c, 0x12, 0xbe, 0x01, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x71, 0x6c, 0x12, 0x24, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x71, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, 0x3a, 0x01, - 0x2a, 0x22, 0x4f, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, - 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x53, - 0x71, 0x6c, 0x30, 0x01, 0x12, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x3a, 0x01, 0x2a, 0x22, 0x4b, 0x2f, 0x76, 0x31, 0x2f, - 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x44, 0x6d, 0x6c, 0x12, 0x91, 0x01, 0x0a, 0x04, 0x52, 0x65, 0x61, 0x64, - 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x74, 0x22, 0x4b, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x01, 0x2a, 0x22, 0x40, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x12, 0xac, 0x01, 0x0a, 0x0d, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, - 0x65, 0x74, 0x22, 0x54, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x30, 0x01, 0x12, 0xc9, 0x01, 0x0a, 0x10, 0x42, - 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0xda, 0x41, 0x0f, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x51, 0x3a, 0x01, 0x2a, 0x22, 0x4c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xeb, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0xda, 0x41, 0x20, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x2c, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xda, 0x41, 0x28, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x75, 0x73, - 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x6d, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x3a, 0x01, 0x2a, - 0x22, 0x42, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, - 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x12, 0xb0, 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x68, 0xda, - 0x41, 0x16, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x3a, 0x01, - 0x2a, 0x22, 0x44, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, - 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x72, - 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0xb7, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x4f, 0x3a, 0x01, 0x2a, 0x22, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x2a, 0x7d, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0xb4, 0x01, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x61, 0x64, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x54, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x2f, 0x2a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0xc8, 0x01, 0x0a, 0x0a, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6b, 0xda, 0x41, 0x17, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2c, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x3a, 0x01, 0x2a, 0x22, 0x46, 0x2f, 0x76, 0x31, 0x2f, 0x7b, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x2a, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x30, 0x01, 0x1a, 0x77, 0xca, 0x41, 0x16, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, - 0x5b, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, - 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, - 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x42, 0x91, 0x02, 0xea, - 0x41, 0x5f, 0x0a, 0x1f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x3c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x7d, 0x2f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x7d, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0xaa, - 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, - 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, - 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_spanner_proto_rawDescOnce sync.Once - file_google_spanner_v1_spanner_proto_rawDescData = file_google_spanner_v1_spanner_proto_rawDesc -) - -func file_google_spanner_v1_spanner_proto_rawDescGZIP() []byte { - file_google_spanner_v1_spanner_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_spanner_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_spanner_proto_rawDescData) - }) - return file_google_spanner_v1_spanner_proto_rawDescData -} - -var file_google_spanner_v1_spanner_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_google_spanner_v1_spanner_proto_msgTypes = make([]protoimpl.MessageInfo, 34) -var file_google_spanner_v1_spanner_proto_goTypes = []any{ - (RequestOptions_Priority)(0), // 0: google.spanner.v1.RequestOptions.Priority - (DirectedReadOptions_ReplicaSelection_Type)(0), // 1: google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type - (ExecuteSqlRequest_QueryMode)(0), // 2: google.spanner.v1.ExecuteSqlRequest.QueryMode - (ReadRequest_OrderBy)(0), // 3: google.spanner.v1.ReadRequest.OrderBy - (ReadRequest_LockHint)(0), // 4: google.spanner.v1.ReadRequest.LockHint - (*CreateSessionRequest)(nil), // 5: google.spanner.v1.CreateSessionRequest - (*BatchCreateSessionsRequest)(nil), // 6: google.spanner.v1.BatchCreateSessionsRequest - (*BatchCreateSessionsResponse)(nil), // 7: google.spanner.v1.BatchCreateSessionsResponse - (*Session)(nil), // 8: google.spanner.v1.Session - (*GetSessionRequest)(nil), // 9: google.spanner.v1.GetSessionRequest - (*ListSessionsRequest)(nil), // 10: google.spanner.v1.ListSessionsRequest - (*ListSessionsResponse)(nil), // 11: google.spanner.v1.ListSessionsResponse - (*DeleteSessionRequest)(nil), // 12: google.spanner.v1.DeleteSessionRequest - (*RequestOptions)(nil), // 13: google.spanner.v1.RequestOptions - (*DirectedReadOptions)(nil), // 14: google.spanner.v1.DirectedReadOptions - (*ExecuteSqlRequest)(nil), // 15: google.spanner.v1.ExecuteSqlRequest - (*ExecuteBatchDmlRequest)(nil), // 16: google.spanner.v1.ExecuteBatchDmlRequest - (*ExecuteBatchDmlResponse)(nil), // 17: google.spanner.v1.ExecuteBatchDmlResponse - (*PartitionOptions)(nil), // 18: google.spanner.v1.PartitionOptions - (*PartitionQueryRequest)(nil), // 19: google.spanner.v1.PartitionQueryRequest - (*PartitionReadRequest)(nil), // 20: google.spanner.v1.PartitionReadRequest - (*Partition)(nil), // 21: google.spanner.v1.Partition - (*PartitionResponse)(nil), // 22: google.spanner.v1.PartitionResponse - (*ReadRequest)(nil), // 23: google.spanner.v1.ReadRequest - (*BeginTransactionRequest)(nil), // 24: google.spanner.v1.BeginTransactionRequest - (*CommitRequest)(nil), // 25: google.spanner.v1.CommitRequest - (*RollbackRequest)(nil), // 26: google.spanner.v1.RollbackRequest - (*BatchWriteRequest)(nil), // 27: google.spanner.v1.BatchWriteRequest - (*BatchWriteResponse)(nil), // 28: google.spanner.v1.BatchWriteResponse - nil, // 29: google.spanner.v1.Session.LabelsEntry - (*DirectedReadOptions_ReplicaSelection)(nil), // 30: google.spanner.v1.DirectedReadOptions.ReplicaSelection - (*DirectedReadOptions_IncludeReplicas)(nil), // 31: google.spanner.v1.DirectedReadOptions.IncludeReplicas - (*DirectedReadOptions_ExcludeReplicas)(nil), // 32: google.spanner.v1.DirectedReadOptions.ExcludeReplicas - (*ExecuteSqlRequest_QueryOptions)(nil), // 33: google.spanner.v1.ExecuteSqlRequest.QueryOptions - nil, // 34: google.spanner.v1.ExecuteSqlRequest.ParamTypesEntry - (*ExecuteBatchDmlRequest_Statement)(nil), // 35: google.spanner.v1.ExecuteBatchDmlRequest.Statement - nil, // 36: google.spanner.v1.ExecuteBatchDmlRequest.Statement.ParamTypesEntry - nil, // 37: google.spanner.v1.PartitionQueryRequest.ParamTypesEntry - (*BatchWriteRequest_MutationGroup)(nil), // 38: google.spanner.v1.BatchWriteRequest.MutationGroup - (*timestamppb.Timestamp)(nil), // 39: google.protobuf.Timestamp - (*TransactionSelector)(nil), // 40: google.spanner.v1.TransactionSelector - (*structpb.Struct)(nil), // 41: google.protobuf.Struct - (*ResultSet)(nil), // 42: google.spanner.v1.ResultSet - (*status.Status)(nil), // 43: google.rpc.Status - (*MultiplexedSessionPrecommitToken)(nil), // 44: google.spanner.v1.MultiplexedSessionPrecommitToken - (*KeySet)(nil), // 45: google.spanner.v1.KeySet - (*Transaction)(nil), // 46: google.spanner.v1.Transaction - (*TransactionOptions)(nil), // 47: google.spanner.v1.TransactionOptions - (*Mutation)(nil), // 48: google.spanner.v1.Mutation - (*durationpb.Duration)(nil), // 49: google.protobuf.Duration - (*Type)(nil), // 50: google.spanner.v1.Type - (*emptypb.Empty)(nil), // 51: google.protobuf.Empty - (*PartialResultSet)(nil), // 52: google.spanner.v1.PartialResultSet - (*CommitResponse)(nil), // 53: google.spanner.v1.CommitResponse -} -var file_google_spanner_v1_spanner_proto_depIdxs = []int32{ - 8, // 0: google.spanner.v1.CreateSessionRequest.session:type_name -> google.spanner.v1.Session - 8, // 1: google.spanner.v1.BatchCreateSessionsRequest.session_template:type_name -> google.spanner.v1.Session - 8, // 2: google.spanner.v1.BatchCreateSessionsResponse.session:type_name -> google.spanner.v1.Session - 29, // 3: google.spanner.v1.Session.labels:type_name -> google.spanner.v1.Session.LabelsEntry - 39, // 4: google.spanner.v1.Session.create_time:type_name -> google.protobuf.Timestamp - 39, // 5: google.spanner.v1.Session.approximate_last_use_time:type_name -> google.protobuf.Timestamp - 8, // 6: google.spanner.v1.ListSessionsResponse.sessions:type_name -> google.spanner.v1.Session - 0, // 7: google.spanner.v1.RequestOptions.priority:type_name -> google.spanner.v1.RequestOptions.Priority - 31, // 8: google.spanner.v1.DirectedReadOptions.include_replicas:type_name -> google.spanner.v1.DirectedReadOptions.IncludeReplicas - 32, // 9: google.spanner.v1.DirectedReadOptions.exclude_replicas:type_name -> google.spanner.v1.DirectedReadOptions.ExcludeReplicas - 40, // 10: google.spanner.v1.ExecuteSqlRequest.transaction:type_name -> google.spanner.v1.TransactionSelector - 41, // 11: google.spanner.v1.ExecuteSqlRequest.params:type_name -> google.protobuf.Struct - 34, // 12: google.spanner.v1.ExecuteSqlRequest.param_types:type_name -> google.spanner.v1.ExecuteSqlRequest.ParamTypesEntry - 2, // 13: google.spanner.v1.ExecuteSqlRequest.query_mode:type_name -> google.spanner.v1.ExecuteSqlRequest.QueryMode - 33, // 14: google.spanner.v1.ExecuteSqlRequest.query_options:type_name -> google.spanner.v1.ExecuteSqlRequest.QueryOptions - 13, // 15: google.spanner.v1.ExecuteSqlRequest.request_options:type_name -> google.spanner.v1.RequestOptions - 14, // 16: google.spanner.v1.ExecuteSqlRequest.directed_read_options:type_name -> google.spanner.v1.DirectedReadOptions - 40, // 17: google.spanner.v1.ExecuteBatchDmlRequest.transaction:type_name -> google.spanner.v1.TransactionSelector - 35, // 18: google.spanner.v1.ExecuteBatchDmlRequest.statements:type_name -> google.spanner.v1.ExecuteBatchDmlRequest.Statement - 13, // 19: google.spanner.v1.ExecuteBatchDmlRequest.request_options:type_name -> google.spanner.v1.RequestOptions - 42, // 20: google.spanner.v1.ExecuteBatchDmlResponse.result_sets:type_name -> google.spanner.v1.ResultSet - 43, // 21: google.spanner.v1.ExecuteBatchDmlResponse.status:type_name -> google.rpc.Status - 44, // 22: google.spanner.v1.ExecuteBatchDmlResponse.precommit_token:type_name -> google.spanner.v1.MultiplexedSessionPrecommitToken - 40, // 23: google.spanner.v1.PartitionQueryRequest.transaction:type_name -> google.spanner.v1.TransactionSelector - 41, // 24: google.spanner.v1.PartitionQueryRequest.params:type_name -> google.protobuf.Struct - 37, // 25: google.spanner.v1.PartitionQueryRequest.param_types:type_name -> google.spanner.v1.PartitionQueryRequest.ParamTypesEntry - 18, // 26: google.spanner.v1.PartitionQueryRequest.partition_options:type_name -> google.spanner.v1.PartitionOptions - 40, // 27: google.spanner.v1.PartitionReadRequest.transaction:type_name -> google.spanner.v1.TransactionSelector - 45, // 28: google.spanner.v1.PartitionReadRequest.key_set:type_name -> google.spanner.v1.KeySet - 18, // 29: google.spanner.v1.PartitionReadRequest.partition_options:type_name -> google.spanner.v1.PartitionOptions - 21, // 30: google.spanner.v1.PartitionResponse.partitions:type_name -> google.spanner.v1.Partition - 46, // 31: google.spanner.v1.PartitionResponse.transaction:type_name -> google.spanner.v1.Transaction - 40, // 32: google.spanner.v1.ReadRequest.transaction:type_name -> google.spanner.v1.TransactionSelector - 45, // 33: google.spanner.v1.ReadRequest.key_set:type_name -> google.spanner.v1.KeySet - 13, // 34: google.spanner.v1.ReadRequest.request_options:type_name -> google.spanner.v1.RequestOptions - 14, // 35: google.spanner.v1.ReadRequest.directed_read_options:type_name -> google.spanner.v1.DirectedReadOptions - 3, // 36: google.spanner.v1.ReadRequest.order_by:type_name -> google.spanner.v1.ReadRequest.OrderBy - 4, // 37: google.spanner.v1.ReadRequest.lock_hint:type_name -> google.spanner.v1.ReadRequest.LockHint - 47, // 38: google.spanner.v1.BeginTransactionRequest.options:type_name -> google.spanner.v1.TransactionOptions - 13, // 39: google.spanner.v1.BeginTransactionRequest.request_options:type_name -> google.spanner.v1.RequestOptions - 48, // 40: google.spanner.v1.BeginTransactionRequest.mutation_key:type_name -> google.spanner.v1.Mutation - 47, // 41: google.spanner.v1.CommitRequest.single_use_transaction:type_name -> google.spanner.v1.TransactionOptions - 48, // 42: google.spanner.v1.CommitRequest.mutations:type_name -> google.spanner.v1.Mutation - 49, // 43: google.spanner.v1.CommitRequest.max_commit_delay:type_name -> google.protobuf.Duration - 13, // 44: google.spanner.v1.CommitRequest.request_options:type_name -> google.spanner.v1.RequestOptions - 44, // 45: google.spanner.v1.CommitRequest.precommit_token:type_name -> google.spanner.v1.MultiplexedSessionPrecommitToken - 13, // 46: google.spanner.v1.BatchWriteRequest.request_options:type_name -> google.spanner.v1.RequestOptions - 38, // 47: google.spanner.v1.BatchWriteRequest.mutation_groups:type_name -> google.spanner.v1.BatchWriteRequest.MutationGroup - 43, // 48: google.spanner.v1.BatchWriteResponse.status:type_name -> google.rpc.Status - 39, // 49: google.spanner.v1.BatchWriteResponse.commit_timestamp:type_name -> google.protobuf.Timestamp - 1, // 50: google.spanner.v1.DirectedReadOptions.ReplicaSelection.type:type_name -> google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type - 30, // 51: google.spanner.v1.DirectedReadOptions.IncludeReplicas.replica_selections:type_name -> google.spanner.v1.DirectedReadOptions.ReplicaSelection - 30, // 52: google.spanner.v1.DirectedReadOptions.ExcludeReplicas.replica_selections:type_name -> google.spanner.v1.DirectedReadOptions.ReplicaSelection - 50, // 53: google.spanner.v1.ExecuteSqlRequest.ParamTypesEntry.value:type_name -> google.spanner.v1.Type - 41, // 54: google.spanner.v1.ExecuteBatchDmlRequest.Statement.params:type_name -> google.protobuf.Struct - 36, // 55: google.spanner.v1.ExecuteBatchDmlRequest.Statement.param_types:type_name -> google.spanner.v1.ExecuteBatchDmlRequest.Statement.ParamTypesEntry - 50, // 56: google.spanner.v1.ExecuteBatchDmlRequest.Statement.ParamTypesEntry.value:type_name -> google.spanner.v1.Type - 50, // 57: google.spanner.v1.PartitionQueryRequest.ParamTypesEntry.value:type_name -> google.spanner.v1.Type - 48, // 58: google.spanner.v1.BatchWriteRequest.MutationGroup.mutations:type_name -> google.spanner.v1.Mutation - 5, // 59: google.spanner.v1.Spanner.CreateSession:input_type -> google.spanner.v1.CreateSessionRequest - 6, // 60: google.spanner.v1.Spanner.BatchCreateSessions:input_type -> google.spanner.v1.BatchCreateSessionsRequest - 9, // 61: google.spanner.v1.Spanner.GetSession:input_type -> google.spanner.v1.GetSessionRequest - 10, // 62: google.spanner.v1.Spanner.ListSessions:input_type -> google.spanner.v1.ListSessionsRequest - 12, // 63: google.spanner.v1.Spanner.DeleteSession:input_type -> google.spanner.v1.DeleteSessionRequest - 15, // 64: google.spanner.v1.Spanner.ExecuteSql:input_type -> google.spanner.v1.ExecuteSqlRequest - 15, // 65: google.spanner.v1.Spanner.ExecuteStreamingSql:input_type -> google.spanner.v1.ExecuteSqlRequest - 16, // 66: google.spanner.v1.Spanner.ExecuteBatchDml:input_type -> google.spanner.v1.ExecuteBatchDmlRequest - 23, // 67: google.spanner.v1.Spanner.Read:input_type -> google.spanner.v1.ReadRequest - 23, // 68: google.spanner.v1.Spanner.StreamingRead:input_type -> google.spanner.v1.ReadRequest - 24, // 69: google.spanner.v1.Spanner.BeginTransaction:input_type -> google.spanner.v1.BeginTransactionRequest - 25, // 70: google.spanner.v1.Spanner.Commit:input_type -> google.spanner.v1.CommitRequest - 26, // 71: google.spanner.v1.Spanner.Rollback:input_type -> google.spanner.v1.RollbackRequest - 19, // 72: google.spanner.v1.Spanner.PartitionQuery:input_type -> google.spanner.v1.PartitionQueryRequest - 20, // 73: google.spanner.v1.Spanner.PartitionRead:input_type -> google.spanner.v1.PartitionReadRequest - 27, // 74: google.spanner.v1.Spanner.BatchWrite:input_type -> google.spanner.v1.BatchWriteRequest - 8, // 75: google.spanner.v1.Spanner.CreateSession:output_type -> google.spanner.v1.Session - 7, // 76: google.spanner.v1.Spanner.BatchCreateSessions:output_type -> google.spanner.v1.BatchCreateSessionsResponse - 8, // 77: google.spanner.v1.Spanner.GetSession:output_type -> google.spanner.v1.Session - 11, // 78: google.spanner.v1.Spanner.ListSessions:output_type -> google.spanner.v1.ListSessionsResponse - 51, // 79: google.spanner.v1.Spanner.DeleteSession:output_type -> google.protobuf.Empty - 42, // 80: google.spanner.v1.Spanner.ExecuteSql:output_type -> google.spanner.v1.ResultSet - 52, // 81: google.spanner.v1.Spanner.ExecuteStreamingSql:output_type -> google.spanner.v1.PartialResultSet - 17, // 82: google.spanner.v1.Spanner.ExecuteBatchDml:output_type -> google.spanner.v1.ExecuteBatchDmlResponse - 42, // 83: google.spanner.v1.Spanner.Read:output_type -> google.spanner.v1.ResultSet - 52, // 84: google.spanner.v1.Spanner.StreamingRead:output_type -> google.spanner.v1.PartialResultSet - 46, // 85: google.spanner.v1.Spanner.BeginTransaction:output_type -> google.spanner.v1.Transaction - 53, // 86: google.spanner.v1.Spanner.Commit:output_type -> google.spanner.v1.CommitResponse - 51, // 87: google.spanner.v1.Spanner.Rollback:output_type -> google.protobuf.Empty - 22, // 88: google.spanner.v1.Spanner.PartitionQuery:output_type -> google.spanner.v1.PartitionResponse - 22, // 89: google.spanner.v1.Spanner.PartitionRead:output_type -> google.spanner.v1.PartitionResponse - 28, // 90: google.spanner.v1.Spanner.BatchWrite:output_type -> google.spanner.v1.BatchWriteResponse - 75, // [75:91] is the sub-list for method output_type - 59, // [59:75] is the sub-list for method input_type - 59, // [59:59] is the sub-list for extension type_name - 59, // [59:59] is the sub-list for extension extendee - 0, // [0:59] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_spanner_proto_init() } -func file_google_spanner_v1_spanner_proto_init() { - if File_google_spanner_v1_spanner_proto != nil { - return - } - file_google_spanner_v1_commit_response_proto_init() - file_google_spanner_v1_keys_proto_init() - file_google_spanner_v1_mutation_proto_init() - file_google_spanner_v1_result_set_proto_init() - file_google_spanner_v1_transaction_proto_init() - file_google_spanner_v1_type_proto_init() - file_google_spanner_v1_spanner_proto_msgTypes[9].OneofWrappers = []any{ - (*DirectedReadOptions_IncludeReplicas_)(nil), - (*DirectedReadOptions_ExcludeReplicas_)(nil), - } - file_google_spanner_v1_spanner_proto_msgTypes[20].OneofWrappers = []any{ - (*CommitRequest_TransactionId)(nil), - (*CommitRequest_SingleUseTransaction)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_spanner_proto_rawDesc, - NumEnums: 5, - NumMessages: 34, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_google_spanner_v1_spanner_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_spanner_proto_depIdxs, - EnumInfos: file_google_spanner_v1_spanner_proto_enumTypes, - MessageInfos: file_google_spanner_v1_spanner_proto_msgTypes, - }.Build() - File_google_spanner_v1_spanner_proto = out.File - file_google_spanner_v1_spanner_proto_rawDesc = nil - file_google_spanner_v1_spanner_proto_goTypes = nil - file_google_spanner_v1_spanner_proto_depIdxs = nil -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// SpannerClient is the client API for Spanner service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type SpannerClient interface { - // Creates a new session. A session can be used to perform - // transactions that read and/or modify data in a Cloud Spanner database. - // Sessions are meant to be reused for many consecutive - // transactions. - // - // Sessions can only execute one transaction at a time. To execute - // multiple concurrent read-write/write-only transactions, create - // multiple sessions. Note that standalone reads and queries use a - // transaction internally, and count toward the one transaction - // limit. - // - // Active sessions use additional server resources, so it is a good idea to - // delete idle and unneeded sessions. - // Aside from explicit deletes, Cloud Spanner may delete sessions for which no - // operations are sent for more than an hour. If a session is deleted, - // requests to it return `NOT_FOUND`. - // - // Idle sessions can be kept alive by sending a trivial SQL query - // periodically, e.g., `"SELECT 1"`. - CreateSession(ctx context.Context, in *CreateSessionRequest, opts ...grpc.CallOption) (*Session, error) - // Creates multiple new sessions. - // - // This API can be used to initialize a session cache on the clients. - // See https://goo.gl/TgSFN2 for best practices on session cache management. - BatchCreateSessions(ctx context.Context, in *BatchCreateSessionsRequest, opts ...grpc.CallOption) (*BatchCreateSessionsResponse, error) - // Gets a session. Returns `NOT_FOUND` if the session does not exist. - // This is mainly useful for determining whether a session is still - // alive. - GetSession(ctx context.Context, in *GetSessionRequest, opts ...grpc.CallOption) (*Session, error) - // Lists all sessions in a given database. - ListSessions(ctx context.Context, in *ListSessionsRequest, opts ...grpc.CallOption) (*ListSessionsResponse, error) - // Ends a session, releasing server resources associated with it. This will - // asynchronously trigger cancellation of any operations that are running with - // this session. - DeleteSession(ctx context.Context, in *DeleteSessionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Executes an SQL statement, returning all results in a single reply. This - // method cannot be used to return a result set larger than 10 MiB; - // if the query yields more data than that, the query fails with - // a `FAILED_PRECONDITION` error. - // - // Operations inside read-write transactions might return `ABORTED`. If - // this occurs, the application should restart the transaction from - // the beginning. See [Transaction][google.spanner.v1.Transaction] for more - // details. - // - // Larger result sets can be fetched in streaming fashion by calling - // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] - // instead. - ExecuteSql(ctx context.Context, in *ExecuteSqlRequest, opts ...grpc.CallOption) (*ResultSet, error) - // Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the - // result set as a stream. Unlike - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there is no limit on - // the size of the returned result set. However, no individual row in the - // result set can exceed 100 MiB, and no column value can exceed 10 MiB. - ExecuteStreamingSql(ctx context.Context, in *ExecuteSqlRequest, opts ...grpc.CallOption) (Spanner_ExecuteStreamingSqlClient, error) - // Executes a batch of SQL DML statements. This method allows many statements - // to be run with lower latency than submitting them sequentially with - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. - // - // Statements are executed in sequential order. A request can succeed even if - // a statement fails. The - // [ExecuteBatchDmlResponse.status][google.spanner.v1.ExecuteBatchDmlResponse.status] - // field in the response provides information about the statement that failed. - // Clients must inspect this field to determine whether an error occurred. - // - // Execution stops after the first failed statement; the remaining statements - // are not executed. - ExecuteBatchDml(ctx context.Context, in *ExecuteBatchDmlRequest, opts ...grpc.CallOption) (*ExecuteBatchDmlResponse, error) - // Reads rows from the database using key lookups and scans, as a - // simple key/value style alternative to - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. This method cannot be - // used to return a result set larger than 10 MiB; if the read matches more - // data than that, the read fails with a `FAILED_PRECONDITION` - // error. - // - // Reads inside read-write transactions might return `ABORTED`. If - // this occurs, the application should restart the transaction from - // the beginning. See [Transaction][google.spanner.v1.Transaction] for more - // details. - // - // Larger result sets can be yielded in streaming fashion by calling - // [StreamingRead][google.spanner.v1.Spanner.StreamingRead] instead. - Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (*ResultSet, error) - // Like [Read][google.spanner.v1.Spanner.Read], except returns the result set - // as a stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no - // limit on the size of the returned result set. However, no individual row in - // the result set can exceed 100 MiB, and no column value can exceed - // 10 MiB. - StreamingRead(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (Spanner_StreamingReadClient, error) - // Begins a new transaction. This step can often be skipped: - // [Read][google.spanner.v1.Spanner.Read], - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and - // [Commit][google.spanner.v1.Spanner.Commit] can begin a new transaction as a - // side-effect. - BeginTransaction(ctx context.Context, in *BeginTransactionRequest, opts ...grpc.CallOption) (*Transaction, error) - // Commits a transaction. The request includes the mutations to be - // applied to rows in the database. - // - // `Commit` might return an `ABORTED` error. This can occur at any time; - // commonly, the cause is conflicts with concurrent - // transactions. However, it can also happen for a variety of other - // reasons. If `Commit` returns `ABORTED`, the caller should re-attempt - // the transaction from the beginning, re-using the same session. - // - // On very rare occasions, `Commit` might return `UNKNOWN`. This can happen, - // for example, if the client job experiences a 1+ hour networking failure. - // At that point, Cloud Spanner has lost track of the transaction outcome and - // we recommend that you perform another read from the database to see the - // state of things as they are now. - Commit(ctx context.Context, in *CommitRequest, opts ...grpc.CallOption) (*CommitResponse, error) - // Rolls back a transaction, releasing any locks it holds. It is a good - // idea to call this for any transaction that includes one or more - // [Read][google.spanner.v1.Spanner.Read] or - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and ultimately - // decides not to commit. - // - // `Rollback` returns `OK` if it successfully aborts the transaction, the - // transaction was already aborted, or the transaction is not - // found. `Rollback` never returns `ABORTED`. - Rollback(ctx context.Context, in *RollbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Creates a set of partition tokens that can be used to execute a query - // operation in parallel. Each of the returned partition tokens can be used - // by [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] to - // specify a subset of the query result to read. The same session and - // read-only transaction must be used by the PartitionQueryRequest used to - // create the partition tokens and the ExecuteSqlRequests that use the - // partition tokens. - // - // Partition tokens become invalid when the session used to create them - // is deleted, is idle for too long, begins a new transaction, or becomes too - // old. When any of these happen, it is not possible to resume the query, and - // the whole operation must be restarted from the beginning. - PartitionQuery(ctx context.Context, in *PartitionQueryRequest, opts ...grpc.CallOption) (*PartitionResponse, error) - // Creates a set of partition tokens that can be used to execute a read - // operation in parallel. Each of the returned partition tokens can be used - // by [StreamingRead][google.spanner.v1.Spanner.StreamingRead] to specify a - // subset of the read result to read. The same session and read-only - // transaction must be used by the PartitionReadRequest used to create the - // partition tokens and the ReadRequests that use the partition tokens. There - // are no ordering guarantees on rows returned among the returned partition - // tokens, or even within each individual StreamingRead call issued with a - // partition_token. - // - // Partition tokens become invalid when the session used to create them - // is deleted, is idle for too long, begins a new transaction, or becomes too - // old. When any of these happen, it is not possible to resume the read, and - // the whole operation must be restarted from the beginning. - PartitionRead(ctx context.Context, in *PartitionReadRequest, opts ...grpc.CallOption) (*PartitionResponse, error) - // Batches the supplied mutation groups in a collection of efficient - // transactions. All mutations in a group are committed atomically. However, - // mutations across groups can be committed non-atomically in an unspecified - // order and thus, they must be independent of each other. Partial failure is - // possible, i.e., some groups may have been committed successfully, while - // some may have failed. The results of individual batches are streamed into - // the response as the batches are applied. - // - // BatchWrite requests are not replay protected, meaning that each mutation - // group may be applied more than once. Replays of non-idempotent mutations - // may have undesirable effects. For example, replays of an insert mutation - // may produce an already exists error or if you use generated or commit - // timestamp-based keys, it may result in additional rows being added to the - // mutation's table. We recommend structuring your mutation groups to be - // idempotent to avoid this issue. - BatchWrite(ctx context.Context, in *BatchWriteRequest, opts ...grpc.CallOption) (Spanner_BatchWriteClient, error) -} - -type spannerClient struct { - cc grpc.ClientConnInterface -} - -func NewSpannerClient(cc grpc.ClientConnInterface) SpannerClient { - return &spannerClient{cc} -} - -func (c *spannerClient) CreateSession(ctx context.Context, in *CreateSessionRequest, opts ...grpc.CallOption) (*Session, error) { - out := new(Session) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/CreateSession", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) BatchCreateSessions(ctx context.Context, in *BatchCreateSessionsRequest, opts ...grpc.CallOption) (*BatchCreateSessionsResponse, error) { - out := new(BatchCreateSessionsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/BatchCreateSessions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) GetSession(ctx context.Context, in *GetSessionRequest, opts ...grpc.CallOption) (*Session, error) { - out := new(Session) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/GetSession", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) ListSessions(ctx context.Context, in *ListSessionsRequest, opts ...grpc.CallOption) (*ListSessionsResponse, error) { - out := new(ListSessionsResponse) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/ListSessions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) DeleteSession(ctx context.Context, in *DeleteSessionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/DeleteSession", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) ExecuteSql(ctx context.Context, in *ExecuteSqlRequest, opts ...grpc.CallOption) (*ResultSet, error) { - out := new(ResultSet) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/ExecuteSql", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) ExecuteStreamingSql(ctx context.Context, in *ExecuteSqlRequest, opts ...grpc.CallOption) (Spanner_ExecuteStreamingSqlClient, error) { - stream, err := c.cc.NewStream(ctx, &_Spanner_serviceDesc.Streams[0], "/google.spanner.v1.Spanner/ExecuteStreamingSql", opts...) - if err != nil { - return nil, err - } - x := &spannerExecuteStreamingSqlClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Spanner_ExecuteStreamingSqlClient interface { - Recv() (*PartialResultSet, error) - grpc.ClientStream -} - -type spannerExecuteStreamingSqlClient struct { - grpc.ClientStream -} - -func (x *spannerExecuteStreamingSqlClient) Recv() (*PartialResultSet, error) { - m := new(PartialResultSet) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *spannerClient) ExecuteBatchDml(ctx context.Context, in *ExecuteBatchDmlRequest, opts ...grpc.CallOption) (*ExecuteBatchDmlResponse, error) { - out := new(ExecuteBatchDmlResponse) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/ExecuteBatchDml", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (*ResultSet, error) { - out := new(ResultSet) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/Read", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) StreamingRead(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (Spanner_StreamingReadClient, error) { - stream, err := c.cc.NewStream(ctx, &_Spanner_serviceDesc.Streams[1], "/google.spanner.v1.Spanner/StreamingRead", opts...) - if err != nil { - return nil, err - } - x := &spannerStreamingReadClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Spanner_StreamingReadClient interface { - Recv() (*PartialResultSet, error) - grpc.ClientStream -} - -type spannerStreamingReadClient struct { - grpc.ClientStream -} - -func (x *spannerStreamingReadClient) Recv() (*PartialResultSet, error) { - m := new(PartialResultSet) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *spannerClient) BeginTransaction(ctx context.Context, in *BeginTransactionRequest, opts ...grpc.CallOption) (*Transaction, error) { - out := new(Transaction) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/BeginTransaction", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) Commit(ctx context.Context, in *CommitRequest, opts ...grpc.CallOption) (*CommitResponse, error) { - out := new(CommitResponse) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/Commit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) Rollback(ctx context.Context, in *RollbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/Rollback", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) PartitionQuery(ctx context.Context, in *PartitionQueryRequest, opts ...grpc.CallOption) (*PartitionResponse, error) { - out := new(PartitionResponse) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/PartitionQuery", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) PartitionRead(ctx context.Context, in *PartitionReadRequest, opts ...grpc.CallOption) (*PartitionResponse, error) { - out := new(PartitionResponse) - err := c.cc.Invoke(ctx, "/google.spanner.v1.Spanner/PartitionRead", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *spannerClient) BatchWrite(ctx context.Context, in *BatchWriteRequest, opts ...grpc.CallOption) (Spanner_BatchWriteClient, error) { - stream, err := c.cc.NewStream(ctx, &_Spanner_serviceDesc.Streams[2], "/google.spanner.v1.Spanner/BatchWrite", opts...) - if err != nil { - return nil, err - } - x := &spannerBatchWriteClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Spanner_BatchWriteClient interface { - Recv() (*BatchWriteResponse, error) - grpc.ClientStream -} - -type spannerBatchWriteClient struct { - grpc.ClientStream -} - -func (x *spannerBatchWriteClient) Recv() (*BatchWriteResponse, error) { - m := new(BatchWriteResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// SpannerServer is the server API for Spanner service. -type SpannerServer interface { - // Creates a new session. A session can be used to perform - // transactions that read and/or modify data in a Cloud Spanner database. - // Sessions are meant to be reused for many consecutive - // transactions. - // - // Sessions can only execute one transaction at a time. To execute - // multiple concurrent read-write/write-only transactions, create - // multiple sessions. Note that standalone reads and queries use a - // transaction internally, and count toward the one transaction - // limit. - // - // Active sessions use additional server resources, so it is a good idea to - // delete idle and unneeded sessions. - // Aside from explicit deletes, Cloud Spanner may delete sessions for which no - // operations are sent for more than an hour. If a session is deleted, - // requests to it return `NOT_FOUND`. - // - // Idle sessions can be kept alive by sending a trivial SQL query - // periodically, e.g., `"SELECT 1"`. - CreateSession(context.Context, *CreateSessionRequest) (*Session, error) - // Creates multiple new sessions. - // - // This API can be used to initialize a session cache on the clients. - // See https://goo.gl/TgSFN2 for best practices on session cache management. - BatchCreateSessions(context.Context, *BatchCreateSessionsRequest) (*BatchCreateSessionsResponse, error) - // Gets a session. Returns `NOT_FOUND` if the session does not exist. - // This is mainly useful for determining whether a session is still - // alive. - GetSession(context.Context, *GetSessionRequest) (*Session, error) - // Lists all sessions in a given database. - ListSessions(context.Context, *ListSessionsRequest) (*ListSessionsResponse, error) - // Ends a session, releasing server resources associated with it. This will - // asynchronously trigger cancellation of any operations that are running with - // this session. - DeleteSession(context.Context, *DeleteSessionRequest) (*emptypb.Empty, error) - // Executes an SQL statement, returning all results in a single reply. This - // method cannot be used to return a result set larger than 10 MiB; - // if the query yields more data than that, the query fails with - // a `FAILED_PRECONDITION` error. - // - // Operations inside read-write transactions might return `ABORTED`. If - // this occurs, the application should restart the transaction from - // the beginning. See [Transaction][google.spanner.v1.Transaction] for more - // details. - // - // Larger result sets can be fetched in streaming fashion by calling - // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] - // instead. - ExecuteSql(context.Context, *ExecuteSqlRequest) (*ResultSet, error) - // Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the - // result set as a stream. Unlike - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there is no limit on - // the size of the returned result set. However, no individual row in the - // result set can exceed 100 MiB, and no column value can exceed 10 MiB. - ExecuteStreamingSql(*ExecuteSqlRequest, Spanner_ExecuteStreamingSqlServer) error - // Executes a batch of SQL DML statements. This method allows many statements - // to be run with lower latency than submitting them sequentially with - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. - // - // Statements are executed in sequential order. A request can succeed even if - // a statement fails. The - // [ExecuteBatchDmlResponse.status][google.spanner.v1.ExecuteBatchDmlResponse.status] - // field in the response provides information about the statement that failed. - // Clients must inspect this field to determine whether an error occurred. - // - // Execution stops after the first failed statement; the remaining statements - // are not executed. - ExecuteBatchDml(context.Context, *ExecuteBatchDmlRequest) (*ExecuteBatchDmlResponse, error) - // Reads rows from the database using key lookups and scans, as a - // simple key/value style alternative to - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. This method cannot be - // used to return a result set larger than 10 MiB; if the read matches more - // data than that, the read fails with a `FAILED_PRECONDITION` - // error. - // - // Reads inside read-write transactions might return `ABORTED`. If - // this occurs, the application should restart the transaction from - // the beginning. See [Transaction][google.spanner.v1.Transaction] for more - // details. - // - // Larger result sets can be yielded in streaming fashion by calling - // [StreamingRead][google.spanner.v1.Spanner.StreamingRead] instead. - Read(context.Context, *ReadRequest) (*ResultSet, error) - // Like [Read][google.spanner.v1.Spanner.Read], except returns the result set - // as a stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no - // limit on the size of the returned result set. However, no individual row in - // the result set can exceed 100 MiB, and no column value can exceed - // 10 MiB. - StreamingRead(*ReadRequest, Spanner_StreamingReadServer) error - // Begins a new transaction. This step can often be skipped: - // [Read][google.spanner.v1.Spanner.Read], - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and - // [Commit][google.spanner.v1.Spanner.Commit] can begin a new transaction as a - // side-effect. - BeginTransaction(context.Context, *BeginTransactionRequest) (*Transaction, error) - // Commits a transaction. The request includes the mutations to be - // applied to rows in the database. - // - // `Commit` might return an `ABORTED` error. This can occur at any time; - // commonly, the cause is conflicts with concurrent - // transactions. However, it can also happen for a variety of other - // reasons. If `Commit` returns `ABORTED`, the caller should re-attempt - // the transaction from the beginning, re-using the same session. - // - // On very rare occasions, `Commit` might return `UNKNOWN`. This can happen, - // for example, if the client job experiences a 1+ hour networking failure. - // At that point, Cloud Spanner has lost track of the transaction outcome and - // we recommend that you perform another read from the database to see the - // state of things as they are now. - Commit(context.Context, *CommitRequest) (*CommitResponse, error) - // Rolls back a transaction, releasing any locks it holds. It is a good - // idea to call this for any transaction that includes one or more - // [Read][google.spanner.v1.Spanner.Read] or - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and ultimately - // decides not to commit. - // - // `Rollback` returns `OK` if it successfully aborts the transaction, the - // transaction was already aborted, or the transaction is not - // found. `Rollback` never returns `ABORTED`. - Rollback(context.Context, *RollbackRequest) (*emptypb.Empty, error) - // Creates a set of partition tokens that can be used to execute a query - // operation in parallel. Each of the returned partition tokens can be used - // by [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] to - // specify a subset of the query result to read. The same session and - // read-only transaction must be used by the PartitionQueryRequest used to - // create the partition tokens and the ExecuteSqlRequests that use the - // partition tokens. - // - // Partition tokens become invalid when the session used to create them - // is deleted, is idle for too long, begins a new transaction, or becomes too - // old. When any of these happen, it is not possible to resume the query, and - // the whole operation must be restarted from the beginning. - PartitionQuery(context.Context, *PartitionQueryRequest) (*PartitionResponse, error) - // Creates a set of partition tokens that can be used to execute a read - // operation in parallel. Each of the returned partition tokens can be used - // by [StreamingRead][google.spanner.v1.Spanner.StreamingRead] to specify a - // subset of the read result to read. The same session and read-only - // transaction must be used by the PartitionReadRequest used to create the - // partition tokens and the ReadRequests that use the partition tokens. There - // are no ordering guarantees on rows returned among the returned partition - // tokens, or even within each individual StreamingRead call issued with a - // partition_token. - // - // Partition tokens become invalid when the session used to create them - // is deleted, is idle for too long, begins a new transaction, or becomes too - // old. When any of these happen, it is not possible to resume the read, and - // the whole operation must be restarted from the beginning. - PartitionRead(context.Context, *PartitionReadRequest) (*PartitionResponse, error) - // Batches the supplied mutation groups in a collection of efficient - // transactions. All mutations in a group are committed atomically. However, - // mutations across groups can be committed non-atomically in an unspecified - // order and thus, they must be independent of each other. Partial failure is - // possible, i.e., some groups may have been committed successfully, while - // some may have failed. The results of individual batches are streamed into - // the response as the batches are applied. - // - // BatchWrite requests are not replay protected, meaning that each mutation - // group may be applied more than once. Replays of non-idempotent mutations - // may have undesirable effects. For example, replays of an insert mutation - // may produce an already exists error or if you use generated or commit - // timestamp-based keys, it may result in additional rows being added to the - // mutation's table. We recommend structuring your mutation groups to be - // idempotent to avoid this issue. - BatchWrite(*BatchWriteRequest, Spanner_BatchWriteServer) error -} - -// UnimplementedSpannerServer can be embedded to have forward compatible implementations. -type UnimplementedSpannerServer struct { -} - -func (*UnimplementedSpannerServer) CreateSession(context.Context, *CreateSessionRequest) (*Session, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateSession not implemented") -} -func (*UnimplementedSpannerServer) BatchCreateSessions(context.Context, *BatchCreateSessionsRequest) (*BatchCreateSessionsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method BatchCreateSessions not implemented") -} -func (*UnimplementedSpannerServer) GetSession(context.Context, *GetSessionRequest) (*Session, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetSession not implemented") -} -func (*UnimplementedSpannerServer) ListSessions(context.Context, *ListSessionsRequest) (*ListSessionsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListSessions not implemented") -} -func (*UnimplementedSpannerServer) DeleteSession(context.Context, *DeleteSessionRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteSession not implemented") -} -func (*UnimplementedSpannerServer) ExecuteSql(context.Context, *ExecuteSqlRequest) (*ResultSet, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ExecuteSql not implemented") -} -func (*UnimplementedSpannerServer) ExecuteStreamingSql(*ExecuteSqlRequest, Spanner_ExecuteStreamingSqlServer) error { - return status1.Errorf(codes.Unimplemented, "method ExecuteStreamingSql not implemented") -} -func (*UnimplementedSpannerServer) ExecuteBatchDml(context.Context, *ExecuteBatchDmlRequest) (*ExecuteBatchDmlResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ExecuteBatchDml not implemented") -} -func (*UnimplementedSpannerServer) Read(context.Context, *ReadRequest) (*ResultSet, error) { - return nil, status1.Errorf(codes.Unimplemented, "method Read not implemented") -} -func (*UnimplementedSpannerServer) StreamingRead(*ReadRequest, Spanner_StreamingReadServer) error { - return status1.Errorf(codes.Unimplemented, "method StreamingRead not implemented") -} -func (*UnimplementedSpannerServer) BeginTransaction(context.Context, *BeginTransactionRequest) (*Transaction, error) { - return nil, status1.Errorf(codes.Unimplemented, "method BeginTransaction not implemented") -} -func (*UnimplementedSpannerServer) Commit(context.Context, *CommitRequest) (*CommitResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method Commit not implemented") -} -func (*UnimplementedSpannerServer) Rollback(context.Context, *RollbackRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method Rollback not implemented") -} -func (*UnimplementedSpannerServer) PartitionQuery(context.Context, *PartitionQueryRequest) (*PartitionResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method PartitionQuery not implemented") -} -func (*UnimplementedSpannerServer) PartitionRead(context.Context, *PartitionReadRequest) (*PartitionResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method PartitionRead not implemented") -} -func (*UnimplementedSpannerServer) BatchWrite(*BatchWriteRequest, Spanner_BatchWriteServer) error { - return status1.Errorf(codes.Unimplemented, "method BatchWrite not implemented") -} - -func RegisterSpannerServer(s *grpc.Server, srv SpannerServer) { - s.RegisterService(&_Spanner_serviceDesc, srv) -} - -func _Spanner_CreateSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateSessionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).CreateSession(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/CreateSession", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).CreateSession(ctx, req.(*CreateSessionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_BatchCreateSessions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BatchCreateSessionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).BatchCreateSessions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/BatchCreateSessions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).BatchCreateSessions(ctx, req.(*BatchCreateSessionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_GetSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetSessionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).GetSession(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/GetSession", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).GetSession(ctx, req.(*GetSessionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_ListSessions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListSessionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).ListSessions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/ListSessions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).ListSessions(ctx, req.(*ListSessionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_DeleteSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteSessionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).DeleteSession(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/DeleteSession", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).DeleteSession(ctx, req.(*DeleteSessionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_ExecuteSql_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ExecuteSqlRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).ExecuteSql(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/ExecuteSql", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).ExecuteSql(ctx, req.(*ExecuteSqlRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_ExecuteStreamingSql_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ExecuteSqlRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(SpannerServer).ExecuteStreamingSql(m, &spannerExecuteStreamingSqlServer{stream}) -} - -type Spanner_ExecuteStreamingSqlServer interface { - Send(*PartialResultSet) error - grpc.ServerStream -} - -type spannerExecuteStreamingSqlServer struct { - grpc.ServerStream -} - -func (x *spannerExecuteStreamingSqlServer) Send(m *PartialResultSet) error { - return x.ServerStream.SendMsg(m) -} - -func _Spanner_ExecuteBatchDml_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ExecuteBatchDmlRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).ExecuteBatchDml(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/ExecuteBatchDml", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).ExecuteBatchDml(ctx, req.(*ExecuteBatchDmlRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_Read_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ReadRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).Read(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/Read", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).Read(ctx, req.(*ReadRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_StreamingRead_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ReadRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(SpannerServer).StreamingRead(m, &spannerStreamingReadServer{stream}) -} - -type Spanner_StreamingReadServer interface { - Send(*PartialResultSet) error - grpc.ServerStream -} - -type spannerStreamingReadServer struct { - grpc.ServerStream -} - -func (x *spannerStreamingReadServer) Send(m *PartialResultSet) error { - return x.ServerStream.SendMsg(m) -} - -func _Spanner_BeginTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BeginTransactionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).BeginTransaction(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/BeginTransaction", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).BeginTransaction(ctx, req.(*BeginTransactionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CommitRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).Commit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/Commit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).Commit(ctx, req.(*CommitRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_Rollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RollbackRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).Rollback(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/Rollback", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).Rollback(ctx, req.(*RollbackRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_PartitionQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PartitionQueryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).PartitionQuery(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/PartitionQuery", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).PartitionQuery(ctx, req.(*PartitionQueryRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_PartitionRead_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PartitionReadRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SpannerServer).PartitionRead(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.spanner.v1.Spanner/PartitionRead", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SpannerServer).PartitionRead(ctx, req.(*PartitionReadRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Spanner_BatchWrite_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(BatchWriteRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(SpannerServer).BatchWrite(m, &spannerBatchWriteServer{stream}) -} - -type Spanner_BatchWriteServer interface { - Send(*BatchWriteResponse) error - grpc.ServerStream -} - -type spannerBatchWriteServer struct { - grpc.ServerStream -} - -func (x *spannerBatchWriteServer) Send(m *BatchWriteResponse) error { - return x.ServerStream.SendMsg(m) -} - -var _Spanner_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.spanner.v1.Spanner", - HandlerType: (*SpannerServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateSession", - Handler: _Spanner_CreateSession_Handler, - }, - { - MethodName: "BatchCreateSessions", - Handler: _Spanner_BatchCreateSessions_Handler, - }, - { - MethodName: "GetSession", - Handler: _Spanner_GetSession_Handler, - }, - { - MethodName: "ListSessions", - Handler: _Spanner_ListSessions_Handler, - }, - { - MethodName: "DeleteSession", - Handler: _Spanner_DeleteSession_Handler, - }, - { - MethodName: "ExecuteSql", - Handler: _Spanner_ExecuteSql_Handler, - }, - { - MethodName: "ExecuteBatchDml", - Handler: _Spanner_ExecuteBatchDml_Handler, - }, - { - MethodName: "Read", - Handler: _Spanner_Read_Handler, - }, - { - MethodName: "BeginTransaction", - Handler: _Spanner_BeginTransaction_Handler, - }, - { - MethodName: "Commit", - Handler: _Spanner_Commit_Handler, - }, - { - MethodName: "Rollback", - Handler: _Spanner_Rollback_Handler, - }, - { - MethodName: "PartitionQuery", - Handler: _Spanner_PartitionQuery_Handler, - }, - { - MethodName: "PartitionRead", - Handler: _Spanner_PartitionRead_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "ExecuteStreamingSql", - Handler: _Spanner_ExecuteStreamingSql_Handler, - ServerStreams: true, - }, - { - StreamName: "StreamingRead", - Handler: _Spanner_StreamingRead_Handler, - ServerStreams: true, - }, - { - StreamName: "BatchWrite", - Handler: _Spanner_BatchWrite_Handler, - ServerStreams: true, - }, - }, - Metadata: "google/spanner/v1/spanner.proto", -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/transaction.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/transaction.pb.go deleted file mode 100644 index 6557286511..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/transaction.pb.go +++ /dev/null @@ -1,1098 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/transaction.proto - -package spannerpb - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// `IsolationLevel` is used when setting `isolation_level` for a transaction. -type TransactionOptions_IsolationLevel int32 - -const ( - // Default value. - // - // If the value is not specified, the `SERIALIZABLE` isolation level is - // used. - TransactionOptions_ISOLATION_LEVEL_UNSPECIFIED TransactionOptions_IsolationLevel = 0 - // All transactions appear as if they executed in a serial order, even if - // some of the reads, writes, and other operations of distinct transactions - // actually occurred in parallel. Spanner assigns commit timestamps that - // reflect the order of committed transactions to implement this property. - // Spanner offers a stronger guarantee than serializability called external - // consistency. For further details, please refer to - // https://cloud.google.com/spanner/docs/true-time-external-consistency#serializability. - TransactionOptions_SERIALIZABLE TransactionOptions_IsolationLevel = 1 - // All reads performed during the transaction observe a consistent snapshot - // of the database, and the transaction is only successfully committed in - // the absence of conflicts between its updates and any concurrent updates - // that have occurred since that snapshot. Consequently, in contrast to - // `SERIALIZABLE` transactions, only write-write conflicts are detected in - // snapshot transactions. - // - // This isolation level does not support Read-only and Partitioned DML - // transactions. - // - // When `REPEATABLE_READ` is specified on a read-write transaction, the - // locking semantics default to `OPTIMISTIC`. - TransactionOptions_REPEATABLE_READ TransactionOptions_IsolationLevel = 2 -) - -// Enum value maps for TransactionOptions_IsolationLevel. -var ( - TransactionOptions_IsolationLevel_name = map[int32]string{ - 0: "ISOLATION_LEVEL_UNSPECIFIED", - 1: "SERIALIZABLE", - 2: "REPEATABLE_READ", - } - TransactionOptions_IsolationLevel_value = map[string]int32{ - "ISOLATION_LEVEL_UNSPECIFIED": 0, - "SERIALIZABLE": 1, - "REPEATABLE_READ": 2, - } -) - -func (x TransactionOptions_IsolationLevel) Enum() *TransactionOptions_IsolationLevel { - p := new(TransactionOptions_IsolationLevel) - *p = x - return p -} - -func (x TransactionOptions_IsolationLevel) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TransactionOptions_IsolationLevel) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_transaction_proto_enumTypes[0].Descriptor() -} - -func (TransactionOptions_IsolationLevel) Type() protoreflect.EnumType { - return &file_google_spanner_v1_transaction_proto_enumTypes[0] -} - -func (x TransactionOptions_IsolationLevel) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TransactionOptions_IsolationLevel.Descriptor instead. -func (TransactionOptions_IsolationLevel) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{0, 0} -} - -// `ReadLockMode` is used to set the read lock mode for read-write -// transactions. -type TransactionOptions_ReadWrite_ReadLockMode int32 - -const ( - // Default value. - // - // - If isolation level is - // [REPEATABLE_READ][google.spanner.v1.TransactionOptions.IsolationLevel.REPEATABLE_READ], - // then it is an error to specify `read_lock_mode`. Locking semantics - // default to `OPTIMISTIC`. No validation checks are done for reads, - // except to validate that the data that was served at the snapshot time - // is unchanged at commit time in the following cases: - // 1. reads done as part of queries that use `SELECT FOR UPDATE` - // 2. reads done as part of statements with a `LOCK_SCANNED_RANGES` - // hint - // 3. reads done as part of DML statements - // - At all other isolation levels, if `read_lock_mode` is the default - // value, then pessimistic read locks are used. - TransactionOptions_ReadWrite_READ_LOCK_MODE_UNSPECIFIED TransactionOptions_ReadWrite_ReadLockMode = 0 - // Pessimistic lock mode. - // - // Read locks are acquired immediately on read. - // Semantics described only applies to - // [SERIALIZABLE][google.spanner.v1.TransactionOptions.IsolationLevel.SERIALIZABLE] - // isolation. - TransactionOptions_ReadWrite_PESSIMISTIC TransactionOptions_ReadWrite_ReadLockMode = 1 - // Optimistic lock mode. - // - // Locks for reads within the transaction are not acquired on read. - // Instead the locks are acquired on a commit to validate that - // read/queried data has not changed since the transaction started. - // Semantics described only applies to - // [SERIALIZABLE][google.spanner.v1.TransactionOptions.IsolationLevel.SERIALIZABLE] - // isolation. - TransactionOptions_ReadWrite_OPTIMISTIC TransactionOptions_ReadWrite_ReadLockMode = 2 -) - -// Enum value maps for TransactionOptions_ReadWrite_ReadLockMode. -var ( - TransactionOptions_ReadWrite_ReadLockMode_name = map[int32]string{ - 0: "READ_LOCK_MODE_UNSPECIFIED", - 1: "PESSIMISTIC", - 2: "OPTIMISTIC", - } - TransactionOptions_ReadWrite_ReadLockMode_value = map[string]int32{ - "READ_LOCK_MODE_UNSPECIFIED": 0, - "PESSIMISTIC": 1, - "OPTIMISTIC": 2, - } -) - -func (x TransactionOptions_ReadWrite_ReadLockMode) Enum() *TransactionOptions_ReadWrite_ReadLockMode { - p := new(TransactionOptions_ReadWrite_ReadLockMode) - *p = x - return p -} - -func (x TransactionOptions_ReadWrite_ReadLockMode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TransactionOptions_ReadWrite_ReadLockMode) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_transaction_proto_enumTypes[1].Descriptor() -} - -func (TransactionOptions_ReadWrite_ReadLockMode) Type() protoreflect.EnumType { - return &file_google_spanner_v1_transaction_proto_enumTypes[1] -} - -func (x TransactionOptions_ReadWrite_ReadLockMode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TransactionOptions_ReadWrite_ReadLockMode.Descriptor instead. -func (TransactionOptions_ReadWrite_ReadLockMode) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{0, 0, 0} -} - -// Options to use for transactions. -type TransactionOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The type of transaction. - // - // Types that are assignable to Mode: - // - // *TransactionOptions_ReadWrite_ - // *TransactionOptions_PartitionedDml_ - // *TransactionOptions_ReadOnly_ - Mode isTransactionOptions_Mode `protobuf_oneof:"mode"` - // When `exclude_txn_from_change_streams` is set to `true`, it prevents read - // or write transactions from being tracked in change streams. - // - // * If the DDL option `allow_txn_exclusion` is set to `true`, then the - // updates - // - // made within this transaction aren't recorded in the change stream. - // - // - If you don't set the DDL option `allow_txn_exclusion` or if it's - // set to `false`, then the updates made within this transaction are - // recorded in the change stream. - // - // When `exclude_txn_from_change_streams` is set to `false` or not set, - // modifications from this transaction are recorded in all change streams - // that are tracking columns modified by these transactions. - // - // The `exclude_txn_from_change_streams` option can only be specified - // for read-write or partitioned DML transactions, otherwise the API returns - // an `INVALID_ARGUMENT` error. - ExcludeTxnFromChangeStreams bool `protobuf:"varint,5,opt,name=exclude_txn_from_change_streams,json=excludeTxnFromChangeStreams,proto3" json:"exclude_txn_from_change_streams,omitempty"` - // Isolation level for the transaction. - IsolationLevel TransactionOptions_IsolationLevel `protobuf:"varint,6,opt,name=isolation_level,json=isolationLevel,proto3,enum=google.spanner.v1.TransactionOptions_IsolationLevel" json:"isolation_level,omitempty"` -} - -func (x *TransactionOptions) Reset() { - *x = TransactionOptions{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *TransactionOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionOptions) ProtoMessage() {} - -func (x *TransactionOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionOptions.ProtoReflect.Descriptor instead. -func (*TransactionOptions) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{0} -} - -func (m *TransactionOptions) GetMode() isTransactionOptions_Mode { - if m != nil { - return m.Mode - } - return nil -} - -func (x *TransactionOptions) GetReadWrite() *TransactionOptions_ReadWrite { - if x, ok := x.GetMode().(*TransactionOptions_ReadWrite_); ok { - return x.ReadWrite - } - return nil -} - -func (x *TransactionOptions) GetPartitionedDml() *TransactionOptions_PartitionedDml { - if x, ok := x.GetMode().(*TransactionOptions_PartitionedDml_); ok { - return x.PartitionedDml - } - return nil -} - -func (x *TransactionOptions) GetReadOnly() *TransactionOptions_ReadOnly { - if x, ok := x.GetMode().(*TransactionOptions_ReadOnly_); ok { - return x.ReadOnly - } - return nil -} - -func (x *TransactionOptions) GetExcludeTxnFromChangeStreams() bool { - if x != nil { - return x.ExcludeTxnFromChangeStreams - } - return false -} - -func (x *TransactionOptions) GetIsolationLevel() TransactionOptions_IsolationLevel { - if x != nil { - return x.IsolationLevel - } - return TransactionOptions_ISOLATION_LEVEL_UNSPECIFIED -} - -type isTransactionOptions_Mode interface { - isTransactionOptions_Mode() -} - -type TransactionOptions_ReadWrite_ struct { - // Transaction may write. - // - // Authorization to begin a read-write transaction requires - // `spanner.databases.beginOrRollbackReadWriteTransaction` permission - // on the `session` resource. - ReadWrite *TransactionOptions_ReadWrite `protobuf:"bytes,1,opt,name=read_write,json=readWrite,proto3,oneof"` -} - -type TransactionOptions_PartitionedDml_ struct { - // Partitioned DML transaction. - // - // Authorization to begin a Partitioned DML transaction requires - // `spanner.databases.beginPartitionedDmlTransaction` permission - // on the `session` resource. - PartitionedDml *TransactionOptions_PartitionedDml `protobuf:"bytes,3,opt,name=partitioned_dml,json=partitionedDml,proto3,oneof"` -} - -type TransactionOptions_ReadOnly_ struct { - // Transaction does not write. - // - // Authorization to begin a read-only transaction requires - // `spanner.databases.beginReadOnlyTransaction` permission - // on the `session` resource. - ReadOnly *TransactionOptions_ReadOnly `protobuf:"bytes,2,opt,name=read_only,json=readOnly,proto3,oneof"` -} - -func (*TransactionOptions_ReadWrite_) isTransactionOptions_Mode() {} - -func (*TransactionOptions_PartitionedDml_) isTransactionOptions_Mode() {} - -func (*TransactionOptions_ReadOnly_) isTransactionOptions_Mode() {} - -// A transaction. -type Transaction struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // `id` may be used to identify the transaction in subsequent - // [Read][google.spanner.v1.Spanner.Read], - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], - // [Commit][google.spanner.v1.Spanner.Commit], or - // [Rollback][google.spanner.v1.Spanner.Rollback] calls. - // - // Single-use read-only transactions do not have IDs, because - // single-use transactions do not support multiple requests. - Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // For snapshot read-only transactions, the read timestamp chosen - // for the transaction. Not returned by default: see - // [TransactionOptions.ReadOnly.return_read_timestamp][google.spanner.v1.TransactionOptions.ReadOnly.return_read_timestamp]. - // - // A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds. - // Example: `"2014-10-02T15:01:23.045123456Z"`. - ReadTimestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=read_timestamp,json=readTimestamp,proto3" json:"read_timestamp,omitempty"` - // A precommit token is included in the response of a BeginTransaction - // request if the read-write transaction is on a multiplexed session and - // a mutation_key was specified in the - // [BeginTransaction][google.spanner.v1.BeginTransactionRequest]. - // The precommit token with the highest sequence number from this transaction - // attempt should be passed to the [Commit][google.spanner.v1.Spanner.Commit] - // request for this transaction. - PrecommitToken *MultiplexedSessionPrecommitToken `protobuf:"bytes,3,opt,name=precommit_token,json=precommitToken,proto3" json:"precommit_token,omitempty"` -} - -func (x *Transaction) Reset() { - *x = Transaction{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Transaction) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Transaction) ProtoMessage() {} - -func (x *Transaction) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Transaction.ProtoReflect.Descriptor instead. -func (*Transaction) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{1} -} - -func (x *Transaction) GetId() []byte { - if x != nil { - return x.Id - } - return nil -} - -func (x *Transaction) GetReadTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.ReadTimestamp - } - return nil -} - -func (x *Transaction) GetPrecommitToken() *MultiplexedSessionPrecommitToken { - if x != nil { - return x.PrecommitToken - } - return nil -} - -// This message is used to select the transaction in which a -// [Read][google.spanner.v1.Spanner.Read] or -// [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] call runs. -// -// See [TransactionOptions][google.spanner.v1.TransactionOptions] for more -// information about transactions. -type TransactionSelector struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // If no fields are set, the default is a single use transaction - // with strong concurrency. - // - // Types that are assignable to Selector: - // - // *TransactionSelector_SingleUse - // *TransactionSelector_Id - // *TransactionSelector_Begin - Selector isTransactionSelector_Selector `protobuf_oneof:"selector"` -} - -func (x *TransactionSelector) Reset() { - *x = TransactionSelector{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *TransactionSelector) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionSelector) ProtoMessage() {} - -func (x *TransactionSelector) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionSelector.ProtoReflect.Descriptor instead. -func (*TransactionSelector) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{2} -} - -func (m *TransactionSelector) GetSelector() isTransactionSelector_Selector { - if m != nil { - return m.Selector - } - return nil -} - -func (x *TransactionSelector) GetSingleUse() *TransactionOptions { - if x, ok := x.GetSelector().(*TransactionSelector_SingleUse); ok { - return x.SingleUse - } - return nil -} - -func (x *TransactionSelector) GetId() []byte { - if x, ok := x.GetSelector().(*TransactionSelector_Id); ok { - return x.Id - } - return nil -} - -func (x *TransactionSelector) GetBegin() *TransactionOptions { - if x, ok := x.GetSelector().(*TransactionSelector_Begin); ok { - return x.Begin - } - return nil -} - -type isTransactionSelector_Selector interface { - isTransactionSelector_Selector() -} - -type TransactionSelector_SingleUse struct { - // Execute the read or SQL query in a temporary transaction. - // This is the most efficient way to execute a transaction that - // consists of a single SQL query. - SingleUse *TransactionOptions `protobuf:"bytes,1,opt,name=single_use,json=singleUse,proto3,oneof"` -} - -type TransactionSelector_Id struct { - // Execute the read or SQL query in a previously-started transaction. - Id []byte `protobuf:"bytes,2,opt,name=id,proto3,oneof"` -} - -type TransactionSelector_Begin struct { - // Begin a new transaction and execute this read or SQL query in - // it. The transaction ID of the new transaction is returned in - // [ResultSetMetadata.transaction][google.spanner.v1.ResultSetMetadata.transaction], - // which is a [Transaction][google.spanner.v1.Transaction]. - Begin *TransactionOptions `protobuf:"bytes,3,opt,name=begin,proto3,oneof"` -} - -func (*TransactionSelector_SingleUse) isTransactionSelector_Selector() {} - -func (*TransactionSelector_Id) isTransactionSelector_Selector() {} - -func (*TransactionSelector_Begin) isTransactionSelector_Selector() {} - -// When a read-write transaction is executed on a multiplexed session, -// this precommit token is sent back to the client -// as a part of the [Transaction][google.spanner.v1.Transaction] message in the -// [BeginTransaction][google.spanner.v1.BeginTransactionRequest] response and -// also as a part of the [ResultSet][google.spanner.v1.ResultSet] and -// [PartialResultSet][google.spanner.v1.PartialResultSet] responses. -type MultiplexedSessionPrecommitToken struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Opaque precommit token. - PrecommitToken []byte `protobuf:"bytes,1,opt,name=precommit_token,json=precommitToken,proto3" json:"precommit_token,omitempty"` - // An incrementing seq number is generated on every precommit token - // that is returned. Clients should remember the precommit token with the - // highest sequence number from the current transaction attempt. - SeqNum int32 `protobuf:"varint,2,opt,name=seq_num,json=seqNum,proto3" json:"seq_num,omitempty"` -} - -func (x *MultiplexedSessionPrecommitToken) Reset() { - *x = MultiplexedSessionPrecommitToken{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *MultiplexedSessionPrecommitToken) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MultiplexedSessionPrecommitToken) ProtoMessage() {} - -func (x *MultiplexedSessionPrecommitToken) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MultiplexedSessionPrecommitToken.ProtoReflect.Descriptor instead. -func (*MultiplexedSessionPrecommitToken) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{3} -} - -func (x *MultiplexedSessionPrecommitToken) GetPrecommitToken() []byte { - if x != nil { - return x.PrecommitToken - } - return nil -} - -func (x *MultiplexedSessionPrecommitToken) GetSeqNum() int32 { - if x != nil { - return x.SeqNum - } - return 0 -} - -// Message type to initiate a read-write transaction. Currently this -// transaction type has no options. -type TransactionOptions_ReadWrite struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Read lock mode for the transaction. - ReadLockMode TransactionOptions_ReadWrite_ReadLockMode `protobuf:"varint,1,opt,name=read_lock_mode,json=readLockMode,proto3,enum=google.spanner.v1.TransactionOptions_ReadWrite_ReadLockMode" json:"read_lock_mode,omitempty"` - // Optional. Clients should pass the transaction ID of the previous - // transaction attempt that was aborted if this transaction is being - // executed on a multiplexed session. - MultiplexedSessionPreviousTransactionId []byte `protobuf:"bytes,2,opt,name=multiplexed_session_previous_transaction_id,json=multiplexedSessionPreviousTransactionId,proto3" json:"multiplexed_session_previous_transaction_id,omitempty"` -} - -func (x *TransactionOptions_ReadWrite) Reset() { - *x = TransactionOptions_ReadWrite{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *TransactionOptions_ReadWrite) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionOptions_ReadWrite) ProtoMessage() {} - -func (x *TransactionOptions_ReadWrite) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionOptions_ReadWrite.ProtoReflect.Descriptor instead. -func (*TransactionOptions_ReadWrite) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *TransactionOptions_ReadWrite) GetReadLockMode() TransactionOptions_ReadWrite_ReadLockMode { - if x != nil { - return x.ReadLockMode - } - return TransactionOptions_ReadWrite_READ_LOCK_MODE_UNSPECIFIED -} - -func (x *TransactionOptions_ReadWrite) GetMultiplexedSessionPreviousTransactionId() []byte { - if x != nil { - return x.MultiplexedSessionPreviousTransactionId - } - return nil -} - -// Message type to initiate a Partitioned DML transaction. -type TransactionOptions_PartitionedDml struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *TransactionOptions_PartitionedDml) Reset() { - *x = TransactionOptions_PartitionedDml{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *TransactionOptions_PartitionedDml) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionOptions_PartitionedDml) ProtoMessage() {} - -func (x *TransactionOptions_PartitionedDml) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[5] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionOptions_PartitionedDml.ProtoReflect.Descriptor instead. -func (*TransactionOptions_PartitionedDml) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{0, 1} -} - -// Message type to initiate a read-only transaction. -type TransactionOptions_ReadOnly struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // How to choose the timestamp for the read-only transaction. - // - // Types that are assignable to TimestampBound: - // - // *TransactionOptions_ReadOnly_Strong - // *TransactionOptions_ReadOnly_MinReadTimestamp - // *TransactionOptions_ReadOnly_MaxStaleness - // *TransactionOptions_ReadOnly_ReadTimestamp - // *TransactionOptions_ReadOnly_ExactStaleness - TimestampBound isTransactionOptions_ReadOnly_TimestampBound `protobuf_oneof:"timestamp_bound"` - // If true, the Cloud Spanner-selected read timestamp is included in - // the [Transaction][google.spanner.v1.Transaction] message that describes - // the transaction. - ReturnReadTimestamp bool `protobuf:"varint,6,opt,name=return_read_timestamp,json=returnReadTimestamp,proto3" json:"return_read_timestamp,omitempty"` -} - -func (x *TransactionOptions_ReadOnly) Reset() { - *x = TransactionOptions_ReadOnly{} - mi := &file_google_spanner_v1_transaction_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *TransactionOptions_ReadOnly) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransactionOptions_ReadOnly) ProtoMessage() {} - -func (x *TransactionOptions_ReadOnly) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_transaction_proto_msgTypes[6] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransactionOptions_ReadOnly.ProtoReflect.Descriptor instead. -func (*TransactionOptions_ReadOnly) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_transaction_proto_rawDescGZIP(), []int{0, 2} -} - -func (m *TransactionOptions_ReadOnly) GetTimestampBound() isTransactionOptions_ReadOnly_TimestampBound { - if m != nil { - return m.TimestampBound - } - return nil -} - -func (x *TransactionOptions_ReadOnly) GetStrong() bool { - if x, ok := x.GetTimestampBound().(*TransactionOptions_ReadOnly_Strong); ok { - return x.Strong - } - return false -} - -func (x *TransactionOptions_ReadOnly) GetMinReadTimestamp() *timestamppb.Timestamp { - if x, ok := x.GetTimestampBound().(*TransactionOptions_ReadOnly_MinReadTimestamp); ok { - return x.MinReadTimestamp - } - return nil -} - -func (x *TransactionOptions_ReadOnly) GetMaxStaleness() *durationpb.Duration { - if x, ok := x.GetTimestampBound().(*TransactionOptions_ReadOnly_MaxStaleness); ok { - return x.MaxStaleness - } - return nil -} - -func (x *TransactionOptions_ReadOnly) GetReadTimestamp() *timestamppb.Timestamp { - if x, ok := x.GetTimestampBound().(*TransactionOptions_ReadOnly_ReadTimestamp); ok { - return x.ReadTimestamp - } - return nil -} - -func (x *TransactionOptions_ReadOnly) GetExactStaleness() *durationpb.Duration { - if x, ok := x.GetTimestampBound().(*TransactionOptions_ReadOnly_ExactStaleness); ok { - return x.ExactStaleness - } - return nil -} - -func (x *TransactionOptions_ReadOnly) GetReturnReadTimestamp() bool { - if x != nil { - return x.ReturnReadTimestamp - } - return false -} - -type isTransactionOptions_ReadOnly_TimestampBound interface { - isTransactionOptions_ReadOnly_TimestampBound() -} - -type TransactionOptions_ReadOnly_Strong struct { - // Read at a timestamp where all previously committed transactions - // are visible. - Strong bool `protobuf:"varint,1,opt,name=strong,proto3,oneof"` -} - -type TransactionOptions_ReadOnly_MinReadTimestamp struct { - // Executes all reads at a timestamp >= `min_read_timestamp`. - // - // This is useful for requesting fresher data than some previous - // read, or data that is fresh enough to observe the effects of some - // previously committed transaction whose timestamp is known. - // - // Note that this option can only be used in single-use transactions. - // - // A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds. - // Example: `"2014-10-02T15:01:23.045123456Z"`. - MinReadTimestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=min_read_timestamp,json=minReadTimestamp,proto3,oneof"` -} - -type TransactionOptions_ReadOnly_MaxStaleness struct { - // Read data at a timestamp >= `NOW - max_staleness` - // seconds. Guarantees that all writes that have committed more - // than the specified number of seconds ago are visible. Because - // Cloud Spanner chooses the exact timestamp, this mode works even if - // the client's local clock is substantially skewed from Cloud Spanner - // commit timestamps. - // - // Useful for reading the freshest data available at a nearby - // replica, while bounding the possible staleness if the local - // replica has fallen behind. - // - // Note that this option can only be used in single-use - // transactions. - MaxStaleness *durationpb.Duration `protobuf:"bytes,3,opt,name=max_staleness,json=maxStaleness,proto3,oneof"` -} - -type TransactionOptions_ReadOnly_ReadTimestamp struct { - // Executes all reads at the given timestamp. Unlike other modes, - // reads at a specific timestamp are repeatable; the same read at - // the same timestamp always returns the same data. If the - // timestamp is in the future, the read is blocked until the - // specified timestamp, modulo the read's deadline. - // - // Useful for large scale consistent reads such as mapreduces, or - // for coordinating many reads against a consistent snapshot of the - // data. - // - // A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds. - // Example: `"2014-10-02T15:01:23.045123456Z"`. - ReadTimestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=read_timestamp,json=readTimestamp,proto3,oneof"` -} - -type TransactionOptions_ReadOnly_ExactStaleness struct { - // Executes all reads at a timestamp that is `exact_staleness` - // old. The timestamp is chosen soon after the read is started. - // - // Guarantees that all writes that have committed more than the - // specified number of seconds ago are visible. Because Cloud Spanner - // chooses the exact timestamp, this mode works even if the client's - // local clock is substantially skewed from Cloud Spanner commit - // timestamps. - // - // Useful for reading at nearby replicas without the distributed - // timestamp negotiation overhead of `max_staleness`. - ExactStaleness *durationpb.Duration `protobuf:"bytes,5,opt,name=exact_staleness,json=exactStaleness,proto3,oneof"` -} - -func (*TransactionOptions_ReadOnly_Strong) isTransactionOptions_ReadOnly_TimestampBound() {} - -func (*TransactionOptions_ReadOnly_MinReadTimestamp) isTransactionOptions_ReadOnly_TimestampBound() {} - -func (*TransactionOptions_ReadOnly_MaxStaleness) isTransactionOptions_ReadOnly_TimestampBound() {} - -func (*TransactionOptions_ReadOnly_ReadTimestamp) isTransactionOptions_ReadOnly_TimestampBound() {} - -func (*TransactionOptions_ReadOnly_ExactStaleness) isTransactionOptions_ReadOnly_TimestampBound() {} - -var File_google_spanner_v1_transaction_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_transaction_proto_rawDesc = []byte{ - 0x0a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, - 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdc, 0x09, 0x0a, 0x12, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x50, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x65, 0x64, 0x5f, 0x64, 0x6d, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x44, - 0x6d, 0x6c, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, - 0x64, 0x44, 0x6d, 0x6c, 0x12, 0x4d, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x12, 0x44, 0x0a, 0x1f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, - 0x78, 0x6e, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x5d, 0x0a, 0x0f, 0x69, 0x73, 0x6f, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0e, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0xa3, 0x02, 0x0a, 0x09, 0x52, 0x65, 0x61, - 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x62, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2e, - 0x52, 0x65, 0x61, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, - 0x61, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x61, 0x0a, 0x2b, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, - 0x03, 0xe0, 0x41, 0x01, 0x52, 0x27, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x65, - 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4f, 0x0a, - 0x0c, 0x52, 0x65, 0x61, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, - 0x1a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x50, 0x45, 0x53, 0x53, 0x49, 0x4d, 0x49, 0x53, 0x54, 0x49, 0x43, 0x10, 0x01, 0x12, 0x0e, - 0x0a, 0x0a, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x54, 0x49, 0x43, 0x10, 0x02, 0x1a, 0x10, - 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x44, 0x6d, 0x6c, - 0x1a, 0x84, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x18, 0x0a, - 0x06, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x12, 0x4a, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x72, - 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, - 0x00, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x40, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, - 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x61, 0x6c, - 0x65, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x61, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x44, 0x0a, 0x0f, 0x65, 0x78, - 0x61, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x0e, 0x65, 0x78, 0x61, 0x63, 0x74, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, 0x73, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x42, 0x11, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x58, 0x0a, 0x0e, 0x49, 0x73, 0x6f, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x1b, 0x49, 0x53, 0x4f, - 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, - 0x52, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, - 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x10, - 0x02, 0x42, 0x06, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x0b, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, 0x0a, 0x0e, 0x72, 0x65, 0x61, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x72, - 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5c, 0x0a, 0x0f, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xba, 0x01, 0x0a, 0x13, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0a, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x75, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, - 0x09, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x55, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x05, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x48, 0x00, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x64, 0x0a, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x65, 0x78, 0x65, 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6e, 0x75, 0x6d, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x42, 0xb3, 0x01, - 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, - 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x70, 0x62, 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, - 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_transaction_proto_rawDescOnce sync.Once - file_google_spanner_v1_transaction_proto_rawDescData = file_google_spanner_v1_transaction_proto_rawDesc -) - -func file_google_spanner_v1_transaction_proto_rawDescGZIP() []byte { - file_google_spanner_v1_transaction_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_transaction_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_transaction_proto_rawDescData) - }) - return file_google_spanner_v1_transaction_proto_rawDescData -} - -var file_google_spanner_v1_transaction_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_google_spanner_v1_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_google_spanner_v1_transaction_proto_goTypes = []any{ - (TransactionOptions_IsolationLevel)(0), // 0: google.spanner.v1.TransactionOptions.IsolationLevel - (TransactionOptions_ReadWrite_ReadLockMode)(0), // 1: google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode - (*TransactionOptions)(nil), // 2: google.spanner.v1.TransactionOptions - (*Transaction)(nil), // 3: google.spanner.v1.Transaction - (*TransactionSelector)(nil), // 4: google.spanner.v1.TransactionSelector - (*MultiplexedSessionPrecommitToken)(nil), // 5: google.spanner.v1.MultiplexedSessionPrecommitToken - (*TransactionOptions_ReadWrite)(nil), // 6: google.spanner.v1.TransactionOptions.ReadWrite - (*TransactionOptions_PartitionedDml)(nil), // 7: google.spanner.v1.TransactionOptions.PartitionedDml - (*TransactionOptions_ReadOnly)(nil), // 8: google.spanner.v1.TransactionOptions.ReadOnly - (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 10: google.protobuf.Duration -} -var file_google_spanner_v1_transaction_proto_depIdxs = []int32{ - 6, // 0: google.spanner.v1.TransactionOptions.read_write:type_name -> google.spanner.v1.TransactionOptions.ReadWrite - 7, // 1: google.spanner.v1.TransactionOptions.partitioned_dml:type_name -> google.spanner.v1.TransactionOptions.PartitionedDml - 8, // 2: google.spanner.v1.TransactionOptions.read_only:type_name -> google.spanner.v1.TransactionOptions.ReadOnly - 0, // 3: google.spanner.v1.TransactionOptions.isolation_level:type_name -> google.spanner.v1.TransactionOptions.IsolationLevel - 9, // 4: google.spanner.v1.Transaction.read_timestamp:type_name -> google.protobuf.Timestamp - 5, // 5: google.spanner.v1.Transaction.precommit_token:type_name -> google.spanner.v1.MultiplexedSessionPrecommitToken - 2, // 6: google.spanner.v1.TransactionSelector.single_use:type_name -> google.spanner.v1.TransactionOptions - 2, // 7: google.spanner.v1.TransactionSelector.begin:type_name -> google.spanner.v1.TransactionOptions - 1, // 8: google.spanner.v1.TransactionOptions.ReadWrite.read_lock_mode:type_name -> google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode - 9, // 9: google.spanner.v1.TransactionOptions.ReadOnly.min_read_timestamp:type_name -> google.protobuf.Timestamp - 10, // 10: google.spanner.v1.TransactionOptions.ReadOnly.max_staleness:type_name -> google.protobuf.Duration - 9, // 11: google.spanner.v1.TransactionOptions.ReadOnly.read_timestamp:type_name -> google.protobuf.Timestamp - 10, // 12: google.spanner.v1.TransactionOptions.ReadOnly.exact_staleness:type_name -> google.protobuf.Duration - 13, // [13:13] is the sub-list for method output_type - 13, // [13:13] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_transaction_proto_init() } -func file_google_spanner_v1_transaction_proto_init() { - if File_google_spanner_v1_transaction_proto != nil { - return - } - file_google_spanner_v1_transaction_proto_msgTypes[0].OneofWrappers = []any{ - (*TransactionOptions_ReadWrite_)(nil), - (*TransactionOptions_PartitionedDml_)(nil), - (*TransactionOptions_ReadOnly_)(nil), - } - file_google_spanner_v1_transaction_proto_msgTypes[2].OneofWrappers = []any{ - (*TransactionSelector_SingleUse)(nil), - (*TransactionSelector_Id)(nil), - (*TransactionSelector_Begin)(nil), - } - file_google_spanner_v1_transaction_proto_msgTypes[6].OneofWrappers = []any{ - (*TransactionOptions_ReadOnly_Strong)(nil), - (*TransactionOptions_ReadOnly_MinReadTimestamp)(nil), - (*TransactionOptions_ReadOnly_MaxStaleness)(nil), - (*TransactionOptions_ReadOnly_ReadTimestamp)(nil), - (*TransactionOptions_ReadOnly_ExactStaleness)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_transaction_proto_rawDesc, - NumEnums: 2, - NumMessages: 7, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_transaction_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_transaction_proto_depIdxs, - EnumInfos: file_google_spanner_v1_transaction_proto_enumTypes, - MessageInfos: file_google_spanner_v1_transaction_proto_msgTypes, - }.Build() - File_google_spanner_v1_transaction_proto = out.File - file_google_spanner_v1_transaction_proto_rawDesc = nil - file_google_spanner_v1_transaction_proto_goTypes = nil - file_google_spanner_v1_transaction_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/type.pb.go b/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/type.pb.go deleted file mode 100644 index fd80fe88d5..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/spannerpb/type.pb.go +++ /dev/null @@ -1,606 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.35.2 -// protoc v4.25.7 -// source: google/spanner/v1/type.proto - -package spannerpb - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// `TypeCode` is used as part of [Type][google.spanner.v1.Type] to -// indicate the type of a Cloud Spanner value. -// -// Each legal value of a type can be encoded to or decoded from a JSON -// value, using the encodings described below. All Cloud Spanner values can -// be `null`, regardless of type; `null`s are always encoded as a JSON -// `null`. -type TypeCode int32 - -const ( - // Not specified. - TypeCode_TYPE_CODE_UNSPECIFIED TypeCode = 0 - // Encoded as JSON `true` or `false`. - TypeCode_BOOL TypeCode = 1 - // Encoded as `string`, in decimal format. - TypeCode_INT64 TypeCode = 2 - // Encoded as `number`, or the strings `"NaN"`, `"Infinity"`, or - // `"-Infinity"`. - TypeCode_FLOAT64 TypeCode = 3 - // Encoded as `number`, or the strings `"NaN"`, `"Infinity"`, or - // `"-Infinity"`. - TypeCode_FLOAT32 TypeCode = 15 - // Encoded as `string` in RFC 3339 timestamp format. The time zone - // must be present, and must be `"Z"`. - // - // If the schema has the column option - // `allow_commit_timestamp=true`, the placeholder string - // `"spanner.commit_timestamp()"` can be used to instruct the system - // to insert the commit timestamp associated with the transaction - // commit. - TypeCode_TIMESTAMP TypeCode = 4 - // Encoded as `string` in RFC 3339 date format. - TypeCode_DATE TypeCode = 5 - // Encoded as `string`. - TypeCode_STRING TypeCode = 6 - // Encoded as a base64-encoded `string`, as described in RFC 4648, - // section 4. - TypeCode_BYTES TypeCode = 7 - // Encoded as `list`, where the list elements are represented - // according to - // [array_element_type][google.spanner.v1.Type.array_element_type]. - TypeCode_ARRAY TypeCode = 8 - // Encoded as `list`, where list element `i` is represented according - // to [struct_type.fields[i]][google.spanner.v1.StructType.fields]. - TypeCode_STRUCT TypeCode = 9 - // Encoded as `string`, in decimal format or scientific notation format. - // Decimal format: - // `[+-]Digits[.[Digits]]` or - // `[+-][Digits].Digits` - // - // Scientific notation: - // `[+-]Digits[.[Digits]][ExponentIndicator[+-]Digits]` or - // `[+-][Digits].Digits[ExponentIndicator[+-]Digits]` - // (ExponentIndicator is `"e"` or `"E"`) - TypeCode_NUMERIC TypeCode = 10 - // Encoded as a JSON-formatted `string` as described in RFC 7159. The - // following rules are applied when parsing JSON input: - // - // - Whitespace characters are not preserved. - // - If a JSON object has duplicate keys, only the first key is preserved. - // - Members of a JSON object are not guaranteed to have their order - // preserved. - // - JSON array elements will have their order preserved. - TypeCode_JSON TypeCode = 11 - // Encoded as a base64-encoded `string`, as described in RFC 4648, - // section 4. - TypeCode_PROTO TypeCode = 13 - // Encoded as `string`, in decimal format. - TypeCode_ENUM TypeCode = 14 - // Encoded as `string`, in `ISO8601` duration format - - // `P[n]Y[n]M[n]DT[n]H[n]M[n[.fraction]]S` - // where `n` is an integer. - // For example, `P1Y2M3DT4H5M6.5S` represents time duration of 1 year, 2 - // months, 3 days, 4 hours, 5 minutes, and 6.5 seconds. - TypeCode_INTERVAL TypeCode = 16 - // Encoded as `string`, in lower-case hexa-decimal format, as described - // in RFC 9562, section 4. - TypeCode_UUID TypeCode = 17 -) - -// Enum value maps for TypeCode. -var ( - TypeCode_name = map[int32]string{ - 0: "TYPE_CODE_UNSPECIFIED", - 1: "BOOL", - 2: "INT64", - 3: "FLOAT64", - 15: "FLOAT32", - 4: "TIMESTAMP", - 5: "DATE", - 6: "STRING", - 7: "BYTES", - 8: "ARRAY", - 9: "STRUCT", - 10: "NUMERIC", - 11: "JSON", - 13: "PROTO", - 14: "ENUM", - 16: "INTERVAL", - 17: "UUID", - } - TypeCode_value = map[string]int32{ - "TYPE_CODE_UNSPECIFIED": 0, - "BOOL": 1, - "INT64": 2, - "FLOAT64": 3, - "FLOAT32": 15, - "TIMESTAMP": 4, - "DATE": 5, - "STRING": 6, - "BYTES": 7, - "ARRAY": 8, - "STRUCT": 9, - "NUMERIC": 10, - "JSON": 11, - "PROTO": 13, - "ENUM": 14, - "INTERVAL": 16, - "UUID": 17, - } -) - -func (x TypeCode) Enum() *TypeCode { - p := new(TypeCode) - *p = x - return p -} - -func (x TypeCode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TypeCode) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_type_proto_enumTypes[0].Descriptor() -} - -func (TypeCode) Type() protoreflect.EnumType { - return &file_google_spanner_v1_type_proto_enumTypes[0] -} - -func (x TypeCode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TypeCode.Descriptor instead. -func (TypeCode) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_type_proto_rawDescGZIP(), []int{0} -} - -// `TypeAnnotationCode` is used as a part of [Type][google.spanner.v1.Type] to -// disambiguate SQL types that should be used for a given Cloud Spanner value. -// Disambiguation is needed because the same Cloud Spanner type can be mapped to -// different SQL types depending on SQL dialect. TypeAnnotationCode doesn't -// affect the way value is serialized. -type TypeAnnotationCode int32 - -const ( - // Not specified. - TypeAnnotationCode_TYPE_ANNOTATION_CODE_UNSPECIFIED TypeAnnotationCode = 0 - // PostgreSQL compatible NUMERIC type. This annotation needs to be applied to - // [Type][google.spanner.v1.Type] instances having - // [NUMERIC][google.spanner.v1.TypeCode.NUMERIC] type code to specify that - // values of this type should be treated as PostgreSQL NUMERIC values. - // Currently this annotation is always needed for - // [NUMERIC][google.spanner.v1.TypeCode.NUMERIC] when a client interacts with - // PostgreSQL-enabled Spanner databases. - TypeAnnotationCode_PG_NUMERIC TypeAnnotationCode = 2 - // PostgreSQL compatible JSONB type. This annotation needs to be applied to - // [Type][google.spanner.v1.Type] instances having - // [JSON][google.spanner.v1.TypeCode.JSON] type code to specify that values of - // this type should be treated as PostgreSQL JSONB values. Currently this - // annotation is always needed for [JSON][google.spanner.v1.TypeCode.JSON] - // when a client interacts with PostgreSQL-enabled Spanner databases. - TypeAnnotationCode_PG_JSONB TypeAnnotationCode = 3 - // PostgreSQL compatible OID type. This annotation can be used by a client - // interacting with PostgreSQL-enabled Spanner database to specify that a - // value should be treated using the semantics of the OID type. - TypeAnnotationCode_PG_OID TypeAnnotationCode = 4 -) - -// Enum value maps for TypeAnnotationCode. -var ( - TypeAnnotationCode_name = map[int32]string{ - 0: "TYPE_ANNOTATION_CODE_UNSPECIFIED", - 2: "PG_NUMERIC", - 3: "PG_JSONB", - 4: "PG_OID", - } - TypeAnnotationCode_value = map[string]int32{ - "TYPE_ANNOTATION_CODE_UNSPECIFIED": 0, - "PG_NUMERIC": 2, - "PG_JSONB": 3, - "PG_OID": 4, - } -) - -func (x TypeAnnotationCode) Enum() *TypeAnnotationCode { - p := new(TypeAnnotationCode) - *p = x - return p -} - -func (x TypeAnnotationCode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TypeAnnotationCode) Descriptor() protoreflect.EnumDescriptor { - return file_google_spanner_v1_type_proto_enumTypes[1].Descriptor() -} - -func (TypeAnnotationCode) Type() protoreflect.EnumType { - return &file_google_spanner_v1_type_proto_enumTypes[1] -} - -func (x TypeAnnotationCode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TypeAnnotationCode.Descriptor instead. -func (TypeAnnotationCode) EnumDescriptor() ([]byte, []int) { - return file_google_spanner_v1_type_proto_rawDescGZIP(), []int{1} -} - -// `Type` indicates the type of a Cloud Spanner value, as might be stored in a -// table cell or returned from an SQL query. -type Type struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The [TypeCode][google.spanner.v1.TypeCode] for this type. - Code TypeCode `protobuf:"varint,1,opt,name=code,proto3,enum=google.spanner.v1.TypeCode" json:"code,omitempty"` - // If [code][google.spanner.v1.Type.code] == - // [ARRAY][google.spanner.v1.TypeCode.ARRAY], then `array_element_type` is the - // type of the array elements. - ArrayElementType *Type `protobuf:"bytes,2,opt,name=array_element_type,json=arrayElementType,proto3" json:"array_element_type,omitempty"` - // If [code][google.spanner.v1.Type.code] == - // [STRUCT][google.spanner.v1.TypeCode.STRUCT], then `struct_type` provides - // type information for the struct's fields. - StructType *StructType `protobuf:"bytes,3,opt,name=struct_type,json=structType,proto3" json:"struct_type,omitempty"` - // The [TypeAnnotationCode][google.spanner.v1.TypeAnnotationCode] that - // disambiguates SQL type that Spanner will use to represent values of this - // type during query processing. This is necessary for some type codes because - // a single [TypeCode][google.spanner.v1.TypeCode] can be mapped to different - // SQL types depending on the SQL dialect. - // [type_annotation][google.spanner.v1.Type.type_annotation] typically is not - // needed to process the content of a value (it doesn't affect serialization) - // and clients can ignore it on the read path. - TypeAnnotation TypeAnnotationCode `protobuf:"varint,4,opt,name=type_annotation,json=typeAnnotation,proto3,enum=google.spanner.v1.TypeAnnotationCode" json:"type_annotation,omitempty"` - // If [code][google.spanner.v1.Type.code] == - // [PROTO][google.spanner.v1.TypeCode.PROTO] or - // [code][google.spanner.v1.Type.code] == - // [ENUM][google.spanner.v1.TypeCode.ENUM], then `proto_type_fqn` is the fully - // qualified name of the proto type representing the proto/enum definition. - ProtoTypeFqn string `protobuf:"bytes,5,opt,name=proto_type_fqn,json=protoTypeFqn,proto3" json:"proto_type_fqn,omitempty"` -} - -func (x *Type) Reset() { - *x = Type{} - mi := &file_google_spanner_v1_type_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Type) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Type) ProtoMessage() {} - -func (x *Type) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_type_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Type.ProtoReflect.Descriptor instead. -func (*Type) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_type_proto_rawDescGZIP(), []int{0} -} - -func (x *Type) GetCode() TypeCode { - if x != nil { - return x.Code - } - return TypeCode_TYPE_CODE_UNSPECIFIED -} - -func (x *Type) GetArrayElementType() *Type { - if x != nil { - return x.ArrayElementType - } - return nil -} - -func (x *Type) GetStructType() *StructType { - if x != nil { - return x.StructType - } - return nil -} - -func (x *Type) GetTypeAnnotation() TypeAnnotationCode { - if x != nil { - return x.TypeAnnotation - } - return TypeAnnotationCode_TYPE_ANNOTATION_CODE_UNSPECIFIED -} - -func (x *Type) GetProtoTypeFqn() string { - if x != nil { - return x.ProtoTypeFqn - } - return "" -} - -// `StructType` defines the fields of a -// [STRUCT][google.spanner.v1.TypeCode.STRUCT] type. -type StructType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The list of fields that make up this struct. Order is - // significant, because values of this struct type are represented as - // lists, where the order of field values matches the order of - // fields in the [StructType][google.spanner.v1.StructType]. In turn, the - // order of fields matches the order of columns in a read request, or the - // order of fields in the `SELECT` clause of a query. - Fields []*StructType_Field `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"` -} - -func (x *StructType) Reset() { - *x = StructType{} - mi := &file_google_spanner_v1_type_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *StructType) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StructType) ProtoMessage() {} - -func (x *StructType) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_type_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StructType.ProtoReflect.Descriptor instead. -func (*StructType) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_type_proto_rawDescGZIP(), []int{1} -} - -func (x *StructType) GetFields() []*StructType_Field { - if x != nil { - return x.Fields - } - return nil -} - -// Message representing a single field of a struct. -type StructType_Field struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The name of the field. For reads, this is the column name. For - // SQL queries, it is the column alias (e.g., `"Word"` in the - // query `"SELECT 'hello' AS Word"`), or the column name (e.g., - // `"ColName"` in the query `"SELECT ColName FROM Table"`). Some - // columns might have an empty name (e.g., `"SELECT - // UPPER(ColName)"`). Note that a query result can contain - // multiple fields with the same name. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The type of the field. - Type *Type `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` -} - -func (x *StructType_Field) Reset() { - *x = StructType_Field{} - mi := &file_google_spanner_v1_type_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *StructType_Field) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StructType_Field) ProtoMessage() {} - -func (x *StructType_Field) ProtoReflect() protoreflect.Message { - mi := &file_google_spanner_v1_type_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StructType_Field.ProtoReflect.Descriptor instead. -func (*StructType_Field) Descriptor() ([]byte, []int) { - return file_google_spanner_v1_type_proto_rawDescGZIP(), []int{1, 0} -} - -func (x *StructType_Field) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *StructType_Field) GetType() *Type { - if x != nil { - return x.Type - } - return nil -} - -var File_google_spanner_v1_type_proto protoreflect.FileDescriptor - -var file_google_spanner_v1_type_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xb9, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x45, 0x0a, 0x12, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x61, 0x72, 0x72, 0x61, 0x79, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x41, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x46, 0x71, 0x6e, 0x22, 0x93, - 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3b, 0x0a, - 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x48, 0x0a, 0x05, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, - 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x2a, 0xdf, 0x01, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, - 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0b, - 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x0d, 0x0a, 0x09, 0x54, - 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, - 0x54, 0x45, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x06, - 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x41, - 0x52, 0x52, 0x41, 0x59, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, - 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x10, 0x0a, 0x12, - 0x08, 0x0a, 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x0b, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x52, 0x4f, - 0x54, 0x4f, 0x10, 0x0d, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x0c, - 0x0a, 0x08, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x10, 0x10, 0x12, 0x08, 0x0a, 0x04, - 0x55, 0x55, 0x49, 0x44, 0x10, 0x11, 0x2a, 0x64, 0x0a, 0x12, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x20, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x47, 0x5f, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, - 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x47, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x42, 0x10, 0x03, - 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x47, 0x5f, 0x4f, 0x49, 0x44, 0x10, 0x04, 0x42, 0xac, 0x01, 0x0a, - 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x70, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, - 0x3b, 0x73, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x70, 0x62, 0xaa, 0x02, 0x17, 0x47, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, - 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xea, 0x02, - 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, - 0x53, 0x70, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, -} - -var ( - file_google_spanner_v1_type_proto_rawDescOnce sync.Once - file_google_spanner_v1_type_proto_rawDescData = file_google_spanner_v1_type_proto_rawDesc -) - -func file_google_spanner_v1_type_proto_rawDescGZIP() []byte { - file_google_spanner_v1_type_proto_rawDescOnce.Do(func() { - file_google_spanner_v1_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_spanner_v1_type_proto_rawDescData) - }) - return file_google_spanner_v1_type_proto_rawDescData -} - -var file_google_spanner_v1_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_google_spanner_v1_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_google_spanner_v1_type_proto_goTypes = []any{ - (TypeCode)(0), // 0: google.spanner.v1.TypeCode - (TypeAnnotationCode)(0), // 1: google.spanner.v1.TypeAnnotationCode - (*Type)(nil), // 2: google.spanner.v1.Type - (*StructType)(nil), // 3: google.spanner.v1.StructType - (*StructType_Field)(nil), // 4: google.spanner.v1.StructType.Field -} -var file_google_spanner_v1_type_proto_depIdxs = []int32{ - 0, // 0: google.spanner.v1.Type.code:type_name -> google.spanner.v1.TypeCode - 2, // 1: google.spanner.v1.Type.array_element_type:type_name -> google.spanner.v1.Type - 3, // 2: google.spanner.v1.Type.struct_type:type_name -> google.spanner.v1.StructType - 1, // 3: google.spanner.v1.Type.type_annotation:type_name -> google.spanner.v1.TypeAnnotationCode - 4, // 4: google.spanner.v1.StructType.fields:type_name -> google.spanner.v1.StructType.Field - 2, // 5: google.spanner.v1.StructType.Field.type:type_name -> google.spanner.v1.Type - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name -} - -func init() { file_google_spanner_v1_type_proto_init() } -func file_google_spanner_v1_type_proto_init() { - if File_google_spanner_v1_type_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_spanner_v1_type_proto_rawDesc, - NumEnums: 2, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_spanner_v1_type_proto_goTypes, - DependencyIndexes: file_google_spanner_v1_type_proto_depIdxs, - EnumInfos: file_google_spanner_v1_type_proto_enumTypes, - MessageInfos: file_google_spanner_v1_type_proto_msgTypes, - }.Build() - File_google_spanner_v1_type_proto = out.File - file_google_spanner_v1_type_proto_rawDesc = nil - file_google_spanner_v1_type_proto_goTypes = nil - file_google_spanner_v1_type_proto_depIdxs = nil -} diff --git a/vendor/cloud.google.com/go/spanner/apiv1/version.go b/vendor/cloud.google.com/go/spanner/apiv1/version.go deleted file mode 100644 index 483fd85b22..0000000000 --- a/vendor/cloud.google.com/go/spanner/apiv1/version.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2023 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapicgen. DO NOT EDIT. - -package spanner - -import "cloud.google.com/go/spanner/internal" - -func init() { - versionClient = internal.Version -} diff --git a/vendor/cloud.google.com/go/spanner/batch.go b/vendor/cloud.google.com/go/spanner/batch.go deleted file mode 100644 index 73461b8532..0000000000 --- a/vendor/cloud.google.com/go/spanner/batch.go +++ /dev/null @@ -1,498 +0,0 @@ -/* -Copyright 2018 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "bytes" - "context" - "encoding/gob" - "log" - "time" - - "cloud.google.com/go/internal/trace" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/googleapis/gax-go/v2" - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/proto" -) - -// BatchReadOnlyTransaction is a ReadOnlyTransaction that allows for exporting -// arbitrarily large amounts of data from Cloud Spanner databases. -// BatchReadOnlyTransaction partitions a read/query request. Read/query request -// can then be executed independently over each partition while observing the -// same snapshot of the database. BatchReadOnlyTransaction can also be shared -// across multiple clients by passing around the BatchReadOnlyTransactionID and -// then recreating the transaction using Client.BatchReadOnlyTransactionFromID. -// -// Note: if a client is used only to run partitions, you can -// create it using a ClientConfig with both MinOpened and MaxIdle set to -// zero to avoid creating unnecessary sessions. You can also avoid excess -// gRPC channels by setting ClientConfig.NumChannels to the number of -// concurrently active BatchReadOnlyTransactions you expect to have. -type BatchReadOnlyTransaction struct { - ReadOnlyTransaction - ID BatchReadOnlyTransactionID -} - -// BatchReadOnlyTransactionID is a unique identifier for a -// BatchReadOnlyTransaction. It can be used to re-create a -// BatchReadOnlyTransaction on a different machine or process by calling -// Client.BatchReadOnlyTransactionFromID. -type BatchReadOnlyTransactionID struct { - // unique ID for the transaction. - tid transactionID - // sid is the id of the Cloud Spanner session used for this transaction. - sid string - // rts is the read timestamp of this transaction. - rts time.Time -} - -// Partition defines a segment of data to be read in a batch read or query. A -// partition can be serialized and processed across several different machines -// or processes. -type Partition struct { - pt []byte - qreq *sppb.ExecuteSqlRequest - rreq *sppb.ReadRequest -} - -// PartitionOptions specifies options for a PartitionQueryRequest and -// PartitionReadRequest. See -// https://godoc.org/google.golang.org/genproto/googleapis/spanner/v1#PartitionOptions -// for more details. -type PartitionOptions struct { - // The desired data size for each partition generated. - PartitionBytes int64 - // The desired maximum number of partitions to return. - MaxPartitions int64 -} - -// toProto converts a spanner.PartitionOptions into a sppb.PartitionOptions -func (opt PartitionOptions) toProto() *sppb.PartitionOptions { - return &sppb.PartitionOptions{ - PartitionSizeBytes: opt.PartitionBytes, - MaxPartitions: opt.MaxPartitions, - } -} - -// PartitionRead returns a list of Partitions that can be used to read rows from -// the database. These partitions can be executed across multiple processes, -// even across different machines. The partition size and count hints can be -// configured using PartitionOptions. -func (t *BatchReadOnlyTransaction) PartitionRead(ctx context.Context, table string, keys KeySet, columns []string, opt PartitionOptions) ([]*Partition, error) { - return t.PartitionReadUsingIndex(ctx, table, "", keys, columns, opt) -} - -// PartitionReadWithOptions returns a list of Partitions that can be used to -// read rows from the database. These partitions can be executed across multiple -// processes, even across different machines. The partition size and count hints -// can be configured using PartitionOptions. Pass a ReadOptions to modify the -// read operation. -func (t *BatchReadOnlyTransaction) PartitionReadWithOptions(ctx context.Context, table string, keys KeySet, columns []string, opt PartitionOptions, readOptions ReadOptions) ([]*Partition, error) { - return t.PartitionReadUsingIndexWithOptions(ctx, table, "", keys, columns, opt, t.ReadOnlyTransaction.txReadOnly.ro.merge(readOptions)) -} - -// PartitionReadUsingIndex returns a list of Partitions that can be used to read -// rows from the database using an index. -func (t *BatchReadOnlyTransaction) PartitionReadUsingIndex(ctx context.Context, table, index string, keys KeySet, columns []string, opt PartitionOptions) ([]*Partition, error) { - return t.PartitionReadUsingIndexWithOptions(ctx, table, index, keys, columns, opt, t.ReadOnlyTransaction.txReadOnly.ro) -} - -// PartitionReadUsingIndexWithOptions returns a list of Partitions that can be -// used to read rows from the database using an index. Pass a ReadOptions to -// modify the read operation. -func (t *BatchReadOnlyTransaction) PartitionReadUsingIndexWithOptions(ctx context.Context, table, index string, keys KeySet, columns []string, opt PartitionOptions, readOptions ReadOptions) ([]*Partition, error) { - sh, ts, err := t.acquire(ctx) - if err != nil { - return nil, err - } - sid, client := sh.getID(), sh.getClient() - var ( - kset *sppb.KeySet - resp *sppb.PartitionResponse - partitions []*Partition - ) - kset, err = keys.keySetProto() - // Request partitions. - if err != nil { - return nil, err - } - var md metadata.MD - sh.updateLastUseTime() - resp, err = client.PartitionRead(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), &sppb.PartitionReadRequest{ - Session: sid, - Transaction: ts, - Table: table, - Index: index, - Columns: columns, - KeySet: kset, - PartitionOptions: opt.toProto(), - }, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "PartitionReadUsingIndexWithOptions"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "PartitionReadUsingIndexWithOptions", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if isUnimplementedErrorForMultiplexedPartitionReads(err) && t.sp.isMultiplexedSessionForPartitionedOpsEnabled() { - t.sp.disableMultiplexedSessionForPartitionedOps() - } - // Prepare ReadRequest. - req := &sppb.ReadRequest{ - Session: sid, - Transaction: ts, - Table: table, - Index: index, - Columns: columns, - KeySet: kset, - RequestOptions: createRequestOptions(readOptions.Priority, readOptions.RequestTag, ""), - DataBoostEnabled: readOptions.DataBoostEnabled, - DirectedReadOptions: readOptions.DirectedReadOptions, - } - // Generate partitions. - for _, p := range resp.GetPartitions() { - partitions = append(partitions, &Partition{ - pt: p.PartitionToken, - rreq: req, - }) - } - return partitions, err -} - -// PartitionQuery returns a list of Partitions that can be used to execute a -// query against the database. -func (t *BatchReadOnlyTransaction) PartitionQuery(ctx context.Context, statement Statement, opt PartitionOptions) ([]*Partition, error) { - return t.partitionQuery(ctx, statement, opt, t.ReadOnlyTransaction.txReadOnly.qo) -} - -// PartitionQueryWithOptions returns a list of Partitions that can be used to -// execute a query against the database. The sql query execution will be -// optimized based on the given query options. -func (t *BatchReadOnlyTransaction) PartitionQueryWithOptions(ctx context.Context, statement Statement, opt PartitionOptions, qOpts QueryOptions) ([]*Partition, error) { - return t.partitionQuery(ctx, statement, opt, t.ReadOnlyTransaction.txReadOnly.qo.merge(qOpts)) -} - -func (t *BatchReadOnlyTransaction) partitionQuery(ctx context.Context, statement Statement, opt PartitionOptions, qOpts QueryOptions) ([]*Partition, error) { - sh, ts, err := t.acquire(ctx) - if err != nil { - return nil, err - } - sid, client := sh.getID(), sh.getClient() - params, paramTypes, err := statement.convertParams() - if err != nil { - return nil, err - } - var md metadata.MD - - // request Partitions - req := &sppb.PartitionQueryRequest{ - Session: sid, - Transaction: ts, - Sql: statement.SQL, - PartitionOptions: opt.toProto(), - Params: params, - ParamTypes: paramTypes, - } - sh.updateLastUseTime() - resp, err := client.PartitionQuery(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), req, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "partitionQuery"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "partitionQuery", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if isUnimplementedErrorForMultiplexedPartitionReads(err) && t.sp.isMultiplexedSessionForPartitionedOpsEnabled() { - t.sp.disableMultiplexedSessionForPartitionedOps() - } - - // prepare ExecuteSqlRequest - r := &sppb.ExecuteSqlRequest{ - Session: sid, - Transaction: ts, - Sql: statement.SQL, - Params: params, - ParamTypes: paramTypes, - QueryOptions: qOpts.Options, - RequestOptions: createRequestOptions(qOpts.Priority, qOpts.RequestTag, ""), - DataBoostEnabled: qOpts.DataBoostEnabled, - DirectedReadOptions: qOpts.DirectedReadOptions, - } - - // generate Partitions - var partitions []*Partition - for _, p := range resp.GetPartitions() { - partitions = append(partitions, &Partition{ - pt: p.PartitionToken, - qreq: r, - }) - } - return partitions, err -} - -// release implements txReadEnv.release, noop. -func (t *BatchReadOnlyTransaction) release(err error) { -} - -// setTimestamp implements txReadEnv.setTimestamp, noop. -// -// read timestamp is ready on txn initialization, avoid contending writing to it -// with future partitions. -func (t *BatchReadOnlyTransaction) setTimestamp(ts time.Time) { -} - -// Close marks the txn as closed. -func (t *BatchReadOnlyTransaction) Close() { - t.mu.Lock() - defer t.mu.Unlock() - t.state = txClosed -} - -// Cleanup cleans up all the resources used by this transaction and makes -// it unusable. Once this method is invoked, the transaction is no longer -// usable anywhere, including other clients/processes with which this -// transaction was shared. -// -// Calling Cleanup is optional, but recommended. If Cleanup is not called, the -// transaction's resources will be freed when the session expires on the backend -// and is deleted. For more information about recycled sessions, see -// https://cloud.google.com/spanner/docs/sessions. -func (t *BatchReadOnlyTransaction) Cleanup(ctx context.Context) { - t.Close() - t.mu.Lock() - defer t.mu.Unlock() - sh := t.sh - if sh == nil { - return - } - t.sh = nil - sid, client := sh.getID(), sh.getClient() - // skip cleanup if session is multiplexed - if sh.session.isMultiplexed { - return - } - - var md metadata.MD - err := client.DeleteSession(contextWithOutgoingMetadata(ctx, sh.getMetadata(), true), &sppb.DeleteSessionRequest{Name: sid}, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "Cleanup"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "Cleanup", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - - if err != nil { - var logger *log.Logger - if sh.session != nil { - logger = sh.session.logger - } - logf(logger, "Failed to delete session %v. Error: %v", sid, err) - } -} - -// Execute runs a single Partition obtained from PartitionRead or -// PartitionQuery. -func (t *BatchReadOnlyTransaction) Execute(ctx context.Context, p *Partition) *RowIterator { - var ( - sh *sessionHandle - err error - rpc func(ct context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error) - ) - if sh, _, err = t.acquire(ctx); err != nil { - return &RowIterator{err: err} - } - client := sh.getClient() - if client == nil { - // Might happen if transaction is closed in the middle of a API call. - return &RowIterator{err: errSessionClosed(sh)} - } - sh.updateLastUseTime() - // Read or query partition. - if p.rreq != nil { - rpc = func(ctx context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error) { - client, err := client.StreamingRead(ctx, &sppb.ReadRequest{ - Session: p.rreq.Session, - Transaction: p.rreq.Transaction, - Table: p.rreq.Table, - Index: p.rreq.Index, - Columns: p.rreq.Columns, - KeySet: p.rreq.KeySet, - PartitionToken: p.pt, - RequestOptions: p.rreq.RequestOptions, - ResumeToken: resumeToken, - DataBoostEnabled: p.rreq.DataBoostEnabled, - DirectedReadOptions: p.rreq.DirectedReadOptions, - }, opts...) - if err != nil { - return client, err - } - md, err := client.Header() - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "Execute"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "Execute", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if isUnimplementedErrorForMultiplexedPartitionReads(err) && t.sp.isMultiplexedSessionForPartitionedOpsEnabled() { - t.sp.disableMultiplexedSessionForPartitionedOps() - } - return client, err - } - } else { - rpc = func(ctx context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error) { - client, err := client.ExecuteStreamingSql(ctx, &sppb.ExecuteSqlRequest{ - Session: p.qreq.Session, - Transaction: p.qreq.Transaction, - Sql: p.qreq.Sql, - Params: p.qreq.Params, - ParamTypes: p.qreq.ParamTypes, - QueryOptions: p.qreq.QueryOptions, - PartitionToken: p.pt, - RequestOptions: p.qreq.RequestOptions, - ResumeToken: resumeToken, - DataBoostEnabled: p.qreq.DataBoostEnabled, - DirectedReadOptions: p.qreq.DirectedReadOptions, - }, opts...) - if err != nil { - return client, err - } - md, err := client.Header() - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "Execute"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "Execute", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if isUnimplementedErrorForMultiplexedPartitionReads(err) && t.sp.isMultiplexedSessionForPartitionedOpsEnabled() { - t.sp.disableMultiplexedSessionForPartitionedOps() - } - return client, err - } - } - return stream( - contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), - sh.session.logger, - t.sp.sc.metricsTracerFactory, - rpc, - t.setTimestamp, - t.release, client.(*grpcSpannerClient)) -} - -// MarshalBinary implements BinaryMarshaler. -func (tid BatchReadOnlyTransactionID) MarshalBinary() (data []byte, err error) { - var buf bytes.Buffer - enc := gob.NewEncoder(&buf) - if err := enc.Encode(tid.tid); err != nil { - return nil, err - } - if err := enc.Encode(tid.sid); err != nil { - return nil, err - } - if err := enc.Encode(tid.rts); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// UnmarshalBinary implements BinaryUnmarshaler. -func (tid *BatchReadOnlyTransactionID) UnmarshalBinary(data []byte) error { - dec := gob.NewDecoder(bytes.NewReader(data)) - if err := dec.Decode(&tid.tid); err != nil { - return err - } - if err := dec.Decode(&tid.sid); err != nil { - return err - } - return dec.Decode(&tid.rts) -} - -// MarshalBinary implements BinaryMarshaler. -func (p Partition) MarshalBinary() (data []byte, err error) { - var buf bytes.Buffer - enc := gob.NewEncoder(&buf) - if err := enc.Encode(p.pt); err != nil { - return nil, err - } - var isReadPartition bool - var req proto.Message - if p.rreq != nil { - isReadPartition = true - req = p.rreq - } else { - isReadPartition = false - req = p.qreq - } - if err := enc.Encode(isReadPartition); err != nil { - return nil, err - } - if data, err = proto.Marshal(req); err != nil { - return nil, err - } - if err := enc.Encode(data); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// UnmarshalBinary implements BinaryUnmarshaler. -func (p *Partition) UnmarshalBinary(data []byte) error { - var ( - isReadPartition bool - d []byte - err error - ) - dec := gob.NewDecoder(bytes.NewReader(data)) - if err := dec.Decode(&p.pt); err != nil { - return err - } - if err := dec.Decode(&isReadPartition); err != nil { - return err - } - if err := dec.Decode(&d); err != nil { - return err - } - if isReadPartition { - p.rreq = &sppb.ReadRequest{} - err = proto.Unmarshal(d, p.rreq) - } else { - p.qreq = &sppb.ExecuteSqlRequest{} - err = proto.Unmarshal(d, p.qreq) - } - return err -} - -// GetPartitionToken returns partition token -func (p *Partition) GetPartitionToken() []byte { - if p != nil { - return p.pt - } - return nil -} diff --git a/vendor/cloud.google.com/go/spanner/client.go b/vendor/cloud.google.com/go/spanner/client.go deleted file mode 100644 index 256c5563cc..0000000000 --- a/vendor/cloud.google.com/go/spanner/client.go +++ /dev/null @@ -1,1493 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "fmt" - "io" - "log" - "os" - "regexp" - "strconv" - "strings" - "time" - - "cloud.google.com/go/internal/trace" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" - grpcgcppb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" - "github.com/googleapis/gax-go/v2" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/noop" - otrace "go.opentelemetry.io/otel/trace" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/option/internaloption" - gtransport "google.golang.org/api/transport/grpc" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/encoding/gzip" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/status" - - vkit "cloud.google.com/go/spanner/apiv1" - "cloud.google.com/go/spanner/internal" -) - -const ( - // resourcePrefixHeader is the name of the metadata header used to indicate - // the resource being operated on. - resourcePrefixHeader = "google-cloud-resource-prefix" - - // routeToLeaderHeader is the name of the metadata header if RW/PDML - // requests need to route to leader. - routeToLeaderHeader = "x-goog-spanner-route-to-leader" - - requestsCompressionHeader = "x-response-encoding" - - // endToEndTracingHeader is the name of the metadata header if client - // has opted-in for the creation of trace spans on the Spanner layer. - endToEndTracingHeader = "x-goog-spanner-end-to-end-tracing" - - // afeMetricHeader is the name of the metadata header if client - // has opted-in for the receiving Spanner API Frontend server timing metrics. - afeMetricHeader = "x-goog-spanner-enable-afe-server-timing" - - // numChannels is the default value for NumChannels of client. - numChannels = 4 - - // Server timing header constants - serverTimingHeaderKey = "server-timing" - gfeTimingHeader = "gfet4t7" - afeTimingHeader = "afe" - - // MinSessions for Experimental Host connection - experimentalHostMinSessions = 0 -) - -const ( - // Scope is the scope for Cloud Spanner Data API. - Scope = "https://www.googleapis.com/auth/spanner.data" - - // AdminScope is the scope for Cloud Spanner Admin APIs. - AdminScope = "https://www.googleapis.com/auth/spanner.admin" -) - -var ( - validDBPattern = regexp.MustCompile("^projects/(?P[^/]+)/instances/(?P[^/]+)/databases/(?P[^/]+)$") - serverTimingPattern = regexp.MustCompile(`([a-zA-Z0-9_-]+);\s*dur=(\d*\.?\d+)`) -) - -func validDatabaseName(db string) error { - if matched := validDBPattern.MatchString(db); !matched { - return fmt.Errorf("database name %q should conform to pattern %q", - db, validDBPattern.String()) - } - return nil -} - -func parseDatabaseName(db string) (project, instance, database string, err error) { - matches := validDBPattern.FindStringSubmatch(db) - if len(matches) == 0 { - return "", "", "", fmt.Errorf("failed to parse database name from %q according to pattern %q", - db, validDBPattern.String()) - } - return matches[1], matches[2], matches[3], nil -} - -// Client is a client for reading and writing data to a Cloud Spanner database. -// A client is safe to use concurrently, except for its Close method. -type Client struct { - sc *sessionClient - idleSessions *sessionPool - logger *log.Logger - qo QueryOptions - ro ReadOptions - ao []ApplyOption - txo TransactionOptions - bwo BatchWriteOptions - ct *commonTags - disableRouteToLeader bool - dro *sppb.DirectedReadOptions - otConfig *openTelemetryConfig - metricsTracerFactory *builtinMetricsTracerFactory -} - -// DatabaseName returns the full name of a database, e.g., -// "projects/spanner-cloud-test/instances/foo/databases/foodb". -func (c *Client) DatabaseName() string { - return c.sc.database -} - -// ClientID returns the id of the Client. This is not recommended for customer applications and used internally for testing. -func (c *Client) ClientID() string { - return c.sc.id -} - -func createGCPMultiEndpoint(cfg *grpcgcp.GCPMultiEndpointOptions, config ClientConfig, opts ...option.ClientOption) (*grpcgcp.GCPMultiEndpoint, error) { - if cfg.GRPCgcpConfig == nil { - cfg.GRPCgcpConfig = &grpcgcppb.ApiConfig{} - } - if len(cfg.GRPCgcpConfig.Method) == 0 { - cfg.GRPCgcpConfig.Method = []*grpcgcppb.MethodConfig{ - { - Name: []string{"/google.spanner.v1.Spanner/CreateSession"}, - Affinity: &grpcgcppb.AffinityConfig{ - Command: grpcgcppb.AffinityConfig_BIND, - AffinityKey: "name", - }, - }, - { - Name: []string{"/google.spanner.v1.Spanner/BatchCreateSessions"}, - Affinity: &grpcgcppb.AffinityConfig{ - Command: grpcgcppb.AffinityConfig_BIND, - AffinityKey: "session.name", - }, - }, - { - Name: []string{"/google.spanner.v1.Spanner/DeleteSession"}, - Affinity: &grpcgcppb.AffinityConfig{ - Command: grpcgcppb.AffinityConfig_UNBIND, - AffinityKey: "name", - }, - }, - { - Name: []string{"/google.spanner.v1.Spanner/GetSession"}, - Affinity: &grpcgcppb.AffinityConfig{ - Command: grpcgcppb.AffinityConfig_BOUND, - AffinityKey: "name", - }, - }, - { - Name: []string{ - "/google.spanner.v1.Spanner/BeginTransaction", - "/google.spanner.v1.Spanner/Commit", - "/google.spanner.v1.Spanner/ExecuteBatchDml", - "/google.spanner.v1.Spanner/ExecuteSql", - "/google.spanner.v1.Spanner/ExecuteStreamingSql", - "/google.spanner.v1.Spanner/PartitionQuery", - "/google.spanner.v1.Spanner/PartitionRead", - "/google.spanner.v1.Spanner/Read", - "/google.spanner.v1.Spanner/Rollback", - "/google.spanner.v1.Spanner/StreamingRead", - }, - Affinity: &grpcgcppb.AffinityConfig{ - Command: grpcgcppb.AffinityConfig_BOUND, - AffinityKey: "session", - }, - }, - } - } - // Append emulator options if SPANNER_EMULATOR_HOST has been set. - if emulatorAddr := os.Getenv("SPANNER_EMULATOR_HOST"); emulatorAddr != "" { - schemeRemoved := regexp.MustCompile("^(http://|https://|passthrough:///)").ReplaceAllString(emulatorAddr, "") - emulatorOpts := []option.ClientOption{ - option.WithEndpoint("passthrough:///" + schemeRemoved), - option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), - option.WithoutAuthentication(), - internaloption.SkipDialSettingsValidation(), - } - opts = append(opts, emulatorOpts...) - // Replace all endpoints with emulator target. - for _, meo := range cfg.MultiEndpoints { - meo.Endpoints = []string{emulatorAddr} - } - } - - // Set the number of channels to the default value if not specified. - if cfg.GRPCgcpConfig.GetChannelPool() == nil || cfg.GRPCgcpConfig.GetChannelPool().GetMaxSize() == 0 { - cfg.GRPCgcpConfig.ChannelPool = &grpcgcppb.ChannelPoolConfig{ - MinSize: numChannels, - MaxSize: numChannels, - } - } - // Set MinSize equal to MaxSize to create all the channels beforehand. - cfg.GRPCgcpConfig.ChannelPool.MinSize = cfg.GRPCgcpConfig.ChannelPool.GetMaxSize() - - cfg.GRPCgcpConfig.ChannelPool.BindPickStrategy = grpcgcppb.ChannelPoolConfig_ROUND_ROBIN - - cfg.DialFunc = func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { - copts := opts - - for _, do := range dopts { - copts = append(copts, option.WithGRPCDialOption(do)) - } - - allOpts := allClientOpts(1, config.Compression, copts...) - - // Overwrite endpoint and pool config. - allOpts = append(allOpts, - option.WithEndpoint(target), - option.WithGRPCConnectionPool(1), - option.WithGRPCConn(nil), - ) - - return gtransport.Dial(ctx, allOpts...) - } - - gme, err := grpcgcp.NewGCPMultiEndpoint(cfg) - return gme, err -} - -// To use GCPMultiEndpoint in gtransport.Dial (via gtransport.WithConnPool option) -// we implement gtransport.ConnPool interface using this wrapper. -type gmeWrapper struct { - *grpcgcp.GCPMultiEndpoint -} - -// Make sure gmeWrapper implements ConnPool interface. -var _ gtransport.ConnPool = (*gmeWrapper)(nil) - -func (gw *gmeWrapper) Conn() *grpc.ClientConn { - // GCPMultiEndpoint does not expose any ClientConn. - // This is safe because Cloud Spanner client doesn't use this function and instead - // makes calls directly using Invoke and NewStream from the grpc.ClientConnInterface - // which GCPMultiEndpoint implements. - return nil -} - -func (gw *gmeWrapper) Num() int { - return int(gw.GCPMultiEndpoint.GCPConfig().GetChannelPool().GetMaxSize()) -} - -// ClientConfig has configurations for the client. -type ClientConfig struct { - // NumChannels is the number of gRPC channels. - // If zero, a reasonable default is used based on the execution environment. - // - // Deprecated: The Spanner client now uses a pool of gRPC connections. Use - // option.WithGRPCConnectionPool(numConns) instead to specify the number of - // connections the client should use. The client will default to a - // reasonable default if this option is not specified. - NumChannels int - - // SessionPoolConfig is the configuration for session pool. - SessionPoolConfig - - // SessionLabels for the sessions created by this client. - // See https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#session - // for more info. - SessionLabels map[string]string - - // QueryOptions is the configuration for executing a sql query. - QueryOptions QueryOptions - - // ReadOptions is the configuration for reading rows from a database - ReadOptions ReadOptions - - // ApplyOptions is the configuration for applying - ApplyOptions []ApplyOption - - // TransactionOptions is the configuration for a transaction. - TransactionOptions TransactionOptions - - // BatchWriteOptions is the configuration for a BatchWrite request. - BatchWriteOptions BatchWriteOptions - - // CallOptions is the configuration for providing custom retry settings that - // override the default values. - CallOptions *vkit.CallOptions - - // UserAgent is the prefix to the user agent header. This is used to supply information - // such as application name or partner tool. - // - // Internal Use Only: This field is for internal tracking purpose only, - // setting the value for this config is not required. - // - // Recommended format: ``application-or-tool-ID/major.minor.version``. - UserAgent string - - // DatabaseRole specifies the role to be assumed for all operations on the - // database by this client. - DatabaseRole string - - // DisableRouteToLeader specifies if all the requests of type read-write and PDML - // need to be routed to the leader region. - // - // Default: false - DisableRouteToLeader bool - - // Logger is the logger to use for this client. If it is nil, all logging - // will be directed to the standard logger. - Logger *log.Logger - - // - // Sets the compression to use for all gRPC calls. The compressor must be a valid name. - // This will enable compression both from the client to the - // server and from the server to the client. - // - // Supported values are: - // gzip: Enable gzip compression - // identity: Disable compression - // - // Default: identity - Compression string - - // BatchTimeout specifies the timeout for a batch of sessions managed sessionClient. - BatchTimeout time.Duration - - // ClientConfig options used to set the DirectedReadOptions for all ReadRequests - // and ExecuteSqlRequests for the Client which indicate which replicas or regions - // should be used for non-transactional reads or queries. - DirectedReadOptions *sppb.DirectedReadOptions - - OpenTelemetryMeterProvider metric.MeterProvider - - // EnableEndToEndTracing indicates whether end to end tracing is enabled or not. If - // it is enabled, trace spans will be created at Spanner layer. Enabling end to end - // tracing requires OpenTelemetry to be set up. Simply enabling this option won't - // generate traces at Spanner layer. - // - // Default: false - EnableEndToEndTracing bool - - // DisableNativeMetrics indicates whether native metrics should be disabled or not. - // If true, native metrics will not be emitted. - // - // Default: false - DisableNativeMetrics bool - - // Default: false - IsExperimentalHost bool -} - -type openTelemetryConfig struct { - enabled bool - meterProvider metric.MeterProvider - commonTraceStartOptions []otrace.SpanStartOption - attributeMap []attribute.KeyValue - attributeMapWithMultiplexed []attribute.KeyValue - attributeMapWithoutMultiplexed []attribute.KeyValue - otMetricRegistration metric.Registration - openSessionCount metric.Int64ObservableGauge - maxAllowedSessionsCount metric.Int64ObservableGauge - sessionsCount metric.Int64ObservableGauge - maxInUseSessionsCount metric.Int64ObservableGauge - getSessionTimeoutsCount metric.Int64Counter - acquiredSessionsCount metric.Int64Counter - releasedSessionsCount metric.Int64Counter - gfeLatency metric.Int64Histogram - gfeHeaderMissingCount metric.Int64Counter -} - -func contextWithOutgoingMetadata(ctx context.Context, md metadata.MD, disableRouteToLeader bool) context.Context { - existing, ok := metadata.FromOutgoingContext(ctx) - if ok { - // Make sure that we only send one resource header. - existing.Delete(resourcePrefixHeader) - md = metadata.Join(existing, md) - } - if !disableRouteToLeader { - md = metadata.Join(md, metadata.Pairs(routeToLeaderHeader, "true")) - } - return metadata.NewOutgoingContext(ctx, md) -} - -// NewClient creates a client to a database. A valid database name has the -// form projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID. It uses -// a default configuration. -func NewClient(ctx context.Context, database string, opts ...option.ClientOption) (*Client, error) { - return NewClientWithConfig(ctx, database, ClientConfig{SessionPoolConfig: DefaultSessionPoolConfig, DisableRouteToLeader: false}, opts...) -} - -// NewClientWithConfig creates a client to a database. A valid database name has -// the form projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID. -func NewClientWithConfig(ctx context.Context, database string, config ClientConfig, opts ...option.ClientOption) (c *Client, err error) { - return newClientWithConfig(ctx, database, config, nil, opts...) -} - -func newClientWithConfig(ctx context.Context, database string, config ClientConfig, gme *grpcgcp.GCPMultiEndpoint, opts ...option.ClientOption) (c *Client, err error) { - // Validate database path. - if err := validDatabaseName(database); err != nil { - return nil, err - } - - ctx, _ = startSpan(ctx, "NewClient") - defer func() { endSpan(ctx, err) }() - - // Explicitly disable some gRPC experiments as they are not stable yet. - gRPCPickFirstEnvVarName := "GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST" - if os.Getenv(gRPCPickFirstEnvVarName) == "" { - err := os.Setenv(gRPCPickFirstEnvVarName, "false") - if err != nil { - logf(config.Logger, "Error overriding GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST to false: %v. Ignoring.", err) - } - } - - // Append emulator options if SPANNER_EMULATOR_HOST has been set. - if emulatorAddr := os.Getenv("SPANNER_EMULATOR_HOST"); emulatorAddr != "" { - schemeRemoved := regexp.MustCompile("^(http://|https://|passthrough:///)").ReplaceAllString(emulatorAddr, "") - emulatorOpts := []option.ClientOption{ - option.WithEndpoint("passthrough:///" + schemeRemoved), - option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), - option.WithoutAuthentication(), - internaloption.SkipDialSettingsValidation(), - } - opts = append(emulatorOpts, opts...) - } - - // Prepare gRPC channels. - hasNumChannelsConfig := config.NumChannels > 0 - if config.NumChannels == 0 { - config.NumChannels = numChannels - } - - var metricsProvider metric.MeterProvider - if emulatorAddr := os.Getenv("SPANNER_EMULATOR_HOST"); emulatorAddr != "" { - // Do not emit native metrics when emulator is being used - metricsProvider = noop.NewMeterProvider() - } - // Check if native metrics are disabled via env. - if disableNativeMetrics, _ := strconv.ParseBool(os.Getenv("SPANNER_DISABLE_BUILTIN_METRICS")); disableNativeMetrics { - config.DisableNativeMetrics = true - } - if config.DisableNativeMetrics { - // Do not emit native metrics when DisableNativeMetrics is set - metricsProvider = noop.NewMeterProvider() - } - isAFEBuiltInMetricEnabled := strings.EqualFold("false", os.Getenv("SPANNER_DISABLE_AFE_SERVER_TIMING")) - isGRPCBuiltInMetricsEnabled := strings.EqualFold("false", os.Getenv("SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS")) - // enable the AFE/GRPC built-in metrics if direct-path is enabled - isDirectPathEnabled, _ := strconv.ParseBool(os.Getenv("GOOGLE_SPANNER_ENABLE_DIRECT_ACCESS")) - if isDirectPathEnabled { - isAFEBuiltInMetricEnabled = true - isGRPCBuiltInMetricsEnabled = true - } - // disable the AFE/GRPC built-in metrics if the env var is explicitly set - if ok, _ := strconv.ParseBool(os.Getenv("SPANNER_DISABLE_AFE_SERVER_TIMING")); ok { - isAFEBuiltInMetricEnabled = false - } - if ok, _ := strconv.ParseBool(os.Getenv("SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS")); ok { - isGRPCBuiltInMetricsEnabled = false - } - - metricsTracerFactory, err := newBuiltinMetricsTracerFactory(ctx, database, config.Compression, isAFEBuiltInMetricEnabled, isGRPCBuiltInMetricsEnabled, metricsProvider, opts...) - if err != nil { - return nil, err - } - if len(metricsTracerFactory.clientOpts) > 0 { - opts = append(opts, metricsTracerFactory.clientOpts...) - } - - var pool gtransport.ConnPool - - if gme != nil { - // Use GCPMultiEndpoint if provided. - pool = &gmeWrapper{gme} - } else { - // Create gtransport ConnPool as usual if MultiEndpoint is not used. - // gRPC options. - - // Add a unaryClientInterceptor and streamClientInterceptor. - reqIDInjector := new(requestIDHeaderInjector) - opts = append(opts, - option.WithGRPCDialOption(grpc.WithChainStreamInterceptor(reqIDInjector.interceptStream)), - option.WithGRPCDialOption(grpc.WithChainUnaryInterceptor(reqIDInjector.interceptUnary)), - ) - - allOpts := allClientOpts(config.NumChannels, config.Compression, opts...) - pool, err = gtransport.DialPool(ctx, allOpts...) - if err != nil { - return nil, err - } - - if hasNumChannelsConfig && pool.Num() != config.NumChannels { - pool.Close() - return nil, spannerErrorf(codes.InvalidArgument, "Connection pool mismatch: NumChannels=%v, WithGRPCConnectionPool=%v. Only set one of these options, or set both to the same value.", config.NumChannels, pool.Num()) - } - } - - // TODO(loite): Remove as the original map cannot be changed by the user - // anyways, and the client library is also not changing it. - // Make a copy of labels. - sessionLabels := make(map[string]string) - for k, v := range config.SessionLabels { - sessionLabels[k] = v - } - - // Default configs for session pool. - if config.MaxOpened == 0 { - config.MaxOpened = uint64(pool.Num() * 100) - } - if config.MaxBurst == 0 { - config.MaxBurst = DefaultSessionPoolConfig.MaxBurst - } - if config.incStep == 0 { - config.incStep = DefaultSessionPoolConfig.incStep - } - if config.BatchTimeout == 0 { - config.BatchTimeout = time.Minute - } - - md := metadata.Pairs(resourcePrefixHeader, database) - if config.Compression == gzip.Name { - md.Append(requestsCompressionHeader, gzip.Name) - } - // Append end to end tracing header if SPANNER_ENABLE_END_TO_END_TRACING - // environment variable has been set or client has passed the opt-in - // option in ClientConfig. - endToEndTracingEnvironmentVariable := os.Getenv("SPANNER_ENABLE_END_TO_END_TRACING") - if config.EnableEndToEndTracing || endToEndTracingEnvironmentVariable == "true" { - md.Append(endToEndTracingHeader, "true") - } - - if isAFEBuiltInMetricEnabled { - md.Append(afeMetricHeader, "true") - } - - if isMultiplexed := strings.ToLower(os.Getenv("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS")); isMultiplexed != "" && !config.enableMultiplexSession { - config.enableMultiplexSession, err = strconv.ParseBool(isMultiplexed) - if err != nil { - return nil, spannerErrorf(codes.InvalidArgument, "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS must be either true or false") - } - } - if isMultiplexForRW := os.Getenv("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW"); isMultiplexForRW != "" && !config.enableMultiplexedSessionForRW { - config.enableMultiplexedSessionForRW, err = strconv.ParseBool(isMultiplexForRW) - if err != nil { - return nil, spannerErrorf(codes.InvalidArgument, "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW must be either true or false") - } - config.enableMultiplexedSessionForRW = config.enableMultiplexedSessionForRW && config.SessionPoolConfig.enableMultiplexSession - } - if isMultiplexForPartitionOps := os.Getenv("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS"); isMultiplexForPartitionOps != "" && !config.enableMultiplexedSessionForPartitionedOps { - config.enableMultiplexedSessionForPartitionedOps, err = strconv.ParseBool(isMultiplexForPartitionOps) - if err != nil { - return nil, spannerErrorf(codes.InvalidArgument, "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS must be either true or false") - } - config.enableMultiplexedSessionForPartitionedOps = config.enableMultiplexedSessionForPartitionedOps && config.SessionPoolConfig.enableMultiplexSession - } - - if config.IsExperimentalHost { - config.SessionPoolConfig.enableMultiplexSession = true - config.enableMultiplexedSessionForRW = true - config.enableMultiplexedSessionForPartitionedOps = true - config.SessionPoolConfig.MinOpened = experimentalHostMinSessions - } - - // Create a session client. - sc := newSessionClient(pool, database, config.UserAgent, sessionLabels, config.DatabaseRole, config.DisableRouteToLeader, md, config.BatchTimeout, config.Logger, config.CallOptions) - - // Create an OpenTelemetry configuration - otConfig, err := createOpenTelemetryConfig(ctx, config.OpenTelemetryMeterProvider, config.Logger, sc.id, database) - if err != nil { - // The error returned here will be due to database name parsing - return nil, err - } - // To prevent data race in unit tests (ex: TestClient_SessionNotFound) - sc.mu.Lock() - sc.otConfig = otConfig - sc.metricsTracerFactory = metricsTracerFactory - sc.mu.Unlock() - - // Create a session pool. - config.SessionPoolConfig.sessionLabels = sessionLabels - sp, err := newSessionPool(sc, config.SessionPoolConfig) - if err != nil { - sc.close() - return nil, err - } - - c = &Client{ - sc: sc, - idleSessions: sp, - logger: config.Logger, - qo: getQueryOptions(config.QueryOptions), - ro: config.ReadOptions, - ao: config.ApplyOptions, - txo: config.TransactionOptions, - bwo: config.BatchWriteOptions, - ct: getCommonTags(sc), - disableRouteToLeader: config.DisableRouteToLeader, - dro: config.DirectedReadOptions, - otConfig: otConfig, - metricsTracerFactory: metricsTracerFactory, - } - return c, nil -} - -// NewMultiEndpointClient is the same as NewMultiEndpointClientWithConfig with -// the default client configuration. -// -// A valid database name has the -// form projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID. -func NewMultiEndpointClient(ctx context.Context, database string, gmeCfg *grpcgcp.GCPMultiEndpointOptions, opts ...option.ClientOption) (*Client, *grpcgcp.GCPMultiEndpoint, error) { - return NewMultiEndpointClientWithConfig(ctx, database, ClientConfig{SessionPoolConfig: DefaultSessionPoolConfig, DisableRouteToLeader: false}, gmeCfg, opts...) -} - -// NewMultiEndpointClientWithConfig creates a client to a database using GCPMultiEndpoint. -// -// The purposes of GCPMultiEndpoint are: -// -// - Fallback to an alternative endpoint (host:port) when the original -// endpoint is completely unavailable. -// - Be able to route a Cloud Spanner call to a specific group of endpoints. -// - Be able to reconfigure endpoints in runtime. -// -// The GRPCgcpConfig and DialFunc in the GCPMultiEndpointOptions are optional -// and will be configured automatically. -// -// For GCPMultiEndpoint the number of channels is configured via MaxSize of the -// ChannelPool config in the GRPCgcpConfig. -// -// The GCPMultiEndpoint returned can be used to update the endpoints in runtime. -// -// A valid database name has the -// form projects/PROJECT_ID/instances/INSTANCE_ID/databases/DATABASE_ID. -func NewMultiEndpointClientWithConfig(ctx context.Context, database string, config ClientConfig, gmeCfg *grpcgcp.GCPMultiEndpointOptions, opts ...option.ClientOption) (c *Client, gme *grpcgcp.GCPMultiEndpoint, err error) { - gme, err = createGCPMultiEndpoint(gmeCfg, config, opts...) - if err != nil { - return nil, nil, err - } - // Align number of channels. - config.NumChannels = int(gme.GCPConfig().GetChannelPool().GetMaxSize()) - c, err = newClientWithConfig(ctx, database, config, gme, opts...) - if err != nil { - return nil, nil, err - } - return -} - -// Combines the default options from the generated client, the default options -// of the hand-written client and the user options to one list of options. -// Precedence: userOpts > clientDefaultOpts > generatedDefaultOpts -func allClientOpts(numChannels int, compression string, userOpts ...option.ClientOption) []option.ClientOption { - generatedDefaultOpts := vkit.DefaultClientOptions() - clientDefaultOpts := []option.ClientOption{ - option.WithGRPCConnectionPool(numChannels), - option.WithUserAgent(fmt.Sprintf("spanner-go/v%s", internal.Version)), - option.WithGRPCDialOption(grpc.WithChainUnaryInterceptor(addNativeMetricsInterceptor()...)), - option.WithGRPCDialOption(grpc.WithChainStreamInterceptor(addStreamNativeMetricsInterceptor()...)), - } - if enableDirectPathXds, _ := strconv.ParseBool(os.Getenv("GOOGLE_SPANNER_ENABLE_DIRECT_ACCESS")); enableDirectPathXds { - clientDefaultOpts = append(clientDefaultOpts, internaloption.AllowNonDefaultServiceAccount(true)) - clientDefaultOpts = append(clientDefaultOpts, internaloption.EnableDirectPath(true), internaloption.EnableDirectPathXds()) - clientDefaultOpts = append(clientDefaultOpts, internaloption.AllowHardBoundTokens("ALTS")) - } - if compression == "gzip" { - userOpts = append(userOpts, option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.UseCompressor(gzip.Name)))) - } - allDefaultOpts := append(generatedDefaultOpts, clientDefaultOpts...) - return append(allDefaultOpts, userOpts...) -} - -// metricsInterceptor is a gRPC unary client interceptor that records metrics for unary RPCs. -func metricsInterceptor() grpc.UnaryClientInterceptor { - return func( - ctx context.Context, - method string, - req interface{}, - reply interface{}, - cc *grpc.ClientConn, - invoker grpc.UnaryInvoker, - opts ...grpc.CallOption, - ) error { - mt, ok := ctx.Value(metricsTracerKey).(*builtinMetricsTracer) - if !ok { - return invoker(ctx, method, req, reply, cc, opts...) - } - - mt.method = method - mt.currOp.incrementAttemptCount() - mt.currOp.currAttempt = &attemptTracer{} - mt.currOp.currAttempt.setStartTime(time.Now()) - if strings.HasPrefix(cc.Target(), "google-c2p") { - mt.currOp.setDirectPathEnabled(true) - } - - var md metadata.MD - peerInfo := &peer.Peer{} - opts = append(opts, grpc.Header(&md), grpc.Peer(peerInfo)) - err := invoker(ctx, method, req, reply, cc, opts...) - - statusCode, _ := status.FromError(err) - mt.currOp.currAttempt.setStatus(statusCode.Code().String()) - mt.currOp.currAttempt.setDirectPathUsed(peer.NewContext(ctx, peerInfo)) - latencies := parseServerTimingHeader(md) - span := otrace.SpanFromContext(ctx) - setGFEAndAFESpanAttributes(span, latencies) - mt.currOp.currAttempt.setServerTimingMetrics(latencies) - recordAttemptCompletion(mt) - return err - } -} - -// metricsInterceptor is a gRPC stream client interceptor that records metrics for stream RPCs. -func metricsStreamInterceptor() grpc.StreamClientInterceptor { - return func( - ctx context.Context, - desc *grpc.StreamDesc, - cc *grpc.ClientConn, - method string, - streamer grpc.Streamer, - opts ...grpc.CallOption, - ) (grpc.ClientStream, error) { - s, err := streamer(ctx, desc, cc, method, opts...) - if err != nil { - return nil, err - } - mt, ok := ctx.Value(metricsTracerKey).(*builtinMetricsTracer) - if ok && mt != nil { - mt.method = method - if strings.HasPrefix(cc.Target(), "google-c2p") { - mt.currOp.setDirectPathEnabled(true) - } - } - return s, nil - } -} - -// AddNativeMetricsInterceptor intercepts unary requests and records metrics for them. -func addNativeMetricsInterceptor() []grpc.UnaryClientInterceptor { - unaryInterceptors := []grpc.UnaryClientInterceptor{} - unaryInterceptors = append(unaryInterceptors, metricsInterceptor()) - return unaryInterceptors -} - -// AddStreamNativeMetricsInterceptor intercepts stream requests and records metrics for them. -func addStreamNativeMetricsInterceptor() []grpc.StreamClientInterceptor { - streamInterceptors := []grpc.StreamClientInterceptor{} - streamInterceptors = append(streamInterceptors, metricsStreamInterceptor()) - return streamInterceptors -} - -// getQueryOptions returns the query options overwritten by the environment -// variables if exist. The input parameter is the query options set by users -// via application-level configuration. If the environment variables are set, -// this will return the overwritten query options. -func getQueryOptions(opts QueryOptions) QueryOptions { - if opts.Options == nil { - opts.Options = &sppb.ExecuteSqlRequest_QueryOptions{} - } - opv := os.Getenv("SPANNER_OPTIMIZER_VERSION") - if opv != "" { - opts.Options.OptimizerVersion = opv - } - opsp := os.Getenv("SPANNER_OPTIMIZER_STATISTICS_PACKAGE") - if opsp != "" { - opts.Options.OptimizerStatisticsPackage = opsp - } - return opts -} - -// Close closes the client. -func (c *Client) Close() { - if c.metricsTracerFactory != nil { - c.metricsTracerFactory.shutdown(context.Background()) - } - if c.idleSessions != nil { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - c.idleSessions.close(ctx) - } - c.sc.close() -} - -// Single provides a read-only snapshot transaction optimized for the case -// where only a single read or query is needed. This is more efficient than -// using ReadOnlyTransaction() for a single read or query. -// -// Single will use a strong TimestampBound by default. Use -// ReadOnlyTransaction.WithTimestampBound to specify a different -// TimestampBound. A non-strong bound can be used to reduce latency, or -// "time-travel" to prior versions of the database, see the documentation of -// TimestampBound for details. -func (c *Client) Single() *ReadOnlyTransaction { - t := &ReadOnlyTransaction{singleUse: true} - t.txReadOnly.sp = c.idleSessions - t.txReadOnly.txReadEnv = t - t.txReadOnly.qo = c.qo - t.txReadOnly.ro = c.ro - t.txReadOnly.disableRouteToLeader = true - t.txReadOnly.replaceSessionFunc = func(ctx context.Context) error { - if t.sh == nil { - return spannerErrorf(codes.InvalidArgument, "missing session handle on transaction") - } - // Remove the session that returned 'Session not found' from the pool. - t.sh.destroy() - // Reset the transaction, acquire a new session and retry. - t.state = txNew - sh, _, err := t.acquire(ctx) - if err != nil { - return err - } - t.sh = sh - return nil - } - t.txReadOnly.qo.DirectedReadOptions = c.dro - t.txReadOnly.ro.DirectedReadOptions = c.dro - t.txReadOnly.ro.LockHint = sppb.ReadRequest_LOCK_HINT_UNSPECIFIED - t.ct = c.ct - t.otConfig = c.otConfig - return t -} - -// ReadOnlyTransaction returns a ReadOnlyTransaction that can be used for -// multiple reads from the database. You must call Close() when the -// ReadOnlyTransaction is no longer needed to release resources on the server. -// -// ReadOnlyTransaction will use a strong TimestampBound by default. Use -// ReadOnlyTransaction.WithTimestampBound to specify a different -// TimestampBound. A non-strong bound can be used to reduce latency, or -// "time-travel" to prior versions of the database, see the documentation of -// TimestampBound for details. -func (c *Client) ReadOnlyTransaction() *ReadOnlyTransaction { - t := &ReadOnlyTransaction{ - singleUse: false, - txReadyOrClosed: make(chan struct{}), - } - t.txReadOnly.sp = c.idleSessions - t.txReadOnly.txReadEnv = t - t.txReadOnly.qo = c.qo - t.txReadOnly.ro = c.ro - t.txReadOnly.disableRouteToLeader = true - t.txReadOnly.qo.DirectedReadOptions = c.dro - t.txReadOnly.ro.DirectedReadOptions = c.dro - t.txReadOnly.ro.LockHint = sppb.ReadRequest_LOCK_HINT_UNSPECIFIED - t.ct = c.ct - t.otConfig = c.otConfig - return t -} - -// BatchReadOnlyTransaction returns a BatchReadOnlyTransaction that can be used -// for partitioned reads or queries from a snapshot of the database. This is -// useful in batch processing pipelines where one wants to divide the work of -// reading from the database across multiple machines. -// -// Note: This transaction does not use the underlying session pool but creates a -// new session each time, and the session is reused across clients. -// -// You should call Close() after the txn is no longer needed on local -// client, and call Cleanup() when the txn is finished for all clients, to free -// the session. -func (c *Client) BatchReadOnlyTransaction(ctx context.Context, tb TimestampBound) (*BatchReadOnlyTransaction, error) { - var ( - tx transactionID - rts time.Time - s *session - sh *sessionHandle - err error - ) - - if c.idleSessions.isMultiplexedSessionForPartitionedOpsEnabled() { - sh, err = c.idleSessions.takeMultiplexed(ctx) - if err != nil { - return nil, err - } - } else { - // Create session. - s, err = c.sc.createSession(ctx) - if err != nil { - return nil, err - } - sh = &sessionHandle{session: s} - sh.updateLastUseTime() - } - - // Begin transaction. - res, err := sh.getClient().BeginTransaction(contextWithOutgoingMetadata(ctx, sh.getMetadata(), true), &sppb.BeginTransactionRequest{ - Session: sh.getID(), - Options: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadOnly_{ - ReadOnly: buildTransactionOptionsReadOnly(tb, true), - }, - }, - }) - if err != nil { - if isUnimplementedErrorForMultiplexedPartitionedDML(err) && c.idleSessions.isMultiplexedSessionForPartitionedOpsEnabled() { - c.idleSessions.disableMultiplexedSessionForRW() - } - return nil, ToSpannerError(err) - } - tx = res.Id - if res.ReadTimestamp != nil { - rts = time.Unix(res.ReadTimestamp.Seconds, int64(res.ReadTimestamp.Nanos)) - } - - t := &BatchReadOnlyTransaction{ - ReadOnlyTransaction: ReadOnlyTransaction{ - tx: tx, - txReadyOrClosed: make(chan struct{}), - state: txActive, - rts: rts, - isLongRunningTransaction: true, - }, - ID: BatchReadOnlyTransactionID{ - tid: tx, - sid: sh.getID(), - rts: rts, - }, - } - t.txReadOnly.sp = c.idleSessions - t.txReadOnly.sh = sh - t.txReadOnly.txReadEnv = t - t.txReadOnly.qo = c.qo - t.txReadOnly.ro = c.ro - t.txReadOnly.disableRouteToLeader = true - t.txReadOnly.qo.DirectedReadOptions = c.dro - t.txReadOnly.ro.DirectedReadOptions = c.dro - t.txReadOnly.ro.LockHint = sppb.ReadRequest_LOCK_HINT_UNSPECIFIED - t.ct = c.ct - t.otConfig = c.otConfig - return t, nil -} - -// BatchReadOnlyTransactionFromID reconstruct a BatchReadOnlyTransaction from -// BatchReadOnlyTransactionID -func (c *Client) BatchReadOnlyTransactionFromID(tid BatchReadOnlyTransactionID) *BatchReadOnlyTransaction { - s, err := c.sc.sessionWithID(tid.sid) - if err != nil { - logf(c.logger, "unexpected error: %v\nThis is an indication of an internal error in the Spanner client library.", err) - // Use an invalid session. Preferably, this method should just return - // the error instead of this, but that would mean an API change. - s = &session{} - } - sh := &sessionHandle{session: s} - - t := &BatchReadOnlyTransaction{ - ReadOnlyTransaction: ReadOnlyTransaction{ - tx: tid.tid, - txReadyOrClosed: make(chan struct{}), - state: txActive, - rts: tid.rts, - isLongRunningTransaction: true, - }, - ID: tid, - } - t.txReadOnly.sp = c.idleSessions - t.txReadOnly.sh = sh - t.txReadOnly.txReadEnv = t - t.txReadOnly.qo = c.qo - t.txReadOnly.ro = c.ro - t.txReadOnly.disableRouteToLeader = true - t.txReadOnly.qo.DirectedReadOptions = c.dro - t.txReadOnly.ro.DirectedReadOptions = c.dro - t.txReadOnly.ro.LockHint = sppb.ReadRequest_LOCK_HINT_UNSPECIFIED - t.ct = c.ct - t.otConfig = c.otConfig - return t -} - -type transactionInProgressKey struct{} - -func checkNestedTxn(ctx context.Context) error { - if ctx.Value(transactionInProgressKey{}) != nil { - return spannerErrorf(codes.FailedPrecondition, "Cloud Spanner does not support nested transactions") - } - return nil -} - -// ReadWriteTransaction executes a read-write transaction, with retries as -// necessary. -// -// The function f will be called one or more times. It must not maintain -// any state between calls. -// -// If the transaction cannot be committed or if f returns an ABORTED error, -// ReadWriteTransaction will call f again. It will continue to call f until the -// transaction can be committed or the Context times out or is cancelled. If f -// returns an error other than ABORTED, ReadWriteTransaction will abort the -// transaction and return the error. -// -// To limit the number of retries, set a deadline on the Context rather than -// using a fixed limit on the number of attempts. ReadWriteTransaction will -// retry as needed until that deadline is met. -// -// See https://godoc.org/cloud.google.com/go/spanner#ReadWriteTransaction for -// more details. -func (c *Client) ReadWriteTransaction(ctx context.Context, f func(context.Context, *ReadWriteTransaction) error) (commitTimestamp time.Time, err error) { - ctx, _ = startSpan(ctx, "ReadWriteTransaction", c.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, err) }() - resp, err := c.rwTransaction(ctx, f, TransactionOptions{}) - return resp.CommitTs, err -} - -// ReadWriteTransactionWithOptions executes a read-write transaction with -// configurable options, with retries as necessary. -// -// ReadWriteTransactionWithOptions is a configurable ReadWriteTransaction. -// -// See https://godoc.org/cloud.google.com/go/spanner#ReadWriteTransaction for -// more details. -func (c *Client) ReadWriteTransactionWithOptions(ctx context.Context, f func(context.Context, *ReadWriteTransaction) error, options TransactionOptions) (resp CommitResponse, err error) { - ctx, _ = startSpan(ctx, "ReadWriteTransactionWithOptions", c.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, err) }() - resp, err = c.rwTransaction(ctx, f, options) - return resp, err -} - -func (c *Client) rwTransaction(ctx context.Context, f func(context.Context, *ReadWriteTransaction) error, options TransactionOptions) (resp CommitResponse, err error) { - if err := checkNestedTxn(ctx); err != nil { - return resp, err - } - var ( - sh *sessionHandle - t *ReadWriteTransaction - attempt = 0 - ) - defer func() { - if sh != nil { - sh.recycle() - } - }() - err = runWithRetryOnAbortedOrFailedInlineBeginOrSessionNotFound(ctx, func(ctx context.Context) error { - var ( - err error - ) - if sh == nil || sh.getID() == "" || sh.getClient() == nil { - if c.idleSessions.isMultiplexedSessionForRWEnabled() { - sh, err = c.idleSessions.takeMultiplexed(ctx) - } else { - // Session handle hasn't been allocated or has been destroyed. - sh, err = c.idleSessions.take(ctx) - } - if err != nil { - // If session retrieval fails, just fail the transaction. - return err - } - - // Some operations (for ex BatchUpdate) can be long-running. For such operations set the isLongRunningTransaction flag to be true - t.setSessionEligibilityForLongRunning(sh) - } - initTx := func(t *ReadWriteTransaction) { - t.txReadOnly.sp = c.idleSessions - t.txReadOnly.txReadEnv = t - t.txReadOnly.qo = c.qo - t.txReadOnly.ro = c.ro - t.txReadOnly.disableRouteToLeader = c.disableRouteToLeader - t.wb = []*Mutation{} - t.txOpts = c.txo.merge(options) - t.ct = c.ct - t.otConfig = c.otConfig - } - if t.shouldExplicitBegin(attempt, options) { - if t == nil { - t = &ReadWriteTransaction{ - txReadyOrClosed: make(chan struct{}), - } - } - initTx(t) - // Make sure we set the current session handle before calling BeginTransaction. - // Note that the t.begin(ctx) call could change the session that is being used by the transaction, as the - // BeginTransaction RPC invocation will be retried on a new session if it returns SessionNotFound. - t.txReadOnly.sh = sh - if err = t.begin(ctx, nil); err != nil { - if attempt > 0 { - trace.TracePrintf(ctx, nil, "Error while BeginTransaction during retrying a ReadWrite transaction: %v", ToSpannerError(err)) - } else { - trace.TracePrintf(ctx, nil, "Error during the initial BeginTransaction for a ReadWrite transaction: %v", ToSpannerError(err)) - } - return ToSpannerError(err) - } - } else { - var previousTx transactionID - if t != nil { - previousTx = t.previousTx - } - t = &ReadWriteTransaction{ - txReadyOrClosed: make(chan struct{}), - previousTx: previousTx, - } - t.txReadOnly.sh = sh - initTx(t) - } - attempt++ - - trace.TracePrintf(ctx, map[string]interface{}{"transactionSelector": t.getTransactionSelector().String()}, - "Starting transaction attempt") - - resp, err = t.runInTransaction(ctx, f) - return err - }) - if isUnimplementedErrorForMultiplexedRW(err) { - c.idleSessions.disableMultiplexedSessionForRW() - } - return resp, err -} - -// applyOption controls the behavior of Client.Apply. -type applyOption struct { - // If atLeastOnce == true, Client.Apply will execute the mutations on Cloud - // Spanner at least once. - atLeastOnce bool - // transactionTag will be included with the CommitRequest. - transactionTag string - // priority is the RPC priority that is used for the commit operation. - priority sppb.RequestOptions_Priority - // If excludeTxnFromChangeStreams == true, mutations from this Client.Apply - // will not be recorded in allowed tracking change streams with DDL option - // allow_txn_exclusion=true. - excludeTxnFromChangeStreams bool - // commitOptions is the commit options to use for the commit operation. - commitOptions CommitOptions - // It defines the isolationLevel for the RW transactions - isolationLevel sppb.TransactionOptions_IsolationLevel -} - -// An ApplyOption is an optional argument to Apply. -type ApplyOption func(*applyOption) - -// ApplyAtLeastOnce returns an ApplyOption that removes replay protection. -// -// With this option, Apply may attempt to apply mutations more than once; if -// the mutations are not idempotent, this may lead to a failure being reported -// when the mutation was applied more than once. For example, an insert may -// fail with ALREADY_EXISTS even though the row did not exist before Apply was -// called. For this reason, most users of the library will prefer not to use -// this option. However, ApplyAtLeastOnce requires only a single RPC, whereas -// Apply's default replay protection may require an additional RPC. So this -// option may be appropriate for latency sensitive and/or high throughput blind -// writing. -func ApplyAtLeastOnce() ApplyOption { - return func(ao *applyOption) { - ao.atLeastOnce = true - } -} - -// TransactionTag returns an ApplyOption that will include the given tag as a -// transaction tag for a write-only transaction. -func TransactionTag(tag string) ApplyOption { - return func(ao *applyOption) { - ao.transactionTag = tag - } -} - -// Priority returns an ApplyOptions that sets the RPC priority to use for the -// commit operation. -func Priority(priority sppb.RequestOptions_Priority) ApplyOption { - return func(ao *applyOption) { - ao.priority = priority - } -} - -// ExcludeTxnFromChangeStreams returns an ApplyOptions that sets whether to exclude recording this commit operation from allowed tracking change streams. -func ExcludeTxnFromChangeStreams() ApplyOption { - return func(ao *applyOption) { - ao.excludeTxnFromChangeStreams = true - } -} - -// IsolationLevel returns an ApplyOptions that sets which isolationLevel for RW transaction -func IsolationLevel(isolationLevel sppb.TransactionOptions_IsolationLevel) ApplyOption { - return func(ao *applyOption) { - ao.isolationLevel = isolationLevel - } -} - -// ApplyCommitOptions returns an ApplyOption that sets the commit options to use for the commit operation. -func ApplyCommitOptions(co CommitOptions) ApplyOption { - return func(ao *applyOption) { - ao.commitOptions = co - } -} - -// Apply applies a list of mutations atomically to the database. -func (c *Client) Apply(ctx context.Context, ms []*Mutation, opts ...ApplyOption) (commitTimestamp time.Time, err error) { - ao := &applyOption{} - - for _, opt := range c.ao { - opt(ao) - } - - for _, opt := range opts { - opt(ao) - } - - ctx, _ = startSpan(ctx, "Apply", c.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, err) }() - - if !ao.atLeastOnce { - resp, err := c.ReadWriteTransactionWithOptions(ctx, func(ctx context.Context, t *ReadWriteTransaction) error { - return t.BufferWrite(ms) - }, TransactionOptions{CommitPriority: ao.priority, TransactionTag: ao.transactionTag, ExcludeTxnFromChangeStreams: ao.excludeTxnFromChangeStreams, CommitOptions: ao.commitOptions, IsolationLevel: ao.isolationLevel}) - return resp.CommitTs, err - } - t := &writeOnlyTransaction{sp: c.idleSessions, commitPriority: ao.priority, transactionTag: ao.transactionTag, disableRouteToLeader: c.disableRouteToLeader, excludeTxnFromChangeStreams: ao.excludeTxnFromChangeStreams, commitOptions: ao.commitOptions, isolationLevel: ao.isolationLevel} - return t.applyAtLeastOnce(ctx, ms...) -} - -// BatchWriteOptions provides options for a BatchWriteRequest. -type BatchWriteOptions struct { - // Priority is the RPC priority to use for this request. - Priority sppb.RequestOptions_Priority - - // The transaction tag to use for this request. - TransactionTag string - - // If excludeTxnFromChangeStreams == true, modifications from all transactions - // in this batch write request will not be recorded in allowed tracking - // change treams with DDL option allow_txn_exclusion=true. - ExcludeTxnFromChangeStreams bool -} - -// merge combines two BatchWriteOptions such that the input parameter will have higher -// order of precedence. -func (bwo BatchWriteOptions) merge(opts BatchWriteOptions) BatchWriteOptions { - merged := BatchWriteOptions{ - TransactionTag: bwo.TransactionTag, - Priority: bwo.Priority, - ExcludeTxnFromChangeStreams: bwo.ExcludeTxnFromChangeStreams || opts.ExcludeTxnFromChangeStreams, - } - if opts.TransactionTag != "" { - merged.TransactionTag = opts.TransactionTag - } - if opts.Priority != sppb.RequestOptions_PRIORITY_UNSPECIFIED { - merged.Priority = opts.Priority - } - return merged -} - -// BatchWriteResponseIterator is an iterator over BatchWriteResponse structures returned from BatchWrite RPC. -type BatchWriteResponseIterator struct { - ctx context.Context - stream sppb.Spanner_BatchWriteClient - err error - dataReceived bool - meterTracerFactory *builtinMetricsTracerFactory - replaceSession func(ctx context.Context) error - rpc func(ctx context.Context) (sppb.Spanner_BatchWriteClient, error) - release func(error) - cancel func() -} - -// Next returns the next result. Its second return value is iterator.Done if -// there are no more results. Once Next returns Done, all subsequent calls -// will return Done. -func (r *BatchWriteResponseIterator) Next() (*sppb.BatchWriteResponse, error) { - mt := r.meterTracerFactory.createBuiltinMetricsTracer(r.ctx) - defer func() { - if mt.method != "" { - statusCode, _ := convertToGrpcStatusErr(r.err) - mt.currOp.setStatus(statusCode.String()) - recordOperationCompletion(&mt) - } - }() - for { - // Stream finished or in error state. - if r.err != nil { - return nil, r.err - } - - // RPC not made yet. - if r.stream == nil { - r.stream, r.err = r.rpc(r.ctx) - continue - } - - // Read from the stream. - var response *sppb.BatchWriteResponse - response, r.err = r.stream.Recv() - - // Return an item. - if r.err == nil { - r.dataReceived = true - return response, nil - } - - // Stream finished. - if r.err == io.EOF { - r.err = iterator.Done - return nil, r.err - } - - // Retry request on session not found error only if no data has been received before. - if !r.dataReceived && r.replaceSession != nil && isSessionNotFoundError(r.err) { - r.err = r.replaceSession(r.ctx) - r.stream = nil - } - } -} - -// Stop terminates the iteration. It should be called after you finish using the -// iterator. -func (r *BatchWriteResponseIterator) Stop() { - if r.stream != nil { - err := r.err - if err == iterator.Done { - err = nil - } - defer trace.EndSpan(r.ctx, err) - } - if r.cancel != nil { - r.cancel() - r.cancel = nil - } - if r.release != nil { - r.release(r.err) - r.release = nil - } - if r.err == nil { - r.err = spannerErrorf(codes.FailedPrecondition, "Next called after Stop") - } -} - -// Do calls the provided function once in sequence for each item in the -// iteration. If the function returns a non-nil error, Do immediately returns -// that error. -// -// If there are no items in the iterator, Do will return nil without calling the -// provided function. -// -// Do always calls Stop on the iterator. -func (r *BatchWriteResponseIterator) Do(f func(r *sppb.BatchWriteResponse) error) error { - defer r.Stop() - for { - row, err := r.Next() - switch err { - case iterator.Done: - return nil - case nil: - if err = f(row); err != nil { - return err - } - default: - return err - } - } -} - -// BatchWrite applies a list of mutation groups in a collection of efficient -// transactions. The mutation groups are applied non-atomically in an -// unspecified order and thus, they must be independent of each other. Partial -// failure is possible, i.e., some mutation groups may have been applied -// successfully, while some may have failed. The results of individual batches -// are streamed into the response as the batches are applied. -// -// BatchWrite requests are not replay protected, meaning that each mutation -// group may be applied more than once. Replays of non-idempotent mutations -// may have undesirable effects. For example, replays of an insert mutation -// may produce an already exists error or if you use generated or commit -// timestamp-based keys, it may result in additional rows being added to the -// mutation's table. We recommend structuring your mutation groups to be -// idempotent to avoid this issue. -func (c *Client) BatchWrite(ctx context.Context, mgs []*MutationGroup) *BatchWriteResponseIterator { - return c.BatchWriteWithOptions(ctx, mgs, BatchWriteOptions{}) -} - -// BatchWriteWithOptions is same as BatchWrite. It accepts additional options to customize the request. -func (c *Client) BatchWriteWithOptions(ctx context.Context, mgs []*MutationGroup, opts BatchWriteOptions) *BatchWriteResponseIterator { - ctx, _ = startSpan(ctx, "BatchWrite", c.otConfig.commonTraceStartOptions...) - - var err error - defer func() { - trace.EndSpan(ctx, err) - }() - - opts = c.bwo.merge(opts) - - mgsPb, err := mutationGroupsProto(mgs) - if err != nil { - return &BatchWriteResponseIterator{meterTracerFactory: c.metricsTracerFactory, err: err} - } - - var sh *sessionHandle - sh, err = c.idleSessions.take(ctx) - if err != nil { - return &BatchWriteResponseIterator{meterTracerFactory: c.metricsTracerFactory, err: err} - } - - rpc := func(ct context.Context) (sppb.Spanner_BatchWriteClient, error) { - var md metadata.MD - sh.updateLastUseTime() - stream, rpcErr := sh.getClient().BatchWrite(contextWithOutgoingMetadata(ct, sh.getMetadata(), c.disableRouteToLeader), &sppb.BatchWriteRequest{ - Session: sh.getID(), - MutationGroups: mgsPb, - RequestOptions: createRequestOptions(opts.Priority, "", opts.TransactionTag), - ExcludeTxnFromChangeStreams: opts.ExcludeTxnFromChangeStreams, - }, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && c.ct != nil { - if metricErr := createContextAndCaptureGFELatencyMetrics(ct, c.ct, md, "BatchWrite"); metricErr != nil { - trace.TracePrintf(ct, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ct, md, "BatchWrite", c.otConfig); metricErr != nil { - trace.TracePrintf(ct, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", err) - } - return stream, rpcErr - } - - replaceSession := func(ct context.Context) error { - if sh != nil { - sh.destroy() - } - var sessionErr error - sh, sessionErr = c.idleSessions.take(ct) - return sessionErr - } - - release := func(err error) { - if sh == nil { - return - } - if isSessionNotFoundError(err) { - sh.destroy() - } - sh.recycle() - } - - ctx, cancel := context.WithCancel(ctx) - ctx, _ = startSpan(ctx, "BatchWriteResponseIterator", c.otConfig.commonTraceStartOptions...) - return &BatchWriteResponseIterator{ - ctx: ctx, - meterTracerFactory: c.metricsTracerFactory, - rpc: rpc, - replaceSession: replaceSession, - release: release, - cancel: cancel, - } -} - -// logf logs the given message to the given logger, or the standard logger if -// the given logger is nil. -func logf(logger *log.Logger, format string, v ...interface{}) { - if logger == nil { - log.Printf(format, v...) - } else { - logger.Printf(format, v...) - } -} - -// parseServerTimingHeader extracts server timing metrics from gRPC metadata into a map -func parseServerTimingHeader(md metadata.MD) map[string]time.Duration { - metrics := make(map[string]time.Duration) - if md == nil { - return metrics - } - - serverTiming := md.Get(serverTimingHeaderKey) - if len(serverTiming) == 0 { - return metrics - } - - for _, timing := range serverTiming { - matches := serverTimingPattern.FindAllStringSubmatch(timing, -1) - for _, match := range matches { - if len(match) == 3 { // full match + 2 capture groups - metricName := match[1] - duration, err := strconv.ParseFloat(match[2], 64) - if err == nil { - metrics[metricName] = time.Duration(duration*1000) * time.Microsecond - } - } - } - } - return metrics -} diff --git a/vendor/cloud.google.com/go/spanner/doc.go b/vendor/cloud.google.com/go/spanner/doc.go deleted file mode 100644 index 8c30fdcc2a..0000000000 --- a/vendor/cloud.google.com/go/spanner/doc.go +++ /dev/null @@ -1,357 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* -Package spanner provides a client for reading and writing to Cloud Spanner -databases. See the packages under admin for clients that operate on databases -and instances. - -See https://cloud.google.com/spanner/docs/getting-started/go/ for an -introduction to Cloud Spanner and additional help on using this API. - -See https://godoc.org/cloud.google.com/go for authentication, timeouts, -connection pooling and similar aspects of this package. - -# Creating a Client - -To start working with this package, create a client that refers to the database -of interest: - - ctx := context.Background() - client, err := spanner.NewClient(ctx, "projects/P/instances/I/databases/D") - if err != nil { - // TODO: Handle error. - } - defer client.Close() - -Remember to close the client after use to free up the sessions in the session -pool. - -To use an emulator with this library, you can set the SPANNER_EMULATOR_HOST -environment variable to the address at which your emulator is running. This will -send requests to that address instead of to Cloud Spanner. You can then create -and use a client as usual: - - // Set SPANNER_EMULATOR_HOST environment variable. - err := os.Setenv("SPANNER_EMULATOR_HOST", "localhost:9010") - if err != nil { - // TODO: Handle error. - } - // Create client as usual. - client, err := spanner.NewClient(ctx, "projects/P/instances/I/databases/D") - if err != nil { - // TODO: Handle error. - } - -# Simple Reads and Writes - -Two Client methods, Apply and Single, work well for simple reads and writes. As -a quick introduction, here we write a new row to the database and read it back: - - _, err := client.Apply(ctx, []*spanner.Mutation{ - spanner.Insert("Users", - []string{"name", "email"}, - []interface{}{"alice", "a@example.com"})}) - if err != nil { - // TODO: Handle error. - } - row, err := client.Single().ReadRow(ctx, "Users", - spanner.Key{"alice"}, []string{"email"}) - if err != nil { - // TODO: Handle error. - } - -All the methods used above are discussed in more detail below. - -# Keys - -Every Cloud Spanner row has a unique key, composed of one or more columns. -Construct keys with a literal of type Key: - - key1 := spanner.Key{"alice"} - -# KeyRanges - -The keys of a Cloud Spanner table are ordered. You can specify ranges of keys -using the KeyRange type: - - kr1 := spanner.KeyRange{Start: key1, End: key2} - -By default, a KeyRange includes its start key but not its end key. Use -the Kind field to specify other boundary conditions: - - // include both keys - kr2 := spanner.KeyRange{Start: key1, End: key2, Kind: spanner.ClosedClosed} - -# KeySets - -A KeySet represents a set of keys. A single Key or KeyRange can act as a KeySet. -Use the KeySets function to build the union of several KeySets: - - ks1 := spanner.KeySets(key1, key2, kr1, kr2) - -AllKeys returns a KeySet that refers to all the keys in a table: - - ks2 := spanner.AllKeys() - -# Transactions - -All Cloud Spanner reads and writes occur inside transactions. There are two -types of transactions, read-only and read-write. Read-only transactions cannot -change the database, do not acquire locks, and may access either the current -database state or states in the past. Read-write transactions can read the -database before writing to it, and always apply to the most recent database -state. - -# Single Reads - -The simplest and fastest transaction is a ReadOnlyTransaction that supports a -single read operation. Use Client.Single to create such a transaction. You can -chain the call to Single with a call to a Read method. - -When you only want one row whose key you know, use ReadRow. Provide the table -name, key, and the columns you want to read: - - row, err := client.Single().ReadRow(ctx, "Accounts", spanner.Key{"alice"}, []string{"balance"}) - -Read multiple rows with the Read method. It takes a table name, KeySet, and list -of columns: - - iter := client.Single().Read(ctx, "Accounts", keyset1, columns) - -Read returns a RowIterator. You can call the Do method on the iterator and pass -a callback: - - err := iter.Do(func(row *Row) error { - // TODO: use row - return nil - }) - -RowIterator also follows the standard pattern for the Google -Cloud Client Libraries: - - defer iter.Stop() - for { - row, err := iter.Next() - if err == iterator.Done { - break - } - if err != nil { - // TODO: Handle error. - } - // TODO: use row - } - -Always call Stop when you finish using an iterator this way, whether or not you -iterate to the end. (Failing to call Stop could lead you to exhaust the -database's session quota.) - -To read rows with an index, use ReadUsingIndex. - -# Statements - -The most general form of reading uses SQL statements. Construct a Statement -with NewStatement, setting any parameters using the Statement's Params map: - - stmt := spanner.NewStatement("SELECT First, Last FROM SINGERS WHERE Last >= @start") - stmt.Params["start"] = "Dylan" - -You can also construct a Statement directly with a struct literal, providing -your own map of parameters. - -Use the Query method to run the statement and obtain an iterator: - - iter := client.Single().Query(ctx, stmt) - -# Rows - -Once you have a Row, via an iterator or a call to ReadRow, you can extract -column values in several ways. Pass in a pointer to a Go variable of the -appropriate type when you extract a value. - -You can extract by column position or name: - - err := row.Column(0, &name) - err = row.ColumnByName("balance", &balance) - -You can extract all the columns at once: - - err = row.Columns(&name, &balance) - -Or you can define a Go struct that corresponds to your columns, and extract -into that: - - var s struct { Name string; Balance int64 } - err = row.ToStruct(&s) - -For Cloud Spanner columns that may contain NULL, use one of the NullXXX types, -like NullString: - - var ns spanner.NullString - if err := row.Column(0, &ns); err != nil { - // TODO: Handle error. - } - if ns.Valid { - fmt.Println(ns.StringVal) - } else { - fmt.Println("column is NULL") - } - -# Multiple Reads - -To perform more than one read in a transaction, use ReadOnlyTransaction: - - txn := client.ReadOnlyTransaction() - defer txn.Close() - iter := txn.Query(ctx, stmt1) - // ... - iter = txn.Query(ctx, stmt2) - // ... - -You must call Close when you are done with the transaction. - -# Timestamps and Timestamp Bounds - -Cloud Spanner read-only transactions conceptually perform all their reads at a -single moment in time, called the transaction's read timestamp. Once a read has -started, you can call ReadOnlyTransaction's Timestamp method to obtain the read -timestamp. - -By default, a transaction will pick the most recent time (a time where all -previously committed transactions are visible) for its reads. This provides the -freshest data, but may involve some delay. You can often get a quicker response -if you are willing to tolerate "stale" data. You can control the read timestamp -selected by a transaction by calling the WithTimestampBound method on the -transaction before using it. For example, to perform a query on data that is at -most one minute stale, use - - client.Single(). - WithTimestampBound(spanner.MaxStaleness(1*time.Minute)). - Query(ctx, stmt) - -See the documentation of TimestampBound for more details. - -# Mutations - -To write values to a Cloud Spanner database, construct a Mutation. The spanner -package has functions for inserting, updating and deleting rows. Except for the -Delete methods, which take a Key or KeyRange, each mutation-building function -comes in three varieties. - -One takes lists of columns and values along with the table name: - - m1 := spanner.Insert("Users", - []string{"name", "email"}, - []interface{}{"alice", "a@example.com"}) - -One takes a map from column names to values: - - m2 := spanner.InsertMap("Users", map[string]interface{}{ - "name": "alice", - "email": "a@example.com", - }) - -And the third accepts a struct value, and determines the columns from the -struct field names: - - type User struct { Name, Email string } - u := User{Name: "alice", Email: "a@example.com"} - m3, err := spanner.InsertStruct("Users", u) - -# Writes - -To apply a list of mutations to the database, use Apply: - - _, err := client.Apply(ctx, []*spanner.Mutation{m1, m2, m3}) - -If you need to read before writing in a single transaction, use a -ReadWriteTransaction. ReadWriteTransactions may be aborted automatically by the -backend and need to be retried. You pass in a function to ReadWriteTransaction, -and the client will handle the retries automatically. Use the transaction's -BufferWrite method to buffer mutations, which will all be executed at the end -of the transaction: - - _, err := client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error { - var balance int64 - row, err := txn.ReadRow(ctx, "Accounts", spanner.Key{"alice"}, []string{"balance"}) - if err != nil { - // The transaction function will be called again if the error code - // of this error is Aborted. The backend may automatically abort - // any read/write transaction if it detects a deadlock or other - // problems. - return err - } - if err := row.Column(0, &balance); err != nil { - return err - } - - if balance <= 10 { - return errors.New("insufficient funds in account") - } - balance -= 10 - m := spanner.Update("Accounts", []string{"user", "balance"}, []interface{}{"alice", balance}) - // The buffered mutation will be committed. If the commit - // fails with an Aborted error, this function will be called - // again. - return txn.BufferWrite([]*spanner.Mutation{m}) - }) - -# Structs - -Cloud Spanner STRUCT (aka STRUCT) values -(https://cloud.google.com/spanner/docs/data-types#struct-type) can be -represented by a Go struct value. - -A proto StructType is built from the field types and field tag information of -the Go struct. If a field in the struct type definition has a -"spanner:" tag, then the value of the "spanner" key in the tag is -used as the name for that field in the built StructType, otherwise the field -name in the struct definition is used. To specify a field with an empty field -name in a Cloud Spanner STRUCT type, use the `spanner:""` tag annotation against -the corresponding field in the Go struct's type definition. - -A STRUCT value can contain STRUCT-typed and Array-of-STRUCT typed fields and -these can be specified using named struct-typed and []struct-typed fields inside -a Go struct. However, embedded struct fields are not allowed. Unexported struct -fields are ignored. - -NULL STRUCT values in Cloud Spanner are typed. A nil pointer to a Go struct -value can be used to specify a NULL STRUCT value of the corresponding -StructType. Nil and empty slices of a Go STRUCT type can be used to specify -NULL and empty array values respectively of the corresponding StructType. A -slice of pointers to a Go struct type can be used to specify an array of -NULL-able STRUCT values. - -# DML and Partitioned DML - -Spanner supports DML statements like INSERT, UPDATE and DELETE. Use -ReadWriteTransaction.Update to run DML statements. It returns the number of rows -affected. (You can call use ReadWriteTransaction.Query with a DML statement. The -first call to Next on the resulting RowIterator will return iterator.Done, and -the RowCount field of the iterator will hold the number of affected rows.) - -For large databases, it may be more efficient to partition the DML statement. -Use client.PartitionedUpdate to run a DML statement in this way. Not all DML -statements can be partitioned. - -# Tracing - -This client has been instrumented to use OpenCensus tracing -(http://opencensus.io). To enable tracing, see "Enabling Tracing for a Program" -at https://godoc.org/go.opencensus.io/trace. OpenCensus tracing requires Go 1.8 -or higher. -*/ -package spanner // import "cloud.google.com/go/spanner" diff --git a/vendor/cloud.google.com/go/spanner/emulator_test.sh b/vendor/cloud.google.com/go/spanner/emulator_test.sh deleted file mode 100644 index 9eab68fffe..0000000000 --- a/vendor/cloud.google.com/go/spanner/emulator_test.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License.. - -# Fail on any error -set -eo pipefail - -# Display commands being run -set -x - -export SPANNER_EMULATOR_HOST=localhost:9010 -export GCLOUD_TESTS_GOLANG_PROJECT_ID=emulator-test-project -echo "Running the Cloud Spanner emulator: $SPANNER_EMULATOR_HOST"; - -# Download the emulator -# TODO: Find a way to use 'latest' here. -EMULATOR_VERSION=1.4.0 -wget https://storage.googleapis.com/cloud-spanner-emulator/releases/${EMULATOR_VERSION}/cloud-spanner-emulator_linux_amd64-${EMULATOR_VERSION}.tar.gz -tar zxvf cloud-spanner-emulator_linux_amd64-${EMULATOR_VERSION}.tar.gz -chmod u+x emulator_main - -# Start the emulator -./emulator_main --host_port $SPANNER_EMULATOR_HOST & - -EMULATOR_PID=$! - -# Stop the emulator & clean the environment variable -function cleanup() { - kill -9 $EMULATOR_PID - unset SPANNER_EMULATOR_HOST - unset GCLOUD_TESTS_GOLANG_PROJECT_ID - echo "Cleanup the emulator"; -} -trap cleanup EXIT - -echo "Testing without GCPMultiEnpoint..." | tee -a sponge_log.log -go test -count=1 -v -timeout 10m ./... -run '^TestIntegration_' 2>&1 | tee -a sponge_log.log - -echo "Testing with GCPMultiEnpoint..." | tee -a sponge_log.log -GCLOUD_TESTS_GOLANG_USE_GRPC_GCP=true go test -count=1 -v -timeout 10m ./... -run '^TestIntegration_' 2>&1 | tee -a sponge_log.log diff --git a/vendor/cloud.google.com/go/spanner/errors.go b/vendor/cloud.google.com/go/spanner/errors.go deleted file mode 100644 index d99c6d3775..0000000000 --- a/vendor/cloud.google.com/go/spanner/errors.go +++ /dev/null @@ -1,243 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "errors" - "fmt" - - "github.com/googleapis/gax-go/v2/apierror" - "google.golang.org/genproto/googleapis/rpc/errdetails" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -var ( - // ErrRowNotFound row not found error - ErrRowNotFound = errors.New("row not found") -) - -// Error is the structured error returned by Cloud Spanner client. -// -// Deprecated: Unwrap any error that is returned by the Spanner client as an APIError -// to access the error details. Do not try to convert the error to the -// spanner.Error struct, as that struct may be removed in a future release. -// -// Example: -// var apiErr *apierror.APIError -// _, err := spanner.NewClient(context.Background()) -// errors.As(err, &apiErr) -type Error struct { - // Code is the canonical error code for describing the nature of a - // particular error. - // - // Deprecated: The error code should be extracted from the wrapped error by - // calling ErrCode(err error). This field will be removed in a future - // release. - Code codes.Code - // err is the wrapped error that caused this Spanner error. The wrapped - // error can be read with the Unwrap method. - err error - // Desc explains more details of the error. - Desc string - // additionalInformation optionally contains any additional information - // about the error. - additionalInformation string - - // RequestID is the associated ID that was sent to Google Cloud Spanner's - // backend, as the value in the "x-goog-spanner-request-id" gRPC header. - RequestID string -} - -// TransactionOutcomeUnknownError is wrapped in a Spanner error when the error -// occurred during a transaction, and the outcome of the transaction is -// unknown as a result of the error. This could be the case if a timeout or -// canceled error occurs after a Commit request has been sent, but before the -// client has received a response from the server. -type TransactionOutcomeUnknownError struct { - // err is the wrapped error that caused this TransactionOutcomeUnknownError - // error. The wrapped error can be read with the Unwrap method. - err error -} - -const transactionOutcomeUnknownMsg = "transaction outcome unknown" - -// Error implements error.Error. -func (*TransactionOutcomeUnknownError) Error() string { return transactionOutcomeUnknownMsg } - -// Unwrap returns the wrapped error (if any). -func (e *TransactionOutcomeUnknownError) Unwrap() error { return e.err } - -// Error implements error.Error. -func (e *Error) Error() string { - if e == nil { - return "spanner: OK" - } - code := ErrCode(e) - - var s string - if e.additionalInformation == "" { - s = fmt.Sprintf("spanner: code = %q, desc = %q", code, e.Desc) - } else { - s = fmt.Sprintf("spanner: code = %q, desc = %q, additional information = %s", code, e.Desc, e.additionalInformation) - } - if e.RequestID != "" { - s = fmt.Sprintf("%s, requestID = %q", s, e.RequestID) - } - return s -} - -// Unwrap returns the wrapped error (if any). -func (e *Error) Unwrap() error { - return e.err -} - -// GRPCStatus returns the corresponding gRPC Status of this Spanner error. -// This allows the error to be converted to a gRPC status using -// `status.Convert(error)`. -func (e *Error) GRPCStatus() *status.Status { - err := errors.Unwrap(e) - for { - // If the base error is nil, return status created from e.Code and e.Desc. - if err == nil { - return status.New(e.Code, e.Desc) - } - code := status.Code(err) - if code != codes.Unknown { - return status.New(code, e.Desc) - } - err = errors.Unwrap(err) - } -} - -// decorate decorates an existing spanner.Error with more information. -func (e *Error) decorate(info string) { - e.Desc = fmt.Sprintf("%v, %v", info, e.Desc) -} - -// spannerErrorf generates a *spanner.Error with the given description and an -// APIError error having given error code as its status. -func spannerErrorf(code codes.Code, format string, args ...interface{}) error { - msg := fmt.Sprintf(format, args...) - return spannerError(code, msg) -} - -func spannerError(code codes.Code, msg string) error { - wrapped, _ := apierror.FromError(status.Error(code, msg)) - return &Error{ - Code: code, - err: wrapped, - Desc: msg, - } -} - -// ToSpannerError converts a general Go error to *spanner.Error. If the given -// error is already a *spanner.Error, the original error will be returned. -// -// Spanner Errors are normally created by the Spanner client library from the -// returned APIError of a RPC. This method can also be used to create Spanner -// errors for use in tests. The recommended way to create test errors is -// calling this method with a status error, e.g. -// ToSpannerError(status.New(codes.NotFound, "Table not found").Err()) -func ToSpannerError(err error) error { - return toSpannerErrorWithCommitInfo(err, false) -} - -// toAPIError converts a general Go error to *gax-go.APIError. If the given -// error is not convertible to *gax-go.APIError, the original error will be returned. -func toAPIError(err error) error { - if apiError, ok := apierror.FromError(err); ok { - return apiError - } - return err -} - -// toSpannerErrorWithCommitInfo converts general Go error to *spanner.Error -// with additional information if the error occurred during a Commit request. -// -// If err is already a *spanner.Error, err is returned unmodified. -func toSpannerErrorWithCommitInfo(err error, errorDuringCommit bool) error { - if err == nil { - return nil - } - var se *Error - if errors.As(err, &se) { - return se - } - switch { - case err == context.DeadlineExceeded || err == context.Canceled: - desc := err.Error() - wrapped := status.FromContextError(err).Err() - if errorDuringCommit { - desc = fmt.Sprintf("%s, %s", desc, transactionOutcomeUnknownMsg) - wrapped = &TransactionOutcomeUnknownError{err: wrapped} - } - return &Error{status.FromContextError(err).Code(), toAPIError(wrapped), desc, "", ""} - case status.Code(err) == codes.Unknown: - return &Error{codes.Unknown, toAPIError(err), err.Error(), "", ""} - default: - statusErr := status.Convert(err) - code, desc := statusErr.Code(), statusErr.Message() - wrapped := err - if errorDuringCommit && (code == codes.DeadlineExceeded || code == codes.Canceled) { - desc = fmt.Sprintf("%s, %s", desc, transactionOutcomeUnknownMsg) - wrapped = &TransactionOutcomeUnknownError{err: wrapped} - } - return &Error{code, toAPIError(wrapped), desc, "", ""} - } -} - -// ErrCode extracts the canonical error code from a Go error. -func ErrCode(err error) codes.Code { - s, ok := status.FromError(err) - if !ok { - return codes.Unknown - } - return s.Code() -} - -// ErrDesc extracts the Cloud Spanner error description from a Go error. -func ErrDesc(err error) string { - var se *Error - if !errors.As(err, &se) { - return err.Error() - } - return se.Desc -} - -// extractResourceType extracts the resource type from any ResourceInfo detail -// included in the error. -func extractResourceType(err error) (string, bool) { - var s *status.Status - var se *Error - if errors.As(err, &se) { - // Unwrap statusError. - s = status.Convert(se.Unwrap()) - } else { - s = status.Convert(err) - } - if s == nil { - return "", false - } - for _, detail := range s.Details() { - if resourceInfo, ok := detail.(*errdetails.ResourceInfo); ok { - return resourceInfo.ResourceType, true - } - } - return "", false -} diff --git a/vendor/cloud.google.com/go/spanner/grpc_client.go b/vendor/cloud.google.com/go/spanner/grpc_client.go deleted file mode 100644 index e51582f781..0000000000 --- a/vendor/cloud.google.com/go/spanner/grpc_client.go +++ /dev/null @@ -1,382 +0,0 @@ -/* -Copyright 2024 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "strings" - "sync/atomic" - "time" - - vkit "cloud.google.com/go/spanner/apiv1" - "cloud.google.com/go/spanner/apiv1/spannerpb" - "cloud.google.com/go/spanner/internal" - "github.com/googleapis/gax-go/v2" - "go.opentelemetry.io/otel/attribute" - oteltrace "go.opentelemetry.io/otel/trace" - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/status" -) - -const ( - directPathIPV6Prefix = "[2001:4860:8040" - directPathIPV4Prefix = "34.126" -) - -type contextKey string - -const metricsTracerKey contextKey = "metricsTracer" - -// spannerClient is an interface that defines the methods available from Cloud Spanner API. -type spannerClient interface { - CallOptions() *vkit.CallOptions - Close() error - Connection() *grpc.ClientConn - CreateSession(context.Context, *spannerpb.CreateSessionRequest, ...gax.CallOption) (*spannerpb.Session, error) - BatchCreateSessions(context.Context, *spannerpb.BatchCreateSessionsRequest, ...gax.CallOption) (*spannerpb.BatchCreateSessionsResponse, error) - GetSession(context.Context, *spannerpb.GetSessionRequest, ...gax.CallOption) (*spannerpb.Session, error) - ListSessions(context.Context, *spannerpb.ListSessionsRequest, ...gax.CallOption) *vkit.SessionIterator - DeleteSession(context.Context, *spannerpb.DeleteSessionRequest, ...gax.CallOption) error - ExecuteSql(context.Context, *spannerpb.ExecuteSqlRequest, ...gax.CallOption) (*spannerpb.ResultSet, error) - ExecuteStreamingSql(context.Context, *spannerpb.ExecuteSqlRequest, ...gax.CallOption) (spannerpb.Spanner_ExecuteStreamingSqlClient, error) - ExecuteBatchDml(context.Context, *spannerpb.ExecuteBatchDmlRequest, ...gax.CallOption) (*spannerpb.ExecuteBatchDmlResponse, error) - Read(context.Context, *spannerpb.ReadRequest, ...gax.CallOption) (*spannerpb.ResultSet, error) - StreamingRead(context.Context, *spannerpb.ReadRequest, ...gax.CallOption) (spannerpb.Spanner_StreamingReadClient, error) - BeginTransaction(context.Context, *spannerpb.BeginTransactionRequest, ...gax.CallOption) (*spannerpb.Transaction, error) - Commit(context.Context, *spannerpb.CommitRequest, ...gax.CallOption) (*spannerpb.CommitResponse, error) - Rollback(context.Context, *spannerpb.RollbackRequest, ...gax.CallOption) error - PartitionQuery(context.Context, *spannerpb.PartitionQueryRequest, ...gax.CallOption) (*spannerpb.PartitionResponse, error) - PartitionRead(context.Context, *spannerpb.PartitionReadRequest, ...gax.CallOption) (*spannerpb.PartitionResponse, error) - BatchWrite(context.Context, *spannerpb.BatchWriteRequest, ...gax.CallOption) (spannerpb.Spanner_BatchWriteClient, error) -} - -// grpcSpannerClient is the gRPC API implementation of the transport-agnostic -// spannerClient interface. -type grpcSpannerClient struct { - raw *vkit.Client - metricsTracerFactory *builtinMetricsTracerFactory - - // These fields are used to uniquely track x-goog-spanner-request-id where: - // raw(*vkit.Client) is the channel, and channelID is derived from the ordinal - // count of unique *vkit.Client as retrieved from the session pool. - channelID uint64 - // id is derived from the SpannerClient. - id int - // nthRequest is incremented for each new request (but not for retries of requests). - nthRequest *atomic.Uint32 -} - -var ( - // Ensure that grpcSpannerClient implements spannerClient. - _ spannerClient = (*grpcSpannerClient)(nil) -) - -// newGRPCSpannerClient initializes a new spannerClient that uses the gRPC -// Spanner API. -func newGRPCSpannerClient(ctx context.Context, sc *sessionClient, channelID uint64, opts ...option.ClientOption) (spannerClient, error) { - raw, err := vkit.NewClient(ctx, opts...) - if err != nil { - return nil, err - } - - g := &grpcSpannerClient{raw: raw, metricsTracerFactory: sc.metricsTracerFactory} - clientID := sc.nthClient - g.prepareRequestIDTrackers(clientID, channelID, sc.nthRequest) - - clientInfo := []string{"gccl", internal.Version} - if sc.userAgent != "" { - agentWithVersion := strings.SplitN(sc.userAgent, "/", 2) - if len(agentWithVersion) == 2 { - clientInfo = append(clientInfo, agentWithVersion[0], agentWithVersion[1]) - } - } - raw.SetGoogleClientInfo(clientInfo...) - if sc.callOptions != nil { - raw.CallOptions = mergeCallOptions(raw.CallOptions, sc.callOptions) - } - return g, nil -} - -func (g *grpcSpannerClient) newBuiltinMetricsTracer(ctx context.Context) *builtinMetricsTracer { - mt := g.metricsTracerFactory.createBuiltinMetricsTracer(ctx) - return &mt -} - -func (g *grpcSpannerClient) CallOptions() *vkit.CallOptions { - return g.raw.CallOptions -} - -func (g *grpcSpannerClient) Close() error { - return g.raw.Close() -} - -func (g *grpcSpannerClient) Connection() *grpc.ClientConn { - return g.raw.Connection() -} - -func (g *grpcSpannerClient) CreateSession(ctx context.Context, req *spannerpb.CreateSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.CreateSession(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) BatchCreateSessions(ctx context.Context, req *spannerpb.BatchCreateSessionsRequest, opts ...gax.CallOption) (*spannerpb.BatchCreateSessionsResponse, error) { - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.BatchCreateSessions(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) GetSession(ctx context.Context, req *spannerpb.GetSessionRequest, opts ...gax.CallOption) (*spannerpb.Session, error) { - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.GetSession(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) ListSessions(ctx context.Context, req *spannerpb.ListSessionsRequest, opts ...gax.CallOption) *vkit.SessionIterator { - return g.raw.ListSessions(ctx, req, g.optsWithNextRequestID(opts)...) -} - -func (g *grpcSpannerClient) DeleteSession(ctx context.Context, req *spannerpb.DeleteSessionRequest, opts ...gax.CallOption) error { - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - err := g.raw.DeleteSession(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return err -} - -// setSpanAttributes dynamically sets span attributes based on the request type. -func setSpanAttributes[T any](span oteltrace.Span, req T) { - if !span.IsRecording() { - return - } - - var attrs []attribute.KeyValue - - if r, ok := any(req).(interface { - GetRequestOptions() *spannerpb.RequestOptions - }); ok { - if tag := r.GetRequestOptions().GetTransactionTag(); tag != "" { - attrs = append(attrs, attribute.String("transaction.tag", tag)) - } - if tag := r.GetRequestOptions().GetRequestTag(); tag != "" { - attrs = append(attrs, attribute.String("statement.tag", tag)) - } - } - - if r, ok := any(req).(interface{ GetSql() string }); ok { - if sql := r.GetSql(); sql != "" { - attrs = append(attrs, attribute.String("db.statement", sql)) - } - } else if r, ok := any(req).(interface { - GetStatements() []*spannerpb.ExecuteBatchDmlRequest_Statement - }); ok { - if stmts := r.GetStatements(); len(stmts) > 0 { - sqls := make([]string, len(stmts)) - for i, stmt := range stmts { - sqls[i] = stmt.GetSql() - } - attrs = append(attrs, attribute.StringSlice("db.statement", sqls)) - } - } - - if r, ok := any(req).(interface{ GetTable() string }); ok { - if table := r.GetTable(); table != "" { - attrs = append(attrs, attribute.String("db.table", table)) - } - } - - span.SetAttributes(attrs...) -} - -func setGFEAndAFESpanAttributes(span oteltrace.Span, latencyMap map[string]time.Duration) { - if !span.IsRecording() { - return - } - for t, v := range latencyMap { - if t == gfeTimingHeader || t == afeTimingHeader { - span.SetAttributes( - attribute.Float64(t[:3]+".latency_ms", float64(v.Nanoseconds())/1e6), - ) - } - } -} - -func (g *grpcSpannerClient) ExecuteSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.ExecuteSql(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) ExecuteStreamingSql(ctx context.Context, req *spannerpb.ExecuteSqlRequest, opts ...gax.CallOption) (spannerpb.Spanner_ExecuteStreamingSqlClient, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - // Note: This method does not add g.optsWithNextRequestID to inject x-goog-spanner-request-id - // as it is already manually added when creating Stream iterators for ExecuteStreamingSql. - client, err := g.raw.ExecuteStreamingSql(peer.NewContext(ctx, &peer.Peer{}), req, opts...) - mt, ok := ctx.Value(metricsTracerKey).(*builtinMetricsTracer) - if !ok { - return client, err - } - if mt != nil && client != nil && mt.currOp.currAttempt != nil { - md, _ := client.Header() - latencyMap := parseServerTimingHeader(md) - setGFEAndAFESpanAttributes(span, latencyMap) - mt.currOp.currAttempt.setServerTimingMetrics(latencyMap) - mt.currOp.currAttempt.setDirectPathUsed(client.Context()) - } - return client, err -} - -func (g *grpcSpannerClient) ExecuteBatchDml(ctx context.Context, req *spannerpb.ExecuteBatchDmlRequest, opts ...gax.CallOption) (*spannerpb.ExecuteBatchDmlResponse, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.ExecuteBatchDml(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) Read(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (*spannerpb.ResultSet, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.Read(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) StreamingRead(ctx context.Context, req *spannerpb.ReadRequest, opts ...gax.CallOption) (spannerpb.Spanner_StreamingReadClient, error) { - // Note: This method does not add g.optsWithNextRequestID, as it is already - // manually added when creating Stream iterators for StreamingRead. - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - client, err := g.raw.StreamingRead(peer.NewContext(ctx, &peer.Peer{}), req, opts...) - mt, ok := ctx.Value(metricsTracerKey).(*builtinMetricsTracer) - if !ok { - return client, err - } - if mt != nil && client != nil && mt.currOp.currAttempt != nil { - md, _ := client.Header() - latencyMap := parseServerTimingHeader(md) - setGFEAndAFESpanAttributes(span, latencyMap) - mt.currOp.currAttempt.setServerTimingMetrics(latencyMap) - mt.currOp.currAttempt.setDirectPathUsed(client.Context()) - } - return client, err -} - -func (g *grpcSpannerClient) BeginTransaction(ctx context.Context, req *spannerpb.BeginTransactionRequest, opts ...gax.CallOption) (*spannerpb.Transaction, error) { - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.BeginTransaction(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) Commit(ctx context.Context, req *spannerpb.CommitRequest, opts ...gax.CallOption) (*spannerpb.CommitResponse, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.Commit(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) Rollback(ctx context.Context, req *spannerpb.RollbackRequest, opts ...gax.CallOption) error { - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - err := g.raw.Rollback(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return err -} - -func (g *grpcSpannerClient) PartitionQuery(ctx context.Context, req *spannerpb.PartitionQueryRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.PartitionQuery(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) PartitionRead(ctx context.Context, req *spannerpb.PartitionReadRequest, opts ...gax.CallOption) (*spannerpb.PartitionResponse, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - mt := g.newBuiltinMetricsTracer(ctx) - defer recordOperationCompletion(mt) - ctx = context.WithValue(ctx, metricsTracerKey, mt) - resp, err := g.raw.PartitionRead(ctx, req, g.optsWithNextRequestID(opts)...) - statusCode, _ := status.FromError(err) - mt.currOp.setStatus(statusCode.Code().String()) - return resp, err -} - -func (g *grpcSpannerClient) BatchWrite(ctx context.Context, req *spannerpb.BatchWriteRequest, opts ...gax.CallOption) (spannerpb.Spanner_BatchWriteClient, error) { - span := oteltrace.SpanFromContext(ctx) - setSpanAttributes(span, req) - client, err := g.raw.BatchWrite(peer.NewContext(ctx, &peer.Peer{}), req, g.optsWithNextRequestID(opts)...) - mt, ok := ctx.Value(metricsTracerKey).(*builtinMetricsTracer) - if !ok { - return client, err - } - if mt != nil && client != nil && mt.currOp.currAttempt != nil { - md, _ := client.Header() - latencyMap := parseServerTimingHeader(md) - setGFEAndAFESpanAttributes(span, latencyMap) - mt.currOp.currAttempt.setServerTimingMetrics(latencyMap) - mt.currOp.currAttempt.setDirectPathUsed(client.Context()) - } - return client, err -} diff --git a/vendor/cloud.google.com/go/spanner/grpc_dp.go b/vendor/cloud.google.com/go/spanner/grpc_dp.go deleted file mode 100644 index 3a60c835c9..0000000000 --- a/vendor/cloud.google.com/go/spanner/grpc_dp.go +++ /dev/null @@ -1,24 +0,0 @@ -//go:build !disable_grpc_modules - -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import ( - // Install google-c2p resolver, which is required for direct path. - _ "google.golang.org/grpc/xds/googledirectpath" - // Install RLS load balancer policy, which is needed for gRPC RLS. - _ "google.golang.org/grpc/balancer/rls" -) diff --git a/vendor/cloud.google.com/go/spanner/internal/version.go b/vendor/cloud.google.com/go/spanner/internal/version.go deleted file mode 100644 index 9cf22b3c90..0000000000 --- a/vendor/cloud.google.com/go/spanner/internal/version.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -// Version is the current tagged release of the library. -const Version = "1.84.1" diff --git a/vendor/cloud.google.com/go/spanner/key.go b/vendor/cloud.google.com/go/spanner/key.go deleted file mode 100644 index 5a8fec49a9..0000000000 --- a/vendor/cloud.google.com/go/spanner/key.go +++ /dev/null @@ -1,444 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "bytes" - "fmt" - "math/big" - "time" - - "cloud.google.com/go/civil" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/google/uuid" - "google.golang.org/grpc/codes" - "google.golang.org/protobuf/reflect/protoreflect" - proto3 "google.golang.org/protobuf/types/known/structpb" -) - -// A Key can be either a Cloud Spanner row's primary key or a secondary index -// key. It is essentially an interface{} array, which represents a set of Cloud -// Spanner columns. A Key can be used as: -// -// - A primary key which uniquely identifies a Cloud Spanner row. -// - A secondary index key which maps to a set of Cloud Spanner rows indexed under it. -// - An endpoint of primary key/secondary index ranges; see the KeyRange type. -// -// Rows that are identified by the Key type are outputs of read operation or -// targets of delete operation in a mutation. Note that for -// Insert/Update/InsertOrUpdate/Update mutation types, although they don't -// require a primary key explicitly, the column list provided must contain -// enough columns that can comprise a primary key. -// -// Keys are easy to construct. For example, suppose you have a table with a -// primary key of username and product ID. To make a key for this table: -// -// key := spanner.Key{"john", 16} -// -// See the description of Row and Mutation types for how Go types are mapped to -// Cloud Spanner types. For convenience, Key type supports a wide range of Go -// types: -// - int, int8, int16, int32, int64, and NullInt64 are mapped to Cloud Spanner's INT64 type. -// - uint8, uint16 and uint32 are also mapped to Cloud Spanner's INT64 type. -// - float32, float64, NullFloat64 are mapped to Cloud Spanner's FLOAT64 type. -// - bool and NullBool are mapped to Cloud Spanner's BOOL type. -// - []byte is mapped to Cloud Spanner's BYTES type. -// - string and NullString are mapped to Cloud Spanner's STRING type. -// - time.Time and NullTime are mapped to Cloud Spanner's TIMESTAMP type. -// - civil.Date and NullDate are mapped to Cloud Spanner's DATE type. -// - protoreflect.Enum and NullProtoEnum are mapped to Cloud Spanner's ENUM type. -type Key []interface{} - -// errInvdKeyPartType returns error for unsupported key part type. -func errInvdKeyPartType(part interface{}) error { - return spannerErrorf(codes.InvalidArgument, "key part has unsupported type %T", part) -} - -// keyPartValue converts a part of the Key (which is a valid Cloud Spanner type) -// into a proto3.Value. Used for encoding Key type into protobuf. -func keyPartValue(part interface{}) (pb *proto3.Value, err error) { - switch v := part.(type) { - case int: - pb, _, err = encodeValue(int64(v)) - case int8: - pb, _, err = encodeValue(int64(v)) - case int16: - pb, _, err = encodeValue(int64(v)) - case int32: - pb, _, err = encodeValue(int64(v)) - case uint8: - pb, _, err = encodeValue(int64(v)) - case uint16: - pb, _, err = encodeValue(int64(v)) - case uint32: - pb, _, err = encodeValue(int64(v)) - case int64, float64, float32, NullInt64, NullFloat64, NullFloat32, bool, NullBool, []byte, string, NullString, time.Time, civil.Date, NullTime, NullDate, big.Rat, NullNumeric, protoreflect.Enum, NullProtoEnum, uuid.UUID, uuid.NullUUID, NullUUID: - pb, _, err = encodeValue(v) - case Encoder: - part, err = v.EncodeSpanner() - if err != nil { - return nil, err - } - pb, err = keyPartValue(part) - default: - return nil, errInvdKeyPartType(v) - } - return pb, err -} - -// proto converts a spanner.Key into a proto3.ListValue. -func (key Key) proto() (*proto3.ListValue, error) { - lv := &proto3.ListValue{} - lv.Values = make([]*proto3.Value, 0, len(key)) - for _, part := range key { - v, err := keyPartValue(part) - if err != nil { - return nil, err - } - lv.Values = append(lv.Values, v) - } - return lv, nil -} - -// keySetProto lets a single Key act as a KeySet. -func (key Key) keySetProto() (*sppb.KeySet, error) { - kp, err := key.proto() - if err != nil { - return nil, err - } - return &sppb.KeySet{Keys: []*proto3.ListValue{kp}}, nil -} - -// String implements fmt.Stringer for Key. For string, []byte and NullString, it -// prints the uninterpreted bytes of their contents, leaving caller with the -// opportunity to escape the output. -func (key Key) String() string { - b := &bytes.Buffer{} - fmt.Fprint(b, "(") - for i, part := range []interface{}(key) { - if i != 0 { - fmt.Fprint(b, ",") - } - key.elemString(b, part) - } - fmt.Fprint(b, ")") - return b.String() -} - -func (key Key) elemString(b *bytes.Buffer, part interface{}) { - switch v := part.(type) { - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, float32, float64, bool, protoreflect.Enum: - // Use %v to print numeric types and bool. - fmt.Fprintf(b, "%v", v) - case string: - fmt.Fprintf(b, "%q", v) - case []byte: - if v != nil { - fmt.Fprintf(b, "%q", v) - } else { - fmt.Fprint(b, nullString) - } - case NullInt64, NullFloat64, NullBool, NullNumeric, NullProtoEnum: - // The above types implement fmt.Stringer. - fmt.Fprintf(b, "%s", v) - case NullString, NullDate, NullTime: - // Quote the returned string if it is not null. - if v.(NullableValue).IsNull() { - fmt.Fprintf(b, "%s", nullString) - } else { - fmt.Fprintf(b, "%q", v) - } - case civil.Date: - fmt.Fprintf(b, "%q", v) - case time.Time: - fmt.Fprintf(b, "%q", v.Format(time.RFC3339Nano)) - case big.Rat: - fmt.Fprintf(b, "%v", NumericString(&v)) - case uuid.UUID: - fmt.Fprintf(b, "%s", v.String()) - case uuid.NullUUID: - if !v.Valid { - fmt.Fprintf(b, "%s", nullString) - } else { - fmt.Fprintf(b, "%s", v.UUID.String()) - } - case Encoder: - var err error - part, err = v.EncodeSpanner() - if err != nil { - fmt.Fprintf(b, "error") - } else { - key.elemString(b, part) - } - default: - fmt.Fprintf(b, "%v", v) - } -} - -// AsPrefix returns a KeyRange for all keys where k is the prefix. -func (key Key) AsPrefix() KeyRange { - return KeyRange{ - Start: key, - End: key, - Kind: ClosedClosed, - } -} - -// KeyRangeKind describes the kind of interval represented by a KeyRange: -// whether it is open or closed on the left and right. -type KeyRangeKind int - -const ( - // ClosedOpen is closed on the left and open on the right: the Start - // key is included, the End key is excluded. - ClosedOpen KeyRangeKind = iota - - // ClosedClosed is closed on the left and the right: both keys are included. - ClosedClosed - - // OpenClosed is open on the left and closed on the right: the Start - // key is excluded, the End key is included. - OpenClosed - - // OpenOpen is open on the left and the right: neither key is included. - OpenOpen -) - -// A KeyRange represents a range of rows in a table or index. -// -// A range has a Start key and an End key. IncludeStart and IncludeEnd -// indicate whether the Start and End keys are included in the range. -// -// For example, consider the following table definition: -// -// CREATE TABLE UserEvents ( -// UserName STRING(MAX), -// EventDate STRING(10), -// ) PRIMARY KEY(UserName, EventDate); -// -// The following keys name rows in this table: -// -// spanner.Key{"Bob", "2014-09-23"} -// spanner.Key{"Alfred", "2015-06-12"} -// -// Since the UserEvents table's PRIMARY KEY clause names two columns, each -// UserEvents key has two elements; the first is the UserName, and the second -// is the EventDate. -// -// Key ranges with multiple components are interpreted lexicographically by -// component using the table or index key's declared sort order. For example, -// the following range returns all events for user "Bob" that occurred in the -// year 2015: -// -// spanner.KeyRange{ -// Start: spanner.Key{"Bob", "2015-01-01"}, -// End: spanner.Key{"Bob", "2015-12-31"}, -// Kind: spanner.ClosedClosed, -// } -// -// Start and end keys can omit trailing key components. This affects the -// inclusion and exclusion of rows that exactly match the provided key -// components: if IncludeStart is true, then rows that exactly match the -// provided components of the Start key are included; if IncludeStart is false -// then rows that exactly match are not included. IncludeEnd and End key -// behave in the same fashion. -// -// For example, the following range includes all events for "Bob" that occurred -// during and after the year 2000: -// -// spanner.KeyRange{ -// Start: spanner.Key{"Bob", "2000-01-01"}, -// End: spanner.Key{"Bob"}, -// Kind: spanner.ClosedClosed, -// } -// -// The next example retrieves all events for "Bob": -// -// spanner.Key{"Bob"}.AsPrefix() -// -// To retrieve events before the year 2000: -// -// spanner.KeyRange{ -// Start: spanner.Key{"Bob"}, -// End: spanner.Key{"Bob", "2000-01-01"}, -// Kind: spanner.ClosedOpen, -// } -// -// Although we specified a Kind for this KeyRange, we didn't need to, because -// the default is ClosedOpen. In later examples we'll omit Kind if it is -// ClosedOpen. -// -// The following range includes all rows in a table or under a -// index: -// -// spanner.AllKeys() -// -// This range returns all users whose UserName begins with any -// character from A to C: -// -// spanner.KeyRange{ -// Start: spanner.Key{"A"}, -// End: spanner.Key{"D"}, -// } -// -// This range returns all users whose UserName begins with B: -// -// spanner.KeyRange{ -// Start: spanner.Key{"B"}, -// End: spanner.Key{"C"}, -// } -// -// Key ranges honor column sort order. For example, suppose a table is defined -// as follows: -// -// CREATE TABLE DescendingSortedTable { -// Key INT64, -// ... -// ) PRIMARY KEY(Key DESC); -// -// The following range retrieves all rows with key values between 1 and 100 -// inclusive: -// -// spanner.KeyRange{ -// Start: spanner.Key{100}, -// End: spanner.Key{1}, -// Kind: spanner.ClosedClosed, -// } -// -// Note that 100 is passed as the start, and 1 is passed as the end, because -// Key is a descending column in the schema. -type KeyRange struct { - // Start specifies the left boundary of the key range; End specifies - // the right boundary of the key range. - Start, End Key - - // Kind describes whether the boundaries of the key range include - // their keys. - Kind KeyRangeKind -} - -// String implements fmt.Stringer for KeyRange type. -func (r KeyRange) String() string { - var left, right string - switch r.Kind { - case ClosedClosed: - left, right = "[", "]" - case ClosedOpen: - left, right = "[", ")" - case OpenClosed: - left, right = "(", "]" - case OpenOpen: - left, right = "(", ")" - default: - left, right = "?", "?" - } - return fmt.Sprintf("%s%s,%s%s", left, r.Start, r.End, right) -} - -// proto converts KeyRange into sppb.KeyRange. -func (r KeyRange) proto() (*sppb.KeyRange, error) { - var err error - var start, end *proto3.ListValue - pb := &sppb.KeyRange{} - if start, err = r.Start.proto(); err != nil { - return nil, err - } - if end, err = r.End.proto(); err != nil { - return nil, err - } - if r.Kind == ClosedClosed || r.Kind == ClosedOpen { - pb.StartKeyType = &sppb.KeyRange_StartClosed{StartClosed: start} - } else { - pb.StartKeyType = &sppb.KeyRange_StartOpen{StartOpen: start} - } - if r.Kind == ClosedClosed || r.Kind == OpenClosed { - pb.EndKeyType = &sppb.KeyRange_EndClosed{EndClosed: end} - } else { - pb.EndKeyType = &sppb.KeyRange_EndOpen{EndOpen: end} - } - return pb, nil -} - -// keySetProto lets a KeyRange act as a KeySet. -func (r KeyRange) keySetProto() (*sppb.KeySet, error) { - rp, err := r.proto() - if err != nil { - return nil, err - } - return &sppb.KeySet{Ranges: []*sppb.KeyRange{rp}}, nil -} - -// A KeySet defines a collection of Cloud Spanner keys and/or key ranges. All -// the keys are expected to be in the same table or index. The keys need not be -// sorted in any particular way. -// -// An individual Key can act as a KeySet, as can a KeyRange. Use the KeySets -// function to create a KeySet consisting of multiple Keys and KeyRanges. To -// obtain an empty KeySet, call KeySets with no arguments. -// -// If the same key is specified multiple times in the set (for example if two -// ranges, two keys, or a key and a range overlap), the Cloud Spanner backend -// behaves as if the key were only specified once. -type KeySet interface { - keySetProto() (*sppb.KeySet, error) -} - -// AllKeys returns a KeySet that represents all Keys of a table or a index. -func AllKeys() KeySet { - return all{} -} - -type all struct{} - -func (all) keySetProto() (*sppb.KeySet, error) { - return &sppb.KeySet{All: true}, nil -} - -// KeySets returns the union of the KeySets. If any of the KeySets is AllKeys, -// then the resulting KeySet will be equivalent to AllKeys. -func KeySets(keySets ...KeySet) KeySet { - u := make(union, len(keySets)) - copy(u, keySets) - return u -} - -// KeySetFromKeys returns a KeySet containing the given slice of keys. -func KeySetFromKeys(keys ...Key) KeySet { - u := make(union, len(keys)) - for i, k := range keys { - u[i] = k - } - return u -} - -type union []KeySet - -func (u union) keySetProto() (*sppb.KeySet, error) { - upb := &sppb.KeySet{} - for _, ks := range u { - pb, err := ks.keySetProto() - if err != nil { - return nil, err - } - if pb.All { - return pb, nil - } - upb.Keys = append(upb.Keys, pb.Keys...) - upb.Ranges = append(upb.Ranges, pb.Ranges...) - } - return upb, nil -} diff --git a/vendor/cloud.google.com/go/spanner/metrics.go b/vendor/cloud.google.com/go/spanner/metrics.go deleted file mode 100644 index d37ccc2020..0000000000 --- a/vendor/cloud.google.com/go/spanner/metrics.go +++ /dev/null @@ -1,709 +0,0 @@ -/* -Copyright 2024 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "errors" - "fmt" - "hash/fnv" - "log" - "os" - "strconv" - "strings" - "time" - - "github.com/google/uuid" - "go.opentelemetry.io/contrib/detectors/gcp" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/noop" - sdkmetric "go.opentelemetry.io/otel/sdk/metric" - semconv "go.opentelemetry.io/otel/semconv/v1.24.0" - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/experimental/stats" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/stats/opentelemetry" - "google.golang.org/grpc/status" - - "cloud.google.com/go/spanner/internal" -) - -const ( - builtInMetricsMeterName = "gax-go" - grpcMetricMeterName = "grpc-go" - - nativeMetricsPrefix = "spanner.googleapis.com/internal/client/" - - // Monitored resource labels - monitoredResLabelKeyProject = "project_id" - monitoredResLabelKeyInstance = "instance_id" - monitoredResLabelKeyInstanceConfig = "instance_config" - monitoredResLabelKeyLocation = "location" - monitoredResLabelKeyClientHash = "client_hash" - - // Metric labels - metricLabelKeyClientUID = "client_uid" - metricLabelKeyClientName = "client_name" - metricLabelKeyDatabase = "database" - metricLabelKeyMethod = "method" - metricLabelKeyStatus = "status" - metricLabelKeyDirectPathEnabled = "directpath_enabled" - metricLabelKeyDirectPathUsed = "directpath_used" - metricLabelKeyGRPCLBPickResult = "grpc.lb.pick_result" - metricLabelKeyGRPCLBDataPlaneTarget = "grpc.lb.rls.data_plane_target" - - // Metric names - metricNameOperationLatencies = "operation_latencies" - metricNameAttemptLatencies = "attempt_latencies" - metricNameOperationCount = "operation_count" - metricNameAttemptCount = "attempt_count" - metricNameAFELatencies = "afe_latencies" - metricNameGFELatencies = "gfe_latencies" - metricNameGFEConnectivityErrorCount = "gfe_connectivity_error_count" - metricNameAFEConnectivityErrorCount = "afe_connectivity_error_count" - - // Metric units - metricUnitMS = "ms" - metricUnitCount = "1" -) - -// These are effectively const, but for testing purposes they are mutable -var ( - // duration between two metric exports - defaultSamplePeriod = 1 * time.Minute - - clientName = fmt.Sprintf("spanner-go/%v", internal.Version) - - bucketBounds = []float64{0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, - 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, - 25.0, 30.0, 40.0, 50.0, 65.0, 80.0, 100.0, 130.0, 160.0, 200.0, 250.0, 300.0, 400.0, 500.0, 650.0, - 800.0, 1000.0, 2000.0, 5000.0, 10000.0, 20000.0, 50000.0, 100000.0, 200000.0, - 400000.0, 800000.0, 1600000.0, 3200000.0} - - // All the built-in metrics have same attributes except 'status' and 'streaming' - // These attributes need to be added to only few of the metrics - metricsDetails = map[string]metricInfo{ - metricNameOperationCount: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: false, - }, - metricNameOperationLatencies: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: false, - }, - metricNameAttemptLatencies: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: true, - }, - metricNameAttemptCount: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: true, - }, - metricNameAFELatencies: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: true, - }, - metricNameGFELatencies: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: true, - }, - metricNameGFEConnectivityErrorCount: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: true, - }, - metricNameAFEConnectivityErrorCount: { - additionalAttrs: []string{ - metricLabelKeyStatus, - }, - recordedPerAttempt: true, - }, - } - - // Generates unique client ID in the format go-@ - generateClientUID = func() (string, error) { - hostname := "localhost" - hostname, err := os.Hostname() - if err != nil { - return "", err - } - return uuid.NewString() + "@" + strconv.FormatInt(int64(os.Getpid()), 10) + "@" + hostname, nil - } - - // generateClientHash generates a 6-digit zero-padded lowercase hexadecimal hash - // using the 10 most significant bits of a 64-bit hash value. - // - // The primary purpose of this function is to generate a hash value for the `client_hash` - // resource label using `client_uid` metric field. The range of values is chosen to be small - // enough to keep the cardinality of the Resource targets under control. Note: If at later time - // the range needs to be increased, it can be done by increasing the value of `kPrefixLength` to - // up to 24 bits without changing the format of the returned value. - generateClientHash = func(clientUID string) string { - if clientUID == "" { - return "000000" - } - - // Use FNV hash function to generate a 64-bit hash - hasher := fnv.New64() - hasher.Write([]byte(clientUID)) - hashValue := hasher.Sum64() - - // Extract the 10 most significant bits - // Shift right by 54 bits to get the 10 most significant bits - kPrefixLength := 10 - tenMostSignificantBits := hashValue >> (64 - kPrefixLength) - - // Format the result as a 6-digit zero-padded hexadecimal string - return fmt.Sprintf("%06x", tenMostSignificantBits) - } - - detectClientLocation = func(ctx context.Context) string { - resource, err := gcp.NewDetector().Detect(ctx) - if err != nil { - return "global" - } - for _, attr := range resource.Attributes() { - if attr.Key == semconv.CloudRegionKey { - return attr.Value.AsString() - } - } - // If region is not found, return global - return "global" - } - - // GCM exporter should use the same options as Spanner client - // createExporterOptions takes Spanner client options and returns exporter options - // Overwritten in tests - createExporterOptions = func(spannerOpts ...option.ClientOption) []option.ClientOption { - defaultMonitoringEndpoint := "monitoring.googleapis.com:443" - if os.Getenv("SPANNER_MONITORING_HOST") != "" { - defaultMonitoringEndpoint = os.Getenv("SPANNER_MONITORING_HOST") - } - // overwrite any Endpoint option - spannerOpts = append(spannerOpts, option.WithEndpoint(defaultMonitoringEndpoint)) - return spannerOpts - } - - grpcMetricsToEnable = []string{ - "grpc.lb.rls.default_target_picks", - "grpc.lb.rls.target_picks", - "grpc.xds_client.server_failure", - "grpc.xds_client.resource_updates_invalid", - "grpc.xds_client.resource_updates_valid", - } -) - -type metricInfo struct { - additionalAttrs []string - recordedPerAttempt bool -} - -// builtinMetricsTracerFactory is responsible for creating and managing metrics tracers. -type builtinMetricsTracerFactory struct { - enabled bool // Indicates if metrics tracing is enabled. - isDirectPathEnabled bool // Indicates if DirectPath is enabled. - isAFEBuiltInMetricEnabled bool - - // shutdown is a function to be called on client close to clean up resources. - shutdown func(ctx context.Context) - - // client options passed to gRPC channels - clientOpts []option.ClientOption - // clientAttributes are attributes specific to a client instance that do not change across different function calls on the client. - clientAttributes []attribute.KeyValue - - // Metrics instruments - operationLatencies metric.Float64Histogram // Histogram for operation latencies. - attemptLatencies metric.Float64Histogram // Histogram for attempt latencies. - gfeLatencies metric.Float64Histogram // Latency between Google's network receiving an RPC and reading back the first byte of the response - afeLatencies metric.Float64Histogram // Latency between Spanner API Frontend receiving an RPC and starting to write back the response. - gfeErrorCount metric.Int64Counter // Counter for the number of requests that failed to reach the Google network. - afeErrorCount metric.Int64Counter // Counter for the number of requests that failed to reach the Spanner API Frontend. - operationCount metric.Int64Counter // Counter for the number of operations. - attemptCount metric.Int64Counter // Counter for the number of attempts. -} - -func newBuiltinMetricsTracerFactory(ctx context.Context, dbpath, compression string, isAFEBuiltInMetricEnabled, isEnableGRPCBuiltInMetrics bool, metricsProvider metric.MeterProvider, opts ...option.ClientOption) (*builtinMetricsTracerFactory, error) { - clientUID, err := generateClientUID() - if err != nil { - log.Printf("built-in metrics: generateClientUID failed: %v. Using empty string in the %v metric atteribute", err, metricLabelKeyClientUID) - } - project, instance, database, err := parseDatabaseName(dbpath) - if err != nil { - return nil, err - } - - tracerFactory := &builtinMetricsTracerFactory{ - enabled: false, - clientAttributes: []attribute.KeyValue{ - attribute.String(monitoredResLabelKeyProject, project), - attribute.String(monitoredResLabelKeyInstance, instance), - attribute.String(metricLabelKeyDatabase, database), - attribute.String(metricLabelKeyClientUID, clientUID), - attribute.String(metricLabelKeyClientName, clientName), - attribute.String(monitoredResLabelKeyClientHash, generateClientHash(clientUID)), - // Skipping instance config until we have a way to get it - attribute.String(monitoredResLabelKeyInstanceConfig, "unknown"), - attribute.String(monitoredResLabelKeyLocation, detectClientLocation(ctx)), - }, - shutdown: func(ctx context.Context) {}, - } - tracerFactory.isAFEBuiltInMetricEnabled = isAFEBuiltInMetricEnabled - tracerFactory.isDirectPathEnabled = false - tracerFactory.enabled = false - var meterProvider *sdkmetric.MeterProvider - if metricsProvider == nil { - // Create default meter provider - mpOptions, exporter, err := builtInMeterProviderOptions(project, compression, tracerFactory.clientAttributes, opts...) - if err != nil { - return tracerFactory, err - } - meterProvider = sdkmetric.NewMeterProvider(mpOptions...) - - if isEnableGRPCBuiltInMetrics { - mo := opentelemetry.MetricsOptions{ - MeterProvider: meterProvider, - Metrics: stats.NewMetrics(grpcMetricsToEnable...), - } - - // Configure gRPC dial options to enable gRPC metrics collection and static method call option. - // The static method call option ensures consistent method names in metrics by preventing gRPC from - // automatically adding service prefixes to method names. This helps maintain consistent metric - // naming across different gRPC calls. - tracerFactory.clientOpts = []option.ClientOption{ - option.WithGRPCDialOption( - opentelemetry.DialOption(opentelemetry.Options{MetricsOptions: mo})), - option.WithGRPCDialOption( - grpc.WithDefaultCallOptions(grpc.StaticMethodCallOption{})), - } - } - tracerFactory.enabled = true - tracerFactory.shutdown = func(ctx context.Context) { - exporter.stop() - meterProvider.Shutdown(ctx) - } - } else { - switch metricsProvider.(type) { - case noop.MeterProvider: - return tracerFactory, nil - default: - return tracerFactory, errors.New("unknown MetricsProvider type") - } - } - - // Create meter and instruments - meter := meterProvider.Meter(builtInMetricsMeterName, metric.WithInstrumentationVersion(internal.Version)) - err = tracerFactory.createInstruments(meter) - return tracerFactory, err -} - -func builtInMeterProviderOptions(project, compression string, clientAttributes []attribute.KeyValue, opts ...option.ClientOption) ([]sdkmetric.Option, *monitoringExporter, error) { - allOpts := createExporterOptions(opts...) - defaultExporter, err := newMonitoringExporter(context.Background(), project, compression, clientAttributes, allOpts...) - if err != nil { - return nil, nil, err - } - var views []sdkmetric.View - for _, m := range grpcMetricsToEnable { - views = append(views, sdkmetric.NewView( - sdkmetric.Instrument{ - Name: m, - }, - sdkmetric.Stream{ - Aggregation: sdkmetric.AggregationSum{}, - AttributeFilter: func(kv attribute.KeyValue) bool { - if _, ok := allowedMetricLabels[string(kv.Key)]; ok { - return true - } - return false - }, - }, - )) - } - return []sdkmetric.Option{sdkmetric.WithReader( - sdkmetric.NewPeriodicReader( - defaultExporter, - sdkmetric.WithInterval(defaultSamplePeriod), - ), - ), sdkmetric.WithView(views...)}, defaultExporter, nil -} - -func (tf *builtinMetricsTracerFactory) createInstruments(meter metric.Meter) error { - var err error - - // Create operation_latencies - tf.operationLatencies, err = meter.Float64Histogram( - nativeMetricsPrefix+metricNameOperationLatencies, - metric.WithDescription("Total time until final operation success or failure, including retries and backoff."), - metric.WithUnit(metricUnitMS), - metric.WithExplicitBucketBoundaries(bucketBounds...), - ) - if err != nil { - return err - } - - // Create attempt_latencies - tf.attemptLatencies, err = meter.Float64Histogram( - nativeMetricsPrefix+metricNameAttemptLatencies, - metric.WithDescription("Client observed latency per RPC attempt."), - metric.WithUnit(metricUnitMS), - metric.WithExplicitBucketBoundaries(bucketBounds...), - ) - if err != nil { - return err - } - - tf.gfeLatencies, err = meter.Float64Histogram( - nativeMetricsPrefix+metricNameGFELatencies, - metric.WithDescription("Latency between Google's network receiving an RPC and reading back the first byte of the response."), - metric.WithUnit(metricUnitMS), - metric.WithExplicitBucketBoundaries(bucketBounds...), - ) - if err != nil { - return err - } - - tf.afeLatencies, err = meter.Float64Histogram( - nativeMetricsPrefix+metricNameAFELatencies, - metric.WithDescription("Latency between Spanner API Frontend receiving an RPC and starting to write back the response."), - metric.WithUnit(metricUnitMS), - metric.WithExplicitBucketBoundaries(bucketBounds...), - ) - if err != nil { - return err - } - - // Create operation_count - tf.operationCount, err = meter.Int64Counter( - nativeMetricsPrefix+metricNameOperationCount, - metric.WithDescription("The count of database operations."), - metric.WithUnit(metricUnitCount), - ) - if err != nil { - return err - } - - // Create attempt_count - tf.attemptCount, err = meter.Int64Counter( - nativeMetricsPrefix+metricNameAttemptCount, - metric.WithDescription("The number of attempts made for the operation, including the initial attempt."), - metric.WithUnit(metricUnitCount), - ) - - tf.gfeErrorCount, err = meter.Int64Counter( - nativeMetricsPrefix+metricNameGFEConnectivityErrorCount, - metric.WithDescription("Number of requests that failed to reach the Google network."), - metric.WithUnit(metricUnitCount), - ) - - tf.afeErrorCount, err = meter.Int64Counter( - nativeMetricsPrefix+metricNameAFEConnectivityErrorCount, - metric.WithDescription("Number of requests that failed to reach the Spanner API Frontend."), - metric.WithUnit(metricUnitCount), - ) - return err -} - -// builtinMetricsTracer is created one per operation. -// It is used to store metric instruments, attribute values, and other data required to obtain and record them. -type builtinMetricsTracer struct { - ctx context.Context // Context for the tracer. - builtInEnabled bool // Indicates if built-in metrics are enabled. - isAFEBuiltInMetricEnabled bool - - // clientAttributes are attributes specific to a client instance that do not change across different operations on the client. - clientAttributes []attribute.KeyValue - - // Metrics instruments - instrumentOperationLatencies metric.Float64Histogram // Histogram for operation latencies. - instrumentAttemptLatencies metric.Float64Histogram // Histogram for attempt latencies. - instrumentGFELatencies metric.Float64Histogram // Histogram for GFE latencies. - instrumentAFELatencies metric.Float64Histogram // Histogram for AFE latencies. - instrumentGFEErrorCount metric.Int64Counter // Counter for GFE connectivity errors. - instrumentAFEErrorCount metric.Int64Counter // Counter for AFE connectivity errors. - instrumentOperationCount metric.Int64Counter // Counter for the number of operations. - instrumentAttemptCount metric.Int64Counter // Counter for the number of attempts. - - method string // The method being traced. - - currOp *opTracer // The current operation tracer. -} - -// opTracer is used to record metrics for the entire operation, including retries. -// An operation is a logical unit that represents a single method invocation on the client. -// The method might require multiple attempts/RPCs and backoff logic to complete. -type opTracer struct { - attemptCount int64 // The number of attempts made for the operation. - startTime time.Time // The start time of the operation. - - // status is the gRPC status code of the last completed attempt. - status string - - directPathEnabled bool // Indicates if DirectPath is enabled for the operation. - - currAttempt *attemptTracer // The current attempt tracer. -} - -// attemptTracer is used to record metrics for a single attempt within an operation. -type attemptTracer struct { - startTime time.Time // The start time of the attempt. - status string // The gRPC status code of the attempt. - - directPathUsed bool // Indicates if DirectPath was used for the attempt. - serverTimingMetrics map[string]time.Duration -} - -// setStartTime sets the start time for the operation. -func (o *opTracer) setStartTime(t time.Time) { - o.startTime = t -} - -// setStartTime sets the start time for the attempt. -func (a *attemptTracer) setStartTime(t time.Time) { - a.startTime = t -} - -// setStatus sets the status for the operation. -func (o *opTracer) setStatus(s string) { - o.status = s -} - -// setStatus sets the status for the attempt. -func (a *attemptTracer) setStatus(s string) { - a.status = s -} - -// incrementAttemptCount increments the attempt count for the operation. -func (o *opTracer) incrementAttemptCount() { - o.attemptCount++ -} - -// setDirectPathUsed sets whether DirectPath was used for the attempt. -func (a *attemptTracer) setDirectPathUsed(ctx context.Context) { - peerInfo, ok := peer.FromContext(ctx) - if ok && peerInfo.Addr != nil { - remoteIP := peerInfo.Addr.String() - if strings.HasPrefix(remoteIP, directPathIPV4Prefix) || strings.HasPrefix(remoteIP, directPathIPV6Prefix) { - a.directPathUsed = true - } - } -} - -func (a *attemptTracer) setServerTimingMetrics(metrics map[string]time.Duration) { - a.serverTimingMetrics = metrics -} - -// setDirectPathEnabled sets whether DirectPath is enabled for the operation. -func (o *opTracer) setDirectPathEnabled(enabled bool) { - o.directPathEnabled = enabled -} - -func (tf *builtinMetricsTracerFactory) createBuiltinMetricsTracer(ctx context.Context) builtinMetricsTracer { - // Operation has started but not the attempt. - // So, create only operation tracer and not attempt tracer - currOpTracer := opTracer{} - currOpTracer.setStartTime(time.Now()) - currOpTracer.setDirectPathEnabled(tf.isDirectPathEnabled) - - return builtinMetricsTracer{ - ctx: ctx, - builtInEnabled: tf.enabled, - currOp: &currOpTracer, - clientAttributes: tf.clientAttributes, - isAFEBuiltInMetricEnabled: tf.isAFEBuiltInMetricEnabled, - - instrumentOperationLatencies: tf.operationLatencies, - instrumentAttemptLatencies: tf.attemptLatencies, - instrumentOperationCount: tf.operationCount, - instrumentAttemptCount: tf.attemptCount, - instrumentGFELatencies: tf.gfeLatencies, - instrumentAFELatencies: tf.afeLatencies, - instrumentGFEErrorCount: tf.gfeErrorCount, - instrumentAFEErrorCount: tf.afeErrorCount, - } -} - -// toOtelMetricAttrs: -// - converts metric attributes values captured throughout the operation / attempt -// to OpenTelemetry attributes format, -// - combines these with common client attributes and returns -func (mt *builtinMetricsTracer) toOtelMetricAttrs(metricName string) ([]attribute.KeyValue, error) { - if mt.currOp == nil || mt.currOp.currAttempt == nil { - return nil, fmt.Errorf("unable to create attributes list for unknown metric: %v", metricName) - } - // Get metric details - mDetails, found := metricsDetails[metricName] - if !found { - return nil, fmt.Errorf("unable to create attributes list for unknown metric: %v", metricName) - } - - rpcStatus := mt.currOp.status - if mDetails.recordedPerAttempt { - rpcStatus = mt.currOp.currAttempt.status - } - - return []attribute.KeyValue{ - attribute.String(metricLabelKeyMethod, strings.ReplaceAll(strings.TrimPrefix(mt.method, "/google.spanner.v1."), "/", ".")), - attribute.String(metricLabelKeyDirectPathEnabled, strconv.FormatBool(mt.currOp.directPathEnabled)), - attribute.String(metricLabelKeyDirectPathUsed, strconv.FormatBool(mt.currOp.currAttempt.directPathUsed)), - attribute.String(metricLabelKeyStatus, rpcStatus), - }, nil -} - -func (t *builtinMetricsTracer) recordGFELatency(latency time.Duration) { - if t.builtInEnabled { - attrs, err := t.toOtelMetricAttrs(metricNameGFELatencies) - if err != nil { - return - } - t.instrumentGFELatencies.Record(t.ctx, float64(latency.Milliseconds()), metric.WithAttributes(attrs...)) - } -} - -func (t *builtinMetricsTracer) recordAFELatency(latency time.Duration) { - if !t.isAFEBuiltInMetricEnabled { - return - } - attrs, err := t.toOtelMetricAttrs(metricNameAFELatencies) - if err != nil { - return - } - t.instrumentAFELatencies.Record(t.ctx, float64(latency.Milliseconds()), metric.WithAttributes(attrs...)) -} - -func (t *builtinMetricsTracer) recordGFEError() { - attrs, err := t.toOtelMetricAttrs(metricNameGFEConnectivityErrorCount) - if err != nil { - return - } - t.instrumentGFEErrorCount.Add(t.ctx, 1, metric.WithAttributes(attrs...)) -} - -func (t *builtinMetricsTracer) recordAFEError() { - if !t.isAFEBuiltInMetricEnabled { - return - } - attrs, err := t.toOtelMetricAttrs(metricNameAFEConnectivityErrorCount) - if err != nil { - return - } - t.instrumentAFEErrorCount.Add(t.ctx, 1, metric.WithAttributes(attrs...)) -} - -// Convert error to grpc status error -func convertToGrpcStatusErr(err error) (codes.Code, error) { - if err == nil { - return codes.OK, nil - } - - if errStatus, ok := status.FromError(err); ok { - return errStatus.Code(), status.Error(errStatus.Code(), errStatus.Message()) - } - - ctxStatus := status.FromContextError(err) - if ctxStatus.Code() != codes.Unknown { - return ctxStatus.Code(), status.Error(ctxStatus.Code(), ctxStatus.Message()) - } - - return codes.Unknown, err -} - -// recordAttemptCompletion records as many attempt specific metrics as it can -// Ignore errors seen while creating metric attributes since metric can still -// be recorded with rest of the attributes -func recordAttemptCompletion(mt *builtinMetricsTracer) { - if !mt.builtInEnabled { - return - } - // capture AFE metrics only if direct-path is enabled and used in current attempt - if mt.currOp.currAttempt.directPathUsed { - if dur, ok := mt.currOp.currAttempt.serverTimingMetrics[afeTimingHeader]; ok { - mt.recordAFELatency(dur) - } else { - mt.recordAFEError() - } - } else { - if dur, ok := mt.currOp.currAttempt.serverTimingMetrics[gfeTimingHeader]; ok { - mt.recordGFELatency(dur) - } else { - mt.recordGFEError() - } - } - - // Calculate elapsed time - elapsedTime := convertToMs(time.Since(mt.currOp.currAttempt.startTime)) - - // Record attempt_latencies - attemptLatAttrs, err := mt.toOtelMetricAttrs(metricNameAttemptLatencies) - if err != nil { - return - } - mt.instrumentAttemptLatencies.Record(mt.ctx, elapsedTime, metric.WithAttributes(attemptLatAttrs...)) -} - -// recordOperationCompletion records as many operation specific metrics as it can -// Ignores error seen while creating metric attributes since metric can still -// be recorded with rest of the attributes -func recordOperationCompletion(mt *builtinMetricsTracer) { - if !mt.builtInEnabled { - return - } - - // Calculate elapsed time - elapsedTimeMs := convertToMs(time.Since(mt.currOp.startTime)) - - // Record operation_count - opCntAttrs, err := mt.toOtelMetricAttrs(metricNameOperationCount) - if err != nil { - return - } - mt.instrumentOperationCount.Add(mt.ctx, 1, metric.WithAttributes(opCntAttrs...)) - - // Record operation_latencies - opLatAttrs, err := mt.toOtelMetricAttrs(metricNameOperationLatencies) - if err != nil { - return - } - mt.instrumentOperationLatencies.Record(mt.ctx, elapsedTimeMs, metric.WithAttributes(opLatAttrs...)) - - // Record attempt_count - attemptCntAttrs, err := mt.toOtelMetricAttrs(metricNameAttemptCount) - if err != nil { - return - } - mt.instrumentAttemptCount.Add(mt.ctx, mt.currOp.attemptCount, metric.WithAttributes(attemptCntAttrs...)) -} - -func convertToMs(d time.Duration) float64 { - return float64(d.Nanoseconds()) / float64(time.Millisecond) -} diff --git a/vendor/cloud.google.com/go/spanner/metrics_monitoring_exporter.go b/vendor/cloud.google.com/go/spanner/metrics_monitoring_exporter.go deleted file mode 100644 index 498c1c844f..0000000000 --- a/vendor/cloud.google.com/go/spanner/metrics_monitoring_exporter.go +++ /dev/null @@ -1,409 +0,0 @@ -/* -Copyright 2024 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// This is a modified version of https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/exporter/metric/v0.46.0/exporter/metric/metric.go - -package spanner - -import ( - "context" - "errors" - "fmt" - "math" - "reflect" - "strings" - "sync" - "time" - - monitoring "cloud.google.com/go/monitoring/apiv3/v2" - "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" - "cloud.google.com/go/spanner/internal" - "github.com/googleapis/gax-go/v2/callctx" - "go.opentelemetry.io/otel/attribute" - otelmetric "go.opentelemetry.io/otel/sdk/metric" - otelmetricdata "go.opentelemetry.io/otel/sdk/metric/metricdata" - "google.golang.org/api/option" - "google.golang.org/genproto/googleapis/api/distribution" - googlemetricpb "google.golang.org/genproto/googleapis/api/metric" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/encoding/gzip" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" -) - -const ( - spannerResourceType = "spanner_instance_client" - - // The number of timeserieses to send to Google Cloud Monitoring in a single request. This - // is a hard limit in the GCM API, so we never want to exceed 200. - // https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/create - sendBatchSize = 200 -) - -var ( - monitoredResLabelsSet = map[string]bool{ - monitoredResLabelKeyProject: true, - monitoredResLabelKeyInstance: true, - monitoredResLabelKeyInstanceConfig: true, - monitoredResLabelKeyLocation: true, - monitoredResLabelKeyClientHash: true, - } - - allowedMetricLabels = map[string]bool{ - metricLabelKeyGRPCLBPickResult: true, - metricLabelKeyGRPCLBDataPlaneTarget: true, - metricLabelKeyClientUID: true, - metricLabelKeyClientName: true, - metricLabelKeyDatabase: true, - metricLabelKeyDirectPathEnabled: true, - metricLabelKeyDirectPathUsed: true, - metricLabelKeyMethod: true, - metricLabelKeyStatus: true, - } - - errShutdown = fmt.Errorf("exporter is shutdown") -) - -type errUnexpectedAggregationKind struct { - kind string -} - -func (e errUnexpectedAggregationKind) Error() string { - return fmt.Sprintf("the metric kind is unexpected: %v", e.kind) -} - -// monitoringExporter is the implementation of OpenTelemetry metric exporter for -// Google Cloud Monitoring. -// Default exporter for built-in metrics -type monitoringExporter struct { - projectID string - compression string - clientAttributes []attribute.KeyValue - shutdown chan struct{} - client *monitoring.MetricClient - shutdownOnce sync.Once - - mu sync.Mutex - stopExport bool - lastExportedAt time.Time -} - -func newMonitoringExporter(ctx context.Context, project, compression string, clientAttributes []attribute.KeyValue, opts ...option.ClientOption) (*monitoringExporter, error) { - client, err := monitoring.NewMetricClient(ctx, opts...) - if err != nil { - return nil, err - } - return &monitoringExporter{ - projectID: project, - compression: compression, - clientAttributes: clientAttributes, - lastExportedAt: time.Now().Add(-time.Minute), - client: client, - shutdown: make(chan struct{}), - }, nil -} - -func (me *monitoringExporter) stop() { - // stop the exporter if last export happens within half-time of default sample period - me.mu.Lock() - defer me.mu.Unlock() - if time.Since(me.lastExportedAt) <= (defaultSamplePeriod / 2) { - me.stopExport = true - } -} - -// ForceFlush does nothing, the exporter holds no state. -func (e *monitoringExporter) ForceFlush(ctx context.Context) error { return ctx.Err() } - -// Shutdown shuts down the client connections. -func (e *monitoringExporter) Shutdown(ctx context.Context) error { - err := errShutdown - e.shutdownOnce.Do(func() { - close(e.shutdown) - err = errors.Join(ctx.Err(), e.client.Close()) - }) - return err -} - -// Export exports OpenTelemetry Metrics to Google Cloud Monitoring. -func (me *monitoringExporter) Export(ctx context.Context, rm *otelmetricdata.ResourceMetrics) error { - select { - case <-me.shutdown: - return errShutdown - default: - } - - me.mu.Lock() - if me.stopExport { - me.mu.Unlock() - return nil - } - me.mu.Unlock() - return me.exportTimeSeries(ctx, rm) -} - -// Temporality returns the Temporality to use for an instrument kind. -func (me *monitoringExporter) Temporality(ik otelmetric.InstrumentKind) otelmetricdata.Temporality { - return otelmetricdata.CumulativeTemporality -} - -// Aggregation returns the Aggregation to use for an instrument kind. -func (me *monitoringExporter) Aggregation(ik otelmetric.InstrumentKind) otelmetric.Aggregation { - return otelmetric.DefaultAggregationSelector(ik) -} - -// exportTimeSeries create TimeSeries from the records in cps. -// res should be the common resource among all TimeSeries, such as instance id, application name and so on. -func (me *monitoringExporter) exportTimeSeries(ctx context.Context, rm *otelmetricdata.ResourceMetrics) error { - tss, err := me.recordsToTimeSeriesPbs(rm) - if len(tss) == 0 { - return err - } - name := fmt.Sprintf("projects/%s", me.projectID) - ctx = callctx.SetHeaders(ctx, "x-goog-api-client", "gccl/"+internal.Version) - if me.compression == gzip.Name { - ctx = callctx.SetHeaders(ctx, requestsCompressionHeader, gzip.Name) - } - errs := []error{err} - for i := 0; i < len(tss); i += sendBatchSize { - j := i + sendBatchSize - if j >= len(tss) { - j = len(tss) - } - req := &monitoringpb.CreateTimeSeriesRequest{ - Name: name, - TimeSeries: tss[i:j], - } - err = me.client.CreateServiceTimeSeries(ctx, req) - if err != nil { - if status.Code(err) == codes.PermissionDenied { - err = fmt.Errorf("%w Need monitoring metric writer permission on project=%s. Follow https://cloud.google.com/spanner/docs/view-manage-client-side-metrics#access-client-side-metrics to set up permissions", - err, me.projectID) - } - } - errs = append(errs, err) - } - - me.mu.Lock() - me.lastExportedAt = time.Now() - me.mu.Unlock() - return errors.Join(errs...) -} - -// recordToMetricAndMonitoredResourcePbs converts data from records to Metric and Monitored resource proto type for Cloud Monitoring. -func (me *monitoringExporter) recordToMetricAndMonitoredResourcePbs(metrics otelmetricdata.Metrics, attributes attribute.Set) (*googlemetricpb.Metric, *monitoredrespb.MonitoredResource) { - mr := &monitoredrespb.MonitoredResource{ - Type: spannerResourceType, - Labels: map[string]string{}, - } - labels := make(map[string]string) - addAttributes := func(attr *attribute.Set) { - iter := attr.Iter() - for iter.Next() { - kv := iter.Attribute() - // Replace metric label names by converting "." to "_" since Cloud Monitoring does not - // support labels containing "." - labelKey := strings.Replace(string(kv.Key), ".", "_", -1) - if _, isResLabel := monitoredResLabelsSet[labelKey]; isResLabel { - mr.Labels[labelKey] = kv.Value.Emit() - } else { - if _, ok := allowedMetricLabels[string(kv.Key)]; ok { - labels[labelKey] = kv.Value.Emit() - } - } - } - for _, label := range me.clientAttributes { - if _, isResLabel := monitoredResLabelsSet[string(label.Key)]; isResLabel { - mr.Labels[string(label.Key)] = label.Value.Emit() - } else { - labels[string(label.Key)] = label.Value.Emit() - } - } - } - metricName := metrics.Name - if !strings.HasPrefix(metricName, nativeMetricsPrefix) { - metricName = nativeMetricsPrefix + strings.Replace(metricName, ".", "/", -1) - } - addAttributes(&attributes) - return &googlemetricpb.Metric{ - Type: metricName, - Labels: labels, - }, mr -} - -func (me *monitoringExporter) recordsToTimeSeriesPbs(rm *otelmetricdata.ResourceMetrics) ([]*monitoringpb.TimeSeries, error) { - var ( - tss []*monitoringpb.TimeSeries - errs []error - ) - for _, scope := range rm.ScopeMetrics { - if !(scope.Scope.Name == builtInMetricsMeterName || scope.Scope.Name == grpcMetricMeterName) { - continue - } - for _, metrics := range scope.Metrics { - ts, err := me.recordToTimeSeriesPb(metrics) - errs = append(errs, err) - tss = append(tss, ts...) - } - } - - return tss, errors.Join(errs...) -} - -// recordToTimeSeriesPb converts record to TimeSeries proto type with common resource. -// ref. https://cloud.google.com/monitoring/api/ref_v3/rest/v3/TimeSeries -func (me *monitoringExporter) recordToTimeSeriesPb(m otelmetricdata.Metrics) ([]*monitoringpb.TimeSeries, error) { - var tss []*monitoringpb.TimeSeries - var errs []error - if m.Data == nil { - return nil, nil - } - switch a := m.Data.(type) { - case otelmetricdata.Histogram[float64]: - for _, point := range a.DataPoints { - metric, mr := me.recordToMetricAndMonitoredResourcePbs(m, point.Attributes) - ts, err := histogramToTimeSeries(point, m, mr) - if err != nil { - errs = append(errs, err) - continue - } - ts.Metric = metric - tss = append(tss, ts) - } - case otelmetricdata.Sum[int64]: - for _, point := range a.DataPoints { - metric, mr := me.recordToMetricAndMonitoredResourcePbs(m, point.Attributes) - var ts *monitoringpb.TimeSeries - var err error - ts, err = sumToTimeSeries[int64](point, m, mr) - if err != nil { - errs = append(errs, err) - continue - } - ts.Metric = metric - tss = append(tss, ts) - } - default: - errs = append(errs, errUnexpectedAggregationKind{kind: reflect.TypeOf(m.Data).String()}) - } - return tss, errors.Join(errs...) -} - -func sumToTimeSeries[N int64 | float64](point otelmetricdata.DataPoint[N], metrics otelmetricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { - interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) - if err != nil { - return nil, err - } - value, valueType := numberDataPointToValue[N](point) - return &monitoringpb.TimeSeries{ - Resource: mr, - Unit: string(metrics.Unit), - MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, - ValueType: valueType, - Points: []*monitoringpb.Point{{ - Interval: interval, - Value: value, - }}, - }, nil -} - -func histogramToTimeSeries[N int64 | float64](point otelmetricdata.HistogramDataPoint[N], metrics otelmetricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { - interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) - if err != nil { - return nil, err - } - distributionValue := histToDistribution(point) - return &monitoringpb.TimeSeries{ - Resource: mr, - Unit: string(metrics.Unit), - MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, - ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, - Points: []*monitoringpb.Point{{ - Interval: interval, - Value: &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_DistributionValue{ - DistributionValue: distributionValue, - }, - }, - }}, - }, nil -} - -func toNonemptyTimeIntervalpb(start, end time.Time) (*monitoringpb.TimeInterval, error) { - // The end time of a new interval must be at least a millisecond after the end time of the - // previous interval, for all non-gauge types. - // https://cloud.google.com/monitoring/api/ref_v3/rpc/google.monitoring.v3#timeinterval - if end.Sub(start).Milliseconds() <= 1 { - end = start.Add(time.Millisecond) - } - startpb := timestamppb.New(start) - endpb := timestamppb.New(end) - err := errors.Join( - startpb.CheckValid(), - endpb.CheckValid(), - ) - if err != nil { - return nil, err - } - - return &monitoringpb.TimeInterval{ - StartTime: startpb, - EndTime: endpb, - }, nil -} - -func histToDistribution[N int64 | float64](hist otelmetricdata.HistogramDataPoint[N]) *distribution.Distribution { - counts := make([]int64, len(hist.BucketCounts)) - for i, v := range hist.BucketCounts { - counts[i] = int64(v) - } - var mean float64 - if !math.IsNaN(float64(hist.Sum)) && hist.Count > 0 { // Avoid divide-by-zero - mean = float64(hist.Sum) / float64(hist.Count) - } - return &distribution.Distribution{ - Count: int64(hist.Count), - Mean: mean, - BucketCounts: counts, - BucketOptions: &distribution.Distribution_BucketOptions{ - Options: &distribution.Distribution_BucketOptions_ExplicitBuckets{ - ExplicitBuckets: &distribution.Distribution_BucketOptions_Explicit{ - Bounds: hist.Bounds, - }, - }, - }, - } -} - -func numberDataPointToValue[N int64 | float64]( - point otelmetricdata.DataPoint[N], -) (*monitoringpb.TypedValue, googlemetricpb.MetricDescriptor_ValueType) { - switch v := any(point.Value).(type) { - case int64: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: v, - }}, - googlemetricpb.MetricDescriptor_INT64 - case float64: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ - DoubleValue: v, - }}, - googlemetricpb.MetricDescriptor_DOUBLE - } - // It is impossible to reach this statement - return nil, googlemetricpb.MetricDescriptor_INT64 -} diff --git a/vendor/cloud.google.com/go/spanner/mutation.go b/vendor/cloud.google.com/go/spanner/mutation.go deleted file mode 100644 index eccae26b9d..0000000000 --- a/vendor/cloud.google.com/go/spanner/mutation.go +++ /dev/null @@ -1,522 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "fmt" - "math/rand" - "reflect" - "time" - - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "google.golang.org/grpc/codes" - proto3 "google.golang.org/protobuf/types/known/structpb" -) - -// op is the mutation operation. -type op int - -const ( - // opDelete removes a row from a table. Succeeds whether or not the - // key was present. - opDelete op = iota - // opInsert inserts a row into a table. If the row already exists, the - // write or transaction fails. - opInsert - // opInsertOrUpdate inserts a row into a table. If the row already - // exists, it updates it instead. Any column values not explicitly - // written are preserved. - opInsertOrUpdate - // opReplace inserts a row into a table, deleting any existing row. - // Unlike InsertOrUpdate, this means any values not explicitly written - // become NULL. - opReplace - // opUpdate updates a row in a table. If the row does not already - // exist, the write or transaction fails. - opUpdate -) - -// A Mutation describes a modification to one or more Cloud Spanner rows. The -// mutation represents an insert, update, delete, etc on a table. -// -// Many mutations can be applied in a single atomic commit. For purposes of -// constraint checking (such as foreign key constraints), the operations can be -// viewed as applying in the same order as the mutations are provided (so that, -// e.g., a row and its logical "child" can be inserted in the same commit). -// -// The Apply function applies series of mutations. For example, -// -// m := spanner.Insert("User", -// []string{"user_id", "profile"}, -// []interface{}{UserID, profile}) -// _, err := client.Apply(ctx, []*spanner.Mutation{m}) -// -// inserts a new row into the User table. The primary key -// for the new row is UserID (presuming that "user_id" has been declared as the -// primary key of the "User" table). -// -// To apply a series of mutations as part of an atomic read-modify-write -// operation, use ReadWriteTransaction. -// -// # Updating a row -// -// Changing the values of columns in an existing row is very similar to -// inserting a new row: -// -// m := spanner.Update("User", -// []string{"user_id", "profile"}, -// []interface{}{UserID, profile}) -// _, err := client.Apply(ctx, []*spanner.Mutation{m}) -// -// # Deleting a row -// -// To delete a row, use spanner.Delete: -// -// m := spanner.Delete("User", spanner.Key{UserId}) -// _, err := client.Apply(ctx, []*spanner.Mutation{m}) -// -// spanner.Delete accepts a KeySet, so you can also pass in a KeyRange, or use -// the spanner.KeySets function to build any combination of Keys and KeyRanges. -// -// Note that deleting a row in a table may also delete rows from other tables -// if cascading deletes are specified in those tables' schemas. Delete does -// nothing if the named row does not exist (does not yield an error). -// -// # Deleting a field -// -// To delete/clear a field within a row, use spanner.Update with the value nil: -// -// m := spanner.Update("User", -// []string{"user_id", "profile"}, -// []interface{}{UserID, nil}) -// _, err := client.Apply(ctx, []*spanner.Mutation{m}) -// -// The valid Go types and their corresponding Cloud Spanner types that can be -// used in the Insert/Update/InsertOrUpdate functions are: -// -// string, *string, NullString - STRING -// []string, []*string, []NullString - STRING ARRAY -// []byte - BYTES -// [][]byte - BYTES ARRAY -// int, int64, *int64, NullInt64 - INT64 -// []int, []int64, []*int64, []NullInt64 - INT64 ARRAY -// bool, *bool, NullBool - BOOL -// []bool, []*bool, []NullBool - BOOL ARRAY -// float64, *float64, NullFloat64 - FLOAT64 -// []float64, []*float64, []NullFloat64 - FLOAT64 ARRAY -// time.Time, *time.Time, NullTime - TIMESTAMP -// []time.Time, []*time.Time, []NullTime - TIMESTAMP ARRAY -// Date, *Date, NullDate - DATE -// []Date, []*Date, []NullDate - DATE ARRAY -// big.Rat, *big.Rat, NullNumeric - NUMERIC -// []big.Rat, []*big.Rat, []NullNumeric - NUMERIC ARRAY -// -// To compare two Mutations for testing purposes, use reflect.DeepEqual. -type Mutation struct { - // op is the operation type of the mutation. - // See documentation for spanner.op for more details. - op op - // Table is the name of the target table to be modified. - table string - // keySet is a set of primary keys that names the rows - // in a delete operation. - keySet KeySet - // columns names the set of columns that are going to be - // modified by Insert, InsertOrUpdate, Replace or Update - // operations. - columns []string - // values specifies the new values for the target columns - // named by Columns. - values []interface{} - - // wrapped is the protobuf mutation that is the source for this Mutation. - // This is only set if the [WrapMutation] function was used to create the Mutation. - wrapped *sppb.Mutation -} - -// A MutationGroup is a list of Mutation to be committed atomically. -type MutationGroup struct { - // The Mutations in this group - Mutations []*Mutation -} - -// mapToMutationParams converts Go map into mutation parameters. -func mapToMutationParams(in map[string]interface{}) ([]string, []interface{}) { - cols := []string{} - vals := []interface{}{} - for k, v := range in { - cols = append(cols, k) - vals = append(vals, v) - } - return cols, vals -} - -// errNotStruct returns error for not getting a go struct type. -func errNotStruct(in interface{}) error { - return spannerErrorf(codes.InvalidArgument, "%T is not a go struct type", in) -} - -// structToMutationParams converts Go struct into mutation parameters. -// If the input is not a valid Go struct type, structToMutationParams -// returns error. -func structToMutationParams(in interface{}) ([]string, []interface{}, error) { - if in == nil { - return nil, nil, errNotStruct(in) - } - v := reflect.ValueOf(in) - t := v.Type() - if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct { - // t is a pointer to a struct. - if v.IsNil() { - // Return empty results. - return nil, nil, nil - } - // Get the struct value that in points to. - v = v.Elem() - t = t.Elem() - } - if t.Kind() != reflect.Struct { - return nil, nil, errNotStruct(in) - } - fields, err := fieldCache.Fields(t) - if err != nil { - return nil, nil, ToSpannerError(err) - } - var cols []string - var vals []interface{} - for _, f := range fields { - cols = append(cols, f.Name) - vals = append(vals, v.FieldByIndex(f.Index).Interface()) - } - return cols, vals, nil -} - -// Insert returns a Mutation to insert a row into a table. If the row already -// exists, the write or transaction fails with codes.AlreadyExists. -func Insert(table string, cols []string, vals []interface{}) *Mutation { - return &Mutation{ - op: opInsert, - table: table, - columns: cols, - values: vals, - } -} - -// InsertMap returns a Mutation to insert a row into a table, specified by -// a map of column name to value. If the row already exists, the write or -// transaction fails with codes.AlreadyExists. -func InsertMap(table string, in map[string]interface{}) *Mutation { - cols, vals := mapToMutationParams(in) - return Insert(table, cols, vals) -} - -// InsertStruct returns a Mutation to insert a row into a table, specified by -// a Go struct. If the row already exists, the write or transaction fails with -// codes.AlreadyExists. -// -// The in argument must be a struct or a pointer to a struct. Its exported -// fields specify the column names and values. Use a field tag like `spanner:"name"` -// to provide an alternative column name, or use `spanner:"-"` to ignore the field. -func InsertStruct(table string, in interface{}) (*Mutation, error) { - cols, vals, err := structToMutationParams(in) - if err != nil { - return nil, err - } - return Insert(table, cols, vals), nil -} - -// Update returns a Mutation to update a row in a table. If the row does not -// already exist, the write or transaction fails. -func Update(table string, cols []string, vals []interface{}) *Mutation { - return &Mutation{ - op: opUpdate, - table: table, - columns: cols, - values: vals, - } -} - -// UpdateMap returns a Mutation to update a row in a table, specified by -// a map of column to value. If the row does not already exist, the write or -// transaction fails. -func UpdateMap(table string, in map[string]interface{}) *Mutation { - cols, vals := mapToMutationParams(in) - return Update(table, cols, vals) -} - -// UpdateStruct returns a Mutation to update a row in a table, specified by a Go -// struct. If the row does not already exist, the write or transaction fails. -func UpdateStruct(table string, in interface{}) (*Mutation, error) { - cols, vals, err := structToMutationParams(in) - if err != nil { - return nil, err - } - return Update(table, cols, vals), nil -} - -// InsertOrUpdate returns a Mutation to insert a row into a table. If the row -// already exists, it updates it instead. Any column values not explicitly -// written are preserved. -// -// For a similar example, See Update. -func InsertOrUpdate(table string, cols []string, vals []interface{}) *Mutation { - return &Mutation{ - op: opInsertOrUpdate, - table: table, - columns: cols, - values: vals, - } -} - -// InsertOrUpdateMap returns a Mutation to insert a row into a table, -// specified by a map of column to value. If the row already exists, it -// updates it instead. Any column values not explicitly written are preserved. -// -// For a similar example, See UpdateMap. -func InsertOrUpdateMap(table string, in map[string]interface{}) *Mutation { - cols, vals := mapToMutationParams(in) - return InsertOrUpdate(table, cols, vals) -} - -// InsertOrUpdateStruct returns a Mutation to insert a row into a table, -// specified by a Go struct. If the row already exists, it updates it instead. -// Any column values not explicitly written are preserved. -// -// The in argument must be a struct or a pointer to a struct. Its exported -// fields specify the column names and values. Use a field tag like -// `spanner:"name"` to provide an alternative column name, or use `spanner:"-"` to -// ignore the field. -// -// For a similar example, See UpdateStruct. -func InsertOrUpdateStruct(table string, in interface{}) (*Mutation, error) { - cols, vals, err := structToMutationParams(in) - if err != nil { - return nil, err - } - return InsertOrUpdate(table, cols, vals), nil -} - -// Replace returns a Mutation to insert a row into a table, deleting any -// existing row. Unlike InsertOrUpdate, this means any values not explicitly -// written become NULL. -// -// For a similar example, See Update. -func Replace(table string, cols []string, vals []interface{}) *Mutation { - return &Mutation{ - op: opReplace, - table: table, - columns: cols, - values: vals, - } -} - -// ReplaceMap returns a Mutation to insert a row into a table, deleting any -// existing row. Unlike InsertOrUpdateMap, this means any values not explicitly -// written become NULL. The row is specified by a map of column to value. -// -// For a similar example, See UpdateMap. -func ReplaceMap(table string, in map[string]interface{}) *Mutation { - cols, vals := mapToMutationParams(in) - return Replace(table, cols, vals) -} - -// ReplaceStruct returns a Mutation to insert a row into a table, deleting any -// existing row. Unlike InsertOrUpdateMap, this means any values not explicitly -// written become NULL. The row is specified by a Go struct. -// -// The in argument must be a struct or a pointer to a struct. Its exported -// fields specify the column names and values. Use a field tag like `spanner:"name"` -// to provide an alternative column name, or use `spanner:"-"` to ignore the field. -// -// For a similar example, See UpdateStruct. -func ReplaceStruct(table string, in interface{}) (*Mutation, error) { - cols, vals, err := structToMutationParams(in) - if err != nil { - return nil, err - } - return Replace(table, cols, vals), nil -} - -// Delete removes the rows described by the KeySet from the table. It succeeds -// whether or not the keys were present. -func Delete(table string, ks KeySet) *Mutation { - return &Mutation{ - op: opDelete, - table: table, - keySet: ks, - } -} - -// WrapMutation creates a mutation that wraps an existing protobuf mutation object. -func WrapMutation(proto *sppb.Mutation) (*Mutation, error) { - if proto == nil { - return nil, fmt.Errorf("protobuf mutation may not be nil") - } - op, table, err := getTableAndSpannerOperation(proto) - if err != nil { - return nil, err - } - return &Mutation{ - op: op, - table: table, - wrapped: proto, - }, nil -} - -func getTableAndSpannerOperation(proto *sppb.Mutation) (op, string, error) { - if proto.GetInsert() != nil { - return opInsert, proto.GetInsert().Table, nil - } else if proto.GetUpdate() != nil { - return opUpdate, proto.GetUpdate().Table, nil - } else if proto.GetReplace() != nil { - return opReplace, proto.GetReplace().Table, nil - } else if proto.GetDelete() != nil { - return opDelete, proto.GetDelete().Table, nil - } else if proto.GetInsertOrUpdate() != nil { - return opInsertOrUpdate, proto.GetInsertOrUpdate().Table, nil - } - return 0, "", spannerErrorf(codes.InvalidArgument, "unknown op type: %d", proto.Operation) -} - -// prepareWrite generates sppb.Mutation_Write from table name, column names -// and new column values. -func prepareWrite(table string, columns []string, vals []interface{}) (*sppb.Mutation_Write, error) { - v, err := encodeValueArray(vals) - if err != nil { - return nil, err - } - return &sppb.Mutation_Write{ - Table: table, - Columns: columns, - Values: []*proto3.ListValue{v}, - }, nil -} - -// errInvdMutationOp returns error for unrecognized mutation operation. -func errInvdMutationOp(m Mutation) error { - return spannerErrorf(codes.InvalidArgument, "Unknown op type: %d", m.op) -} - -// proto converts a spanner.Mutation to sppb.Mutation, in preparation to send -// RPCs. -func (m Mutation) proto() (*sppb.Mutation, error) { - if m.wrapped != nil { - return m.wrapped, nil - } - - var pb *sppb.Mutation - switch m.op { - case opDelete: - var kp *sppb.KeySet - if m.keySet != nil { - var err error - kp, err = m.keySet.keySetProto() - if err != nil { - return nil, err - } - } - pb = &sppb.Mutation{ - Operation: &sppb.Mutation_Delete_{ - Delete: &sppb.Mutation_Delete{ - Table: m.table, - KeySet: kp, - }, - }, - } - case opInsert: - w, err := prepareWrite(m.table, m.columns, m.values) - if err != nil { - return nil, err - } - pb = &sppb.Mutation{Operation: &sppb.Mutation_Insert{Insert: w}} - case opInsertOrUpdate: - w, err := prepareWrite(m.table, m.columns, m.values) - if err != nil { - return nil, err - } - pb = &sppb.Mutation{Operation: &sppb.Mutation_InsertOrUpdate{InsertOrUpdate: w}} - case opReplace: - w, err := prepareWrite(m.table, m.columns, m.values) - if err != nil { - return nil, err - } - pb = &sppb.Mutation{Operation: &sppb.Mutation_Replace{Replace: w}} - case opUpdate: - w, err := prepareWrite(m.table, m.columns, m.values) - if err != nil { - return nil, err - } - pb = &sppb.Mutation{Operation: &sppb.Mutation_Update{Update: w}} - default: - return nil, errInvdMutationOp(m) - } - return pb, nil -} - -// mutationsProto turns a spanner.Mutation array into a sppb.Mutation array, -// it is convenient for sending batch mutations to Cloud Spanner. -func mutationsProto(ms []*Mutation) ([]*sppb.Mutation, *sppb.Mutation, error) { - var selectedMutation *Mutation - var nonInsertMutations []*Mutation - - l := make([]*sppb.Mutation, 0, len(ms)) - for _, m := range ms { - if m.op != opInsert { - nonInsertMutations = append(nonInsertMutations, m) - } - if selectedMutation == nil { - selectedMutation = m - } - // Track the INSERT mutation with the highest number of values if only INSERT mutation were found - if selectedMutation.op == opInsert && m.op == opInsert && len(m.values) > len(selectedMutation.values) { - selectedMutation = m - } - - // Convert the mutation to sppb.Mutation and add to the list - pb, err := m.proto() - if err != nil { - return nil, nil, err - } - l = append(l, pb) - } - if len(nonInsertMutations) > 0 { - selectedMutation = nonInsertMutations[rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(nonInsertMutations))] - } - if selectedMutation != nil { - m, err := selectedMutation.proto() - if err != nil { - return nil, nil, err - } - return l, m, nil - } - - return l, nil, nil -} - -// mutationGroupsProto turns a spanner.MutationGroup array into a -// sppb.BatchWriteRequest_MutationGroup array, in preparation to send RPCs. -func mutationGroupsProto(mgs []*MutationGroup) ([]*sppb.BatchWriteRequest_MutationGroup, error) { - gs := make([]*sppb.BatchWriteRequest_MutationGroup, 0, len(mgs)) - for _, mg := range mgs { - ms, _, err := mutationsProto(mg.Mutations) - if err != nil { - return nil, err - } - gs = append(gs, &sppb.BatchWriteRequest_MutationGroup{Mutations: ms}) - } - return gs, nil -} diff --git a/vendor/cloud.google.com/go/spanner/ot_metrics.go b/vendor/cloud.google.com/go/spanner/ot_metrics.go deleted file mode 100644 index ecef1f46e8..0000000000 --- a/vendor/cloud.google.com/go/spanner/ot_metrics.go +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import ( - "context" - "log" - "sync" - - "cloud.google.com/go/spanner/internal" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/trace" - "google.golang.org/grpc/metadata" -) - -// OtInstrumentationScope is the instrumentation name that will be associated with the emitted telemetry. -const OtInstrumentationScope = "cloud.google.com/go" -const metricsPrefix = "spanner/" - -var ( - attributeKeyClientID = attribute.Key("client_id") - attributeKeyDatabase = attribute.Key("database") - attributeKeyInstance = attribute.Key("instance_id") - attributeKeyLibVersion = attribute.Key("library_version") - attributeKeyType = attribute.Key("type") - attributeKeyMethod = attribute.Key("grpc_client_method") - attributeKeyIsMultiplexed = attribute.Key("is_multiplexed") - - attributeNumInUseSessions = attributeKeyType.String("num_in_use_sessions") - attributeNumSessions = attributeKeyType.String("num_sessions") - // openTelemetryMetricsEnabled is used to track if OpenTelemetry Metrics need to be recorded - openTelemetryMetricsEnabled = false - // mutex to avoid data race in reading/writing the above flag - otMu = sync.RWMutex{} -) - -func createOpenTelemetryConfig(ctx context.Context, mp metric.MeterProvider, logger *log.Logger, sessionClientID string, db string) (*openTelemetryConfig, error) { - // Important: snapshot the value of the global variable to ensure a - // consistent value for the lifetime of this client. - enabled := IsOpenTelemetryMetricsEnabled() - _, instance, database, err := parseDatabaseName(db) - if err != nil { - return nil, err - } - config := &openTelemetryConfig{ - enabled: enabled, - attributeMap: []attribute.KeyValue{}, - commonTraceStartOptions: []trace.SpanStartOption{ - trace.WithAttributes( - attribute.String("db.name", database), - attribute.String("instance.name", instance), - attribute.String("cloud.region", detectClientLocation(ctx)), - attribute.String("gcp.client.version", internal.Version), - attribute.String("gcp.client.repo", gcpClientRepo), - attribute.String("gcp.client.artifact", gcpClientArtifact), - ), - }, - } - if !enabled { - return config, nil - } - - // Construct attributes for Metrics - attributeMap := []attribute.KeyValue{ - attributeKeyClientID.String(sessionClientID), - attributeKeyDatabase.String(database), - attributeKeyInstance.String(instance), - attributeKeyLibVersion.String(internal.Version), - } - config.attributeMap = append(config.attributeMap, attributeMap...) - - config.attributeMapWithMultiplexed = append(config.attributeMapWithMultiplexed, attributeMap...) - config.attributeMapWithMultiplexed = append(config.attributeMapWithMultiplexed, attributeKeyIsMultiplexed.String("true")) - - config.attributeMapWithoutMultiplexed = append(config.attributeMapWithoutMultiplexed, attributeMap...) - config.attributeMapWithoutMultiplexed = append(config.attributeMapWithoutMultiplexed, attributeKeyIsMultiplexed.String("false")) - setOpenTelemetryMetricProvider(config, mp, logger) - return config, nil -} - -func setOpenTelemetryMetricProvider(config *openTelemetryConfig, mp metric.MeterProvider, logger *log.Logger) { - // Fallback to global meter provider in OpenTelemetry - if mp == nil { - mp = otel.GetMeterProvider() - } - config.meterProvider = mp - initializeMetricInstruments(config, logger) -} - -func initializeMetricInstruments(config *openTelemetryConfig, logger *log.Logger) { - if !config.enabled { - return - } - meter := config.meterProvider.Meter(OtInstrumentationScope, metric.WithInstrumentationVersion(internal.Version)) - - openSessionCountInstrument, err := meter.Int64ObservableGauge( - metricsPrefix+"open_session_count", - metric.WithDescription("Number of sessions currently opened"), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/open_session_count, error: %v", err) - } - config.openSessionCount = openSessionCountInstrument - - maxAllowedSessionsCountInstrument, err := meter.Int64ObservableGauge( - metricsPrefix+"max_allowed_sessions", - metric.WithDescription("The maximum number of sessions allowed. Configurable by the user."), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/max_allowed_sessions, error: %v", err) - } - config.maxAllowedSessionsCount = maxAllowedSessionsCountInstrument - - sessionsCountInstrument, _ := meter.Int64ObservableGauge( - metricsPrefix+"num_sessions_in_pool", - metric.WithDescription("The number of sessions currently in use."), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/num_sessions_in_pool, error: %v", err) - } - config.sessionsCount = sessionsCountInstrument - - maxInUseSessionsCountInstrument, err := meter.Int64ObservableGauge( - metricsPrefix+"max_in_use_sessions", - metric.WithDescription("The maximum number of sessions in use during the last 10 minute interval."), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/max_in_use_sessions, error: %v", err) - } - config.maxInUseSessionsCount = maxInUseSessionsCountInstrument - - getSessionTimeoutsCountInstrument, err := meter.Int64Counter( - metricsPrefix+"get_session_timeouts", - metric.WithDescription("The number of get sessions timeouts due to pool exhaustion."), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/get_session_timeouts, error: %v", err) - } - config.getSessionTimeoutsCount = getSessionTimeoutsCountInstrument - - acquiredSessionsCountInstrument, err := meter.Int64Counter( - metricsPrefix+"num_acquired_sessions", - metric.WithDescription("The number of sessions acquired from the session pool."), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/num_acquired_sessions, error: %v", err) - } - config.acquiredSessionsCount = acquiredSessionsCountInstrument - - releasedSessionsCountInstrument, err := meter.Int64Counter( - metricsPrefix+"num_released_sessions", - metric.WithDescription("The number of sessions released by the user and pool maintainer."), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/num_released_sessions, error: %v", err) - } - config.releasedSessionsCount = releasedSessionsCountInstrument - - gfeLatencyInstrument, err := meter.Int64Histogram( - metricsPrefix+"gfe_latency", - metric.WithDescription("Latency between Google's network receiving an RPC and reading back the first byte of the response"), - metric.WithUnit("ms"), - metric.WithExplicitBucketBoundaries(0.0, 0.01, 0.05, 0.1, 0.3, 0.6, 0.8, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 13.0, - 16.0, 20.0, 25.0, 30.0, 40.0, 50.0, 65.0, 80.0, 100.0, 130.0, 160.0, 200.0, 250.0, - 300.0, 400.0, 500.0, 650.0, 800.0, 1000.0, 2000.0, 5000.0, 10000.0, 20000.0, 50000.0, - 100000.0), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/gfe_latency, error: %v", err) - } - config.gfeLatency = gfeLatencyInstrument - - gfeHeaderMissingCountInstrument, err := meter.Int64Counter( - metricsPrefix+"gfe_header_missing_count", - metric.WithDescription("Number of RPC responses received without the server-timing header, most likely means that the RPC never reached Google's network"), - metric.WithUnit("1"), - ) - if err != nil { - logf(logger, "Error during registering instrument for metric spanner/gfe_header_missing_count, error: %v", err) - } - config.gfeHeaderMissingCount = gfeHeaderMissingCountInstrument -} - -func registerSessionPoolOTMetrics(pool *sessionPool) error { - otConfig := pool.otConfig - if otConfig == nil || !otConfig.enabled { - return nil - } - - attributes := otConfig.attributeMap - attributesInUseSessions := append(attributes, attributeNumInUseSessions) - attributesAvailableSessions := append(attributes, attributeNumSessions) - - reg, err := otConfig.meterProvider.Meter(OtInstrumentationScope, metric.WithInstrumentationVersion(internal.Version)).RegisterCallback( - func(ctx context.Context, o metric.Observer) error { - pool.mu.Lock() - defer pool.mu.Unlock() - if pool.multiplexedSession != nil { - o.ObserveInt64(otConfig.openSessionCount, int64(1), metric.WithAttributes(otConfig.attributeMapWithMultiplexed...)) - } - o.ObserveInt64(otConfig.openSessionCount, int64(pool.numOpened), metric.WithAttributes(attributes...)) - o.ObserveInt64(otConfig.maxAllowedSessionsCount, int64(pool.SessionPoolConfig.MaxOpened), metric.WithAttributes(attributes...)) - o.ObserveInt64(otConfig.sessionsCount, int64(pool.numInUse), metric.WithAttributes(append(attributesInUseSessions, attribute.Key("is_multiplexed").String("false"))...)) - o.ObserveInt64(otConfig.sessionsCount, int64(pool.numSessions), metric.WithAttributes(attributesAvailableSessions...)) - o.ObserveInt64(otConfig.maxInUseSessionsCount, int64(pool.maxNumInUse), metric.WithAttributes(append(attributes, attribute.Key("is_multiplexed").String("false"))...)) - return nil - }, - otConfig.openSessionCount, - otConfig.maxAllowedSessionsCount, - otConfig.sessionsCount, - otConfig.maxInUseSessionsCount, - ) - pool.otConfig.otMetricRegistration = reg - return err -} - -// EnableOpenTelemetryMetrics enables OpenTelemetery metrics -func EnableOpenTelemetryMetrics() { - setOpenTelemetryMetricsFlag(true) -} - -// IsOpenTelemetryMetricsEnabled tells whether OpenTelemtery metrics is enabled or not. -func IsOpenTelemetryMetricsEnabled() bool { - otMu.RLock() - defer otMu.RUnlock() - return openTelemetryMetricsEnabled -} - -func setOpenTelemetryMetricsFlag(enable bool) { - otMu.Lock() - openTelemetryMetricsEnabled = enable - otMu.Unlock() -} - -func recordGFELatencyMetricsOT(ctx context.Context, md metadata.MD, keyMethod string, otConfig *openTelemetryConfig) error { - if otConfig == nil || !otConfig.enabled || md == nil { - return nil - } - attr := otConfig.attributeMap - metrics := parseServerTimingHeader(md) - if len(metrics) == 0 && otConfig.gfeHeaderMissingCount != nil { - otConfig.gfeHeaderMissingCount.Add(ctx, 1, metric.WithAttributes(attr...)) - return nil - } - attr = append(attr, attributeKeyMethod.String(keyMethod)) - if otConfig.gfeLatency != nil { - otConfig.gfeLatency.Record(ctx, metrics[gfeTimingHeader].Milliseconds(), metric.WithAttributes(attr...)) - } - return nil -} diff --git a/vendor/cloud.google.com/go/spanner/pdml.go b/vendor/cloud.google.com/go/spanner/pdml.go deleted file mode 100644 index 60b639d776..0000000000 --- a/vendor/cloud.google.com/go/spanner/pdml.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import ( - "context" - - "cloud.google.com/go/internal/trace" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/googleapis/gax-go/v2" - "go.opencensus.io/tag" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// PartitionedUpdate executes a DML statement in parallel across the database, -// using separate, internal transactions that commit independently. The DML -// statement must be fully partitionable: it must be expressible as the union -// of many statements each of which accesses only a single row of the table. The -// statement should also be idempotent, because it may be applied more than once. -// -// PartitionedUpdate returns an estimated count of the number of rows affected. -// The actual number of affected rows may be greater than the estimate. -func (c *Client) PartitionedUpdate(ctx context.Context, statement Statement) (count int64, err error) { - return c.partitionedUpdate(ctx, statement, c.qo) -} - -// PartitionedUpdateWithOptions executes a DML statement in parallel across the database, -// using separate, internal transactions that commit independently. The sql -// query execution will be optimized based on the given query options. -func (c *Client) PartitionedUpdateWithOptions(ctx context.Context, statement Statement, opts QueryOptions) (count int64, err error) { - return c.partitionedUpdate(ctx, statement, c.qo.merge(opts)) -} - -func (c *Client) partitionedUpdate(ctx context.Context, statement Statement, options QueryOptions) (count int64, err error) { - ctx, _ = startSpan(ctx, "PartitionedUpdate", c.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, err) }() - if err := checkNestedTxn(ctx); err != nil { - return 0, err - } - var sh *sessionHandle - if c.idleSessions.isMultiplexedSessionForPartitionedOpsEnabled() { - sh, err = c.idleSessions.takeMultiplexed(ctx) - } else { - sh, err = c.idleSessions.take(ctx) - } - if err != nil { - return 0, ToSpannerError(err) - } - if sh == nil { - return 0, spannerErrorf(codes.Internal, "no session available") - } - defer sh.recycle() - // Mark isLongRunningTransaction to true, as the session in case of partitioned dml can be long-running - sh.mu.Lock() - sh.eligibleForLongRunning = true - sh.mu.Unlock() - - // Create the parameters and the SQL request, but without a transaction. - // The transaction reference will be added by the executePdml method. - params, paramTypes, err := statement.convertParams() - if err != nil { - return 0, ToSpannerError(err) - } - req := &sppb.ExecuteSqlRequest{ - Session: sh.getID(), - Sql: statement.SQL, - Params: params, - ParamTypes: paramTypes, - QueryOptions: options.Options, - RequestOptions: createRequestOptions(options.Priority, options.RequestTag, ""), - } - - // Make a retryer for Aborted and certain Internal errors. - retryer := onCodes(DefaultRetryBackoff, codes.Aborted, codes.Internal) - // Execute the PDML and retry if the transaction is aborted. - executePdmlWithRetry := func(ctx context.Context) (int64, error) { - for { - count, err := executePdml(contextWithOutgoingMetadata(ctx, sh.getMetadata(), c.disableRouteToLeader), sh, req, options) - if err == nil { - return count, nil - } - if isUnimplementedErrorForMultiplexedPartitionedDML(err) && sh.session.pool.isMultiplexedSessionForPartitionedOpsEnabled() { - logf(c.logger, "Warning: Multiplexed sessions are not supported for partitioned operations in this environment. Falling back to regular sessions.") - sh.session.pool.disableMultiplexedSessionForPartitionedOps() - sh, err = c.idleSessions.take(ctx) - if err != nil { - return 0, ToSpannerError(err) - } - if sh == nil { - return 0, spannerErrorf(codes.Internal, "no session available") - } - defer sh.recycle() - // Mark isLongRunningTransaction to true, as the session in case of partitioned dml can be long-running - sh.mu.Lock() - sh.eligibleForLongRunning = true - sh.mu.Unlock() - req.Session = sh.getID() - continue - } - delay, shouldRetry := retryer.Retry(err) - if !shouldRetry { - return 0, err - } - if err := gax.Sleep(ctx, delay); err != nil { - return 0, err - } - } - } - return executePdmlWithRetry(ctx) -} - -// executePdml executes the following steps: -// 1. Begin a PDML transaction -// 2. Add the ID of the PDML transaction to the SQL request. -// 3. Execute the update statement on the PDML transaction -// -// Note that PDML transactions cannot be committed or rolled back. -func executePdml(ctx context.Context, sh *sessionHandle, req *sppb.ExecuteSqlRequest, options QueryOptions) (count int64, err error) { - var md metadata.MD - sh.updateLastUseTime() - // Begin transaction. - res, err := sh.getClient().BeginTransaction(ctx, &sppb.BeginTransactionRequest{ - Session: sh.getID(), - Options: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_PartitionedDml_{PartitionedDml: &sppb.TransactionOptions_PartitionedDml{}}, - ExcludeTxnFromChangeStreams: options.ExcludeTxnFromChangeStreams, - }, - }) - if err != nil { - return 0, ToSpannerError(err) - } - // Add a reference to the PDML transaction on the ExecuteSql request. - req.Transaction = &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Id{Id: res.Id}, - } - - sh.updateLastUseTime() - resultSet, err := sh.getClient().ExecuteSql(ctx, req, gax.WithGRPCOptions(grpc.Header(&md))) - if getGFELatencyMetricsFlag() && md != nil && sh.session.pool != nil { - err := captureGFELatencyStats(tag.NewContext(ctx, sh.session.pool.tagMap), md, "executePdml_ExecuteSql") - if err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "executePdml_ExecuteSql", sh.session.pool.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - return 0, err - } - - if resultSet.Stats == nil { - return 0, spannerErrorf(codes.InvalidArgument, "query passed to Update: %q", req.Sql) - } - return extractRowCount(resultSet.Stats) -} diff --git a/vendor/cloud.google.com/go/spanner/protoutils.go b/vendor/cloud.google.com/go/spanner/protoutils.go deleted file mode 100644 index 66a6353ffa..0000000000 --- a/vendor/cloud.google.com/go/spanner/protoutils.go +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "encoding/base64" - "math/big" - "strconv" - "time" - - "cloud.google.com/go/civil" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/google/uuid" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - proto3 "google.golang.org/protobuf/types/known/structpb" -) - -// Helpers to generate protobuf values and Cloud Spanner types. - -func stringProto(s string) *proto3.Value { - return &proto3.Value{Kind: stringKind(s)} -} - -func stringKind(s string) *proto3.Value_StringValue { - return &proto3.Value_StringValue{StringValue: s} -} - -func stringType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_STRING} -} - -func boolProto(b bool) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_BoolValue{BoolValue: b}} -} - -func boolType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_BOOL} -} - -func intProto(n int64) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_StringValue{StringValue: strconv.FormatInt(n, 10)}} -} - -func intType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_INT64} -} - -func float32Proto(n float32) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_NumberValue{NumberValue: float64(n)}} -} - -func float32Type() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_FLOAT32} -} - -func floatProto(n float64) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_NumberValue{NumberValue: n}} -} - -func floatType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_FLOAT64} -} - -func numericProto(n *big.Rat) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_StringValue{StringValue: NumericString(n)}} -} - -func numericType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_NUMERIC} -} - -func pgNumericType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_NUMERIC, TypeAnnotation: sppb.TypeAnnotationCode_PG_NUMERIC} -} - -func pgOidType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_INT64, TypeAnnotation: sppb.TypeAnnotationCode_PG_OID} -} - -func jsonType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_JSON} -} - -func pgJsonbType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_JSON, TypeAnnotation: sppb.TypeAnnotationCode_PG_JSONB} -} - -func bytesProto(b []byte) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_StringValue{StringValue: base64.StdEncoding.EncodeToString(b)}} -} - -func bytesType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_BYTES} -} - -func timeProto(t time.Time) *proto3.Value { - return stringProto(t.UTC().Format(time.RFC3339Nano)) -} - -func timeType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_TIMESTAMP} -} - -func dateProto(d civil.Date) *proto3.Value { - return stringProto(d.String()) -} - -func dateType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_DATE} -} - -func uuidProto(u uuid.UUID) *proto3.Value { - return stringProto(u.String()) -} - -func uuidType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_UUID} -} - -func intervalType() *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_INTERVAL} -} - -func listProto(p ...*proto3.Value) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_ListValue{ListValue: &proto3.ListValue{Values: p}}} -} - -func listValueProto(p ...*proto3.Value) *proto3.ListValue { - return &proto3.ListValue{Values: p} -} - -func listType(t *sppb.Type) *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_ARRAY, ArrayElementType: t} -} - -func mkField(n string, t *sppb.Type) *sppb.StructType_Field { - return &sppb.StructType_Field{Name: n, Type: t} -} - -func structType(fields ...*sppb.StructType_Field) *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_STRUCT, StructType: &sppb.StructType{Fields: fields}} -} - -func nullProto() *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_NullValue{NullValue: proto3.NullValue_NULL_VALUE}} -} - -func protoMessageType(fqn string) *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_PROTO, ProtoTypeFqn: fqn} -} - -func protoEnumType(fqn string) *sppb.Type { - return &sppb.Type{Code: sppb.TypeCode_ENUM, ProtoTypeFqn: fqn} -} - -func protoMessageProto(m proto.Message) *proto3.Value { - var b, _ = proto.Marshal(m) - return &proto3.Value{Kind: &proto3.Value_StringValue{StringValue: base64.StdEncoding.EncodeToString(b)}} -} - -func protoEnumProto(e protoreflect.Enum) *proto3.Value { - return &proto3.Value{Kind: &proto3.Value_StringValue{StringValue: strconv.FormatInt(int64(e.Number()), 10)}} -} diff --git a/vendor/cloud.google.com/go/spanner/read.go b/vendor/cloud.google.com/go/spanner/read.go deleted file mode 100644 index 3e9cfe4ea0..0000000000 --- a/vendor/cloud.google.com/go/spanner/read.go +++ /dev/null @@ -1,946 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "bytes" - "context" - "io" - "log" - "sync/atomic" - "time" - - "cloud.google.com/go/internal/protostruct" - "cloud.google.com/go/internal/trace" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/googleapis/gax-go/v2" - otcodes "go.opentelemetry.io/otel/codes" - otrace "go.opentelemetry.io/otel/trace" - "google.golang.org/api/iterator" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" - proto3 "google.golang.org/protobuf/types/known/structpb" -) - -// streamingReceiver is the interface for receiving data from a client side -// stream. -type streamingReceiver interface { - Recv() (*sppb.PartialResultSet, error) - Context() context.Context -} - -// errEarlyReadEnd returns error for read finishes when gRPC stream is still -// active. -func errEarlyReadEnd() error { - return spannerErrorf(codes.FailedPrecondition, "read completed with active stream") -} - -// stream is the internal fault tolerant method for streaming data from Cloud -// Spanner. -func stream( - ctx context.Context, - logger *log.Logger, - meterTracerFactory *builtinMetricsTracerFactory, - rpc func(ct context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error), - setTimestamp func(time.Time), - release func(error), - gsc *grpcSpannerClient, -) *RowIterator { - return streamWithReplaceSessionFunc( - ctx, - logger, - meterTracerFactory, - rpc, - nil, - nil, - func(err error) error { - return err - }, - nil, - setTimestamp, - release, - gsc, - ) -} - -// this stream method will automatically retry the stream on a new session if -// the replaceSessionFunc function has been defined. This function should only be -// used for single-use transactions. -func streamWithReplaceSessionFunc( - ctx context.Context, - logger *log.Logger, - meterTracerFactory *builtinMetricsTracerFactory, - rpc func(ct context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error), - replaceSession func(ctx context.Context) error, - setTransactionID func(transactionID), - updateTxState func(err error) error, - updatePrecommitToken func(token *sppb.MultiplexedSessionPrecommitToken), - setTimestamp func(time.Time), - release func(error), - gsc *grpcSpannerClient, -) *RowIterator { - ctx, cancel := context.WithCancel(ctx) - ctx, _ = startSpan(ctx, "RowIterator") - return &RowIterator{ - meterTracerFactory: meterTracerFactory, - streamd: newResumableStreamDecoder(ctx, cancel, logger, rpc, replaceSession, gsc), - rowd: &partialResultSetDecoder{}, - setTransactionID: setTransactionID, - updatePrecommitToken: updatePrecommitToken, - updateTxState: updateTxState, - setTimestamp: setTimestamp, - release: release, - cancel: cancel, - } -} - -// rowIterator is an interface for iterating over Rows. -type rowIterator interface { - Next() (*Row, error) - Do(f func(r *Row) error) error - Stop() -} - -// RowIterator is an iterator over Rows. -type RowIterator struct { - // The plan for the query. Available after RowIterator.Next returns - // iterator.Done if QueryWithStats was called. - QueryPlan *sppb.QueryPlan - - // Execution statistics for the query. Available after RowIterator.Next - // returns iterator.Done if QueryWithStats was called. - QueryStats map[string]interface{} - - // For a DML statement, the number of rows affected. For PDML, this is a - // lower bound. Available for DML statements after RowIterator.Next returns - // iterator.Done. - RowCount int64 - - // The metadata of the results of the query. The metadata are available - // after the first call to RowIterator.Next(), unless the first call to - // RowIterator.Next() returned an error that is not equal to iterator.Done. - Metadata *sppb.ResultSetMetadata - - ctx context.Context - meterTracerFactory *builtinMetricsTracerFactory - streamd *resumableStreamDecoder - rowd *partialResultSetDecoder - setTransactionID func(transactionID) - updateTxState func(err error) error - updatePrecommitToken func(token *sppb.MultiplexedSessionPrecommitToken) - setTimestamp func(time.Time) - release func(error) - cancel func() - err error - rows []*Row - sawStats bool -} - -// this is for safety from future changes to RowIterator making sure that it implements rowIterator interface. -var _ rowIterator = (*RowIterator)(nil) - -// Next returns the next result. Its second return value is iterator.Done if -// there are no more results. Once Next returns Done, all subsequent calls -// will return Done. -func (r *RowIterator) Next() (*Row, error) { - mt := r.meterTracerFactory.createBuiltinMetricsTracer(r.ctx) - if r.err != nil { - return nil, r.err - } - // Start new attempt - mt.currOp.incrementAttemptCount() - mt.currOp.currAttempt = &attemptTracer{ - startTime: time.Now(), - } - defer func() { - // when mt method is not empty, it means the RPC was sent to backend and native metrics attributes were captured in interceptor - if mt.method != "" { - statusCode, _ := convertToGrpcStatusErr(r.err) - // record the attempt completion - mt.currOp.currAttempt.setStatus(statusCode.String()) - recordAttemptCompletion(&mt) - mt.currOp.setStatus(statusCode.String()) - // Record operation completion. - // Operational_latencies metric captures the full picture of all attempts including retries. - recordOperationCompletion(&mt) - mt.currOp.currAttempt = nil - } - }() - - for len(r.rows) == 0 && r.streamd.next(&mt) { - prs := r.streamd.get() - if r.setTransactionID != nil { - // this is when Read/Query is executed using ReadWriteTransaction - // and server returned the first stream response. - if prs.Metadata != nil && prs.Metadata.Transaction != nil { - r.setTransactionID(prs.Metadata.Transaction.GetId()) - } else { - // This code block should never run ideally, server is expected to return a transactionID in response - // if request contains TransactionSelector::Begin option, this is here as fallback to retry with - // explicit transactionID after a retry. - r.setTransactionID(nil) - r.err = r.updateTxState(errInlineBeginTransactionFailed(nil)) - return nil, r.err - } - r.setTransactionID = nil - } - if r.updatePrecommitToken != nil { - r.updatePrecommitToken(prs.GetPrecommitToken()) - } - if prs.Stats != nil { - r.sawStats = true - r.QueryPlan = prs.Stats.QueryPlan - r.QueryStats = protostruct.DecodeToMap(prs.Stats.QueryStats) - if prs.Stats.RowCount != nil { - rc, err := extractRowCount(prs.Stats) - if err != nil { - return nil, err - } - r.RowCount = rc - } - } - var metadata *sppb.ResultSetMetadata - r.rows, metadata, r.err = r.rowd.add(prs) - if metadata != nil { - r.Metadata = metadata - } - if r.err != nil { - return nil, r.err - } - if !r.rowd.ts.IsZero() && r.setTimestamp != nil { - r.setTimestamp(r.rowd.ts) - r.setTimestamp = nil - } - } - if len(r.rows) > 0 { - row := r.rows[0] - r.rows = r.rows[1:] - return row, nil - } - if err := r.streamd.lastErr(); err != nil { - r.err = r.updateTxState(ToSpannerError(err)) - } else if !r.rowd.done() { - r.err = errEarlyReadEnd() - } else { - r.cancel = nil - r.err = iterator.Done - } - return nil, r.err -} - -func extractRowCount(stats *sppb.ResultSetStats) (int64, error) { - if stats.RowCount == nil { - return 0, spannerErrorf(codes.Internal, "missing RowCount") - } - switch rc := stats.RowCount.(type) { - case *sppb.ResultSetStats_RowCountExact: - return rc.RowCountExact, nil - case *sppb.ResultSetStats_RowCountLowerBound: - return rc.RowCountLowerBound, nil - default: - return 0, spannerErrorf(codes.Internal, "unknown RowCount type %T", stats.RowCount) - } -} - -// Do calls the provided function once in sequence for each row in the -// iteration. If the function returns a non-nil error, Do immediately returns -// that error. -// -// If there are no rows in the iterator, Do will return nil without calling the -// provided function. -// -// Do always calls Stop on the iterator. -func (r *RowIterator) Do(f func(r *Row) error) error { - defer r.Stop() - for { - row, err := r.Next() - switch err { - case iterator.Done: - return nil - case nil: - if err = f(row); err != nil { - return err - } - default: - return err - } - } -} - -// Stop terminates the iteration. It should be called after you finish using the -// iterator. -func (r *RowIterator) Stop() { - if r.streamd != nil { - if r.err != nil && r.err != iterator.Done { - defer trace.EndSpan(r.streamd.ctx, r.err) - } else { - defer trace.EndSpan(r.streamd.ctx, nil) - } - } - if r.cancel != nil { - r.cancel() - } - if r.release != nil { - r.release(r.err) - if r.err == nil { - r.err = spannerErrorf(codes.FailedPrecondition, "Next called after Stop") - } - r.release = nil - } -} - -// partialResultQueue implements a simple FIFO queue. The zero value is a valid -// queue. -type partialResultQueue struct { - q []*sppb.PartialResultSet - first int - last int - n int // number of elements in queue -} - -// empty returns if the partialResultQueue is empty. -func (q *partialResultQueue) empty() bool { - return q.n == 0 -} - -// errEmptyQueue returns error for dequeuing an empty queue. -func errEmptyQueue() error { - return spannerErrorf(codes.OutOfRange, "empty partialResultQueue") -} - -// peekLast returns the last item in partialResultQueue; if the queue -// is empty, it returns error. -func (q *partialResultQueue) peekLast() (*sppb.PartialResultSet, error) { - if q.empty() { - return nil, errEmptyQueue() - } - return q.q[(q.last+cap(q.q)-1)%cap(q.q)], nil -} - -// push adds an item to the tail of partialResultQueue. -func (q *partialResultQueue) push(r *sppb.PartialResultSet) { - if q.q == nil { - q.q = make([]*sppb.PartialResultSet, 8 /* arbitrary */) - } - if q.n == cap(q.q) { - buf := make([]*sppb.PartialResultSet, cap(q.q)*2) - for i := 0; i < q.n; i++ { - buf[i] = q.q[(q.first+i)%cap(q.q)] - } - q.q = buf - q.first = 0 - q.last = q.n - } - q.q[q.last] = r - q.last = (q.last + 1) % cap(q.q) - q.n++ -} - -// pop removes an item from the head of partialResultQueue and returns it. -func (q *partialResultQueue) pop() *sppb.PartialResultSet { - if q.n == 0 { - return nil - } - r := q.q[q.first] - q.q[q.first] = nil - q.first = (q.first + 1) % cap(q.q) - q.n-- - return r -} - -// clear empties partialResultQueue. -func (q *partialResultQueue) clear() { - *q = partialResultQueue{} -} - -// dump retrieves all items from partialResultQueue and return them in a slice. -// It is used only in tests. -func (q *partialResultQueue) dump() []*sppb.PartialResultSet { - var dq []*sppb.PartialResultSet - for i := q.first; len(dq) < q.n; i = (i + 1) % cap(q.q) { - dq = append(dq, q.q[i]) - } - return dq -} - -// resumableStreamDecoderState encodes resumableStreamDecoder's status. See also -// the comments for resumableStreamDecoder.Next. -type resumableStreamDecoderState int - -const ( - unConnected resumableStreamDecoderState = iota // 0 - queueingRetryable // 1 - queueingUnretryable // 2 - aborted // 3 - finished // 4 -) - -// resumableStreamDecoder provides a resumable interface for receiving -// sppb.PartialResultSet(s) from a given query wrapped by -// resumableStreamDecoder.rpc(). -type resumableStreamDecoder struct { - // state is the current status of resumableStreamDecoder, see also - // the comments for resumableStreamDecoder.Next. - state resumableStreamDecoderState - - // stateWitness when non-nil is called to observe state change, - // used for testing. - stateWitness func(resumableStreamDecoderState) - - // ctx is the caller's context, used for cancel/timeout Next(). - ctx context.Context - - // cancel is the function to cancel the context - cancel func() - - // rpc is a factory of streamingReceiver, which might resume - // a previous stream from the point encoded in restartToken. - // rpc is always a wrapper of a Cloud Spanner query which is - // resumable. - rpc func(ctx context.Context, restartToken []byte, opts ...gax.CallOption) (streamingReceiver, error) - - // replaceSessionFunc is a function that can be used to replace the session - // that is being used to execute the read operation. This function should - // only be defined for single-use transactions that can safely retry the - // read operation on a new session. If this function is nil, the stream - // does not support retrying the query on a new session. - replaceSessionFunc func(ctx context.Context) error - - // logger is the logger to use. - logger *log.Logger - - // stream is the current RPC streaming receiver. - stream streamingReceiver - - // q buffers received yet undecoded partial results. - q partialResultQueue - - // bytesBetweenResumeTokens is the proxy of the byte size of - // PartialResultSets being queued between two resume tokens. Once - // bytesBetweenResumeTokens is greater than maxBytesBetweenResumeTokens, - // resumableStreamDecoder goes into queueingUnretryable state. - bytesBetweenResumeTokens int32 - - // maxBytesBetweenResumeTokens is the max number of bytes that can be - // buffered between two resume tokens. It is always copied from the global - // maxBytesBetweenResumeTokens atomically. - maxBytesBetweenResumeTokens int32 - - // np is the next sppb.PartialResultSet ready to be returned - // to caller of resumableStreamDecoder.Get(). - np *sppb.PartialResultSet - - // resumeToken stores the resume token that resumableStreamDecoder has - // last revealed to caller. - resumeToken []byte - - // err is the last error resumableStreamDecoder has encountered so far. - err error - - // backoff is used for the retry settings - backoff gax.Backoff - - gsc *grpcSpannerClient - - // reqIDInjector is generated once per stream, unless the stream - // gets broken and in that case a fresh one is generated. - reqIDInjector *requestIDWrap - // retryAttempt is is incremented whenever a retry happens, and it is - // reset whenever a new reqIDInjector is created afresh. - retryAttempt uint32 -} - -// newResumableStreamDecoder creates a new resumeableStreamDecoder instance. -// Parameter rpc should be a function that creates a new stream beginning at the -// restartToken if non-nil. -func newResumableStreamDecoder(ctx context.Context, cancel func(), logger *log.Logger, rpc func(ct context.Context, restartToken []byte, opts ...gax.CallOption) (streamingReceiver, error), replaceSession func(ctx context.Context) error, gsc *grpcSpannerClient) *resumableStreamDecoder { - return &resumableStreamDecoder{ - ctx: ctx, - cancel: cancel, - logger: logger, - rpc: rpc, - replaceSessionFunc: replaceSession, - maxBytesBetweenResumeTokens: atomic.LoadInt32(&maxBytesBetweenResumeTokens), - backoff: DefaultRetryBackoff, - gsc: gsc, - } -} - -func (d *resumableStreamDecoder) reqIDInjectorOrNew() *requestIDWrap { - if d.reqIDInjector == nil { - d.reqIDInjector = d.gsc.generateRequestIDHeaderInjector() - d.retryAttempt = 0 - } - return d.reqIDInjector -} - -// changeState fulfills state transition for resumableStateDecoder. -func (d *resumableStreamDecoder) changeState(target resumableStreamDecoderState) { - if d.state == queueingRetryable && d.state != target { - // Reset bytesBetweenResumeTokens because it is only meaningful/changed - // under queueingRetryable state. - d.bytesBetweenResumeTokens = 0 - } - d.state = target - if d.stateWitness != nil { - d.stateWitness(target) - } -} - -// isNewResumeToken returns if the observed resume token is different from -// the one returned from server last time. -func (d *resumableStreamDecoder) isNewResumeToken(rt []byte) bool { - if rt == nil { - return false - } - if bytes.Equal(rt, d.resumeToken) { - return false - } - return true -} - -// Next advances to the next available partial result set. If error or no -// more, returns false, call Err to determine if an error was encountered. -// The following diagram illustrates the state machine of resumableStreamDecoder -// that Next() implements. Note that state transition can be only triggered by -// RPC activities. -/* - rpc() fails retryable - +---------+ - | | rpc() fails unretryable/ctx timeouts or cancelled - | | +------------------------------------------------+ - | | | | - | v | v - | +---+---+---+ +--------+ +------+--+ - +-----+unConnected| |finished| | aborted |<----+ - | | ++-----+-+ +------+--+ | - +---+----+--+ ^ ^ ^ | - | ^ | | | | - | | | | recv() fails | - | | | | | | - | |recv() fails retryable | | | | - | |with valid ctx | | | | - | | | | | | - rpc() succeeds | +-----------------------+ | | | - | | | recv EOF recv EOF | | - | | | | | | - v | | Queue size exceeds | | | - +---+----+---+----+threshold +-------+-----------+ | | -+---------->+ +--------------->+ +-+ | -| |queueingRetryable| |queueingUnretryable| | -| | +<---------------+ | | -| +---+----------+--+ pop() returns +--+----+-----------+ | -| | | resume token | ^ | -| | | | | | -| | | | | | -+---------------+ | | | | - recv() succeeds | +----+ | - | recv() succeeds | - | | - | | - | | - | | - | | - +--------------------------------------------------+ - recv() fails unretryable - -*/ -var ( - // maxBytesBetweenResumeTokens is the maximum amount of bytes that - // resumableStreamDecoder in queueingRetryable state can use to queue - // PartialResultSets before getting into queueingUnretryable state. - maxBytesBetweenResumeTokens = int32(128 * 1024 * 1024) -) - -func (d *resumableStreamDecoder) next(mt *builtinMetricsTracer) bool { - retryer := onCodes(d.backoff, codes.Unavailable, codes.ResourceExhausted, codes.Internal) - - // Setup and track x-goog-request-id in the manual retries for ExecuteStreamingSql. - riw := d.reqIDInjectorOrNew() - - for { - switch d.state { - case unConnected: - d.retryAttempt++ - // If no gRPC stream is available, try to initiate one. - d.stream, d.err = d.rpc(context.WithValue(d.ctx, metricsTracerKey, mt), d.resumeToken, riw.withNextRetryAttempt(d.retryAttempt)) - if d.err == nil { - d.changeState(queueingRetryable) - continue - } - - delay, shouldRetry := retryer.Retry(d.err) - if !shouldRetry { - d.changeState(aborted) - continue - } - trace.TracePrintf(d.ctx, nil, "Backing off stream read for %s", delay) - if err := gax.Sleep(d.ctx, delay); err == nil { - // record the attempt completion - mt.currOp.currAttempt.setStatus(status.Code(d.err).String()) - recordAttemptCompletion(mt) - mt.currOp.incrementAttemptCount() - mt.currOp.currAttempt = &attemptTracer{ - startTime: time.Now(), - } - // Be explicit about state transition, although the - // state doesn't actually change. State transition - // will be triggered only by RPC activity, regardless of - // whether there is an actual state change or not. - d.changeState(unConnected) - } else { - d.err = err - d.changeState(aborted) - } - continue - - case queueingRetryable: - fallthrough - case queueingUnretryable: - // Receiving queue is not empty. - last, err := d.q.peekLast() - if err != nil { - // Only the case that receiving queue is empty could cause - // peekLast to return error and in such case, we should try to - // receive from stream. - d.tryRecv(mt, retryer) - continue - } - if d.isNewResumeToken(last.ResumeToken) { - // Got new resume token, return buffered sppb.PartialResultSets - // to caller. - d.np = d.q.pop() - if d.q.empty() { - d.bytesBetweenResumeTokens = 0 - // The new resume token was just popped out from queue, - // record it. - d.resumeToken = d.np.ResumeToken - d.changeState(queueingRetryable) - } - return true - } - if d.bytesBetweenResumeTokens >= d.maxBytesBetweenResumeTokens && d.state == queueingRetryable { - d.changeState(queueingUnretryable) - continue - } - if d.state == queueingUnretryable { - // When there is no resume token observed, only yield - // sppb.PartialResultSets to caller under queueingUnretryable - // state. - d.np = d.q.pop() - return true - } - // Needs to receive more from gRPC stream till a new resume token - // is observed. - d.tryRecv(mt, retryer) - continue - case aborted: - // Discard all pending items because none of them should be yield - // to caller. - d.q.clear() - return false - case finished: - // If query has finished, check if there are still buffered messages. - d.reqIDInjector = nil - if d.q.empty() { - // No buffered PartialResultSet. - return false - } - // Although query has finished, there are still buffered - // PartialResultSets. - d.np = d.q.pop() - return true - - default: - logf(d.logger, "Unexpected resumableStreamDecoder.state: %v", d.state) - return false - } - } -} - -// tryRecv attempts to receive a PartialResultSet from gRPC stream. -func (d *resumableStreamDecoder) tryRecv(mt *builtinMetricsTracer, retryer gax.Retryer) { - var res *sppb.PartialResultSet - res, d.err = d.stream.Recv() - if d.err == nil { - d.q.push(res) - if res.GetLast() { - if span := otrace.SpanFromContext(d.stream.Context()); span != nil && span.IsRecording() { - span.SetStatus(otcodes.Ok, "Stream finished successfully") - span.End() - } - if d.cancel != nil { - // Remove the cancel function to prevent iter.Stop from also calling it. - cancel := d.cancel - d.cancel = nil - go func() { - _, _ = d.stream.Recv() - cancel() - }() - } - d.changeState(finished) - return - } - if d.state == queueingRetryable && !d.isNewResumeToken(res.ResumeToken) { - d.bytesBetweenResumeTokens += int32(proto.Size(res)) - } - d.changeState(d.state) - return - } - - if d.err == io.EOF { - d.err = nil - // Cancel the context after receiving trailers - if d.cancel != nil { - d.cancel() - } - d.changeState(finished) - return - } - - if d.replaceSessionFunc != nil && isSessionNotFoundError(d.err) && d.resumeToken == nil { - mt.currOp.currAttempt.setStatus(status.Code(d.err).String()) - recordAttemptCompletion(mt) - // A 'Session not found' error occurred before we received a resume - // token and a replaceSessionFunc function is defined. Try to restart - // the stream on a new session. - if err := d.replaceSessionFunc(d.ctx); err != nil { - d.err = err - d.changeState(aborted) - return - } - mt.currOp.incrementAttemptCount() - mt.currOp.currAttempt = &attemptTracer{ - startTime: time.Now(), - } - } else { - mt.currOp.currAttempt.setStatus(status.Code(d.err).String()) - recordAttemptCompletion(mt) - delay, shouldRetry := retryer.Retry(d.err) - if !shouldRetry || d.state != queueingRetryable { - d.changeState(aborted) - return - } - if err := gax.Sleep(d.ctx, delay); err != nil { - d.err = err - d.changeState(aborted) - return - } - mt.currOp.incrementAttemptCount() - mt.currOp.currAttempt = &attemptTracer{ - startTime: time.Now(), - } - } - // Clear error and retry the stream. - d.err = nil - // Discard all queue items (none have resume tokens). - d.q.clear() - d.stream = nil - d.changeState(unConnected) - return -} - -// get returns the most recent PartialResultSet generated by a call to next. -func (d *resumableStreamDecoder) get() *sppb.PartialResultSet { - return d.np -} - -// lastErr returns the last non-EOF error encountered. -func (d *resumableStreamDecoder) lastErr() error { - return d.err -} - -// partialResultSetDecoder assembles PartialResultSet(s) into Cloud Spanner -// Rows. -type partialResultSetDecoder struct { - row Row - tx *sppb.Transaction - chunked bool // if true, next value should be merged with last values - // entry. - ts time.Time // read timestamp -} - -// yield checks we have a complete row, and if so returns it. A row is not -// complete if it doesn't have enough columns, or if this is a chunked response -// and there are no further values to process. -func (p *partialResultSetDecoder) yield(chunked, last bool) *Row { - if len(p.row.vals) == len(p.row.fields) && (!chunked || !last) { - // When partialResultSetDecoder gets enough number of Column values. - // There are two cases that a new Row should be yield: - // - // 1. The incoming PartialResultSet is not chunked; - // 2. The incoming PartialResultSet is chunked, but the - // proto3.Value being merged is not the last one in - // the PartialResultSet. - // - // Use a fresh Row to simplify clients that want to use yielded results - // after the next row is retrieved. Note that fields is never changed - // so it doesn't need to be copied. - fresh := Row{ - fields: p.row.fields, - vals: make([]*proto3.Value, len(p.row.vals)), - } - copy(fresh.vals, p.row.vals) - p.row.vals = p.row.vals[:0] // empty and reuse slice - return &fresh - } - return nil -} - -// yieldTx returns transaction information via caller supplied callback. -func errChunkedEmptyRow() error { - return spannerErrorf(codes.FailedPrecondition, "got invalid chunked PartialResultSet with empty Row") -} - -// add tries to merge a new PartialResultSet into buffered Row. It returns any -// rows that have been completed as a result. -func (p *partialResultSetDecoder) add(r *sppb.PartialResultSet) ([]*Row, *sppb.ResultSetMetadata, error) { - var rows []*Row - if r.Metadata != nil { - // Metadata should only be returned in the first result. - if p.row.fields == nil { - p.row.fields = r.Metadata.RowType.Fields - } - if p.tx == nil && r.Metadata.Transaction != nil { - p.tx = r.Metadata.Transaction - if p.tx.ReadTimestamp != nil { - p.ts = time.Unix(p.tx.ReadTimestamp.Seconds, int64(p.tx.ReadTimestamp.Nanos)) - } - } - } - if len(r.Values) == 0 { - return nil, r.Metadata, nil - } - if p.chunked { - p.chunked = false - // Try to merge first value in r.Values into uncompleted row. - last := len(p.row.vals) - 1 - if last < 0 { // confidence check - return nil, nil, errChunkedEmptyRow() - } - var err error - // If p is chunked, then we should always try to merge p.last with - // r.first. - if p.row.vals[last], err = p.merge(p.row.vals[last], r.Values[0]); err != nil { - return nil, r.Metadata, err - } - r.Values = r.Values[1:] - // Merge is done, try to yield a complete Row. - if row := p.yield(r.ChunkedValue, len(r.Values) == 0); row != nil { - rows = append(rows, row) - } - } - for i, v := range r.Values { - // The rest values in r can be appened into p directly. - p.row.vals = append(p.row.vals, v) - // Again, check to see if a complete Row can be yielded because of the - // newly added value. - if row := p.yield(r.ChunkedValue, i == len(r.Values)-1); row != nil { - rows = append(rows, row) - } - } - if r.ChunkedValue { - // After dealing with all values in r, if r is chunked then p must be - // also chunked. - p.chunked = true - } - return rows, r.Metadata, nil -} - -// isMergeable returns if a protobuf Value can be potentially merged with other -// protobuf Values. -func (p *partialResultSetDecoder) isMergeable(a *proto3.Value) bool { - switch a.Kind.(type) { - case *proto3.Value_StringValue: - return true - case *proto3.Value_ListValue: - return true - default: - return false - } -} - -// errIncompatibleMergeTypes returns error for incompatible protobuf types that -// cannot be merged by partialResultSetDecoder. -func errIncompatibleMergeTypes(a, b *proto3.Value) error { - return spannerErrorf(codes.FailedPrecondition, "incompatible type in chunked PartialResultSet. expected (%T), got (%T)", a.Kind, b.Kind) -} - -// errUnsupportedMergeType returns error for protobuf type that cannot be merged -// to other protobufs. -func errUnsupportedMergeType(a *proto3.Value) error { - return spannerErrorf(codes.FailedPrecondition, "unsupported type merge (%T)", a.Kind) -} - -// merge tries to combine two protobuf Values if possible. -func (p *partialResultSetDecoder) merge(a, b *proto3.Value) (*proto3.Value, error) { - var err error - typeErr := errIncompatibleMergeTypes(a, b) - switch t := a.Kind.(type) { - case *proto3.Value_StringValue: - s, ok := b.Kind.(*proto3.Value_StringValue) - if !ok { - return nil, typeErr - } - return &proto3.Value{ - Kind: &proto3.Value_StringValue{StringValue: t.StringValue + s.StringValue}, - }, nil - case *proto3.Value_ListValue: - l, ok := b.Kind.(*proto3.Value_ListValue) - if !ok { - return nil, typeErr - } - if l.ListValue == nil || len(l.ListValue.Values) <= 0 { - // b is an empty list, just return a. - return a, nil - } - if t.ListValue == nil || len(t.ListValue.Values) <= 0 { - // a is an empty list, just return b. - return b, nil - } - if la := len(t.ListValue.Values) - 1; p.isMergeable(t.ListValue.Values[la]) { - // When the last item in a is of type String, List or Struct - // (encoded into List by Cloud Spanner), try to Merge last item in - // a and first item in b. - t.ListValue.Values[la], err = p.merge(t.ListValue.Values[la], l.ListValue.Values[0]) - if err != nil { - return nil, err - } - l.ListValue.Values = l.ListValue.Values[1:] - } - return &proto3.Value{ - Kind: &proto3.Value_ListValue{ - ListValue: &proto3.ListValue{ - Values: append(t.ListValue.Values, l.ListValue.Values...), - }, - }, - }, nil - default: - return nil, errUnsupportedMergeType(a) - } - -} - -// Done returns if partialResultSetDecoder has already done with all buffered -// values. -func (p *partialResultSetDecoder) done() bool { - // There is no explicit end of stream marker, but ending part way through a - // row is obviously bad, or ending with the last column still awaiting - // completion. - return len(p.row.vals) == 0 && !p.chunked -} diff --git a/vendor/cloud.google.com/go/spanner/request_id_header.go b/vendor/cloud.google.com/go/spanner/request_id_header.go deleted file mode 100644 index d25a009024..0000000000 --- a/vendor/cloud.google.com/go/spanner/request_id_header.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import ( - "context" - "crypto/rand" - "errors" - "fmt" - "io" - "math" - "math/big" - "sync/atomic" - "time" - - "github.com/googleapis/gax-go/v2" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" - "google.golang.org/api/iterator" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// randIDForProcess is a strongly randomly generated value derived -// from a uint64, and in the range [0, maxUint64]. -var randIDForProcess string - -func init() { - bigMaxInt64, _ := new(big.Int).SetString(fmt.Sprintf("%d", uint64(math.MaxUint64)), 10) - if g, w := bigMaxInt64.Uint64(), uint64(math.MaxUint64); g != w { - panic(fmt.Sprintf("mismatch in randIDForProcess.maxUint64:\n\tGot: %d\n\tWant: %d", g, w)) - } - r64, err := rand.Int(rand.Reader, bigMaxInt64) - if err != nil { - panic(err) - } - randIDForProcess = fmt.Sprintf("%016x", r64.Uint64()) -} - -// Please bump this version whenever this implementation -// executes on the plans of a new specification. -const xSpannerRequestIDVersion uint8 = 1 - -const xSpannerRequestIDHeader = "x-goog-spanner-request-id" -const xSpannerRequestIDSpanAttr = "x_goog_spanner_request_id" - -// optsWithNextRequestID bundles priors with a new header "x-goog-spanner-request-id" -func (g *grpcSpannerClient) optsWithNextRequestID(priors []gax.CallOption) []gax.CallOption { - return append(priors, &retryerWithRequestID{g}) -} - -func (g *grpcSpannerClient) prepareRequestIDTrackers(clientID int, channelID uint64, nthRequest *atomic.Uint32) { - g.id = clientID // The ID derived from the SpannerClient. - g.channelID = channelID - g.nthRequest = nthRequest -} - -// retryerWithRequestID is a gax.CallOption that injects "x-goog-spanner-request-id" -// into every RPC, and it appropriately increments the RPC's ordinal number per retry. -type retryerWithRequestID struct { - gsc *grpcSpannerClient -} - -var _ gax.CallOption = (*retryerWithRequestID)(nil) - -func (g *grpcSpannerClient) appendRequestIDToGRPCOptions(priors []grpc.CallOption, nthRequest, attempt uint32) []grpc.CallOption { - // Each value should be added in Decimal, unpadded. - requestID := fmt.Sprintf("%d.%s.%d.%d.%d.%d", xSpannerRequestIDVersion, randIDForProcess, g.id, g.channelID, nthRequest, attempt) - md := metadata.MD{xSpannerRequestIDHeader: []string{requestID}} - return append(priors, grpc.Header(&md)) -} - -type requestID string - -// augmentErrorWithRequestID introspects error converting it to an *.Error and -// attaching the subject requestID, unless it is one of the following: -// * nil -// * context.Canceled -// * io.EOF -// * iterator.Done -// of which in this case, the original error will be attached as is, since those -// are sentinel errors used to break sensitive conditions like ending iterations. -func (r requestID) augmentErrorWithRequestID(err error) error { - if err == nil { - return nil - } - - switch err { - case iterator.Done, io.EOF, context.Canceled: - return err - - default: - potentialCommit := errors.Is(err, context.DeadlineExceeded) - if code := status.Code(err); code == codes.DeadlineExceeded { - potentialCommit = true - } - sErr := toSpannerErrorWithCommitInfo(err, potentialCommit) - if sErr == nil { - return err - } - - spErr := sErr.(*Error) - spErr.RequestID = string(r) - return spErr - } -} - -func gRPCCallOptionsToRequestID(opts []grpc.CallOption) (md metadata.MD, reqID requestID, found bool) { - for _, opt := range opts { - hdrOpt, ok := opt.(grpc.HeaderCallOption) - if !ok { - continue - } - - metadata := hdrOpt.HeaderAddr - reqIDs := metadata.Get(xSpannerRequestIDHeader) - if len(reqIDs) != 0 && len(reqIDs[0]) != 0 { - md = *metadata - reqID = requestID(reqIDs[0]) - found = true - break - } - } - return -} - -func (wr *requestIDHeaderInjector) interceptUnary(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - // It is imperative to search for the requestID before the call - // because gRPC's internals will consume the headers. - _, reqID, foundRequestID := gRPCCallOptionsToRequestID(opts) - if foundRequestID { - ctx = metadata.AppendToOutgoingContext(ctx, xSpannerRequestIDHeader, string(reqID)) - - // Associate the requestId as an attribute on the span in the current context. - span := trace.SpanFromContext(ctx) - span.SetAttributes(attribute.KeyValue{ - Key: xSpannerRequestIDSpanAttr, - Value: attribute.StringValue(string(reqID)), - }) - } - - err := invoker(ctx, method, req, reply, cc, opts...) - if !foundRequestID { - return err - } - return reqID.augmentErrorWithRequestID(err) -} - -type requestIDErrWrappingClientStream struct { - grpc.ClientStream - reqID requestID -} - -func (rew *requestIDErrWrappingClientStream) processFromOutgoingContext(err error) error { - if err == nil { - return nil - } - return rew.reqID.augmentErrorWithRequestID(err) -} - -func (rew *requestIDErrWrappingClientStream) SendMsg(msg any) error { - err := rew.ClientStream.SendMsg(msg) - return rew.processFromOutgoingContext(err) -} - -func (rew *requestIDErrWrappingClientStream) RecvMsg(msg any) error { - err := rew.ClientStream.RecvMsg(msg) - return rew.processFromOutgoingContext(err) -} - -var _ grpc.ClientStream = (*requestIDErrWrappingClientStream)(nil) - -type requestIDHeaderInjector int - -func (wr *requestIDHeaderInjector) interceptStream(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { - // It is imperative to search for the requestID before the call - // because gRPC's internals will consume the headers. - _, reqID, foundRequestID := gRPCCallOptionsToRequestID(opts) - if foundRequestID { - ctx = metadata.AppendToOutgoingContext(ctx, xSpannerRequestIDHeader, string(reqID)) - - // Associate the requestId as an attribute on the span in the current context. - span := trace.SpanFromContext(ctx) - span.SetAttributes(attribute.KeyValue{ - Key: xSpannerRequestIDSpanAttr, - Value: attribute.StringValue(string(reqID)), - }) - } - - cs, err := streamer(ctx, desc, cc, method, opts...) - if !foundRequestID { - return cs, err - } - wcs := &requestIDErrWrappingClientStream{cs, reqID} - if err == nil { - return wcs, nil - } - - return wcs, reqID.augmentErrorWithRequestID(err) -} - -func (wr *retryerWithRequestID) Resolve(cs *gax.CallSettings) { - nthRequest := wr.gsc.nextNthRequest() - attempt := uint32(1) - // Inject the first request-id header. - // Note: after every gax.Invoke call, all the gRPC option headers are cleared out - // and nullified, but yet cs.GRPC still contains a reference to the inserted *metadata.MD - // just that it got cleared out and nullified. However, for retries we need to retain control - // of the entry to re-insert the updated request-id on every call, hence why we are creating - // and retaining a pointer reference to the metadata and shall be re-inserting the header value - // on every retry. - md := new(metadata.MD) - wr.generateAndInsertRequestID(md, nthRequest, attempt) - // Insert our grpc.CallOption that'll be updated by reference on every retry attempt. - cs.GRPC = append(cs.GRPC, grpc.Header(md)) - - if cs.Retry == nil { - // If there was no retry manager, our journey has ended. - return - } - - originalRetryer := cs.Retry() - newRetryer := func() gax.Retryer { - return (wrapRetryFn)(func(err error) (pause time.Duration, shouldRetry bool) { - attempt++ - wr.generateAndInsertRequestID(md, nthRequest, attempt) - return originalRetryer.Retry(err) - }) - } - cs.Retry = newRetryer -} - -func (wr *retryerWithRequestID) generateAndInsertRequestID(md *metadata.MD, nthRequest, attempt uint32) { - wr.gsc.generateAndInsertRequestID(md, nthRequest, attempt) -} - -func (gsc *grpcSpannerClient) generateAndInsertRequestID(md *metadata.MD, nthRequest, attempt uint32) { - // Google Engineering has requested that each value be added in Decimal unpadded. - // Should we have a standardized endianness: Little Endian or Big Endian? - reqID := fmt.Sprintf("%d.%s.%d.%d.%d.%d", xSpannerRequestIDVersion, randIDForProcess, gsc.id, gsc.channelID, nthRequest, attempt) - if *md == nil { - *md = metadata.MD{} - } - md.Set(xSpannerRequestIDHeader, reqID) -} - -type wrapRetryFn func(err error) (time.Duration, bool) - -var _ gax.Retryer = (wrapRetryFn)(nil) - -func (fn wrapRetryFn) Retry(err error) (time.Duration, bool) { - return fn(err) -} - -func (g *grpcSpannerClient) nextNthRequest() uint32 { - return g.nthRequest.Add(1) -} - -type requestIDWrap struct { - md *metadata.MD - nthRequest uint32 - gsc *grpcSpannerClient -} - -func (gsc *grpcSpannerClient) generateRequestIDHeaderInjector() *requestIDWrap { - // Setup and track x-goog-request-id. - md := new(metadata.MD) - return &requestIDWrap{md: md, nthRequest: gsc.nextNthRequest(), gsc: gsc} -} - -func (riw *requestIDWrap) withNextRetryAttempt(attempt uint32) gax.CallOption { - riw.gsc.generateAndInsertRequestID(riw.md, riw.nthRequest, attempt) - // If no gRPC stream is available, try to initiate one. - return gax.WithGRPCOptions(grpc.Header(riw.md)) -} diff --git a/vendor/cloud.google.com/go/spanner/retry.go b/vendor/cloud.google.com/go/spanner/retry.go deleted file mode 100644 index 9fa0cadeda..0000000000 --- a/vendor/cloud.google.com/go/spanner/retry.go +++ /dev/null @@ -1,166 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "errors" - "strings" - "time" - - "cloud.google.com/go/internal/trace" - "github.com/googleapis/gax-go/v2" - "google.golang.org/genproto/googleapis/rpc/errdetails" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -const ( - retryInfoKey = "google.rpc.retryinfo-bin" -) - -// DefaultRetryBackoff is used for retryers as a fallback value when the server -// did not return any retry information. -var DefaultRetryBackoff = gax.Backoff{ - Initial: 20 * time.Millisecond, - Max: 32 * time.Second, - Multiplier: 1.3, -} - -// spannerRetryer extends the generic gax Retryer, but also checks for any -// retry info returned by Cloud Spanner and uses that if present. -type spannerRetryer struct { - gax.Retryer -} - -// onCodes returns a spannerRetryer that will retry on the specified error -// codes. For Internal errors, only errors that have one of a list of known -// descriptions should be retried. -func onCodes(bo gax.Backoff, cc ...codes.Code) gax.Retryer { - return &spannerRetryer{ - Retryer: gax.OnCodes(cc, bo), - } -} - -// Retry returns the retry delay returned by Cloud Spanner if that is present. -// Otherwise it returns the retry delay calculated by the generic gax Retryer. -func (r *spannerRetryer) Retry(err error) (time.Duration, bool) { - errCode := status.Code(err) - if errCode == codes.Internal && - !strings.Contains(err.Error(), "stream terminated by RST_STREAM") && - // See b/25451313. - !strings.Contains(err.Error(), "HTTP/2 error code: INTERNAL_ERROR") && - // See b/27794742. - !strings.Contains(err.Error(), "Connection closed with unknown cause") && - !strings.Contains(err.Error(), "Received unexpected EOS on DATA frame from server") && - !strings.Contains(err.Error(), "Authentication backend internal server error. Please retry") { - return 0, false - } - - delay, shouldRetry := r.Retryer.Retry(err) - if !shouldRetry { - return 0, false - } - - serverDelay, hasServerDelay := ExtractRetryDelay(err) - // Retry ResourceExhausted error only if there's a server delay in the trailer - if errCode == codes.ResourceExhausted && (!hasServerDelay || serverDelay <= 0) { - return 0, false - } - - if hasServerDelay { - delay = serverDelay - } - return delay, true -} - -// runWithRetryOnAbortedOrFailedInlineBeginOrSessionNotFound executes the given function and -// retries it if it returns an Aborted, Session not found error or certain Internal errors. The retry -// is delayed if the error was Aborted or Internal error. The delay between retries is the delay -// returned by Cloud Spanner, or if none is returned, the calculated delay with -// a minimum of 10ms and maximum of 32s. There is no delay before the retry if -// the error was Session not found or failed inline begin transaction. -func runWithRetryOnAbortedOrFailedInlineBeginOrSessionNotFound(ctx context.Context, f func(context.Context) error) error { - retryer := onCodes(DefaultRetryBackoff, codes.Aborted, codes.ResourceExhausted, codes.Internal) - funcWithRetry := func(ctx context.Context) error { - for { - err := f(ctx) - if err == nil { - return nil - } - // Get Spanner or GRPC status error. - // TODO(loite): Refactor to unwrap Status error instead of Spanner - // error when statusError implements the (errors|xerrors).Wrapper - // interface. - var retryErr error - var se *Error - if errors.As(err, &se) { - // It is a (wrapped) Spanner error. Use that to check whether - // we should retry. - retryErr = se - } else { - // It's not a Spanner error, check if it is a status error. - _, ok := status.FromError(err) - if !ok { - return err - } - retryErr = err - } - if isSessionNotFoundError(retryErr) { - trace.TracePrintf(ctx, nil, "Retrying after Session not found") - continue - } - if isFailedInlineBeginTransaction(retryErr) { - trace.TracePrintf(ctx, nil, "Retrying after failed inline begin transaction") - continue - } - delay, shouldRetry := retryer.Retry(retryErr) - if !shouldRetry { - return err - } - trace.TracePrintf(ctx, nil, "Backing off after ABORTED for %s, then retrying", delay) - if err := gax.Sleep(ctx, delay); err != nil { - return err - } - } - } - return funcWithRetry(ctx) -} - -// ExtractRetryDelay extracts retry backoff from a *spanner.Error if present. -func ExtractRetryDelay(err error) (time.Duration, bool) { - var se *Error - var s *status.Status - // Unwrap status error. - if errors.As(err, &se) { - s = status.Convert(se.Unwrap()) - } else { - s = status.Convert(err) - } - if s == nil { - return 0, false - } - for _, detail := range s.Details() { - if retryInfo, ok := detail.(*errdetails.RetryInfo); ok { - if !retryInfo.GetRetryDelay().IsValid() { - return 0, false - } - return retryInfo.GetRetryDelay().AsDuration(), true - } - } - return 0, false -} diff --git a/vendor/cloud.google.com/go/spanner/row.go b/vendor/cloud.google.com/go/spanner/row.go deleted file mode 100644 index b0c23ee5cf..0000000000 --- a/vendor/cloud.google.com/go/spanner/row.go +++ /dev/null @@ -1,589 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "errors" - "fmt" - "reflect" - "strings" - - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "google.golang.org/grpc/codes" - proto3 "google.golang.org/protobuf/types/known/structpb" -) - -// A Row is a view of a row of data returned by a Cloud Spanner read. -// It consists of a number of columns; the number depends on the columns -// used to construct the read. -// -// The column values can be accessed by index. For instance, if the read specified -// []string{"photo_id", "caption"}, then each row will contain two -// columns: "photo_id" with index 0, and "caption" with index 1. -// -// Column values are decoded by using one of the Column, ColumnByName, or -// Columns methods. The valid values passed to these methods depend on the -// column type. For example: -// -// var photoID int64 -// err := row.Column(0, &photoID) // Decode column 0 as an integer. -// -// var caption string -// err := row.Column(1, &caption) // Decode column 1 as a string. -// -// // Decode all the columns. -// err := row.Columns(&photoID, &caption) -// -// Supported types and their corresponding Cloud Spanner column type(s) are: -// -// *string(not NULL), *NullString - STRING -// *[]string, *[]NullString - STRING ARRAY -// *[]byte - BYTES -// *[][]byte - BYTES ARRAY -// *int64(not NULL), *NullInt64 - INT64 -// *[]int64, *[]NullInt64 - INT64 ARRAY -// *bool(not NULL), *NullBool - BOOL -// *[]bool, *[]NullBool - BOOL ARRAY -// *float32(not NULL), *NullFloat32 - FLOAT32 -// *[]float32, *[]NullFloat32 - FLOAT32 ARRAY -// *float64(not NULL), *NullFloat64 - FLOAT64 -// *[]float64, *[]NullFloat64 - FLOAT64 ARRAY -// *big.Rat(not NULL), *NullNumeric - NUMERIC -// *[]big.Rat, *[]NullNumeric - NUMERIC ARRAY -// *time.Time(not NULL), *NullTime - TIMESTAMP -// *[]time.Time, *[]NullTime - TIMESTAMP ARRAY -// *Date(not NULL), *NullDate - DATE -// *[]civil.Date, *[]NullDate - DATE ARRAY -// *uuid.UUID(not NULL), *NullUuid - UUID -// *[]uuid.UUID, *[]NullUuid - UUID Array -// *[]*some_go_struct, *[]NullRow - STRUCT ARRAY -// *NullJSON - JSON -// *[]NullJSON - JSON ARRAY -// *GenericColumnValue - any Cloud Spanner type -// -// For TIMESTAMP columns, the returned time.Time object will be in UTC. -// -// To fetch an array of BYTES, pass a *[][]byte. To fetch an array of (sub)rows, pass -// a *[]spanner.NullRow or a *[]*some_go_struct where some_go_struct holds all -// information of the subrow, see spanner.Row.ToStruct for the mapping between a -// Cloud Spanner row and a Go struct. To fetch an array of other types, pass a -// *[]spanner.NullXXX type of the appropriate type. Use GenericColumnValue when you -// don't know in advance what column type to expect. -// -// Row decodes the row contents lazily; as a result, each call to a getter has -// a chance of returning an error. -// -// A column value may be NULL if the corresponding value is not present in -// Cloud Spanner. The spanner.NullXXX types (spanner.NullInt64 et al.) allow fetching -// values that may be null. A NULL BYTES can be fetched into a *[]byte as nil. -// It is an error to fetch a NULL value into any other type. -type Row struct { - fields []*sppb.StructType_Field - vals []*proto3.Value // keep decoded for now -} - -// String implements fmt.stringer. -func (r *Row) String() string { - return fmt.Sprintf("{fields: %s, values: %s}", r.fields, r.vals) -} - -// errNamesValuesMismatch returns error for when columnNames count is not equal -// to columnValues count. -func errNamesValuesMismatch(columnNames []string, columnValues []interface{}) error { - return spannerErrorf(codes.FailedPrecondition, - "different number of names(%v) and values(%v)", len(columnNames), len(columnValues)) -} - -// NewRow returns a Row containing the supplied data. This can be useful for -// mocking Cloud Spanner Read and Query responses for unit testing. -func NewRow(columnNames []string, columnValues []interface{}) (*Row, error) { - if len(columnValues) != len(columnNames) { - return nil, errNamesValuesMismatch(columnNames, columnValues) - } - r := Row{ - fields: make([]*sppb.StructType_Field, len(columnValues)), - vals: make([]*proto3.Value, len(columnValues)), - } - for i := range columnValues { - val, typ, err := encodeValue(columnValues[i]) - if err != nil { - return nil, err - } - r.fields[i] = &sppb.StructType_Field{ - Name: columnNames[i], - Type: typ, - } - r.vals[i] = val - } - return &r, nil -} - -// Size is the number of columns in the row. -func (r *Row) Size() int { - return len(r.fields) -} - -// ColumnName returns the name of column i, or empty string for invalid column. -func (r *Row) ColumnName(i int) string { - if i < 0 || i >= len(r.fields) { - return "" - } - return r.fields[i].Name -} - -// ColumnIndex returns the index of the column with the given name. The -// comparison is case-sensitive. -func (r *Row) ColumnIndex(name string) (int, error) { - found := false - var index int - if len(r.vals) != len(r.fields) { - return 0, errFieldsMismatchVals(r) - } - for i, f := range r.fields { - if f == nil { - return 0, errNilColType(i) - } - if name == f.Name { - if found { - return 0, errDupColName(name) - } - found = true - index = i - } - } - if !found { - return 0, errColNotFound(name) - } - return index, nil -} - -// ColumnNames returns all column names of the row. -func (r *Row) ColumnNames() []string { - var n []string - for _, c := range r.fields { - n = append(n, c.Name) - } - return n -} - -// ColumnType returns the Cloud Spanner Type of column i, or nil for invalid column. -func (r *Row) ColumnType(i int) *sppb.Type { - if i < 0 || i >= len(r.fields) { - return nil - } - return r.fields[i].Type -} - -// ColumnValue returns the Cloud Spanner Value of column i, or nil for invalid column. -func (r *Row) ColumnValue(i int) *proto3.Value { - if i < 0 || i >= len(r.vals) { - return nil - } - return r.vals[i] -} - -// errColIdxOutOfRange returns error for requested column index is out of the -// range of the target Row's columns. -func errColIdxOutOfRange(i int, r *Row) error { - return spannerErrorf(codes.OutOfRange, "column index %d out of range [0,%d)", i, len(r.vals)) -} - -// errDecodeColumn returns error for not being able to decode a indexed column. -func errDecodeColumn(i int, err error) error { - if err == nil { - return nil - } - var se *Error - if !errors.As(err, &se) { - return spannerErrorf(codes.InvalidArgument, "failed to decode column %v, error = <%v>", i, err) - } - se.decorate(fmt.Sprintf("failed to decode column %v", i)) - return se -} - -// errFieldsMismatchVals returns error for field count isn't equal to value count in a Row. -func errFieldsMismatchVals(r *Row) error { - return spannerErrorf(codes.FailedPrecondition, "row has different number of fields(%v) and values(%v)", - len(r.fields), len(r.vals)) -} - -// errNilColType returns error for column type for column i being nil in the row. -func errNilColType(i int) error { - return spannerErrorf(codes.FailedPrecondition, "column(%v)'s type is nil", i) -} - -// Column fetches the value from the ith column, decoding it into ptr. -// See the Row documentation for the list of acceptable argument types. -// see Client.ReadWriteTransaction for an example. -func (r *Row) Column(i int, ptr interface{}) error { - if len(r.vals) != len(r.fields) { - return errFieldsMismatchVals(r) - } - if i < 0 || i >= len(r.fields) { - return errColIdxOutOfRange(i, r) - } - if r.fields[i] == nil { - return errNilColType(i) - } - if err := decodeValue(r.vals[i], r.fields[i].Type, ptr); err != nil { - return errDecodeColumn(i, err) - } - return nil -} - -// errDupColName returns error for duplicated column name in the same row. -func errDupColName(n string) error { - return spannerErrorf(codes.FailedPrecondition, "ambiguous column name %q", n) -} - -// errColNotFound returns error for not being able to find a named column. -func errColNotFound(n string) error { - return spannerErrorf(codes.NotFound, "column %q not found", n) -} - -func errNotASlicePointer() error { - return spannerErrorf(codes.InvalidArgument, "destination must be a pointer to a slice") -} - -func errNilSlicePointer() error { - return spannerErrorf(codes.InvalidArgument, "destination must be a non nil pointer") -} - -func errTooManyColumns() error { - return spannerErrorf(codes.InvalidArgument, "too many columns returned for primitive slice") -} - -// ColumnByName fetches the value from the named column, decoding it into ptr. -// See the Row documentation for the list of acceptable argument types. -func (r *Row) ColumnByName(name string, ptr interface{}) error { - index, err := r.ColumnIndex(name) - if err != nil { - return err - } - return r.Column(index, ptr) -} - -// errNumOfColValue returns error for providing wrong number of values to Columns. -func errNumOfColValue(n int, r *Row) error { - return spannerErrorf(codes.InvalidArgument, - "Columns(): number of arguments (%d) does not match row size (%d)", n, len(r.vals)) -} - -// Columns fetches all the columns in the row at once. -// -// The value of the kth column will be decoded into the kth argument to Columns. See -// Row for the list of acceptable argument types. The number of arguments must be -// equal to the number of columns. Pass nil to specify that a column should be -// ignored. -func (r *Row) Columns(ptrs ...interface{}) error { - if len(ptrs) != len(r.vals) { - return errNumOfColValue(len(ptrs), r) - } - if len(r.vals) != len(r.fields) { - return errFieldsMismatchVals(r) - } - for i, p := range ptrs { - if p == nil { - continue - } - if err := r.Column(i, p); err != nil { - return err - } - } - return nil -} - -// errToStructArgType returns error for p not having the correct data type(pointer to Go struct) to -// be the argument of Row.ToStruct. -func errToStructArgType(p interface{}) error { - return spannerErrorf(codes.InvalidArgument, "ToStruct(): type %T is not a valid pointer to Go struct", p) -} - -// ToStruct fetches the columns in a row into the fields of a struct. -// The rules for mapping a row's columns into a struct's exported fields -// are: -// -// 1. If a field has a `spanner: "column_name"` tag, then decode column -// 'column_name' into the field. A special case is the `spanner: "-"` -// tag, which instructs ToStruct to ignore the field during decoding. -// -// 2. Otherwise, if the name of a field matches the name of a column (ignoring case), -// decode the column into the field. -// -// 3. The number of columns in the row must match the number of exported fields in the struct. -// There must be exactly one match for each column in the row. The method will return an error -// if a column in the row cannot be assigned to a field in the struct. -// -// The fields of the destination struct can be of any type that is acceptable -// to spanner.Row.Column. -// -// Slice and pointer fields will be set to nil if the source column is NULL, and a -// non-nil value if the column is not NULL. To decode NULL values of other types, use -// one of the spanner.NullXXX types as the type of the destination field. -// -// If ToStruct returns an error, the contents of p are undefined. Some fields may -// have been successfully populated, while others were not; you should not use any of -// the fields. -func (r *Row) ToStruct(p interface{}) error { - // Check if p is a pointer to a struct - if t := reflect.TypeOf(p); t == nil || t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { - return errToStructArgType(p) - } - if len(r.vals) != len(r.fields) { - return errFieldsMismatchVals(r) - } - // Call decodeStruct directly to decode the row as a typed proto.ListValue. - return decodeStruct( - &sppb.StructType{Fields: r.fields}, - &proto3.ListValue{Values: r.vals}, - p, - false, - ) -} - -// ToStructLenient fetches the columns in a row into the fields of a struct. -// The rules for mapping a row's columns into a struct's exported fields -// are: -// -// 1. If a field has a `spanner: "column_name"` tag, then decode column -// 'column_name' into the field. A special case is the `spanner: "-"` -// tag, which instructs ToStruct to ignore the field during decoding. -// -// 2. Otherwise, if the name of a field matches the name of a column (ignoring case), -// decode the column into the field. -// -// 3. The number of columns in the row and exported fields in the struct do not need to match. -// Any field in the struct that cannot not be assigned a value from the row is assigned its default value. -// Any column in the row that does not have a corresponding field in the struct is ignored. -// -// The fields of the destination struct can be of any type that is acceptable -// to spanner.Row.Column. -// -// Slice and pointer fields will be set to nil if the source column is NULL, and a -// non-nil value if the column is not NULL. To decode NULL values of other types, use -// one of the spanner.NullXXX types as the type of the destination field. -// -// If ToStructLenient returns an error, the contents of p are undefined. Some fields may -// have been successfully populated, while others were not; you should not use any of -// the fields. -func (r *Row) ToStructLenient(p interface{}) error { - // Check if p is a pointer to a struct - if t := reflect.TypeOf(p); t == nil || t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { - return errToStructArgType(p) - } - if len(r.vals) != len(r.fields) { - return errFieldsMismatchVals(r) - } - // Call decodeStruct directly to decode the row as a typed proto.ListValue. - return decodeStruct( - &sppb.StructType{Fields: r.fields}, - &proto3.ListValue{Values: r.vals}, - p, - true, - ) -} - -// SelectAll iterates all rows to the end. After iterating it closes the rows -// and propagates any errors that could pop up with destination slice partially filled. -// It expects that destination should be a slice. For each row, it scans data and appends it to the destination slice. -// SelectAll supports both types of slices: slice of pointers and slice of structs or primitives by value, -// for example: -// -// type Singer struct { -// ID string -// Name string -// } -// -// var singersByPtr []*Singer -// var singersByValue []Singer -// -// Both singersByPtr and singersByValue are valid destinations for SelectAll function. -// -// Add the option `spanner.WithLenient()` to instruct SelectAll to ignore additional columns in the rows that are not present in the destination struct. -// example: -// -// var singersByPtr []*Singer -// err := spanner.SelectAll(row, &singersByPtr, spanner.WithLenient()) -func SelectAll(rows rowIterator, destination interface{}, options ...DecodeOptions) error { - if rows == nil { - return errors.New("rows is nil") - } - if destination == nil { - return errors.New("destination is nil") - } - dstVal := reflect.ValueOf(destination) - if !dstVal.IsValid() || (dstVal.Kind() == reflect.Ptr && dstVal.IsNil()) { - return errNilSlicePointer() - } - if dstVal.Kind() != reflect.Ptr { - return errNotASlicePointer() - } - dstVal = dstVal.Elem() - dstType := dstVal.Type() - if k := dstType.Kind(); k != reflect.Slice { - return errNotASlicePointer() - } - - itemType := dstType.Elem() - var itemByPtr bool - // If it's a slice of pointers to structs, - // we handle it the same way as it would be slice of struct by value - // and dereference pointers to values, - // because eventually we work with fields. - // But if it's a slice of primitive type e.g. or []string or []*string, - // we must leave and pass elements as is. - if itemType.Kind() == reflect.Ptr { - elementBaseTypeElem := itemType.Elem() - if elementBaseTypeElem.Kind() == reflect.Struct { - itemType = elementBaseTypeElem - itemByPtr = true - } - } - s := &decodeSetting{} - for _, opt := range options { - opt.Apply(s) - } - - isPrimitive := itemType.Kind() != reflect.Struct - var pointers []interface{} - isFirstRow := true - var err error - return rows.Do(func(row *Row) error { - sliceItem := reflect.New(itemType) - if !isPrimitive { - if isFirstRow { - defer func() { - isFirstRow = false - }() - if pointers, err = structPointers(sliceItem.Elem(), row.fields, s.Lenient); err != nil { - return err - } - } - defer func() { - for _, ptr := range pointers { - v := reflect.ValueOf(ptr) - if v.IsValid() && !(v.IsNil() || v.IsZero()) { - e := v.Elem() - e.Set(reflect.Zero(e.Type())) - } - } - }() - } else if isPrimitive { - if len(row.fields) > 1 && !s.Lenient { - return errTooManyColumns() - } - pointers = []interface{}{sliceItem.Interface()} - } - if len(pointers) == 0 { - return nil - } - err = row.Columns(pointers...) - if err != nil { - return err - } - if !isPrimitive { - e := sliceItem.Elem() - idx := 0 - for _, p := range pointers { - if p == nil { - continue - } - e.Field(idx).Set(reflect.ValueOf(p).Elem()) - idx++ - } - } - var elemVal reflect.Value - if itemByPtr { - if isFirstRow { - // create a new pointer to the struct with all the values copied from sliceItem - // because same underlying pointers array will be used for next rows - elemVal = reflect.New(itemType) - elemVal.Elem().Set(sliceItem.Elem()) - } else { - elemVal = sliceItem - } - } else { - elemVal = sliceItem.Elem() - } - dstVal.Set(reflect.Append(dstVal, elemVal)) - return nil - }) -} - -func structPointers(sliceItem reflect.Value, cols []*sppb.StructType_Field, lenient bool) ([]interface{}, error) { - pointers := make([]interface{}, 0, len(cols)) - fieldTag := make(map[string]reflect.Value, len(cols)) - initFieldTag(sliceItem, &fieldTag) - - for i, colName := range cols { - if colName.Name == "" { - return nil, errColNotFound(fmt.Sprintf("column %d", i)) - } - - var fieldVal reflect.Value - if v, ok := fieldTag[strings.ToLower(colName.GetName())]; ok { - fieldVal = v - } else { - if !lenient { - return nil, errNoOrDupGoField(sliceItem, colName.GetName()) - } - fieldVal = sliceItem.FieldByName(colName.GetName()) - } - if !fieldVal.IsValid() || !fieldVal.CanSet() { - // have to add if we found a column because Columns() requires - // len(cols) arguments or it will error. This way we can scan to - // a useless pointer - pointers = append(pointers, nil) - continue - } - - pointers = append(pointers, fieldVal.Addr().Interface()) - } - return pointers, nil -} - -// Initialization the tags from struct. -func initFieldTag(sliceItem reflect.Value, fieldTagMap *map[string]reflect.Value) { - typ := sliceItem.Type() - - for i := 0; i < sliceItem.NumField(); i++ { - fieldType := typ.Field(i) - exported := (fieldType.PkgPath == "") - // If a named field is unexported, ignore it. An anonymous - // unexported field is processed, because it may contain - // exported fields, which are visible. - if !exported && !fieldType.Anonymous { - continue - } - if fieldType.Type.Kind() == reflect.Struct { - // found an embedded struct - if fieldType.Anonymous { - sliceItemOfAnonymous := sliceItem.Field(i) - initFieldTag(sliceItemOfAnonymous, fieldTagMap) - continue - } - } - name, keep, _, _ := spannerTagParser(fieldType.Tag) - if !keep { - continue - } - if name == "" { - name = fieldType.Name - } - (*fieldTagMap)[strings.ToLower(name)] = sliceItem.Field(i) - } -} diff --git a/vendor/cloud.google.com/go/spanner/session.go b/vendor/cloud.google.com/go/spanner/session.go deleted file mode 100644 index 9d53364a8e..0000000000 --- a/vendor/cloud.google.com/go/spanner/session.go +++ /dev/null @@ -1,2019 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "container/heap" - "container/list" - "context" - "fmt" - "log" - "math" - "math/rand" - "runtime/debug" - "strings" - "sync" - "time" - - "cloud.google.com/go/internal/trace" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "cloud.google.com/go/spanner/internal" - "go.opencensus.io/stats" - "go.opencensus.io/tag" - octrace "go.opencensus.io/trace" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -const ( - healthCheckIntervalMins = 50 - multiplexSessionRefreshInterval = 7 * 24 * time.Hour -) - -// ActionOnInactiveTransactionKind describes the kind of action taken when there are inactive transactions. -type ActionOnInactiveTransactionKind int - -const ( - actionUnspecified ActionOnInactiveTransactionKind = iota - // NoAction action does not perform any action on inactive transactions. - NoAction - // Warn action logs inactive transactions. Any inactive transaction gets logged only once. - Warn - // Close action closes inactive transactions without logging. - Close - // WarnAndClose action logs and closes the inactive transactions. - WarnAndClose -) - -// InactiveTransactionRemovalOptions has configurations for action on long-running transactions. -type InactiveTransactionRemovalOptions struct { - // ActionOnInactiveTransaction is the configuration to choose action for inactive transactions. - // It can be one of Warn, Close, WarnAndClose. - ActionOnInactiveTransaction ActionOnInactiveTransactionKind - // long-running transactions will be cleaned up if utilisation is - // greater than the below value. - usedSessionsRatioThreshold float64 - // A transaction is considered to be idle if it has not been used for - // a duration greater than the below value. - idleTimeThreshold time.Duration - // frequency for closing inactive transactions - executionFrequency time.Duration - // variable that keeps track of the last execution time when inactive transactions - // were removed by the maintainer task. - lastExecutionTime time.Time -} - -// sessionHandle is an interface for transactions to access Cloud Spanner -// sessions safely. It is generated by sessionPool.take(). -type sessionHandle struct { - // mu guarantees that the inner session object is returned / destroyed only - // once. - mu sync.Mutex - // session is a pointer to a session object. Transactions never need to - // access it directly. - session *session - // client is the RPC channel to Cloud Spanner. It is set only once during session acquisition. - client spannerClient - // checkoutTime is the time the session was checked out of the pool. - checkoutTime time.Time - // lastUseTime is the time the session was last used after checked out of the pool. - lastUseTime time.Time - // trackedSessionHandle is the linked list node which links the session to - // the list of tracked session handles. trackedSessionHandle is only set if - // TrackSessionHandles has been enabled in the session pool configuration. - trackedSessionHandle *list.Element - // stack is the call stack of the goroutine that checked out the session - // from the pool. This can be used to track down session leak problems. - stack []byte - // eligibleForLongRunning tells if the inner session is eligible to be long-running. - eligibleForLongRunning bool - // if the inner session object is long-running then the stack gets logged once. - isSessionLeakLogged bool -} - -// recycle gives the inner session object back to its home session pool. It is -// safe to call recycle multiple times but only the first one would take effect. -func (sh *sessionHandle) recycle() { - sh.mu.Lock() - if sh.session == nil { - // sessionHandle has already been recycled. - sh.mu.Unlock() - return - } - p := sh.session.pool - tracked := sh.trackedSessionHandle - s := sh.session - sh.session = nil - sh.client = nil - sh.trackedSessionHandle = nil - sh.checkoutTime = time.Time{} - sh.lastUseTime = time.Time{} - sh.stack = nil - sh.mu.Unlock() - s.recycle() - if tracked != nil { - p.mu.Lock() - p.trackedSessionHandles.Remove(tracked) - p.mu.Unlock() - } -} - -// getID gets the Cloud Spanner session ID from the internal session object. -// getID returns empty string if the sessionHandle is nil or the inner session -// object has been released by recycle / destroy. -func (sh *sessionHandle) getID() string { - sh.mu.Lock() - defer sh.mu.Unlock() - if sh.session == nil { - // sessionHandle has already been recycled/destroyed. - return "" - } - return sh.session.getID() -} - -// getClient gets the Cloud Spanner RPC client associated with the session ID -// in sessionHandle. -func (sh *sessionHandle) getClient() spannerClient { - sh.mu.Lock() - defer sh.mu.Unlock() - if sh.session == nil { - return nil - } - if sh.client != nil { - // Use the gRPC connection from the session handle - return sh.client - } - return sh.session.client -} - -// getMetadata returns the metadata associated with the session in sessionHandle. -func (sh *sessionHandle) getMetadata() metadata.MD { - sh.mu.Lock() - defer sh.mu.Unlock() - if sh.session == nil { - return nil - } - return sh.session.md -} - -// getTransactionID returns the transaction id in the session if available. -func (sh *sessionHandle) getTransactionID() transactionID { - sh.mu.Lock() - defer sh.mu.Unlock() - if sh.session == nil { - return nil - } - return sh.session.tx -} - -// destroy destroys the inner session object. It is safe to call destroy -// multiple times and only the first call would attempt to -// destroy the inner session object. -func (sh *sessionHandle) destroy() { - sh.mu.Lock() - s := sh.session - if s == nil { - // sessionHandle has already been recycled. - sh.mu.Unlock() - return - } - tracked := sh.trackedSessionHandle - sh.session = nil - sh.client = nil - sh.trackedSessionHandle = nil - sh.checkoutTime = time.Time{} - sh.lastUseTime = time.Time{} - sh.stack = nil - sh.mu.Unlock() - - if tracked != nil { - p := s.pool - p.mu.Lock() - p.trackedSessionHandles.Remove(tracked) - p.mu.Unlock() - } - // since sessionHandle is always used by Transactions we can safely destroy the session with wasInUse=true - s.destroy(false, true) -} - -func (sh *sessionHandle) updateLastUseTime() { - sh.mu.Lock() - defer sh.mu.Unlock() - if sh.session != nil { - sh.lastUseTime = time.Now() - } -} - -// session wraps a Cloud Spanner session ID through which transactions are -// created and executed. -type session struct { - // client is the RPC channel to Cloud Spanner. It is set only once during - // session's creation. - client spannerClient - // id is the unique id of the session in Cloud Spanner. It is set only once - // during session's creation. - id string - // pool is the session's home session pool where it was created. It is set - // only once during session's creation. - pool *sessionPool - // createTime is the timestamp of the session's creation. It is set only - // once during session's creation. - createTime time.Time - // logger is the logger configured for the Spanner client that created the - // session. If nil, logging will be directed to the standard logger. - logger *log.Logger - - // mu protects the following fields from concurrent access: both - // healthcheck workers and transactions can modify them. - mu sync.Mutex - // valid marks the validity of a session. - valid bool - // hcIndex is the index of the session inside the global healthcheck queue. - // If hcIndex < 0, session has been unregistered from the queue. - hcIndex int - // idleList is the linkedlist node which links the session to its home - // session pool's idle list. If idleList == nil, the - // session is not in idle list. - idleList *list.Element - // nextCheck is the timestamp of next scheduled healthcheck of the session. - // It is maintained by the global health checker. - nextCheck time.Time - // checkingHelath is true if currently this session is being processed by - // health checker. Must be modified under health checker lock. - checkingHealth bool - // md is the Metadata to be sent with each request. - md metadata.MD - // tx contains the transaction id if the session has been prepared for - // write. - tx transactionID - // firstHCDone indicates whether the first health check is done or not. - firstHCDone bool - // isMultiplexed is true if the session is multiplexed. - isMultiplexed bool -} - -// isValid returns true if the session is still valid for use. -func (s *session) isValid() bool { - s.mu.Lock() - defer s.mu.Unlock() - return s.valid -} - -// isWritePrepared returns true if the session is prepared for write. -func (s *session) isWritePrepared() bool { - s.mu.Lock() - defer s.mu.Unlock() - return s.tx != nil -} - -// String implements fmt.Stringer for session. -func (s *session) String() string { - s.mu.Lock() - defer s.mu.Unlock() - return fmt.Sprintf("", - s.id, s.hcIndex, s.idleList, s.valid, s.createTime, s.nextCheck) -} - -// ping verifies if the session is still alive in Cloud Spanner. -func (s *session) ping() error { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - // Start parent span that doesn't record. - _, span := octrace.StartSpan(ctx, "cloud.google.com/go/spanner.ping", octrace.WithSampler(octrace.NeverSample())) - defer span.End() - - // s.getID is safe even when s is invalid. - _, err := s.client.ExecuteSql(contextWithOutgoingMetadata(ctx, s.md, true), &sppb.ExecuteSqlRequest{ - Session: s.getID(), - Sql: "SELECT 1", - }) - return err -} - -// setHcIndex atomically sets the session's index in the healthcheck queue and -// returns the old index. -func (s *session) setHcIndex(i int) int { - s.mu.Lock() - defer s.mu.Unlock() - oi := s.hcIndex - s.hcIndex = i - return oi -} - -// setIdleList atomically sets the session's idle list link and returns the old -// link. -func (s *session) setIdleList(le *list.Element) *list.Element { - s.mu.Lock() - defer s.mu.Unlock() - old := s.idleList - s.idleList = le - return old -} - -// invalidate marks a session as invalid and returns the old validity. -func (s *session) invalidate() bool { - s.mu.Lock() - defer s.mu.Unlock() - ov := s.valid - s.valid = false - return ov -} - -// setNextCheck sets the timestamp for next healthcheck on the session. -func (s *session) setNextCheck(t time.Time) { - s.mu.Lock() - defer s.mu.Unlock() - s.nextCheck = t -} - -// setTransactionID sets the transaction id in the session -func (s *session) setTransactionID(tx transactionID) { - s.mu.Lock() - defer s.mu.Unlock() - s.tx = tx -} - -// getID returns the session ID which uniquely identifies the session in Cloud -// Spanner. -func (s *session) getID() string { - s.mu.Lock() - defer s.mu.Unlock() - return s.id -} - -// getHcIndex returns the session's index into the global healthcheck priority -// queue. -func (s *session) getHcIndex() int { - s.mu.Lock() - defer s.mu.Unlock() - return s.hcIndex -} - -// getIdleList returns the session's link in its home session pool's idle list. -func (s *session) getIdleList() *list.Element { - s.mu.Lock() - defer s.mu.Unlock() - return s.idleList -} - -// getNextCheck returns the timestamp for next healthcheck on the session. -func (s *session) getNextCheck() time.Time { - s.mu.Lock() - defer s.mu.Unlock() - return s.nextCheck -} - -// recycle turns the session back to its home session pool. -func (s *session) recycle() { - s.setTransactionID(nil) - s.pool.mu.Lock() - if s.isMultiplexed { - s.pool.decNumMultiplexedInUseLocked(context.Background()) - s.pool.mu.Unlock() - return - } - if !s.pool.recycleLocked(s) { - // s is rejected by its home session pool because it expired and the - // session pool currently has enough open sessions. - s.pool.mu.Unlock() - s.destroy(false, true) - s.pool.mu.Lock() - } - s.pool.decNumInUseLocked(context.Background()) - s.pool.mu.Unlock() -} - -// destroy removes the session from its home session pool, healthcheck queue -// and Cloud Spanner service. -func (s *session) destroy(isExpire, wasInUse bool) bool { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - return s.destroyWithContext(ctx, isExpire, wasInUse) -} - -func (s *session) destroyWithContext(ctx context.Context, isExpire, wasInUse bool) bool { - // Remove s from session pool. - if !s.pool.remove(s, isExpire, wasInUse) { - return false - } - // Unregister s from healthcheck queue. - s.pool.hc.unregister(s) - return true -} - -func (s *session) delete(ctx context.Context) { - // Ignore the error because even if we fail to explicitly destroy the - // session, it will be eventually garbage collected by Cloud Spanner. - err := s.client.DeleteSession(contextWithOutgoingMetadata(ctx, s.md, true), &sppb.DeleteSessionRequest{Name: s.getID()}) - // Do not log DeadlineExceeded errors when deleting sessions, as these do - // not indicate anything the user can or should act upon. - if err != nil && ErrCode(err) != codes.DeadlineExceeded { - logf(s.logger, "Failed to delete session %v. Error: %v", s.getID(), err) - } -} - -// SessionPoolConfig stores configurations of a session pool. -type SessionPoolConfig struct { - // MaxOpened is the maximum number of opened sessions allowed by the session - // pool. If the client tries to open a session and there are already - // MaxOpened sessions, it will block until one becomes available or the - // context passed to the client method is canceled or times out. - // - // Defaults to NumChannels * 100. - MaxOpened uint64 - - // MinOpened is the minimum number of opened sessions that the session pool - // tries to maintain. Session pool won't continue to expire sessions if - // number of opened connections drops below MinOpened. However, if a session - // is found to be broken, it will still be evicted from the session pool, - // therefore it is posssible that the number of opened sessions drops below - // MinOpened. - // - // Defaults to 100. - MinOpened uint64 - - // MaxIdle is the maximum number of idle sessions that are allowed in the - // session pool. - // - // Defaults to 0. - MaxIdle uint64 - - // MaxBurst is the maximum number of concurrent session creation requests. - // - // Deprecated: MaxBurst exists for historical compatibility and should not - // be used. MaxBurst was used to limit the number of sessions that the - // session pool could create within a time frame. This was an early safety - // valve to prevent a client from overwhelming the backend if a large number - // of sessions was suddenly needed. The session pool would then pause the - // creation of sessions for a while. Such a pause is no longer needed and - // the implementation has been removed from the pool. - // - // Defaults to 10. - MaxBurst uint64 - - // incStep is the number of sessions to create in one batch when at least - // one more session is needed. - // - // Defaults to 25. - incStep uint64 - - // WriteSessions is the fraction of sessions we try to keep prepared for - // write. - // - // Deprecated: The session pool no longer prepares a fraction of the sessions with a read/write transaction. - // This setting therefore does not have any meaning anymore, and may be removed in the future. - // - // Defaults to 0.2. - WriteSessions float64 - - // HealthCheckWorkers is number of workers used by health checker for this - // pool. - // - // Defaults to 10. - HealthCheckWorkers int - - // HealthCheckInterval is how often the health checker pings a session. - // - // Defaults to 50m. - HealthCheckInterval time.Duration - - // MultiplexSessionCheckInterval is the interval at which the multiplexed session is checked whether it needs to be refreshed. - // - // Defaults to 10 mins. - MultiplexSessionCheckInterval time.Duration - - // TrackSessionHandles determines whether the session pool will keep track - // of the stacktrace of the goroutines that take sessions from the pool. - // This setting can be used to track down session leak problems. - // - // Defaults to false. - TrackSessionHandles bool - - enableMultiplexSession bool - - // enableMultiplexedSessionForRW is a flag to enable multiplexed session for read/write transactions - enableMultiplexedSessionForRW bool - - // enableMultiplexedSessionForPartitionedOps is a flag to enable multiplexed session for partitioned DML and read/query operations - enableMultiplexedSessionForPartitionedOps bool - - // healthCheckSampleInterval is how often the health checker samples live - // session (for use in maintaining session pool size). - // - // Defaults to 1m. - healthCheckSampleInterval time.Duration - - // sessionLabels for the sessions created in the session pool. - sessionLabels map[string]string - - InactiveTransactionRemovalOptions -} - -// DefaultSessionPoolConfig is the default configuration for the session pool -// that will be used for a Spanner client, unless the user supplies a specific -// session pool config. -var DefaultSessionPoolConfig = SessionPoolConfig{ - MinOpened: 100, - MaxOpened: numChannels * 100, - MaxBurst: 10, - incStep: 25, - WriteSessions: 0.2, - HealthCheckWorkers: 10, - HealthCheckInterval: healthCheckIntervalMins * time.Minute, - InactiveTransactionRemovalOptions: InactiveTransactionRemovalOptions{ - ActionOnInactiveTransaction: Warn, - executionFrequency: 2 * time.Minute, - idleTimeThreshold: 60 * time.Minute, - usedSessionsRatioThreshold: 0.95, - }, -} - -// errMinOpenedGTMapOpened returns error for SessionPoolConfig.MaxOpened < SessionPoolConfig.MinOpened when SessionPoolConfig.MaxOpened is set. -func errMinOpenedGTMaxOpened(maxOpened, minOpened uint64) error { - return spannerErrorf(codes.InvalidArgument, - "require SessionPoolConfig.MaxOpened >= SessionPoolConfig.MinOpened, got %d and %d", maxOpened, minOpened) -} - -// errWriteFractionOutOfRange returns error for -// SessionPoolConfig.WriteFraction < 0 or SessionPoolConfig.WriteFraction > 1 -func errWriteFractionOutOfRange(writeFraction float64) error { - return spannerErrorf(codes.InvalidArgument, - "require SessionPoolConfig.WriteSessions >= 0.0 && SessionPoolConfig.WriteSessions <= 1.0, got %.2f", writeFraction) -} - -// errHealthCheckWorkersNegative returns error for -// SessionPoolConfig.HealthCheckWorkers < 0 -func errHealthCheckWorkersNegative(workers int) error { - return spannerErrorf(codes.InvalidArgument, - "require SessionPoolConfig.HealthCheckWorkers >= 0, got %d", workers) -} - -// errHealthCheckIntervalNegative returns error for -// SessionPoolConfig.HealthCheckInterval < 0 -func errHealthCheckIntervalNegative(interval time.Duration) error { - return spannerErrorf(codes.InvalidArgument, - "require SessionPoolConfig.HealthCheckInterval >= 0, got %v", interval) -} - -// validate verifies that the SessionPoolConfig is good for use. -func (spc *SessionPoolConfig) validate() error { - if spc.MinOpened > spc.MaxOpened && spc.MaxOpened > 0 { - return errMinOpenedGTMaxOpened(spc.MaxOpened, spc.MinOpened) - } - if spc.HealthCheckWorkers < 0 { - return errHealthCheckWorkersNegative(spc.HealthCheckWorkers) - } - if spc.HealthCheckInterval < 0 { - return errHealthCheckIntervalNegative(spc.HealthCheckInterval) - } - return nil -} - -type muxSessionCreateRequest struct { - ctx context.Context - force bool -} - -// sessionPool creates and caches Cloud Spanner sessions. -type sessionPool struct { - // mu protects sessionPool from concurrent access. - mu sync.Mutex - // valid marks the validity of the session pool. - valid bool - // sc is used to create the sessions for the pool. - sc *sessionClient - // trackedSessionHandles contains all sessions handles that have been - // checked out of the pool. The list is only filled if TrackSessionHandles - // has been enabled. - trackedSessionHandles list.List - // idleList caches idle session IDs. Session IDs in this list can be - // allocated for use. - idleList list.List - // multiplexSessionClientCounter is the counter for the multiplexed session client. - multiplexSessionClientCounter int - // clientPool is a pool of Cloud Spanner grpc clients. - clientPool []spannerClient - // multiplexedSession contains the multiplexed session - multiplexedSession *session - // mayGetSession is for broadcasting that session retrival/creation may - // proceed. - mayGetSession chan struct{} - // multiplexedSessionReq is the ongoing multiplexed session creation request (if any). - multiplexedSessionReq chan muxSessionCreateRequest - // mayGetMultiplexedSession is for broadcasting that multiplexed session retrieval is possible. - mayGetMultiplexedSession chan bool - // sessionCreationError is the last error that occurred during session - // creation and is propagated to any waiters waiting for a session. - sessionCreationError error - // multiplexedSessionCreationError is the error that occurred during multiplexed session - // creation for the first time and is propagated to any waiters waiting for a session. - multiplexedSessionCreationError error - // numOpened is the total number of open sessions from the session pool. - numOpened uint64 - // createReqs is the number of ongoing session creation requests. - createReqs uint64 - // numWaiters is the number of processes waiting for a session to - // become available. - numWaiters uint64 - // disableBackgroundPrepareSessions indicates that the BeginTransaction - // call for a read/write transaction failed with a permanent error, such as - // PermissionDenied or `Database not found`. Further background calls to - // prepare sessions will be disabled. - disableBackgroundPrepareSessions bool - // configuration of the session pool. - SessionPoolConfig - // hc is the health checker - hc *healthChecker - // rand is a separately sourced random generator. - rand *rand.Rand - // numInUse is the number of sessions that are currently in use (checked out - // from the session pool). - numInUse uint64 - // maxNumInUse is the maximum number of sessions in use concurrently in the - // current 10 minute interval. - maxNumInUse uint64 - // lastResetTime is the start time of the window for recording maxNumInUse. - lastResetTime time.Time - // numSessions is the number of sessions that are idle for read/write. - numSessions uint64 - - // mw is the maintenance window containing statistics for the max number of - // sessions checked out of the pool during the last 10 minutes. - mw *maintenanceWindow - - // tagMap is a map of all tags that are associated with the emitted metrics. - tagMap *tag.Map - - // indicates the number of leaked sessions removed from the session pool. - // This is valid only when ActionOnInactiveTransaction is WarnAndClose or ActionOnInactiveTransaction is Close in InactiveTransactionRemovalOptions. - numOfLeakedSessionsRemoved uint64 - - otConfig *openTelemetryConfig - - // enableMultiplexSession is a flag to enable multiplexed session. - enableMultiplexSession bool -} - -// newSessionPool creates a new session pool. -func newSessionPool(sc *sessionClient, config SessionPoolConfig) (*sessionPool, error) { - if err := config.validate(); err != nil { - return nil, err - } - if config.HealthCheckWorkers == 0 { - // With 10 workers and assuming average latency of 5ms for - // BeginTransaction, we will be able to prepare 2000 tx/sec in advance. - // If the rate of takeWriteSession is more than that, it will degrade to - // doing BeginTransaction inline. - // - // TODO: consider resizing the worker pool dynamically according to the load. - config.HealthCheckWorkers = 10 - } - if config.HealthCheckInterval == 0 { - config.HealthCheckInterval = healthCheckIntervalMins * time.Minute - } - if config.healthCheckSampleInterval == 0 { - config.healthCheckSampleInterval = time.Minute - } - if config.ActionOnInactiveTransaction == actionUnspecified { - config.ActionOnInactiveTransaction = DefaultSessionPoolConfig.ActionOnInactiveTransaction - } - if config.idleTimeThreshold == 0 { - config.idleTimeThreshold = DefaultSessionPoolConfig.idleTimeThreshold - } - if config.executionFrequency == 0 { - config.executionFrequency = DefaultSessionPoolConfig.executionFrequency - } - if config.usedSessionsRatioThreshold == 0 { - config.usedSessionsRatioThreshold = DefaultSessionPoolConfig.usedSessionsRatioThreshold - } - if config.MultiplexSessionCheckInterval == 0 { - config.MultiplexSessionCheckInterval = 10 * time.Minute - } - - pool := &sessionPool{ - sc: sc, - valid: true, - mayGetSession: make(chan struct{}), - mayGetMultiplexedSession: make(chan bool), - multiplexedSessionReq: make(chan muxSessionCreateRequest), - SessionPoolConfig: config, - mw: newMaintenanceWindow(config.MaxOpened), - rand: rand.New(rand.NewSource(time.Now().UnixNano())), - otConfig: sc.otConfig, - enableMultiplexSession: config.enableMultiplexSession, - } - - _, instance, database, err := parseDatabaseName(sc.database) - if err != nil { - return nil, err - } - // Errors should not prevent initializing the session pool. - ctx, err := tag.New(context.Background(), - tag.Upsert(tagKeyClientID, sc.id), - tag.Upsert(tagKeyDatabase, database), - tag.Upsert(tagKeyInstance, instance), - tag.Upsert(tagKeyLibVersion, internal.Version), - ) - if err != nil { - logf(pool.sc.logger, "Failed to create tag map, error: %v", err) - } - pool.tagMap = tag.FromContext(ctx) - - // On GCE VM, within the same region an healthcheck ping takes on average - // 10ms to finish, given a 5 minutes interval and 10 healthcheck workers, a - // healthChecker can effectively mantain - // 100 checks_per_worker/sec * 10 workers * 300 seconds = 300K sessions. - pool.hc = newHealthChecker(config.HealthCheckInterval, config.MultiplexSessionCheckInterval, config.HealthCheckWorkers, config.healthCheckSampleInterval, pool) - - // First initialize the pool before we indicate that the healthchecker is - // ready. This prevents the maintainer from starting before the pool has - // been initialized, which means that we guarantee that the initial - // sessions are created using BatchCreateSessions. - if config.MinOpened > 0 { - numSessions := minUint64(config.MinOpened, math.MaxInt32) - if err := pool.initPool(numSessions); err != nil { - return nil, err - } - } - if pool.enableMultiplexSession { - go pool.createMultiplexedSession() - ctx, cancel := context.WithTimeout(ctx, 30*time.Second) - pool.multiplexedSessionReq <- muxSessionCreateRequest{force: true, ctx: ctx} - // listen for the session to be created - go func() { - select { - case <-ctx.Done(): - cancel() - return - // wait for the session to be created - case <-pool.mayGetMultiplexedSession: - } - }() - } - pool.recordStat(context.Background(), MaxAllowedSessionsCount, int64(config.MaxOpened)) - - err = registerSessionPoolOTMetrics(pool) - if err != nil { - logf(pool.sc.logger, "Error when registering session pool metrics in OpenTelemetry, error: %v", err) - } - - close(pool.hc.ready) - return pool, nil -} - -func (p *sessionPool) recordStat(ctx context.Context, m *stats.Int64Measure, n int64, tags ...tag.Tag) { - ctx = tag.NewContext(ctx, p.tagMap) - mutators := make([]tag.Mutator, len(tags)) - for i, t := range tags { - mutators[i] = tag.Upsert(t.Key, t.Value) - } - ctx, err := tag.New(ctx, mutators...) - if err != nil { - logf(p.sc.logger, "Failed to tag metrics, error: %v", err) - } - recordStat(ctx, m, n) -} - -type recordOTStatOption struct { - attr []attribute.KeyValue -} - -func (p *sessionPool) recordOTStat(ctx context.Context, m metric.Int64Counter, val int64, option recordOTStatOption) { - if m != nil { - attrs := p.otConfig.attributeMap - if len(option.attr) > 0 { - attrs = option.attr - } - m.Add(ctx, val, metric.WithAttributes(attrs...)) - } -} - -func (p *sessionPool) getRatioOfSessionsInUseLocked() float64 { - maxSessions := p.MaxOpened - if maxSessions == 0 { - return 0 - } - return float64(p.numInUse) / float64(maxSessions) -} - -func (p *sessionPool) isMultiplexedSessionForRWEnabled() bool { - p.mu.Lock() - defer p.mu.Unlock() - return p.enableMultiplexedSessionForRW -} - -func (p *sessionPool) isMultiplexedSessionForPartitionedOpsEnabled() bool { - p.mu.Lock() - defer p.mu.Unlock() - return p.enableMultiplexedSessionForPartitionedOps -} - -func (p *sessionPool) disableMultiplexedSessionForRW() { - p.mu.Lock() - defer p.mu.Unlock() - p.enableMultiplexedSessionForRW = false -} - -func (p *sessionPool) disableMultiplexedSessionForPartitionedOps() { - p.mu.Lock() - defer p.mu.Unlock() - p.enableMultiplexedSessionForPartitionedOps = false -} - -// gets sessions which are unexpectedly long-running. -func (p *sessionPool) getLongRunningSessionsLocked() []*sessionHandle { - usedSessionsRatio := p.getRatioOfSessionsInUseLocked() - var longRunningSessions []*sessionHandle - if usedSessionsRatio > p.usedSessionsRatioThreshold { - element := p.trackedSessionHandles.Front() - for element != nil { - sh := element.Value.(*sessionHandle) - sh.mu.Lock() - if sh.session == nil { - // sessionHandle has already been recycled/destroyed. - sh.mu.Unlock() - element = element.Next() - continue - } - diff := time.Since(sh.lastUseTime) - if !sh.eligibleForLongRunning && diff.Seconds() >= p.idleTimeThreshold.Seconds() { - if (p.ActionOnInactiveTransaction == Warn || p.ActionOnInactiveTransaction == WarnAndClose) && !sh.isSessionLeakLogged { - if p.ActionOnInactiveTransaction == Warn { - if sh.stack != nil { - logf(p.sc.logger, "session %s checked out of pool at %s is long running due to possible session leak for goroutine: \n%s", sh.session.getID(), sh.checkoutTime.Format(time.RFC3339), sh.stack) - } else { - logf(p.sc.logger, "session %s checked out of pool at %s is long running due to possible session leak for goroutine: \nEnable SessionPoolConfig.TrackSessionHandles to get stack trace associated with the session", sh.session.getID(), sh.checkoutTime.Format(time.RFC3339)) - } - sh.isSessionLeakLogged = true - } else if p.ActionOnInactiveTransaction == WarnAndClose { - if sh.stack != nil { - logf(p.sc.logger, "session %s checked out of pool at %s is long running and will be removed due to possible session leak for goroutine: \n%s", sh.session.getID(), sh.checkoutTime.Format(time.RFC3339), sh.stack) - } else { - logf(p.sc.logger, "session %s checked out of pool at %s is long running and will be removed due to possible session leak for goroutine: \nEnable SessionPoolConfig.TrackSessionHandles to get stack trace associated with the session", sh.session.getID(), sh.checkoutTime.Format(time.RFC3339)) - } - } - } - if p.ActionOnInactiveTransaction == WarnAndClose || p.ActionOnInactiveTransaction == Close { - longRunningSessions = append(longRunningSessions, sh) - } - } - sh.mu.Unlock() - element = element.Next() - } - } - return longRunningSessions -} - -// removes or logs sessions that are unexpectedly long-running. -func (p *sessionPool) removeLongRunningSessions() { - p.mu.Lock() - longRunningSessions := p.getLongRunningSessionsLocked() - p.mu.Unlock() - - // destroy long-running sessions - if p.ActionOnInactiveTransaction == WarnAndClose || p.ActionOnInactiveTransaction == Close { - var leakedSessionsRemovedCount uint64 - for _, sh := range longRunningSessions { - // removes inner session out of the pool to reduce the probability of two processes trying - // to use the same session at the same time. - sh.destroy() - leakedSessionsRemovedCount++ - } - p.mu.Lock() - p.numOfLeakedSessionsRemoved += leakedSessionsRemovedCount - p.mu.Unlock() - } -} - -func (p *sessionPool) initPool(numSessions uint64) error { - p.mu.Lock() - defer p.mu.Unlock() - return p.growPoolLocked(numSessions, true) -} - -func (p *sessionPool) growPoolLocked(numSessions uint64, distributeOverChannels bool) error { - // Take budget before the actual session creation. - numSessions = minUint64(numSessions, math.MaxInt32) - p.numOpened += uint64(numSessions) - p.recordStat(context.Background(), OpenSessionCount, int64(p.numOpened)) - p.createReqs += uint64(numSessions) - // Asynchronously create a batch of sessions for the pool. - return p.sc.batchCreateSessions(int32(numSessions), distributeOverChannels, p) -} - -func (p *sessionPool) createMultiplexedSession() { - for c := range p.multiplexedSessionReq { - p.mu.Lock() - sess := p.multiplexedSession - p.mu.Unlock() - if c.force || sess == nil { - p.mu.Lock() - p.sc.mu.Lock() - client, err := p.sc.nextClient() - p.sc.mu.Unlock() - p.mu.Unlock() - if err != nil { - // If we can't get a client, we can't create a session. - p.mu.Lock() - p.multiplexedSessionCreationError = err - p.mu.Unlock() - select { - case p.mayGetMultiplexedSession <- true: - case <-c.ctx.Done(): - } - continue - } - p.sc.executeCreateMultiplexedSession(c.ctx, client, p.sc.md, p) - continue - } - select { - case p.mayGetMultiplexedSession <- true: - case <-c.ctx.Done(): - return - } - } -} - -// sessionReady is executed by the SessionClient when a session has been -// created and is ready to use. This method will add the new session to the -// pool and decrease the number of sessions that is being created. -func (p *sessionPool) sessionReady(ctx context.Context, s *session) { - p.mu.Lock() - defer p.mu.Unlock() - // Clear any session creation error. - if s.isMultiplexed { - s.pool = p - p.multiplexedSession = s - p.multiplexedSessionCreationError = nil - p.recordStat(context.Background(), OpenSessionCount, int64(1), tag.Tag{Key: tagKeyIsMultiplexed, Value: "true"}) - p.recordStat(context.Background(), SessionsCount, 1, tagNumSessions, tag.Tag{Key: tagKeyIsMultiplexed, Value: "true"}) - // either notify the waiting goroutine or skip if no one is waiting - select { - case p.mayGetMultiplexedSession <- true: - case <-ctx.Done(): - return - } - return - } - p.sessionCreationError = nil - // Set this pool as the home pool of the session and register it with the - // health checker. - s.pool = p - p.hc.register(s) - p.createReqs-- - // Insert the session at a random position in the pool to prevent all - // sessions affiliated with a channel to be placed at sequentially in the - // pool. - if p.idleList.Len() > 0 { - pos := rand.Intn(p.idleList.Len()) - before := p.idleList.Front() - for i := 0; i < pos; i++ { - before = before.Next() - } - s.setIdleList(p.idleList.InsertBefore(s, before)) - } else { - s.setIdleList(p.idleList.PushBack(s)) - } - p.incNumSessionsLocked(context.Background()) - // Notify other waiters blocking on session creation. - close(p.mayGetSession) - p.mayGetSession = make(chan struct{}) -} - -// sessionCreationFailed is called by the SessionClient when the creation of one -// or more requested sessions finished with an error. sessionCreationFailed will -// decrease the number of sessions being created and notify any waiters that -// the session creation failed. -func (p *sessionPool) sessionCreationFailed(ctx context.Context, err error, numSessions int32, isMultiplexed bool) { - p.mu.Lock() - defer p.mu.Unlock() - if isMultiplexed { - // Ignore the error if multiplexed session already present - if p.multiplexedSession != nil { - p.multiplexedSessionCreationError = nil - select { - case p.mayGetMultiplexedSession <- true: - case <-ctx.Done(): - return - } - return - } - p.recordStat(context.Background(), OpenSessionCount, int64(0), tag.Tag{Key: tagKeyIsMultiplexed, Value: "true"}) - p.multiplexedSessionCreationError = err - select { - case p.mayGetMultiplexedSession <- true: - case <-ctx.Done(): - return - } - return - } - p.createReqs -= uint64(numSessions) - p.numOpened -= uint64(numSessions) - p.recordStat(context.Background(), OpenSessionCount, int64(p.numOpened), tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - // Notify other waiters blocking on session creation. - p.sessionCreationError = err - close(p.mayGetSession) - p.mayGetSession = make(chan struct{}) -} - -// isValid checks if the session pool is still valid. -func (p *sessionPool) isValid() bool { - if p == nil { - return false - } - p.mu.Lock() - defer p.mu.Unlock() - return p.valid -} - -// close marks the session pool as closed and deletes all sessions in parallel. -// Any errors that are returned by the Delete RPC are logged but otherwise -// ignored, except for DeadlineExceeded errors, which are ignored and not -// logged. -func (p *sessionPool) close(ctx context.Context) { - if p == nil { - return - } - p.mu.Lock() - if !p.valid { - p.mu.Unlock() - return - } - p.valid = false - if p.otConfig != nil && p.otConfig.otMetricRegistration != nil { - err := p.otConfig.otMetricRegistration.Unregister() - if err != nil { - logf(p.sc.logger, "Failed to unregister callback from the OpenTelemetry meter, error : %v", err) - } - } - p.mu.Unlock() - p.hc.close() - // destroy all the sessions - p.hc.mu.Lock() - allSessions := make([]*session, len(p.hc.queue.sessions)) - copy(allSessions, p.hc.queue.sessions) - p.hc.mu.Unlock() - wg := sync.WaitGroup{} - for _, s := range allSessions { - wg.Add(1) - go closeSession(ctx, s, &wg) - } - wg.Wait() -} - -func closeSession(ctx context.Context, s *session, wg *sync.WaitGroup) { - defer wg.Done() - s.destroyWithContext(ctx, false, false) -} - -// errInvalidSessionPool is the error for using an invalid session pool. -var errInvalidSessionPool = spannerErrorf(codes.InvalidArgument, "invalid session pool") - -// errGetSessionTimeout returns error for context timeout during -// sessionPool.take(). -var errGetSessionTimeout = spannerErrorf(codes.Canceled, "timeout / context canceled during getting session") - -// newSessionHandle creates a new session handle for the given session for this -// session pool. The session handle will also hold a copy of the current call -// stack if the session pool has been configured to track the call stacks of -// sessions being checked out of the pool. -func (p *sessionPool) newSessionHandle(s *session) (sh *sessionHandle) { - sh = &sessionHandle{session: s, checkoutTime: time.Now(), lastUseTime: time.Now()} - if s.isMultiplexed { - p.mu.Lock() - sh.client = p.getRoundRobinClient() - p.mu.Unlock() - return sh - } - if p.TrackSessionHandles || p.ActionOnInactiveTransaction == Warn || p.ActionOnInactiveTransaction == WarnAndClose || p.ActionOnInactiveTransaction == Close { - if p.TrackSessionHandles { - sh.stack = debug.Stack() - } - p.mu.Lock() - sh.trackedSessionHandle = p.trackedSessionHandles.PushBack(sh) - p.mu.Unlock() - } - return sh -} - -func (p *sessionPool) getRoundRobinClient() spannerClient { - p.sc.mu.Lock() - defer func() { - p.multiplexSessionClientCounter++ - p.sc.mu.Unlock() - }() - if len(p.clientPool) == 0 { - p.clientPool = make([]spannerClient, p.sc.connPool.Num()) - for i := 0; i < p.sc.connPool.Num(); i++ { - c, err := p.sc.nextClient() - if err != nil { - // If we can't get a client, use the session's client. - return nil - } - p.clientPool[i] = c - } - } - p.multiplexSessionClientCounter = p.multiplexSessionClientCounter % len(p.clientPool) - return p.clientPool[p.multiplexSessionClientCounter] -} - -// errGetSessionTimeout returns error for context timeout during -// sessionPool.take() or sessionPool.takeMultiplexed(). -func (p *sessionPool) errGetSessionTimeout(ctx context.Context) error { - var code codes.Code - if ctx.Err() == context.DeadlineExceeded { - code = codes.DeadlineExceeded - } else { - code = codes.Canceled - } - if p.TrackSessionHandles { - return p.errGetSessionTimeoutWithTrackedSessionHandles(code) - } - return p.errGetBasicSessionTimeout(code) -} - -// errGetBasicSessionTimeout returns error for context timout during -// sessionPool.take() without any tracked sessionHandles. -func (p *sessionPool) errGetBasicSessionTimeout(code codes.Code) error { - return spannerErrorf(code, "timeout / context canceled during getting session.\n"+ - "Enable SessionPoolConfig.TrackSessionHandles if you suspect a session leak to get more information about the checked out sessions.") -} - -// errGetSessionTimeoutWithTrackedSessionHandles returns error for context -// timout during sessionPool.take() including a stacktrace of each checked out -// session handle. -func (p *sessionPool) errGetSessionTimeoutWithTrackedSessionHandles(code codes.Code) error { - err := spannerErrorf(code, "timeout / context canceled during getting session.") - err.(*Error).additionalInformation = p.getTrackedSessionHandleStacksLocked() - return err -} - -// getTrackedSessionHandleStacksLocked returns a string containing the -// stacktrace of all currently checked out sessions of the pool. This method -// requires the caller to have locked p.mu. -func (p *sessionPool) getTrackedSessionHandleStacksLocked() string { - p.mu.Lock() - defer p.mu.Unlock() - stackTraces := "" - i := 1 - element := p.trackedSessionHandles.Front() - for element != nil { - sh := element.Value.(*sessionHandle) - sh.mu.Lock() - if sh.stack != nil { - stackTraces = fmt.Sprintf("%s\n\nSession %d checked out of pool at %s by goroutine:\n%s", stackTraces, i, sh.checkoutTime.Format(time.RFC3339), sh.stack) - } - sh.mu.Unlock() - element = element.Next() - i++ - } - return stackTraces -} - -func (p *sessionPool) isHealthy(s *session) bool { - if s.getNextCheck().Add(2 * p.hc.getInterval()).Before(time.Now()) { - if err := s.ping(); isSessionNotFoundError(err) { - // The session is already bad, continue to fetch/create a new one. - s.destroy(false, false) - return false - } - p.hc.scheduledHC(s) - } - return true -} - -// take returns a cached session if there are available ones; if there isn't -// any, it tries to allocate a new one. -func (p *sessionPool) take(ctx context.Context) (*sessionHandle, error) { - trace.TracePrintf(ctx, nil, "Acquiring a session") - for { - var s *session - - p.mu.Lock() - if !p.valid { - p.mu.Unlock() - return nil, errInvalidSessionPool - } - if p.idleList.Len() > 0 { - // Idle sessions are available, get one from the top of the idle - // list. - s = p.idleList.Remove(p.idleList.Front()).(*session) - trace.TracePrintf(ctx, map[string]interface{}{"sessionID": s.getID()}, - "Acquired session") - p.decNumSessionsLocked(ctx) - } - if s != nil { - s.setIdleList(nil) - numCheckedOut := p.currSessionsCheckedOutLocked() - p.mu.Unlock() - p.mw.updateMaxSessionsCheckedOutDuringWindow(numCheckedOut) - // From here, session is no longer in idle list, so healthcheck - // workers won't destroy it. If healthcheck workers failed to - // schedule healthcheck for the session timely, do the check here. - // Because session check is still much cheaper than session - // creation, they should be reused as much as possible. - if !p.isHealthy(s) { - continue - } - p.incNumInUse(ctx) - return p.newSessionHandle(s), nil - } - - // No session available. Start the creation of a new batch of sessions - // if that is allowed, and then wait for a session to come available. - if p.numWaiters >= p.createReqs { - numSessions := minUint64(p.MaxOpened-p.numOpened, p.incStep) - if err := p.growPoolLocked(numSessions, false); err != nil { - p.mu.Unlock() - return nil, err - } - } - - p.numWaiters++ - mayGetSession := p.mayGetSession - p.mu.Unlock() - trace.TracePrintf(ctx, nil, "Waiting for read-only session to become available") - select { - case <-ctx.Done(): - trace.TracePrintf(ctx, nil, "Context done waiting for session") - p.recordStat(ctx, GetSessionTimeoutsCount, 1, tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - if p.otConfig != nil { - p.recordOTStat(ctx, p.otConfig.getSessionTimeoutsCount, 1, recordOTStatOption{attr: p.otConfig.attributeMapWithoutMultiplexed}) - } - p.mu.Lock() - p.numWaiters-- - p.mu.Unlock() - return nil, p.errGetSessionTimeout(ctx) - case <-mayGetSession: - p.mu.Lock() - p.numWaiters-- - if p.sessionCreationError != nil { - trace.TracePrintf(ctx, nil, "Error creating session: %v", p.sessionCreationError) - err := p.sessionCreationError - p.mu.Unlock() - return nil, err - } - p.mu.Unlock() - } - } -} - -// takeMultiplexed returns a cached session if there is available one; if there isn't -// any, it tries to allocate a new one. -func (p *sessionPool) takeMultiplexed(ctx context.Context) (*sessionHandle, error) { - trace.TracePrintf(ctx, nil, "Acquiring a multiplexed session") - for { - var s *session - p.mu.Lock() - if !p.valid { - p.mu.Unlock() - return nil, errInvalidSessionPool - } - if !p.enableMultiplexSession { - p.mu.Unlock() - return p.take(ctx) - } - // use the multiplex session if it is available - if p.multiplexedSession != nil { - // Multiplexed session is available, get it. - s = p.multiplexedSession - trace.TracePrintf(ctx, map[string]interface{}{"sessionID": s.getID()}, - "Acquired multiplexed session") - p.mu.Unlock() - p.incNumMultiplexedInUse(ctx) - return p.newSessionHandle(s), nil - } - mayGetSession := p.mayGetMultiplexedSession - p.mu.Unlock() - p.multiplexedSessionReq <- muxSessionCreateRequest{force: false, ctx: ctx} - select { - case <-ctx.Done(): - trace.TracePrintf(ctx, nil, "Context done waiting for multiplexed session") - p.recordStat(ctx, GetSessionTimeoutsCount, 1, tag.Tag{Key: tagKeyIsMultiplexed, Value: "true"}) - if p.otConfig != nil { - p.recordOTStat(ctx, p.otConfig.getSessionTimeoutsCount, 1, recordOTStatOption{attr: p.otConfig.attributeMapWithMultiplexed}) - } - return nil, p.errGetSessionTimeout(ctx) - case <-mayGetSession: // Block until multiplexed session is created. - p.mu.Lock() - if p.multiplexedSessionCreationError != nil { - trace.TracePrintf(ctx, nil, "Error creating multiplexed session: %v", p.multiplexedSessionCreationError) - err := p.multiplexedSessionCreationError - if isUnimplementedError(err) { - logf(p.sc.logger, "Multiplexed session is not enabled on this project, continuing with regular sessions") - p.enableMultiplexSession = false - } else { - p.mu.Unlock() - // If the error is a timeout, there is a chance that the session was - // created on the server but is not known to the session pool. In this - // case, we should retry to get the session. - return nil, err - } - } - p.mu.Unlock() - } - } -} - -// recycle puts session s back to the session pool's idle list, it returns true -// if the session pool successfully recycles session s. -func (p *sessionPool) recycle(s *session) bool { - p.mu.Lock() - defer p.mu.Unlock() - return p.recycleLocked(s) -} - -func (p *sessionPool) recycleLocked(s *session) bool { - if !s.isValid() || !p.valid { - // Reject the session if session is invalid or pool itself is invalid. - return false - } - ctx := context.Background() - // Put session at the top of the list to be handed out in LIFO order for load balancing - // across channels. - s.setIdleList(p.idleList.PushFront(s)) - p.incNumSessionsLocked(ctx) - // Broadcast that a session has been returned to idle list. - close(p.mayGetSession) - p.mayGetSession = make(chan struct{}) - return true -} - -// remove atomically removes session s from the session pool and invalidates s. -// If isExpire == true, the removal is triggered by session expiration and in -// such cases, only idle sessions can be removed. -func (p *sessionPool) remove(s *session, isExpire bool, wasInUse bool) bool { - if s.isMultiplexed { - return false - } - p.mu.Lock() - defer p.mu.Unlock() - if isExpire && (p.numOpened <= p.MinOpened || s.getIdleList() == nil) { - // Don't expire session if the session is not in idle list (in use), or - // if number of open sessions is going below p.MinOpened. - return false - } - - ol := s.setIdleList(nil) - ctx := context.Background() - // If the session is in the idlelist, remove it. - if ol != nil { - // Remove from the list it is in. - p.idleList.Remove(ol) - p.decNumSessionsLocked(ctx) - } - if s.invalidate() { - // Decrease the number of opened sessions. - p.numOpened-- - // Decrease the number of sessions in use, only when not from idle list. - if wasInUse { - p.decNumInUseLocked(ctx) - } - p.recordStat(ctx, OpenSessionCount, int64(p.numOpened)) - close(p.mayGetSession) - p.mayGetSession = make(chan struct{}) - return true - } - return false -} - -func (p *sessionPool) currSessionsCheckedOutLocked() uint64 { - return p.numOpened - uint64(p.idleList.Len()) -} - -func (p *sessionPool) incNumInUse(ctx context.Context) { - p.mu.Lock() - p.incNumInUseLocked(ctx) - p.mu.Unlock() -} - -func (p *sessionPool) incNumInUseLocked(ctx context.Context) { - p.numInUse++ - p.recordStat(ctx, SessionsCount, int64(p.numInUse), tagNumInUseSessions, tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - p.recordStat(ctx, AcquiredSessionsCount, 1, tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - if p.otConfig != nil { - p.recordOTStat(ctx, p.otConfig.acquiredSessionsCount, 1, recordOTStatOption{attr: p.otConfig.attributeMapWithoutMultiplexed}) - } - if p.numInUse > p.maxNumInUse { - p.maxNumInUse = p.numInUse - p.recordStat(ctx, MaxInUseSessionsCount, int64(p.maxNumInUse), tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - } -} - -func (p *sessionPool) incNumMultiplexedInUse(ctx context.Context) { - p.recordStat(ctx, AcquiredSessionsCount, 1, tag.Tag{Key: tagKeyIsMultiplexed, Value: "true"}) - if p.otConfig != nil { - p.recordOTStat(ctx, p.otConfig.acquiredSessionsCount, 1, recordOTStatOption{attr: p.otConfig.attributeMapWithMultiplexed}) - } -} - -func (p *sessionPool) decNumInUseLocked(ctx context.Context) { - p.numInUse-- - if int64(p.numInUse) < 0 { - // print whole call stack trace - logf(p.sc.logger, "Number of sessions in use is negative, resetting it to currSessionsCheckedOutLocked. Stack trace: %s", string(debug.Stack())) - p.numInUse = p.currSessionsCheckedOutLocked() - } - p.recordStat(ctx, SessionsCount, int64(p.numInUse), tagNumInUseSessions, tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - p.recordStat(ctx, ReleasedSessionsCount, 1, tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - if p.otConfig != nil { - p.recordOTStat(ctx, p.otConfig.releasedSessionsCount, 1, recordOTStatOption{attr: p.otConfig.attributeMapWithoutMultiplexed}) - } -} - -func (p *sessionPool) decNumMultiplexedInUseLocked(ctx context.Context) { - p.recordStat(ctx, ReleasedSessionsCount, 1, tag.Tag{Key: tagKeyIsMultiplexed, Value: "true"}) - if p.otConfig != nil { - p.recordOTStat(ctx, p.otConfig.releasedSessionsCount, 1, recordOTStatOption{attr: p.otConfig.attributeMapWithMultiplexed}) - } -} - -func (p *sessionPool) incNumSessionsLocked(ctx context.Context) { - p.numSessions++ - p.recordStat(ctx, SessionsCount, int64(p.numSessions), tagNumSessions) -} - -func (p *sessionPool) decNumSessionsLocked(ctx context.Context) { - p.numSessions-- - p.recordStat(ctx, SessionsCount, int64(p.numSessions), tagNumSessions) -} - -// hcHeap implements heap.Interface. It is used to create the priority queue for -// session healthchecks. -type hcHeap struct { - sessions []*session -} - -// Len implements heap.Interface.Len. -func (h hcHeap) Len() int { - return len(h.sessions) -} - -// Less implements heap.Interface.Less. -func (h hcHeap) Less(i, j int) bool { - return h.sessions[i].getNextCheck().Before(h.sessions[j].getNextCheck()) -} - -// Swap implements heap.Interface.Swap. -func (h hcHeap) Swap(i, j int) { - h.sessions[i], h.sessions[j] = h.sessions[j], h.sessions[i] - h.sessions[i].setHcIndex(i) - h.sessions[j].setHcIndex(j) -} - -// Push implements heap.Interface.Push. -func (h *hcHeap) Push(s interface{}) { - ns := s.(*session) - ns.setHcIndex(len(h.sessions)) - h.sessions = append(h.sessions, ns) -} - -// Pop implements heap.Interface.Pop. -func (h *hcHeap) Pop() interface{} { - old := h.sessions - n := len(old) - s := old[n-1] - h.sessions = old[:n-1] - s.setHcIndex(-1) - return s -} - -// maintenanceWindowSize specifies the number of health check cycles that -// defines a maintenance window. The maintenance window keeps track of a -// rolling set of numbers for the number of maximum checked out sessions during -// the maintenance window. This is used by the maintainer to determine the -// number of sessions to create or delete at the end of each health check -// cycle. -const maintenanceWindowSize = 10 - -// maintenanceWindow contains the statistics that are gathered during a health -// check maintenance window. -type maintenanceWindow struct { - mu sync.Mutex - // maxSessionsCheckedOut contains the maximum number of sessions that was - // checked out of the session pool during a health check cycle. This number - // indicates the number of sessions that was actually needed by the pool to - // serve the load during that cycle. The values are kept as a rolling set - // containing the values for the past 10 cycles (minutes). The maintainer - // uses these values to determine the number of sessions to keep at the end - // of each cycle. - maxSessionsCheckedOut [maintenanceWindowSize]uint64 -} - -// maxSessionsCheckedOutDuringWindow returns the maximum number of sessions -// that has been checked out during the last maintenance window of 10 cycles -// (minutes). -func (mw *maintenanceWindow) maxSessionsCheckedOutDuringWindow() uint64 { - mw.mu.Lock() - defer mw.mu.Unlock() - var max uint64 - for _, cycleMax := range mw.maxSessionsCheckedOut { - max = maxUint64(max, cycleMax) - } - return max -} - -// updateMaxSessionsCheckedOutDuringWindow updates the maximum number of -// sessions that has been checked out of the pool during the current -// cycle of the maintenance window. A maintenance window consists of 10 -// maintenance cycles. Each cycle keeps track of the max number of sessions in -// use during that cycle. The rolling maintenance window of 10 cycles is used -// to determine the number of sessions to keep at the end of a cycle by -// calculating the max in use during the last 10 cycles. -func (mw *maintenanceWindow) updateMaxSessionsCheckedOutDuringWindow(currNumSessionsCheckedOut uint64) { - mw.mu.Lock() - defer mw.mu.Unlock() - mw.maxSessionsCheckedOut[0] = maxUint64(currNumSessionsCheckedOut, mw.maxSessionsCheckedOut[0]) -} - -// startNewCycle starts a new health check cycle with the specified number of -// checked out sessions as its initial value. -func (mw *maintenanceWindow) startNewCycle(currNumSessionsCheckedOut uint64) { - mw.mu.Lock() - defer mw.mu.Unlock() - copy(mw.maxSessionsCheckedOut[1:], mw.maxSessionsCheckedOut[:9]) - mw.maxSessionsCheckedOut[0] = currNumSessionsCheckedOut -} - -// newMaintenanceWindow creates a new maintenance window with all values for -// maxSessionsCheckedOut set to maxOpened. This ensures that a complete -// maintenance window must pass before the maintainer will start to delete any -// sessions. -func newMaintenanceWindow(maxOpened uint64) *maintenanceWindow { - mw := &maintenanceWindow{} - // Initialize the rolling window with max values to prevent the maintainer - // from deleting sessions before a complete window of 10 cycles has - // finished. - for i := 0; i < maintenanceWindowSize; i++ { - mw.maxSessionsCheckedOut[i] = maxOpened - } - return mw -} - -// healthChecker performs periodical healthchecks on registered sessions. -type healthChecker struct { - // mu protects concurrent access to healthChecker. - mu sync.Mutex - // queue is the priority queue for session healthchecks. Sessions with lower - // nextCheck rank higher in the queue. - queue hcHeap - // interval is the average interval between two healthchecks on a session. - interval time.Duration - // workers is the number of concurrent healthcheck workers. - workers int - // waitWorkers waits for all healthcheck workers to exit - waitWorkers sync.WaitGroup - // pool is the underlying session pool. - pool *sessionPool - // sampleInterval is the interval of sampling by the maintainer. - sampleInterval time.Duration - // multiplexSessionRefreshInterval is the interval of refreshing multiplexed session. - multiplexSessionRefreshInterval time.Duration - // ready is used to signal that maintainer can start running. - ready chan struct{} - // done is used to signal that health checker should be closed. - done chan struct{} - // once is used for closing channel done only once. - once sync.Once - maintainerCancel func() -} - -// newHealthChecker initializes new instance of healthChecker. -func newHealthChecker(interval, multiplexSessionRefreshInterval time.Duration, workers int, sampleInterval time.Duration, pool *sessionPool) *healthChecker { - if workers <= 0 { - workers = 1 - } - hc := &healthChecker{ - interval: interval, - multiplexSessionRefreshInterval: multiplexSessionRefreshInterval, - workers: workers, - pool: pool, - sampleInterval: sampleInterval, - ready: make(chan struct{}), - done: make(chan struct{}), - maintainerCancel: func() {}, - } - hc.waitWorkers.Add(1) - go hc.maintainer() - for i := 1; i <= hc.workers; i++ { - hc.waitWorkers.Add(1) - go hc.worker(i) - } - if hc.pool.enableMultiplexSession { - go hc.multiplexSessionWorker() - } - return hc -} - -// close closes the healthChecker and waits for all healthcheck workers to exit. -func (hc *healthChecker) close() { - hc.mu.Lock() - hc.maintainerCancel() - hc.mu.Unlock() - hc.once.Do(func() { close(hc.done) }) - hc.waitWorkers.Wait() -} - -// isClosing checks if a healthChecker is already closing. -func (hc *healthChecker) isClosing() bool { - select { - case <-hc.done: - return true - default: - return false - } -} - -// getInterval gets the healthcheck interval. -func (hc *healthChecker) getInterval() time.Duration { - hc.mu.Lock() - defer hc.mu.Unlock() - return hc.interval -} - -// scheduledHCLocked schedules next healthcheck on session s with the assumption -// that hc.mu is being held. -func (hc *healthChecker) scheduledHCLocked(s *session) { - var constPart, randPart float64 - if !s.firstHCDone { - // The first check will be scheduled in a large range to make requests - // more evenly distributed. The first healthcheck will be scheduled - // after [interval*0.2, interval*1.1) ns. - constPart = float64(hc.interval) * 0.2 - randPart = hc.pool.rand.Float64() * float64(hc.interval) * 0.9 - s.firstHCDone = true - } else { - // The next healthcheck will be scheduled after - // [interval*0.9, interval*1.1) ns. - constPart = float64(hc.interval) * 0.9 - randPart = hc.pool.rand.Float64() * float64(hc.interval) * 0.2 - } - // math.Ceil makes the value to be at least 1 ns. - nsFromNow := int64(math.Ceil(constPart + randPart)) - s.setNextCheck(time.Now().Add(time.Duration(nsFromNow))) - if hi := s.getHcIndex(); hi != -1 { - // Session is still being tracked by healthcheck workers. - heap.Fix(&hc.queue, hi) - } -} - -// scheduledHC schedules next healthcheck on session s. It is safe to be called -// concurrently. -func (hc *healthChecker) scheduledHC(s *session) { - hc.mu.Lock() - defer hc.mu.Unlock() - hc.scheduledHCLocked(s) -} - -// register registers a session with healthChecker for periodical healthcheck. -func (hc *healthChecker) register(s *session) { - hc.mu.Lock() - defer hc.mu.Unlock() - hc.scheduledHCLocked(s) - heap.Push(&hc.queue, s) -} - -// unregister unregisters a session from healthcheck queue. -func (hc *healthChecker) unregister(s *session) { - hc.mu.Lock() - defer hc.mu.Unlock() - oi := s.setHcIndex(-1) - if oi >= 0 { - heap.Remove(&hc.queue, oi) - } -} - -// markDone marks that health check for session has been performed. -func (hc *healthChecker) markDone(s *session) { - hc.mu.Lock() - defer hc.mu.Unlock() - s.checkingHealth = false -} - -// healthCheck checks the health of the session and pings it if needed. -func (hc *healthChecker) healthCheck(s *session) { - defer hc.markDone(s) - if s.isMultiplexed { - return - } - if !s.pool.isValid() { - // Session pool is closed, perform a garbage collection. - s.destroy(false, false) - return - } - if err := s.ping(); isSessionNotFoundError(err) { - // Ping failed, destroy the session. - s.destroy(false, false) - } -} - -// worker performs the healthcheck on sessions in healthChecker's priority -// queue. -func (hc *healthChecker) worker(i int) { - // Returns a session which we should ping to keep it alive. - getNextForPing := func() *session { - hc.pool.mu.Lock() - defer hc.pool.mu.Unlock() - hc.mu.Lock() - defer hc.mu.Unlock() - if hc.queue.Len() <= 0 { - // Queue is empty. - return nil - } - s := hc.queue.sessions[0] - if s.getNextCheck().After(time.Now()) && hc.pool.valid { - // All sessions have been checked recently. - return nil - } - hc.scheduledHCLocked(s) - if !s.checkingHealth { - s.checkingHealth = true - return s - } - return nil - } - - for { - if hc.isClosing() { - // Exit when the pool has been closed and all sessions have been - // destroyed or when health checker has been closed. - hc.waitWorkers.Done() - return - } - rs := getNextForPing() - if rs == nil { - // No work to be done so sleep to avoid burning CPU. - pause := int64(100 * time.Millisecond) - if pause > int64(hc.interval) { - pause = int64(hc.interval) - } - select { - case <-time.After(time.Duration(rand.Int63n(pause) + pause/2)): - case <-hc.done: - } - continue - } - hc.healthCheck(rs) - } -} - -// maintainer maintains the number of sessions in the pool based on the session -// pool configuration and the current and historical number of sessions checked -// out of the pool. The maintainer will: -// 1. Ensure that the session pool contains at least MinOpened sessions. -// 2. If the current number of sessions in the pool exceeds the greatest number -// of checked out sessions (=sessions in use) during the last 10 minutes, -// and the delta is larger than MaxIdleSessions, the maintainer will reduce -// the number of sessions to maxSessionsInUseDuringWindow+MaxIdleSessions. -func (hc *healthChecker) maintainer() { - // Wait until the pool is ready. - <-hc.ready - - for iteration := uint64(0); ; iteration++ { - if hc.isClosing() { - hc.waitWorkers.Done() - return - } - - hc.pool.mu.Lock() - currSessionsOpened := hc.pool.numOpened - maxIdle := hc.pool.MaxIdle - minOpened := hc.pool.MinOpened - - // Reset the start time for recording the maximum number of sessions - // in the pool. - now := time.Now() - if now.After(hc.pool.lastResetTime.Add(10 * time.Minute)) { - hc.pool.maxNumInUse = hc.pool.numInUse - hc.pool.recordStat(context.Background(), MaxInUseSessionsCount, int64(hc.pool.maxNumInUse), tag.Tag{Key: tagKeyIsMultiplexed, Value: "false"}) - hc.pool.lastResetTime = now - } - hc.pool.mu.Unlock() - - // task to remove or log sessions which are unexpectedly long-running - if now.After(hc.pool.InactiveTransactionRemovalOptions.lastExecutionTime.Add(hc.pool.executionFrequency)) { - if hc.pool.ActionOnInactiveTransaction == Warn || hc.pool.ActionOnInactiveTransaction == WarnAndClose || hc.pool.ActionOnInactiveTransaction == Close { - hc.pool.removeLongRunningSessions() - } - hc.pool.InactiveTransactionRemovalOptions.lastExecutionTime = now - } - - // Get the maximum number of sessions in use during the current - // maintenance window. - maxSessionsInUseDuringWindow := hc.pool.mw.maxSessionsCheckedOutDuringWindow() - hc.mu.Lock() - ctx, cancel := context.WithTimeout(context.Background(), hc.sampleInterval) - hc.maintainerCancel = cancel - hc.mu.Unlock() - - // Grow or shrink pool if needed. - // The number of sessions in the pool should be in the range - // [Config.MinOpened, Config.MaxIdle+maxSessionsInUseDuringWindow] - if currSessionsOpened < minOpened { - if err := hc.growPoolInBatch(ctx, minOpened); err != nil { - logf(hc.pool.sc.logger, "failed to grow pool: %v", err) - } - } else if maxIdle+maxSessionsInUseDuringWindow < currSessionsOpened { - hc.shrinkPool(ctx, maxIdle+maxSessionsInUseDuringWindow) - } - - select { - case <-ctx.Done(): - case <-hc.done: - cancel() - } - // Cycle the maintenance window. This will remove the oldest cycle and - // add a new cycle at the beginning of the maintenance window with the - // currently checked out number of sessions as the max number of - // sessions in use in this cycle. This value will be increased during - // the next cycle if it increases. - hc.pool.mu.Lock() - currSessionsInUse := hc.pool.currSessionsCheckedOutLocked() - hc.pool.mu.Unlock() - hc.pool.mw.startNewCycle(currSessionsInUse) - } -} - -func (hc *healthChecker) growPoolInBatch(ctx context.Context, growToNumSessions uint64) error { - hc.pool.mu.Lock() - defer hc.pool.mu.Unlock() - numSessions := growToNumSessions - hc.pool.numOpened - return hc.pool.growPoolLocked(numSessions, false) -} - -// shrinkPool scales down the session pool. The method will stop deleting -// sessions when shrinkToNumSessions number of sessions in the pool has -// been reached. The method will also stop deleting sessions if it detects that -// another process has started creating sessions for the pool again, for -// example through the take() method. -func (hc *healthChecker) shrinkPool(ctx context.Context, shrinkToNumSessions uint64) { - hc.pool.mu.Lock() - maxSessionsToDelete := int(hc.pool.numOpened - shrinkToNumSessions) - hc.pool.mu.Unlock() - var deleted int - var prevNumOpened uint64 = math.MaxUint64 - for { - if ctx.Err() != nil { - return - } - - p := hc.pool - p.mu.Lock() - // Check if the number of open sessions has increased. If it has, we - // should stop deleting sessions, as the load has increased and - // additional sessions are needed. - if p.numOpened >= prevNumOpened { - p.mu.Unlock() - break - } - prevNumOpened = p.numOpened - - // Check on both whether we have reached the number of open sessions as - // well as the number of sessions to delete, in case sessions have been - // deleted by other methods because they have expired or deemed - // invalid. - if shrinkToNumSessions >= p.numOpened || deleted >= maxSessionsToDelete { - p.mu.Unlock() - break - } - - var s *session - if p.idleList.Len() > 0 { - s = p.idleList.Front().Value.(*session) - } - p.mu.Unlock() - if s != nil { - deleted++ - // destroy session as expire. - s.destroy(true, false) - } else { - break - } - } -} - -func (hc *healthChecker) multiplexSessionWorker() { - for { - if hc.isClosing() { - return - } - hc.pool.mu.Lock() - createTime := time.Now() - s := hc.pool.multiplexedSession - if s != nil { - createTime = hc.pool.multiplexedSession.createTime - } - hc.pool.mu.Unlock() - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - if createTime.Add(multiplexSessionRefreshInterval).Before(time.Now()) { - // Multiplexed session is idle for more than 7 days, replace it. - hc.pool.multiplexedSessionReq <- muxSessionCreateRequest{force: true, ctx: ctx} - // wait for the new multiplexed session to be created. - <-hc.pool.mayGetMultiplexedSession - } - // Sleep for a while to avoid burning CPU. - select { - case <-time.After(hc.multiplexSessionRefreshInterval): - cancel() - case <-hc.done: - cancel() - return - } - } -} - -// maxUint64 returns the maximum of two uint64. -func maxUint64(a, b uint64) uint64 { - if a > b { - return a - } - return b -} - -// minUint64 returns the minimum of two uint64. -func minUint64(a, b uint64) uint64 { - if a > b { - return b - } - return a -} - -// sessionResourceType is the type name of Spanner sessions. -const sessionResourceType = "type.googleapis.com/google.spanner.v1.Session" - -// isSessionNotFoundError returns true if the given error is a -// `Session not found` error. -func isSessionNotFoundError(err error) bool { - if err == nil { - return false - } - if ErrCode(err) == codes.NotFound { - if rt, ok := extractResourceType(err); ok { - return rt == sessionResourceType - } - } - return strings.Contains(err.Error(), "Session not found") -} - -func isUnimplementedError(err error) bool { - if err == nil { - return false - } - return ErrCode(err) == codes.Unimplemented -} - -// isUnimplementedErrorForMultiplexedRW returns true if the gRPC error code is Unimplemented and related to use of multiplexed session with ReadWrite txn. -func isUnimplementedErrorForMultiplexedRW(err error) bool { - if err == nil { - return false - } - return ErrCode(err) == codes.Unimplemented && strings.Contains(err.Error(), "Transaction type read_write not supported with multiplexed sessions") -} - -// isUnimplementedErrorForMultiplexedPartitionedDML returns true if the gRPC error code is Unimplemented and related to use of multiplexed session with partitioned ops. -func isUnimplementedErrorForMultiplexedPartitionedDML(err error) bool { - if err == nil { - return false - } - return ErrCode(err) == codes.Unimplemented && strings.Contains(err.Error(), "Transaction type partitioned_dml not supported with multiplexed sessions") -} - -func isUnimplementedErrorForMultiplexedPartitionReads(err error) bool { - if err == nil { - return false - } - return strings.Contains(err.Error(), "Partitioned operations are not supported with multiplexed sessions") -} - -func isFailedInlineBeginTransaction(err error) bool { - if err == nil { - return false - } - return ErrCode(err) == codes.Internal && strings.Contains(err.Error(), errInlineBeginTransactionFailedMsg) -} - -// isClientClosing returns true if the given error is a -// `Connection is closing` error. -func isClientClosing(err error) bool { - if err == nil { - return false - } - return ErrCode(err) == codes.Canceled && strings.Contains(err.Error(), "the client connection is closing") -} diff --git a/vendor/cloud.google.com/go/spanner/sessionclient.go b/vendor/cloud.google.com/go/spanner/sessionclient.go deleted file mode 100644 index b89bf4dda7..0000000000 --- a/vendor/cloud.google.com/go/spanner/sessionclient.go +++ /dev/null @@ -1,467 +0,0 @@ -/* -Copyright 2019 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "fmt" - "log" - "reflect" - "sync" - "sync/atomic" - "time" - - "cloud.google.com/go/internal/trace" - vkit "cloud.google.com/go/spanner/apiv1" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "cloud.google.com/go/spanner/internal" - "github.com/googleapis/gax-go/v2" - "go.opencensus.io/tag" - "google.golang.org/api/option" - - gtransport "google.golang.org/api/transport/grpc" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -var cidGen = newClientIDGenerator() - -type clientIDGenerator struct { - mu sync.Mutex - ids map[string]int -} - -func newClientIDGenerator() *clientIDGenerator { - return &clientIDGenerator{ids: make(map[string]int)} -} - -func (cg *clientIDGenerator) nextClientIDAndOrdinal(database string) (clientID string, nthClient int) { - cg.mu.Lock() - defer cg.mu.Unlock() - var id int - if val, ok := cg.ids[database]; ok { - id = val + 1 - } else { - id = 1 - } - cg.ids[database] = id - return fmt.Sprintf("client-%d", id), id -} - -func (cg *clientIDGenerator) nextID(database string) string { - clientStrID, _ := cg.nextClientIDAndOrdinal(database) - return clientStrID -} - -// sessionConsumer is passed to the batchCreateSessions method and will receive -// the sessions that are created as they become available. A sessionConsumer -// implementation must be safe for concurrent use. -// -// The interface is implemented by sessionPool and is used for testing the -// sessionClient. -type sessionConsumer interface { - // sessionReady is called when a session has been created and is ready for - // use. - sessionReady(ctx context.Context, s *session) - - // sessionCreationFailed is called when the creation of a sub-batch of - // sessions failed. The numSessions argument specifies the number of - // sessions that could not be created as a result of this error. A - // consumer may receive multiple errors per batch. - sessionCreationFailed(ctx context.Context, err error, numSessions int32, isMultiplexed bool) -} - -// sessionClient creates sessions for a database, either in batches or one at a -// time. Each session will be affiliated with a gRPC channel. sessionClient -// will ensure that the sessions that are created are evenly distributed over -// all available channels. -type sessionClient struct { - waitWorkers sync.WaitGroup - mu sync.Mutex - closed bool - disableRouteToLeader bool - - connPool gtransport.ConnPool - database string - id string - userAgent string - sessionLabels map[string]string - databaseRole string - md metadata.MD - batchTimeout time.Duration - logger *log.Logger - callOptions *vkit.CallOptions - otConfig *openTelemetryConfig - metricsTracerFactory *builtinMetricsTracerFactory - channelIDMap map[*grpc.ClientConn]uint64 - - // These fields are for request-id propagation. - nthClient int - // nthRequest shall always be incremented on every fresh request. - nthRequest *atomic.Uint32 -} - -// newSessionClient creates a session client to use for a database. -func newSessionClient(connPool gtransport.ConnPool, database, userAgent string, sessionLabels map[string]string, databaseRole string, disableRouteToLeader bool, md metadata.MD, batchTimeout time.Duration, logger *log.Logger, callOptions *vkit.CallOptions) *sessionClient { - clientID, nthClient := cidGen.nextClientIDAndOrdinal(database) - return &sessionClient{ - connPool: connPool, - database: database, - userAgent: userAgent, - id: clientID, - sessionLabels: sessionLabels, - databaseRole: databaseRole, - disableRouteToLeader: disableRouteToLeader, - md: md, - batchTimeout: batchTimeout, - logger: logger, - callOptions: callOptions, - - nthClient: nthClient, - nthRequest: new(atomic.Uint32), - } -} - -func (sc *sessionClient) close() error { - defer sc.waitWorkers.Wait() - - var err error - func() { - sc.mu.Lock() - defer sc.mu.Unlock() - - sc.closed = true - err = sc.connPool.Close() - }() - return err -} - -// createSession creates one session for the database of the sessionClient. The -// session is created using one synchronous RPC. -func (sc *sessionClient) createSession(ctx context.Context) (*session, error) { - sc.mu.Lock() - if sc.closed { - sc.mu.Unlock() - return nil, spannerErrorf(codes.FailedPrecondition, "SessionClient is closed") - } - sc.mu.Unlock() - client, err := sc.nextClient() - if err != nil { - return nil, err - } - - var md metadata.MD - sid, err := client.CreateSession(contextWithOutgoingMetadata(ctx, sc.md, sc.disableRouteToLeader), &sppb.CreateSessionRequest{ - Database: sc.database, - Session: &sppb.Session{Labels: sc.sessionLabels, CreatorRole: sc.databaseRole}, - }, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil { - _, instance, database, err := parseDatabaseName(sc.database) - if err != nil { - return nil, ToSpannerError(err) - } - ctxGFE, err := tag.New(ctx, - tag.Upsert(tagKeyClientID, sc.id), - tag.Upsert(tagKeyDatabase, database), - tag.Upsert(tagKeyInstance, instance), - tag.Upsert(tagKeyLibVersion, internal.Version), - ) - if err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", ToSpannerError(err)) - } - err = captureGFELatencyStats(ctxGFE, md, "createSession") - if err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", ToSpannerError(err)) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "createSession", sc.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - return nil, ToSpannerError(err) - } - return &session{valid: true, client: client, id: sid.Name, createTime: time.Now(), md: sc.md, logger: sc.logger}, nil -} - -// batchCreateSessions creates a batch of sessions for the database of the -// sessionClient and returns these to the given sessionConsumer. -// -// createSessionCount is the number of sessions that should be created. The -// sessionConsumer is guaranteed to receive the requested number of sessions if -// no error occurs. If one or more errors occur, the sessionConsumer will -// receive any number of sessions + any number of errors, where each error will -// include the number of sessions that could not be created as a result of the -// error. The sum of returned sessions and errored sessions will be equal to -// the number of requested sessions. -// If distributeOverChannels is true, the sessions will be equally distributed -// over all the channels that are in use by the client. -func (sc *sessionClient) batchCreateSessions(createSessionCount int32, distributeOverChannels bool, consumer sessionConsumer) error { - var sessionCountPerChannel int32 - var remainder int32 - if distributeOverChannels { - // The sessions that we create should be evenly distributed over all the - // channels (gapic clients) that are used by the client. Each gapic client - // will do a request for a fraction of the total. - sessionCountPerChannel = createSessionCount / int32(sc.connPool.Num()) - // The remainder of the calculation will be added to the number of sessions - // that will be created for the first channel, to ensure that we create the - // exact number of requested sessions. - remainder = createSessionCount % int32(sc.connPool.Num()) - } else { - sessionCountPerChannel = createSessionCount - } - sc.mu.Lock() - defer sc.mu.Unlock() - if sc.closed { - return spannerErrorf(codes.FailedPrecondition, "SessionClient is closed") - } - // Spread the session creation over all available gRPC channels. Spanner - // will maintain server side caches for a session on the gRPC channel that - // is used by the session. A session should therefore always use the same - // channel, and the sessions should be as evenly distributed as possible - // over the channels. - var numBeingCreated int32 - for i := 0; i < sc.connPool.Num() && numBeingCreated < createSessionCount; i++ { - client, err := sc.nextClient() - if err != nil { - return err - } - // Determine the number of sessions that should be created for this - // channel. The createCount for the first channel will be increased - // with the remainder of the division of the total number of sessions - // with the number of channels. All other channels will just use the - // result of the division over all channels. - createCountForChannel := sessionCountPerChannel - if i == 0 { - // We add the remainder to the first gRPC channel we use. We could - // also spread the remainder over all channels, but this ensures - // that small batches of sessions (i.e. less than numChannels) are - // created in one RPC. - createCountForChannel += remainder - } - if createCountForChannel > 0 { - sc.waitWorkers.Add(1) - go sc.executeBatchCreateSessions(client, createCountForChannel, sc.sessionLabels, sc.md, consumer) - numBeingCreated += createCountForChannel - } - } - return nil -} - -// executeBatchCreateSessions executes the gRPC call for creating a batch of -// sessions. -func (sc *sessionClient) executeBatchCreateSessions(client spannerClient, createCount int32, labels map[string]string, md metadata.MD, consumer sessionConsumer) { - defer sc.waitWorkers.Done() - ctx, cancel := context.WithTimeout(context.Background(), sc.batchTimeout) - defer cancel() - ctx, _ = startSpan(ctx, "BatchCreateSessions", sc.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, nil) }() - trace.TracePrintf(ctx, nil, "Creating a batch of %d sessions", createCount) - - remainingCreateCount := createCount - for { - sc.mu.Lock() - closed := sc.closed - sc.mu.Unlock() - if closed { - err := spannerErrorf(codes.Canceled, "Session client closed") - trace.TracePrintf(ctx, nil, "Session client closed while creating a batch of %d sessions: %v", createCount, err) - consumer.sessionCreationFailed(ctx, err, remainingCreateCount, false) - break - } - if ctx.Err() != nil { - trace.TracePrintf(ctx, nil, "Context error while creating a batch of %d sessions: %v", createCount, ctx.Err()) - consumer.sessionCreationFailed(ctx, ToSpannerError(ctx.Err()), remainingCreateCount, false) - break - } - var mdForGFELatency metadata.MD - response, err := client.BatchCreateSessions(contextWithOutgoingMetadata(ctx, sc.md, sc.disableRouteToLeader), &sppb.BatchCreateSessionsRequest{ - SessionCount: remainingCreateCount, - Database: sc.database, - SessionTemplate: &sppb.Session{Labels: labels, CreatorRole: sc.databaseRole}, - }, gax.WithGRPCOptions(grpc.Header(&mdForGFELatency))) - - if getGFELatencyMetricsFlag() && mdForGFELatency != nil { - _, instance, database, err := parseDatabaseName(sc.database) - if err != nil { - trace.TracePrintf(ctx, nil, "Error getting instance and database name: %v", err) - } - // Errors should not prevent initializing the session pool. - ctxGFE, err := tag.New(ctx, - tag.Upsert(tagKeyClientID, sc.id), - tag.Upsert(tagKeyDatabase, database), - tag.Upsert(tagKeyInstance, instance), - tag.Upsert(tagKeyLibVersion, internal.Version), - ) - if err != nil { - trace.TracePrintf(ctx, nil, "Error in adding tags in BatchCreateSessions for GFE Latency: %v", err) - } - err = captureGFELatencyStats(ctxGFE, mdForGFELatency, "executeBatchCreateSessions") - if err != nil { - trace.TracePrintf(ctx, nil, "Error in Capturing GFE Latency and Header Missing count. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, mdForGFELatency, "executeBatchCreateSessions", sc.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - trace.TracePrintf(ctx, nil, "Error creating a batch of %d sessions: %v", remainingCreateCount, err) - consumer.sessionCreationFailed(ctx, ToSpannerError(err), remainingCreateCount, false) - break - } - actuallyCreated := int32(len(response.Session)) - trace.TracePrintf(ctx, nil, "Received a batch of %d sessions", actuallyCreated) - for _, s := range response.Session { - consumer.sessionReady(ctx, &session{valid: true, client: client, id: s.Name, createTime: time.Now(), md: md, logger: sc.logger}) - } - if actuallyCreated < remainingCreateCount { - // Spanner could return less sessions than requested. In that case, we - // should do another call using the same gRPC channel. - remainingCreateCount -= actuallyCreated - } else { - trace.TracePrintf(ctx, nil, "Finished creating %d sessions", createCount) - break - } - } -} - -func (sc *sessionClient) executeCreateMultiplexedSession(ctx context.Context, client spannerClient, md metadata.MD, consumer sessionConsumer) { - ctx, _ = startSpan(ctx, "CreateSession", sc.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, nil) }() - trace.TracePrintf(ctx, nil, "Creating a multiplexed session") - sc.mu.Lock() - closed := sc.closed - sc.mu.Unlock() - if closed { - err := spannerErrorf(codes.Canceled, "Session client closed") - trace.TracePrintf(ctx, nil, "Session client closed while creating a multiplexed session: %v", err) - return - } - if ctx.Err() != nil { - trace.TracePrintf(ctx, nil, "Context error while creating a multiplexed session: %v", ctx.Err()) - consumer.sessionCreationFailed(ctx, ToSpannerError(ctx.Err()), 1, true) - return - } - var mdForGFELatency metadata.MD - response, err := client.CreateSession(contextWithOutgoingMetadata(ctx, sc.md, sc.disableRouteToLeader), &sppb.CreateSessionRequest{ - Database: sc.database, - // Multiplexed sessions do not support labels. - Session: &sppb.Session{CreatorRole: sc.databaseRole, Multiplexed: true}, - }, gax.WithGRPCOptions(grpc.Header(&mdForGFELatency))) - - if getGFELatencyMetricsFlag() && mdForGFELatency != nil { - _, instance, database, err := parseDatabaseName(sc.database) - if err != nil { - trace.TracePrintf(ctx, nil, "Error getting instance and database name: %v", err) - } - // Errors should not prevent initializing the session pool. - ctxGFE, err := tag.New(ctx, - tag.Upsert(tagKeyClientID, sc.id), - tag.Upsert(tagKeyDatabase, database), - tag.Upsert(tagKeyInstance, instance), - tag.Upsert(tagKeyLibVersion, internal.Version), - ) - if err != nil { - trace.TracePrintf(ctx, nil, "Error in adding tags in CreateSession for GFE Latency: %v", err) - } - err = captureGFELatencyStats(ctxGFE, mdForGFELatency, "executeCreateSession") - if err != nil { - trace.TracePrintf(ctx, nil, "Error in Capturing GFE Latency and Header Missing count. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, mdForGFELatency, "executeCreateSession", sc.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - trace.TracePrintf(ctx, nil, "Error creating a multiplexed sessions: %v", err) - consumer.sessionCreationFailed(ctx, ToSpannerError(err), 1, true) - return - } - consumer.sessionReady(ctx, &session{valid: true, client: client, id: response.Name, createTime: time.Now(), md: md, logger: sc.logger, isMultiplexed: response.Multiplexed}) - trace.TracePrintf(ctx, nil, "Finished creating multiplexed sessions") -} - -func (sc *sessionClient) sessionWithID(id string) (*session, error) { - sc.mu.Lock() - defer sc.mu.Unlock() - client, err := sc.nextClient() - if err != nil { - return nil, err - } - return &session{valid: true, client: client, id: id, createTime: time.Now(), md: sc.md, logger: sc.logger}, nil -} - -// nextClient returns the next gRPC client to use for session creation. The -// client is set on the session, and used by all subsequent gRPC calls on the -// session. Using the same channel for all gRPC calls for a session ensures the -// optimal usage of server side caches. -func (sc *sessionClient) nextClient() (spannerClient, error) { - var clientOpt option.ClientOption - var channelID uint64 - if _, ok := sc.connPool.(*gmeWrapper); ok { - // Pass GCPMultiEndpoint as a pool. - clientOpt = gtransport.WithConnPool(sc.connPool) - } else { - // Pick a grpc.ClientConn from a regular pool. - conn := sc.connPool.Conn() - - // Retrieve the channelID for each spannerClient. - // It is assumed that this method is invoked - // under a lock already. - var ok bool - channelID, ok = sc.channelIDMap[conn] - if !ok { - if sc.channelIDMap == nil { - sc.channelIDMap = make(map[*grpc.ClientConn]uint64) - } - channelID = uint64(len(sc.channelIDMap)) + 1 - sc.channelIDMap[conn] = channelID - } - - clientOpt = option.WithGRPCConn(conn) - } - client, err := newGRPCSpannerClient(context.Background(), sc, channelID, clientOpt) - if err != nil { - return nil, err - } - - return client, nil -} - -// mergeCallOptions merges two CallOptions into one and the first argument has -// a lower order of precedence than the second one. -func mergeCallOptions(a *vkit.CallOptions, b *vkit.CallOptions) *vkit.CallOptions { - res := &vkit.CallOptions{} - resVal := reflect.ValueOf(res).Elem() - aVal := reflect.ValueOf(a).Elem() - bVal := reflect.ValueOf(b).Elem() - - t := aVal.Type() - - for i := 0; i < aVal.NumField(); i++ { - fieldName := t.Field(i).Name - - aFieldVal := aVal.Field(i).Interface().([]gax.CallOption) - bFieldVal := bVal.Field(i).Interface().([]gax.CallOption) - - merged := append(aFieldVal, bFieldVal...) - resVal.FieldByName(fieldName).Set(reflect.ValueOf(merged)) - } - return res -} diff --git a/vendor/cloud.google.com/go/spanner/statement.go b/vendor/cloud.google.com/go/spanner/statement.go deleted file mode 100644 index c6e549ac0b..0000000000 --- a/vendor/cloud.google.com/go/spanner/statement.go +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "errors" - "fmt" - - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "google.golang.org/grpc/codes" - proto3 "google.golang.org/protobuf/types/known/structpb" - structpb "google.golang.org/protobuf/types/known/structpb" -) - -// A Statement is a SQL query with named parameters. -// -// A parameter placeholder consists of '@' followed by the parameter name. -// The parameter name is an identifier which must conform to the naming -// requirements in https://cloud.google.com/spanner/docs/lexical#identifiers. -// Parameters may appear anywhere that a literal value is expected. The same -// parameter name may be used more than once. It is an error to execute a -// statement with unbound parameters. On the other hand, it is allowable to -// bind parameter names that are not used. -// -// See the documentation of the Row type for how Go types are mapped to Cloud -// Spanner types. -type Statement struct { - SQL string - Params map[string]interface{} -} - -// NewStatement returns a Statement with the given SQL and an empty Params map. -func NewStatement(sql string) Statement { - return Statement{SQL: sql, Params: map[string]interface{}{}} -} - -// convertParams converts a statement's parameters into proto Param and -// ParamTypes. -func (s *Statement) convertParams() (*structpb.Struct, map[string]*sppb.Type, error) { - params := &proto3.Struct{ - Fields: map[string]*proto3.Value{}, - } - paramTypes := map[string]*sppb.Type{} - for k, v := range s.Params { - val, t, err := encodeValue(v) - if err != nil { - return nil, nil, errBindParam(k, v, err) - } - params.Fields[k] = val - if t != nil { - paramTypes[k] = t - } - } - - return params, paramTypes, nil -} - -// errBindParam returns error for not being able to bind parameter to query -// request. -func errBindParam(k string, v interface{}, err error) error { - if err == nil { - return nil - } - var se *Error - if !errors.As(err, &se) { - return spannerErrorf(codes.InvalidArgument, "failed to bind query parameter(name: %q, value: %v), error = <%v>", k, v, err) - } - se.decorate(fmt.Sprintf("failed to bind query parameter(name: %q, value: %v)", k, v)) - return se -} diff --git a/vendor/cloud.google.com/go/spanner/stats.go b/vendor/cloud.google.com/go/spanner/stats.go deleted file mode 100644 index bc8176b6d2..0000000000 --- a/vendor/cloud.google.com/go/spanner/stats.go +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import ( - "context" - "strconv" - "strings" - "sync" - - "cloud.google.com/go/spanner/internal" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "google.golang.org/grpc/metadata" -) - -const statsPrefix = "cloud.google.com/go/spanner/" - -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -var ( - tagKeyClientID = tag.MustNewKey("client_id") - tagKeyDatabase = tag.MustNewKey("database") - tagKeyInstance = tag.MustNewKey("instance_id") - tagKeyLibVersion = tag.MustNewKey("library_version") - tagKeyType = tag.MustNewKey("type") - tagKeyIsMultiplexed = tag.MustNewKey("is_multiplexed") - - tagCommonKeys = []tag.Key{tagKeyClientID, tagKeyDatabase, tagKeyInstance, tagKeyLibVersion} - - tagNumInUseSessions = tag.Tag{Key: tagKeyType, Value: "num_in_use_sessions"} - tagNumSessions = tag.Tag{Key: tagKeyType, Value: "num_sessions"} - - // Deprecated: With InLine Begin transaction client won't maintain separate read or write sessions - tagNumBeingPrepared = tag.Tag{Key: tagKeyType, Value: "num_sessions_being_prepared"} - tagNumReadSessions = tag.Tag{Key: tagKeyType, Value: "num_read_sessions"} - tagNumWriteSessions = tag.Tag{Key: tagKeyType, Value: "num_write_prepared_sessions"} - - tagKeyMethod = tag.MustNewKey("grpc_client_method") - // gfeLatencyMetricsEnabled is used to track if GFELatency and GFEHeaderMissingCount need to be recorded - gfeLatencyMetricsEnabled = false - // mutex to avoid data race in reading/writing the above flag - statsMu = sync.RWMutex{} -) - -func recordStat(ctx context.Context, m *stats.Int64Measure, n int64) { - stats.Record(ctx, m.M(n)) -} - -var ( - // OpenSessionCount is a measure of the number of sessions currently opened. - // It is EXPERIMENTAL and subject to change or removal without notice. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get open_session_count metrics. - OpenSessionCount = stats.Int64( - statsPrefix+"open_session_count", - "Number of sessions currently opened", - stats.UnitDimensionless, - ) - - // OpenSessionCountView is a view of the last value of OpenSessionCount. - // It is EXPERIMENTAL and subject to change or removal without notice. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get open_session_count metrics. - OpenSessionCountView = &view.View{ - Measure: OpenSessionCount, - Aggregation: view.LastValue(), - TagKeys: tagCommonKeys, - } - - // MaxAllowedSessionsCount is a measure of the maximum number of sessions - // allowed. Configurable by the user. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get max_allowed_sessions metrics. - MaxAllowedSessionsCount = stats.Int64( - statsPrefix+"max_allowed_sessions", - "The maximum number of sessions allowed. Configurable by the user.", - stats.UnitDimensionless, - ) - - // MaxAllowedSessionsCountView is a view of the last value of - // MaxAllowedSessionsCount. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get max_allowed_sessions metrics. - MaxAllowedSessionsCountView = &view.View{ - Measure: MaxAllowedSessionsCount, - Aggregation: view.LastValue(), - TagKeys: tagCommonKeys, - } - - // SessionsCount is a measure of the number of sessions in the pool - // including both in-use, idle, and being prepared. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get num_sessions_in_pool metrics. - SessionsCount = stats.Int64( - statsPrefix+"num_sessions_in_pool", - "The number of sessions currently in use.", - stats.UnitDimensionless, - ) - - // SessionsCountView is a view of the last value of SessionsCount. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get num_sessions_in_pool metrics. - SessionsCountView = &view.View{ - Measure: SessionsCount, - Aggregation: view.LastValue(), - TagKeys: append(tagCommonKeys, tagKeyType), - } - - // MaxInUseSessionsCount is a measure of the maximum number of sessions - // in use during the last 10 minute interval. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get max_in_use_sessions metrics. - MaxInUseSessionsCount = stats.Int64( - statsPrefix+"max_in_use_sessions", - "The maximum number of sessions in use during the last 10 minute interval.", - stats.UnitDimensionless, - ) - - // MaxInUseSessionsCountView is a view of the last value of - // MaxInUseSessionsCount. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get max_in_use_sessions metrics. - MaxInUseSessionsCountView = &view.View{ - Measure: MaxInUseSessionsCount, - Aggregation: view.LastValue(), - TagKeys: tagCommonKeys, - } - - // GetSessionTimeoutsCount is a measure of the number of get sessions - // timeouts due to pool exhaustion. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get get_session_timeouts metrics. - GetSessionTimeoutsCount = stats.Int64( - statsPrefix+"get_session_timeouts", - "The number of get sessions timeouts due to pool exhaustion.", - stats.UnitDimensionless, - ) - - // GetSessionTimeoutsCountView is a view of the last value of - // GetSessionTimeoutsCount. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get get_session_timeouts metrics. - GetSessionTimeoutsCountView = &view.View{ - Measure: GetSessionTimeoutsCount, - Aggregation: view.Count(), - TagKeys: tagCommonKeys, - } - - // AcquiredSessionsCount is the number of sessions acquired from - // the session pool. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get num_acquired_sessions metrics. - AcquiredSessionsCount = stats.Int64( - statsPrefix+"num_acquired_sessions", - "The number of sessions acquired from the session pool.", - stats.UnitDimensionless, - ) - - // AcquiredSessionsCountView is a view of the last value of - // AcquiredSessionsCount. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get num_acquired_sessions metrics. - AcquiredSessionsCountView = &view.View{ - Measure: AcquiredSessionsCount, - Aggregation: view.Count(), - TagKeys: tagCommonKeys, - } - - // ReleasedSessionsCount is the number of sessions released by the user - // and pool maintainer. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get num_released_sessions metrics. - ReleasedSessionsCount = stats.Int64( - statsPrefix+"num_released_sessions", - "The number of sessions released by the user and pool maintainer.", - stats.UnitDimensionless, - ) - - // ReleasedSessionsCountView is a view of the last value of - // ReleasedSessionsCount. - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get num_released_sessions metrics. - ReleasedSessionsCountView = &view.View{ - Measure: ReleasedSessionsCount, - Aggregation: view.Count(), - TagKeys: tagCommonKeys, - } - - // GFELatency is the latency between Google's network receiving an RPC and reading back the first byte of the response - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get gfe_latency metrics. - GFELatency = stats.Int64( - statsPrefix+"gfe_latency", - "Latency between Google's network receiving an RPC and reading back the first byte of the response", - stats.UnitMilliseconds, - ) - - // GFELatencyView is the view of distribution of GFELatency values - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get gfe_latency metrics. - GFELatencyView = &view.View{ - Name: "cloud.google.com/go/spanner/gfe_latency", - Measure: GFELatency, - Description: "Latency between Google's network receives an RPC and reads back the first byte of the response", - Aggregation: view.Distribution(0.0, 0.01, 0.05, 0.1, 0.3, 0.6, 0.8, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 13.0, - 16.0, 20.0, 25.0, 30.0, 40.0, 50.0, 65.0, 80.0, 100.0, 130.0, 160.0, 200.0, 250.0, - 300.0, 400.0, 500.0, 650.0, 800.0, 1000.0, 2000.0, 5000.0, 10000.0, 20000.0, 50000.0, - 100000.0), - TagKeys: append(tagCommonKeys, tagKeyMethod), - } - - // GFEHeaderMissingCount is the number of RPC responses received without the server-timing header, most likely means that the RPC never reached Google's network - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get gfe_header_missing_count metrics. - GFEHeaderMissingCount = stats.Int64( - statsPrefix+"gfe_header_missing_count", - "Number of RPC responses received without the server-timing header, most likely means that the RPC never reached Google's network", - stats.UnitDimensionless, - ) - - // GFEHeaderMissingCountView is the view of number of GFEHeaderMissingCount - // - // Deprecated: OpenCensus project is deprecated. Use OpenTelemetry to get gfe_header_missing_count metrics. - GFEHeaderMissingCountView = &view.View{ - Name: "cloud.google.com/go/spanner/gfe_header_missing_count", - Measure: GFEHeaderMissingCount, - Description: "Number of RPC responses received without the server-timing header, most likely means that the RPC never reached Google's network", - Aggregation: view.Count(), - TagKeys: append(tagCommonKeys, tagKeyMethod), - } -) - -// EnableStatViews enables all views of metrics relate to session management. -// -// Deprecated: OpenCensus project is deprecated. -// Use EnableOpenTelemetryMetrics to get Session metrics through OpenTelemetry instrumentation. -func EnableStatViews() error { - return view.Register( - OpenSessionCountView, - MaxAllowedSessionsCountView, - SessionsCountView, - MaxInUseSessionsCountView, - GetSessionTimeoutsCountView, - AcquiredSessionsCountView, - ReleasedSessionsCountView, - ) -} - -// EnableGfeLatencyView enables GFELatency metric -// -// Deprecated: OpenCensus project is deprecated. -// Use EnableOpenTelemetryMetrics to get GfeLatency metrics through OpenTelemetry instrumentation. -func EnableGfeLatencyView() error { - setGFELatencyMetricsFlag(true) - return view.Register(GFELatencyView) -} - -// EnableGfeHeaderMissingCountView enables GFEHeaderMissingCount metric -// -// Deprecated: OpenCensus project is deprecated. -// Use EnableOpenTelemetryMetrics to get GfeHeaderMissingCount metrics through OpenTelemetry instrumentation. -func EnableGfeHeaderMissingCountView() error { - setGFELatencyMetricsFlag(true) - return view.Register(GFEHeaderMissingCountView) -} - -// EnableGfeLatencyAndHeaderMissingCountViews enables GFEHeaderMissingCount and GFELatency metric -// -// Deprecated: OpenCensus project is deprecated. -// Use EnableOpenTelemetryMetrics to get GfeLatency and GfeHeaderMissingCount metrics through OpenTelemetry instrumentation. -func EnableGfeLatencyAndHeaderMissingCountViews() error { - setGFELatencyMetricsFlag(true) - return view.Register( - GFELatencyView, - GFEHeaderMissingCountView, - ) -} - -// Deprecated: OpenCensus project is deprecated. -func getGFELatencyMetricsFlag() bool { - statsMu.RLock() - defer statsMu.RUnlock() - return gfeLatencyMetricsEnabled -} - -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -func setGFELatencyMetricsFlag(enable bool) { - statsMu.Lock() - gfeLatencyMetricsEnabled = enable - statsMu.Unlock() -} - -// DisableGfeLatencyAndHeaderMissingCountViews disables GFEHeaderMissingCount and GFELatency metric -// -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -func DisableGfeLatencyAndHeaderMissingCountViews() { - setGFELatencyMetricsFlag(false) - view.Unregister( - GFELatencyView, - GFEHeaderMissingCountView, - ) -} - -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -func captureGFELatencyStats(ctx context.Context, md metadata.MD, keyMethod string) error { - if len(md.Get("server-timing")) == 0 { - recordStat(ctx, GFEHeaderMissingCount, 1) - return nil - } - serverTiming := md.Get("server-timing")[0] - gfeLatency, err := strconv.Atoi(strings.TrimPrefix(serverTiming, "gfet4t7; dur=")) - if !strings.HasPrefix(serverTiming, "gfet4t7; dur=") || err != nil { - return err - } - // Record GFE latency with OpenCensus. - ctx = tag.NewContext(ctx, tag.FromContext(ctx)) - ctx, err = tag.New(ctx, tag.Insert(tagKeyMethod, keyMethod)) - if err != nil { - return err - } - recordStat(ctx, GFELatency, int64(gfeLatency)) - return nil -} - -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -func createContextAndCaptureGFELatencyMetrics(ctx context.Context, ct *commonTags, md metadata.MD, keyMethod string) error { - var ctxGFE, err = tag.New(ctx, - tag.Upsert(tagKeyClientID, ct.clientID), - tag.Upsert(tagKeyDatabase, ct.database), - tag.Upsert(tagKeyInstance, ct.instance), - tag.Upsert(tagKeyLibVersion, ct.libVersion), - ) - if err != nil { - return err - } - return captureGFELatencyStats(ctxGFE, md, keyMethod) -} - -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -func getCommonTags(sc *sessionClient) *commonTags { - _, instance, database, err := parseDatabaseName(sc.database) - if err != nil { - return nil - } - return &commonTags{ - clientID: sc.id, - database: database, - instance: instance, - libVersion: internal.Version, - } -} - -// commonTags are common key-value pairs of data associated with the GFELatency measure -// Deprecated: OpenCensus project is deprecated. Use OpenTelemetry for capturing metrics. -type commonTags struct { - // Client ID - clientID string - // Database Name - database string - // Instance ID - instance string - // Library Version - libVersion string -} diff --git a/vendor/cloud.google.com/go/spanner/timestampbound.go b/vendor/cloud.google.com/go/spanner/timestampbound.go deleted file mode 100644 index fdefa792f7..0000000000 --- a/vendor/cloud.google.com/go/spanner/timestampbound.go +++ /dev/null @@ -1,242 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "fmt" - "time" - - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - pbd "google.golang.org/protobuf/types/known/durationpb" - pbt "google.golang.org/protobuf/types/known/timestamppb" -) - -// timestampBoundType specifies the timestamp bound mode. -type timestampBoundType int - -const ( - strong timestampBoundType = iota // strong reads - exactStaleness // read with exact staleness - maxStaleness // read with max staleness - minReadTimestamp // read with min freshness - readTimestamp // read data at exact timestamp -) - -// TimestampBound defines how Cloud Spanner will choose a timestamp for a single -// read/query or read-only transaction. -// -// There are three types of timestamp bound: strong, bounded staleness and exact -// staleness. Strong is the default. -// -// If the Cloud Spanner database to be read is geographically distributed, stale -// read-only transactions can execute more quickly than strong or read-write -// transactions, because they are able to execute far from the leader replica. -// -// Each type of timestamp bound is discussed in detail below. A TimestampBound -// can be specified when creating transactions, see the documentation of -// spanner.Client for an example. -// -// # Strong reads -// -// Strong reads are guaranteed to see the effects of all transactions that have -// committed before the start of the read. Furthermore, all rows yielded by a -// single read are consistent with each other: if any part of the read -// observes a transaction, all parts of the read see the transaction. -// -// Strong reads are not repeatable: two consecutive strong read-only -// transactions might return inconsistent results if there are concurrent -// writes. If consistency across reads is required, the reads should be -// executed within a transaction or at an exact read timestamp. -// -// Use StrongRead to create a bound of this type. -// -// # Exact staleness -// -// An exact staleness timestamp bound executes reads at a user-specified -// timestamp. Reads at a timestamp are guaranteed to see a consistent prefix of -// the global transaction history: they observe modifications done by all -// transactions with a commit timestamp less than or equal to the read -// timestamp, and observe none of the modifications done by transactions with a -// larger commit timestamp. They will block until all conflicting transactions -// that may be assigned commit timestamps less than or equal to the read -// timestamp have finished. -// -// The timestamp can either be expressed as an absolute Cloud Spanner commit -// timestamp or a staleness relative to the current time. -// -// These modes do not require a "negotiation phase" to pick a timestamp. As a -// result, they execute slightly faster than the equivalent boundedly stale -// concurrency modes. On the other hand, boundedly stale reads usually return -// fresher results. -// -// Use ReadTimestamp and ExactStaleness to create a bound of this type. -// -// # Bounded staleness -// -// Bounded staleness modes allow Cloud Spanner to pick the read timestamp, -// subject to a user-provided staleness bound. Cloud Spanner chooses the newest -// timestamp within the staleness bound that allows execution of the reads at -// the closest available replica without blocking. -// -// All rows yielded are consistent with each other: if any part of the read -// observes a transaction, all parts of the read see the transaction. Boundedly -// stale reads are not repeatable: two stale reads, even if they use the same -// staleness bound, can execute at different timestamps and thus return -// inconsistent results. -// -// Boundedly stale reads execute in two phases. The first phase negotiates a -// timestamp among all replicas needed to serve the read. In the second phase, -// reads are executed at the negotiated timestamp. -// -// As a result of this two-phase execution, bounded staleness reads are usually -// a little slower than comparable exact staleness reads. However, they are -// typically able to return fresher results, and are more likely to execute at -// the closest replica. -// -// Because the timestamp negotiation requires up-front knowledge of which rows -// will be read, it can only be used with single-use reads and single-use -// read-only transactions. -// -// Use MinReadTimestamp and MaxStaleness to create a bound of this type. -// -// # Old read timestamps and garbage collection -// -// Cloud Spanner continuously garbage collects deleted and overwritten data in -// the background to reclaim storage space. This process is known as "version -// GC". By default, version GC reclaims versions after they are one hour old. -// Because of this, Cloud Spanner cannot perform reads at read timestamps more -// than one hour in the past. This restriction also applies to in-progress reads -// and/or SQL queries whose timestamps become too old while executing. Reads and -// SQL queries with too-old read timestamps fail with the error -// ErrorCode.FAILED_PRECONDITION. -type TimestampBound struct { - mode timestampBoundType - d time.Duration - t time.Time -} - -// StrongRead returns a TimestampBound that will perform reads and queries at a -// timestamp where all previously committed transactions are visible. -func StrongRead() TimestampBound { - return TimestampBound{mode: strong} -} - -// ExactStaleness returns a TimestampBound that will perform reads and queries -// at an exact staleness. -func ExactStaleness(d time.Duration) TimestampBound { - return TimestampBound{ - mode: exactStaleness, - d: d, - } -} - -// MaxStaleness returns a TimestampBound that will perform reads and queries at -// a time chosen to be at most "d" stale. -func MaxStaleness(d time.Duration) TimestampBound { - return TimestampBound{ - mode: maxStaleness, - d: d, - } -} - -// MinReadTimestamp returns a TimestampBound that bound that will perform reads -// and queries at a time chosen to be at least "t". -func MinReadTimestamp(t time.Time) TimestampBound { - return TimestampBound{ - mode: minReadTimestamp, - t: t, - } -} - -// ReadTimestamp returns a TimestampBound that will peform reads and queries at -// the given time. -func ReadTimestamp(t time.Time) TimestampBound { - return TimestampBound{ - mode: readTimestamp, - t: t, - } -} - -func (tb TimestampBound) String() string { - switch tb.mode { - case strong: - return "(strong)" - case exactStaleness: - return fmt.Sprintf("(exactStaleness: %s)", tb.d) - case maxStaleness: - return fmt.Sprintf("(maxStaleness: %s)", tb.d) - case minReadTimestamp: - return fmt.Sprintf("(minReadTimestamp: %s)", tb.t) - case readTimestamp: - return fmt.Sprintf("(readTimestamp: %s)", tb.t) - default: - return fmt.Sprintf("{mode=%v, d=%v, t=%v}", tb.mode, tb.d, tb.t) - } -} - -// durationProto takes a time.Duration and converts it into pdb.Duration for -// calling gRPC APIs. -func durationProto(d time.Duration) *pbd.Duration { - n := d.Nanoseconds() - return &pbd.Duration{ - Seconds: n / int64(time.Second), - Nanos: int32(n % int64(time.Second)), - } -} - -// timestampProto takes a time.Time and converts it into pbt.Timestamp for -// calling gRPC APIs. -func timestampProto(t time.Time) *pbt.Timestamp { - return &pbt.Timestamp{ - Seconds: t.Unix(), - Nanos: int32(t.Nanosecond()), - } -} - -// buildTransactionOptionsReadOnly converts a spanner.TimestampBound into a -// sppb.TransactionOptions_ReadOnly transaction option, which is then used in -// transactional reads. -func buildTransactionOptionsReadOnly(tb TimestampBound, returnReadTimestamp bool) *sppb.TransactionOptions_ReadOnly { - pb := &sppb.TransactionOptions_ReadOnly{ - ReturnReadTimestamp: returnReadTimestamp, - } - switch tb.mode { - case strong: - pb.TimestampBound = &sppb.TransactionOptions_ReadOnly_Strong{ - Strong: true, - } - case exactStaleness: - pb.TimestampBound = &sppb.TransactionOptions_ReadOnly_ExactStaleness{ - ExactStaleness: durationProto(tb.d), - } - case maxStaleness: - pb.TimestampBound = &sppb.TransactionOptions_ReadOnly_MaxStaleness{ - MaxStaleness: durationProto(tb.d), - } - case minReadTimestamp: - pb.TimestampBound = &sppb.TransactionOptions_ReadOnly_MinReadTimestamp{ - MinReadTimestamp: timestampProto(tb.t), - } - case readTimestamp: - pb.TimestampBound = &sppb.TransactionOptions_ReadOnly_ReadTimestamp{ - ReadTimestamp: timestampProto(tb.t), - } - default: - panic(fmt.Sprintf("buildTransactionOptionsReadOnly(%v,%v)", tb, returnReadTimestamp)) - } - return pb -} diff --git a/vendor/cloud.google.com/go/spanner/trace.go b/vendor/cloud.google.com/go/spanner/trace.go deleted file mode 100644 index bc3cf25759..0000000000 --- a/vendor/cloud.google.com/go/spanner/trace.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spanner - -import ( - "context" - "errors" - "fmt" - - "cloud.google.com/go/spanner/internal" - "go.opentelemetry.io/otel" - otelcodes "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/trace" - "google.golang.org/api/googleapi" - "google.golang.org/grpc/status" -) - -const ( - defaultTracerName = "cloud.google.com/go/spanner" - gcpClientRepo = "googleapis/google-cloud-go" - gcpClientArtifact = "cloud.google.com/go/spanner" -) - -func tracer() trace.Tracer { - return otel.Tracer(defaultTracerName, trace.WithInstrumentationVersion(internal.Version)) -} - -// startSpan creates a span and a context.Context containing the newly-created span. -// If the context.Context provided in `ctx` contains a span then the newly-created -// span will be a child of that span, otherwise it will be a root span. -func startSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { - name = prependPackageName(name) - ctx, span := tracer().Start(ctx, name, opts...) - return ctx, span -} - -// endSpan retrieves the current span from ctx and completes the span. -// If an error occurs, the error is recorded as an exception span event for this span, -// and the span status is set in the form of a code and a description. -func endSpan(ctx context.Context, err error) { - span := trace.SpanFromContext(ctx) - if err != nil { - span.SetStatus(otelcodes.Error, toOpenTelemetryStatusDescription(err)) - span.RecordError(err) - } - span.End() -} - -// toOpenTelemetryStatus converts an error to an equivalent OpenTelemetry status description. -func toOpenTelemetryStatusDescription(err error) string { - var err2 *googleapi.Error - if ok := errors.As(err, &err2); ok { - return err2.Message - } else if s, ok := status.FromError(err); ok { - return s.Message() - } else { - return err.Error() - } -} - -func prependPackageName(spanName string) string { - return fmt.Sprintf("%s.%s", gcpClientArtifact, spanName) -} diff --git a/vendor/cloud.google.com/go/spanner/transaction.go b/vendor/cloud.google.com/go/spanner/transaction.go deleted file mode 100644 index 019b1e64f4..0000000000 --- a/vendor/cloud.google.com/go/spanner/transaction.go +++ /dev/null @@ -1,2333 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "context" - "errors" - "fmt" - "sync" - "sync/atomic" - "time" - - "cloud.google.com/go/internal/trace" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/googleapis/gax-go/v2" - "github.com/googleapis/gax-go/v2/apierror" - "google.golang.org/api/iterator" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" - - durationpb "google.golang.org/protobuf/types/known/durationpb" -) - -// transactionID stores a transaction ID which uniquely identifies a transaction -// in Cloud Spanner. -type transactionID []byte - -// txReadEnv manages a read-transaction environment consisting of a session -// handle and a transaction selector. -type txReadEnv interface { - // acquire returns a read-transaction environment that can be used to - // perform a transactional read. - acquire(ctx context.Context) (*sessionHandle, *sppb.TransactionSelector, error) - // getTransactionSelector returns the transaction selector based on state of the transaction it is in - getTransactionSelector() *sppb.TransactionSelector - // sets the transactionID - setTransactionID(id transactionID) - // updatePrecommitToken updates the precommit token for the transaction - updatePrecommitToken(token *sppb.MultiplexedSessionPrecommitToken) - // sets the transaction's read timestamp - setTimestamp(time.Time) - // release should be called at the end of every transactional read to deal - // with session recycling. - release(error) - setSessionEligibilityForLongRunning(sh *sessionHandle) -} - -// txReadOnly contains methods for doing transactional reads. -type txReadOnly struct { - // read-transaction environment for performing transactional read - // operations. - txReadEnv - - // updateTxStateFunc is a function that updates the state of the current - // transaction based on the given error. This function is by default a no-op, - // but is overridden for read/write transactions to set the state to txAborted - // if Spanner aborts the transaction. - updateTxStateFunc func(err error) error - - // Atomic. Only needed for DML statements, but used forall. - sequenceNumber int64 - - // replaceSessionFunc is a function that can be called to replace the - // session that is used by the transaction. This function should only be - // defined for single-use transactions that can safely be retried on a - // different session. All other transactions will set this function to nil. - replaceSessionFunc func(ctx context.Context) error - - // sp is the session pool for allocating a session to execute the read-only - // transaction. It is set only once during initialization of the - // txReadOnly. - sp *sessionPool - // sh is the sessionHandle allocated from sp. - sh *sessionHandle - - // qo provides options for executing a sql query. - qo QueryOptions - - // ro provides options for reading rows from a database. - ro ReadOptions - - // txOpts provides options for a transaction. - txOpts TransactionOptions - - // commonTags for opencensus metrics - ct *commonTags - - // disableRouteToLeader specifies if all the requests of type read-write and PDML - // need to be routed to the leader region. - disableRouteToLeader bool - - otConfig *openTelemetryConfig -} - -func (t *txReadOnly) isDefaultInlinedBegin() bool { - return false -} - -func (t *txReadOnly) updateTxState(err error) error { - if t.updateTxStateFunc == nil { - return err - } - return t.updateTxStateFunc(err) -} - -// BeginTransactionOption determines how a transaction is started by the client. A transaction can be started by -// inlining the BeginTransaction option with the first statement in the transaction, or by executing an explicit -// BeginTransaction RPC. Inlining the BeginTransaction with the first statement requires one less round-trip to Spanner. -// Using an explicit BeginTransaction RPC can be more efficient if you want to execute multiple queries in parallel at -// the start of the transaction, as only one statement can include a BeginTransaction option, and all other queries -// have to wait for the first query to return at least one result before proceeding. -type BeginTransactionOption int - -const ( - // DefaultBeginTransaction instructs the transaction to use the default for the type of transaction. The defaults are: - // * ReadWriteTransaction: InlinedBeginTransaction - // * ReadWriteStmtBasedTransaction: ExplicitBeginTransaction - // * ReadOnlyTransaction: ExplicitBeginTransaction - DefaultBeginTransaction BeginTransactionOption = iota - - // InlinedBeginTransaction instructs the transaction to include the BeginTransaction with the first statement in the - // transaction. This is more efficient if the transaction does not execute any statements in parallel at the start - // of the transaction. This option is the default for ReadWriteTransaction. - InlinedBeginTransaction - - // ExplicitBeginTransaction instructs the transaction to use a separate BeginTransaction RPC to start the transaction. - // This can be more efficient if the transaction executes multiple statements in parallel at the start of the - // transaction. This option is the default for ReadOnlyTransaction and ReadWriteStmtBasedTransaction. - ExplicitBeginTransaction -) - -// TransactionOptions provides options for a transaction. -type TransactionOptions struct { - CommitOptions CommitOptions - - // The transaction tag to use for a read/write transaction. - // This tag is automatically included with each statement and the commit - // request of a read/write transaction. - TransactionTag string - - // CommitPriority is the priority to use for the Commit RPC for the - // transaction. - CommitPriority sppb.RequestOptions_Priority - - // the transaction lock mode is used to specify a concurrency mode for the - // read/query operations. It works for a read/write transaction only. - ReadLockMode sppb.TransactionOptions_ReadWrite_ReadLockMode - - // Controls whether to exclude recording modifications in current transaction - // from the allowed tracking change streams(with DDL option allow_txn_exclusion=true). - ExcludeTxnFromChangeStreams bool - - // sets the isolation level for RW transaction - IsolationLevel sppb.TransactionOptions_IsolationLevel - - // BeginTransactionOption controls whether a separate BeginTransaction RPC should be used, - // or whether the BeginTransaction operation should be inlined with the first statement - // in the transaction. - BeginTransactionOption BeginTransactionOption -} - -// merge combines two TransactionOptions that the input parameter will have higher -// order of precedence. -func (to TransactionOptions) merge(opts TransactionOptions) TransactionOptions { - merged := TransactionOptions{ - CommitOptions: to.CommitOptions.merge(opts.CommitOptions), - TransactionTag: to.TransactionTag, - CommitPriority: to.CommitPriority, - ExcludeTxnFromChangeStreams: to.ExcludeTxnFromChangeStreams || opts.ExcludeTxnFromChangeStreams, - IsolationLevel: to.IsolationLevel, - BeginTransactionOption: to.BeginTransactionOption, - } - if opts.TransactionTag != "" { - merged.TransactionTag = opts.TransactionTag - } - if opts.CommitPriority != sppb.RequestOptions_PRIORITY_UNSPECIFIED { - merged.CommitPriority = opts.CommitPriority - } - if opts.ReadLockMode != sppb.TransactionOptions_ReadWrite_READ_LOCK_MODE_UNSPECIFIED { - merged.ReadLockMode = opts.ReadLockMode - } - if opts.IsolationLevel != sppb.TransactionOptions_ISOLATION_LEVEL_UNSPECIFIED { - merged.IsolationLevel = opts.IsolationLevel - } - if opts.BeginTransactionOption != DefaultBeginTransaction { - merged.BeginTransactionOption = opts.BeginTransactionOption - } - return merged -} - -// errSessionClosed returns error for using a recycled/destroyed session -func errSessionClosed(sh *sessionHandle) error { - return spannerErrorf(codes.FailedPrecondition, - "session is already recycled / destroyed: session_id = %q, rpc_client = %v", sh.getID(), sh.getClient()) -} - -// Read returns a RowIterator for reading multiple rows from the database. -func (t *txReadOnly) Read(ctx context.Context, table string, keys KeySet, columns []string) *RowIterator { - return t.ReadWithOptions(ctx, table, keys, columns, nil) -} - -// ReadUsingIndex calls ReadWithOptions with ReadOptions{Index: index}. -func (t *txReadOnly) ReadUsingIndex(ctx context.Context, table, index string, keys KeySet, columns []string) (ri *RowIterator) { - return t.ReadWithOptions(ctx, table, keys, columns, &ReadOptions{Index: index}) -} - -// ReadOptions provides options for reading rows from a database. -type ReadOptions struct { - // The index to use for reading. If non-empty, you can only read columns - // that are part of the index key, part of the primary key, or stored in the - // index due to a STORING clause in the index definition. - Index string - - // The maximum number of rows to read. A limit value less than 1 means no - // limit. - Limit int - - // Priority is the RPC priority to use for the operation. - Priority sppb.RequestOptions_Priority - - // The request tag to use for this request. - RequestTag string - - // If this is for a partitioned read and DataBoostEnabled field is set to true, the request will be executed - // via Spanner independent compute resources. Setting this option for regular read operations has no effect. - DataBoostEnabled bool - - // ReadOptions option used to set the DirectedReadOptions for all ReadRequests which indicate - // which replicas or regions should be used for running read operations. - DirectedReadOptions *sppb.DirectedReadOptions - - // An option to control the order in which rows are returned from a read. - OrderBy sppb.ReadRequest_OrderBy - - // A lock hint mechanism to use for this request. This setting is only applicable for - // read-write transaction as as read-only transactions do not take locks. - LockHint sppb.ReadRequest_LockHint -} - -// merge combines two ReadOptions that the input parameter will have higher -// order of precedence. -func (ro ReadOptions) merge(opts ReadOptions) ReadOptions { - merged := ReadOptions{ - Index: ro.Index, - Limit: ro.Limit, - Priority: ro.Priority, - RequestTag: ro.RequestTag, - DataBoostEnabled: ro.DataBoostEnabled, - DirectedReadOptions: ro.DirectedReadOptions, - OrderBy: ro.OrderBy, - LockHint: ro.LockHint, - } - if opts.Index != "" { - merged.Index = opts.Index - } - if opts.Limit > 0 { - merged.Limit = opts.Limit - } - if opts.Priority != sppb.RequestOptions_PRIORITY_UNSPECIFIED { - merged.Priority = opts.Priority - } - if opts.RequestTag != "" { - merged.RequestTag = opts.RequestTag - } - if opts.DataBoostEnabled { - merged.DataBoostEnabled = opts.DataBoostEnabled - } - if opts.DirectedReadOptions != nil { - merged.DirectedReadOptions = opts.DirectedReadOptions - } - if opts.OrderBy != sppb.ReadRequest_ORDER_BY_UNSPECIFIED { - merged.OrderBy = opts.OrderBy - } - if opts.LockHint != sppb.ReadRequest_LOCK_HINT_UNSPECIFIED { - merged.LockHint = opts.LockHint - } - return merged -} - -// ReadWithOptions returns a RowIterator for reading multiple rows from the -// database. Pass a ReadOptions to modify the read operation. -func (t *txReadOnly) ReadWithOptions(ctx context.Context, table string, keys KeySet, columns []string, opts *ReadOptions) (ri *RowIterator) { - ctx, _ = startSpan(ctx, "Read", t.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, ri.err) }() - var ( - sh *sessionHandle - ts *sppb.TransactionSelector - err error - ) - kset, err := keys.keySetProto() - if err != nil { - return &RowIterator{ - meterTracerFactory: t.sp.sc.metricsTracerFactory, - err: err} - } - if sh, ts, err = t.acquire(ctx); err != nil { - return &RowIterator{ - meterTracerFactory: t.sp.sc.metricsTracerFactory, - err: err} - } - // Cloud Spanner will return "Session not found" on bad sessions. - client := sh.getClient() - if client == nil { - // Might happen if transaction is closed in the middle of a API call. - return &RowIterator{ - meterTracerFactory: t.sp.sc.metricsTracerFactory, - err: errSessionClosed(sh)} - } - index := t.ro.Index - limit := t.ro.Limit - prio := t.ro.Priority - requestTag := t.ro.RequestTag - dataBoostEnabled := t.ro.DataBoostEnabled - directedReadOptions := t.ro.DirectedReadOptions - orderBy := t.ro.OrderBy - lockHint := t.ro.LockHint - if opts != nil { - index = opts.Index - if opts.Limit > 0 { - limit = opts.Limit - } - prio = opts.Priority - requestTag = opts.RequestTag - if opts.DataBoostEnabled { - dataBoostEnabled = opts.DataBoostEnabled - } - if opts.DirectedReadOptions != nil { - directedReadOptions = opts.DirectedReadOptions - } - if opts.OrderBy != sppb.ReadRequest_ORDER_BY_UNSPECIFIED { - orderBy = opts.OrderBy - } - if opts.LockHint != sppb.ReadRequest_LOCK_HINT_UNSPECIFIED { - lockHint = opts.LockHint - } - - } - var setTransactionID func(transactionID) - if _, ok := ts.Selector.(*sppb.TransactionSelector_Begin); ok { - setTransactionID = t.setTransactionID - } else { - setTransactionID = nil - } - return streamWithReplaceSessionFunc( - contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), - sh.session.logger, - t.sp.sc.metricsTracerFactory, - func(ctx context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error) { - if t.sh != nil { - t.sh.updateLastUseTime() - } - client, err := client.StreamingRead(ctx, - &sppb.ReadRequest{ - Session: t.sh.getID(), - Transaction: t.getTransactionSelector(), - Table: table, - Index: index, - Columns: columns, - KeySet: kset, - ResumeToken: resumeToken, - Limit: int64(limit), - RequestOptions: createRequestOptions(prio, requestTag, t.txOpts.TransactionTag), - DataBoostEnabled: dataBoostEnabled, - DirectedReadOptions: directedReadOptions, - OrderBy: orderBy, - LockHint: lockHint, - }, opts...) - if err != nil { - if _, ok := t.getTransactionSelector().GetSelector().(*sppb.TransactionSelector_Begin); ok { - t.setTransactionID(nil) - return client, t.updateTxState(errInlineBeginTransactionFailed(err)) - } - return client, t.updateTxState(err) - } - md, err := client.Header() - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "ReadWithOptions"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "ReadWithOptions", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - return client, err - }, - t.replaceSessionFunc, - setTransactionID, - func(err error) error { - return t.updateTxState(err) - }, - t.updatePrecommitToken, - t.setTimestamp, - t.release, - client.(*grpcSpannerClient), - ) -} - -// errRowNotFound returns error for not being able to read the row identified by -// key. -func errRowNotFound(table string, key Key) error { - err := spannerErrorf(codes.NotFound, "row not found(Table: %v, PrimaryKey: %v)", table, key) - err.(*Error).err = ErrRowNotFound - return err -} - -// errRowNotFoundByIndex returns error for not being able to read the row by index. -func errRowNotFoundByIndex(table string, key Key, index string) error { - err := spannerErrorf(codes.NotFound, "row not found(Table: %v, IndexKey: %v, Index: %v)", table, key, index) - err.(*Error).err = ErrRowNotFound - return err -} - -// errMultipleRowsFound returns error for receiving more than one row when reading a single row using an index. -func errMultipleRowsFound(table string, key Key, index string) error { - return spannerErrorf(codes.FailedPrecondition, "more than one row found by index(Table: %v, IndexKey: %v, Index: %v)", table, key, index) -} - -const errInlineBeginTransactionFailedMsg = "failed inline begin transaction" - -// errInlineBeginTransactionFailed creates an error that indicates that the first statement in the -// transaction included an inline-begin-transaction option, and that the statement failed. This -// internal error is an indication to the client library that the transaction should be retried -// with an explicit BeginTransaction RPC. -// -// The error that is passed in to this function is wrapped in the error that is returned. It is -// ignored if it is nil. -func errInlineBeginTransactionFailed(err error) error { - // Create an API error that can be wrapped in the error that we return. - // This API error is used by the client library to determine the error code. - apiErr, _ := apierror.FromError(status.Error(codes.Internal, errInlineBeginTransactionFailedMsg)) - var wrapped error - if err == nil { - // Only wrap the API error if there is no user error. - wrapped = apiErr - } else { - // Create a combination of both the API error and the given user error and wrap - // that in the internal error that will be returned. - wrapped = fmt.Errorf("%s: %w (%w)", errInlineBeginTransactionFailedMsg, apiErr, err) - } - return &Error{ - Code: codes.Internal, - err: wrapped, - Desc: errInlineBeginTransactionFailedMsg, - } -} - -// ReadRow reads a single row from the database. -// -// If no row is present with the given key, then ReadRow returns an error(spanner.ErrRowNotFound) where -// spanner.ErrCode(err) is codes.NotFound. -// -// To check if the error is spanner.ErrRowNotFound: -// -// if errors.Is(err, spanner.ErrRowNotFound) { -// ... -// } -func (t *txReadOnly) ReadRow(ctx context.Context, table string, key Key, columns []string) (*Row, error) { - return t.ReadRowWithOptions(ctx, table, key, columns, nil) -} - -// ReadRowWithOptions reads a single row from the database. Pass a ReadOptions to modify the read operation. -// -// If no row is present with the given key, then ReadRowWithOptions returns an error where -// spanner.ErrCode(err) is codes.NotFound. -// -// To check if the error is spanner.ErrRowNotFound: -// -// if errors.Is(err, spanner.ErrRowNotFound) { -// ... -// } -func (t *txReadOnly) ReadRowWithOptions(ctx context.Context, table string, key Key, columns []string, opts *ReadOptions) (*Row, error) { - iter := t.ReadWithOptions(ctx, table, key, columns, opts) - defer iter.Stop() - row, err := iter.Next() - switch err { - case iterator.Done: - return nil, errRowNotFound(table, key) - case nil: - return row, nil - default: - return nil, err - } -} - -// ReadRowUsingIndex reads a single row from the database using an index. -// -// If no row is present with the given index, then ReadRowUsingIndex returns an -// error(spanner.ErrRowNotFound) where spanner.ErrCode(err) is codes.NotFound. -// -// To check if the error is spanner.ErrRowNotFound: -// -// if errors.Is(err, spanner.ErrRowNotFound) { -// ... -// } -// -// If more than one row received with the given index, then ReadRowUsingIndex -// returns an error where spanner.ErrCode(err) is codes.FailedPrecondition. -func (t *txReadOnly) ReadRowUsingIndex(ctx context.Context, table string, index string, key Key, columns []string) (*Row, error) { - iter := t.ReadUsingIndex(ctx, table, index, key, columns) - defer iter.Stop() - row, err := iter.Next() - switch err { - case iterator.Done: - return nil, errRowNotFoundByIndex(table, key, index) - case nil: - // If more than one row found, return an error. - _, err := iter.Next() - switch err { - case iterator.Done: - return row, nil - case nil: - return nil, errMultipleRowsFound(table, key, index) - default: - return nil, err - } - default: - return nil, err - } -} - -// QueryOptions provides options for executing a sql query or update statement. -type QueryOptions struct { - Mode *sppb.ExecuteSqlRequest_QueryMode - Options *sppb.ExecuteSqlRequest_QueryOptions - - // Priority is the RPC priority to use for the query/update. - Priority sppb.RequestOptions_Priority - - // The request tag to use for this request. - RequestTag string - - // If this is for a partitioned query and DataBoostEnabled field is set to true, the request will be executed - // via Spanner independent compute resources. Setting this option for regular query operations has no effect. - DataBoostEnabled bool - - // QueryOptions option used to set the DirectedReadOptions for all ExecuteSqlRequests which indicate - // which replicas or regions should be used for executing queries. - DirectedReadOptions *sppb.DirectedReadOptions - - // Controls whether to exclude recording modifications in current partitioned update operation - // from the allowed tracking change streams(with DDL option allow_txn_exclusion=true). Setting - // this value for any sql/dml requests other than partitioned update will receive an error. - ExcludeTxnFromChangeStreams bool - - // LastStatement indicates whether this statement is the last statement in this transaction. - // If set to true, this option marks the end of the transaction. The transaction should be - // committed or rolled back after this statement executes, and attempts to execute any other requests - // against this transaction (including reads and queries) will be rejected. Mixing mutations with - // statements that are marked as the last statement is not allowed. - // - // For DML statements, setting this option may cause some error reporting to be deferred until - // commit time (e.g. validation of unique constraints). Given this, successful execution of a DML - // statement should not be assumed until the transaction commits. - LastStatement bool -} - -// merge combines two QueryOptions that the input parameter will have higher -// order of precedence. -func (qo QueryOptions) merge(opts QueryOptions) QueryOptions { - merged := QueryOptions{ - Mode: qo.Mode, - Options: &sppb.ExecuteSqlRequest_QueryOptions{}, - RequestTag: qo.RequestTag, - Priority: qo.Priority, - DataBoostEnabled: qo.DataBoostEnabled, - DirectedReadOptions: qo.DirectedReadOptions, - ExcludeTxnFromChangeStreams: qo.ExcludeTxnFromChangeStreams || opts.ExcludeTxnFromChangeStreams, - LastStatement: qo.LastStatement || opts.LastStatement, - } - if opts.Mode != nil { - merged.Mode = opts.Mode - } - if opts.RequestTag != "" { - merged.RequestTag = opts.RequestTag - } - if opts.Priority != sppb.RequestOptions_PRIORITY_UNSPECIFIED { - merged.Priority = opts.Priority - } - if opts.DataBoostEnabled { - merged.DataBoostEnabled = opts.DataBoostEnabled - } - if opts.DirectedReadOptions != nil { - merged.DirectedReadOptions = opts.DirectedReadOptions - } - proto.Merge(merged.Options, qo.Options) - proto.Merge(merged.Options, opts.Options) - return merged -} - -func createRequestOptions(prio sppb.RequestOptions_Priority, requestTag, transactionTag string) (ro *sppb.RequestOptions) { - ro = &sppb.RequestOptions{} - if prio != sppb.RequestOptions_PRIORITY_UNSPECIFIED { - ro.Priority = prio - } - if requestTag != "" { - ro.RequestTag = requestTag - } - if transactionTag != "" { - ro.TransactionTag = transactionTag - } - return ro -} - -// Query executes a query against the database. It returns a RowIterator for -// retrieving the resulting rows. -// -// Query returns only row data, without a query plan or execution statistics. -// Use QueryWithStats to get rows along with the plan and statistics. Use -// AnalyzeQuery to get just the plan. -func (t *txReadOnly) Query(ctx context.Context, statement Statement) *RowIterator { - mode := sppb.ExecuteSqlRequest_NORMAL - return t.query(ctx, statement, QueryOptions{ - Mode: &mode, - Options: t.qo.Options, - Priority: t.qo.Priority, - DirectedReadOptions: t.qo.DirectedReadOptions, - }) -} - -// QueryWithOptions executes a SQL statment against the database. It returns -// a RowIterator for retrieving the resulting rows. The sql query execution -// will be optimized based on the given query options. -func (t *txReadOnly) QueryWithOptions(ctx context.Context, statement Statement, opts QueryOptions) *RowIterator { - return t.query(ctx, statement, t.qo.merge(opts)) -} - -// QueryWithStats executes a SQL statement against the database. It returns -// a RowIterator for retrieving the resulting rows. The RowIterator will also -// be populated with a query plan and execution statistics. -func (t *txReadOnly) QueryWithStats(ctx context.Context, statement Statement) *RowIterator { - mode := sppb.ExecuteSqlRequest_PROFILE - return t.query(ctx, statement, QueryOptions{ - Mode: &mode, - Options: t.qo.Options, - Priority: t.qo.Priority, - DirectedReadOptions: t.qo.DirectedReadOptions, - }) -} - -// AnalyzeQuery returns the query plan for statement. -func (t *txReadOnly) AnalyzeQuery(ctx context.Context, statement Statement) (*sppb.QueryPlan, error) { - mode := sppb.ExecuteSqlRequest_PLAN - iter := t.query(ctx, statement, QueryOptions{ - Mode: &mode, - Options: t.qo.Options, - Priority: t.qo.Priority, - DirectedReadOptions: t.qo.DirectedReadOptions, - }) - defer iter.Stop() - for { - _, err := iter.Next() - if err == iterator.Done { - break - } - if err != nil { - return nil, err - } - } - if iter.QueryPlan == nil { - return nil, spannerErrorf(codes.Internal, "query plan unavailable") - } - return iter.QueryPlan, nil -} - -func (t *txReadOnly) query(ctx context.Context, statement Statement, options QueryOptions) (ri *RowIterator) { - ctx, _ = startSpan(ctx, "Query", t.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, ri.err) }() - req, sh, err := t.prepareExecuteSQL(ctx, statement, options) - if err != nil { - return &RowIterator{ - meterTracerFactory: t.sp.sc.metricsTracerFactory, - err: err, - } - } - var setTransactionID func(transactionID) - if _, ok := req.Transaction.GetSelector().(*sppb.TransactionSelector_Begin); ok { - setTransactionID = t.setTransactionID - } else { - setTransactionID = nil - } - client := sh.getClient() - return streamWithReplaceSessionFunc( - contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), - sh.session.logger, - t.sp.sc.metricsTracerFactory, - func(ctx context.Context, resumeToken []byte, opts ...gax.CallOption) (streamingReceiver, error) { - req.ResumeToken = resumeToken - req.Session = t.sh.getID() - req.Transaction = t.getTransactionSelector() - t.sh.updateLastUseTime() - - client, err := client.ExecuteStreamingSql(ctx, req, opts...) - if err != nil { - if _, ok := req.Transaction.GetSelector().(*sppb.TransactionSelector_Begin); ok { - t.setTransactionID(nil) - return client, t.updateTxState(errInlineBeginTransactionFailed(err)) - } - return client, t.updateTxState(err) - } - md, err := client.Header() - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "query"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "query", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - return client, err - }, - t.replaceSessionFunc, - setTransactionID, - func(err error) error { - return t.updateTxState(err) - }, - t.updatePrecommitToken, - t.setTimestamp, - t.release, - client.(*grpcSpannerClient)) -} - -func (t *txReadOnly) prepareExecuteSQL(ctx context.Context, stmt Statement, options QueryOptions) (*sppb.ExecuteSqlRequest, *sessionHandle, error) { - sh, ts, err := t.acquire(ctx) - if err != nil { - return nil, nil, err - } - // Cloud Spanner will return "Session not found" on bad sessions. - sid := sh.getID() - if sid == "" { - // Might happen if transaction is closed in the middle of a API call. - return nil, nil, errSessionClosed(sh) - } - params, paramTypes, err := stmt.convertParams() - if err != nil { - return nil, nil, err - } - mode := sppb.ExecuteSqlRequest_NORMAL - if options.Mode != nil { - mode = *options.Mode - } - req := &sppb.ExecuteSqlRequest{ - Session: sid, - Transaction: ts, - Sql: stmt.SQL, - QueryMode: mode, - Seqno: atomic.AddInt64(&t.sequenceNumber, 1), - Params: params, - ParamTypes: paramTypes, - QueryOptions: options.Options, - RequestOptions: createRequestOptions(options.Priority, options.RequestTag, t.txOpts.TransactionTag), - DataBoostEnabled: options.DataBoostEnabled, - DirectedReadOptions: options.DirectedReadOptions, - LastStatement: options.LastStatement, - } - return req, sh, nil -} - -// txState is the status of a transaction. -type txState int - -const ( - // transaction is new, waiting to be initialized.. - txNew txState = iota - // transaction is being initialized. - txInit - // transaction is active and can perform read/write. - txActive - // transaction is closed, cannot be used anymore. - txClosed - // transaction was aborted by Spanner and should be retried. - txAborted -) - -// errRtsUnavailable returns error for read transaction's read timestamp being -// unavailable. -func errRtsUnavailable() error { - return spannerErrorf(codes.Internal, "read timestamp is unavailable") -} - -// errTxClosed returns error for using a closed transaction. -func errTxClosed() error { - return spannerErrorf(codes.InvalidArgument, "cannot use a closed transaction") -} - -// errUnexpectedTxState returns error for transaction enters an unexpected state. -func errUnexpectedTxState(ts txState) error { - return spannerErrorf(codes.FailedPrecondition, "unexpected transaction state: %v", ts) -} - -// errExcludeRequestLevelDmlFromChangeStreams returns error for passing -// QueryOptions.ExcludeTxnFromChangeStreams to request-level DML functions. This -// options should only be used for partitioned update. -func errExcludeRequestLevelDmlFromChangeStreams() error { - return spannerErrorf(codes.InvalidArgument, "cannot set exclude transaction from change streams for a request-level DML statement.") -} - -// ReadOnlyTransaction provides a snapshot transaction with guaranteed -// consistency across reads, but does not allow writes. Read-only transactions -// can be configured to read at timestamps in the past. -// -// Read-only transactions do not take locks. Instead, they work by choosing a -// Cloud Spanner timestamp, then executing all reads at that timestamp. Since -// they do not acquire locks, they do not block concurrent read-write -// transactions. -// -// Unlike locking read-write transactions, read-only transactions never abort. -// They can fail if the chosen read timestamp is garbage collected; however, the -// default garbage collection policy is generous enough that most applications -// do not need to worry about this in practice. See the documentation of -// TimestampBound for more details. -// -// A ReadOnlyTransaction consumes resources on the server until Close is called. -type ReadOnlyTransaction struct { - // mu protects concurrent access to the internal states of ReadOnlyTransaction. - mu sync.Mutex - // txReadOnly contains methods for performing transactional reads. - txReadOnly - // singleUse indicates that the transaction can be used for only one read. - singleUse bool - // tx is the transaction ID in Cloud Spanner that uniquely identifies the - // ReadOnlyTransaction. - tx transactionID - // txReadyOrClosed is for broadcasting that transaction ID has been returned - // by Cloud Spanner or that transaction is closed. - txReadyOrClosed chan struct{} - // state is the current transaction status of the ReadOnly transaction. - state txState - // rts is the read timestamp returned by transactional reads. - rts time.Time - // tb is the read staleness bound specification for transactional reads. - tb TimestampBound - // beginTransactionOption determines whether the transaction should use inlined-begin - // or an explicit BeginTransaction RPC. - beginTransactionOption BeginTransactionOption - // isLongRunningTransaction indicates whether the transaction is long-running or not. - isLongRunningTransaction bool -} - -// errTxInitTimeout returns error for timeout in waiting for initialization of -// the transaction. -func errTxInitTimeout() error { - return spannerErrorf(codes.Canceled, "timeout/context canceled in waiting for transaction's initialization") -} - -// getTimestampBound returns the read staleness bound specified for the -// ReadOnlyTransaction. -func (t *ReadOnlyTransaction) getTimestampBound() TimestampBound { - t.mu.Lock() - defer t.mu.Unlock() - return t.tb -} - -// begin starts a snapshot read-only Transaction on Cloud Spanner. -func (t *ReadOnlyTransaction) begin(ctx context.Context) error { - var ( - locked bool - tx transactionID - rts time.Time - sh *sessionHandle - err error - res *sppb.Transaction - ) - defer func() { - if !locked { - t.mu.Lock() - // Not necessary, just to make it clear that t.mu is being held when - // locked == true. - locked = true - } - if t.state != txClosed { - // Signal other initialization routines. - close(t.txReadyOrClosed) - t.txReadyOrClosed = make(chan struct{}) - } - t.mu.Unlock() - if err != nil && sh != nil { - // Got a valid session handle, but failed to initialize transaction= - // on Cloud Spanner. - if isSessionNotFoundError(err) { - sh.destroy() - } - // If sh.destroy was already executed, this becomes a noop. - sh.recycle() - } - }() - // Retry the BeginTransaction call if a 'Session not found' is returned. - for { - sh, err = t.sp.takeMultiplexed(ctx) - if err != nil { - return err - } - t.setSessionEligibilityForLongRunning(sh) - sh.updateLastUseTime() - var md metadata.MD - res, err = sh.getClient().BeginTransaction(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), &sppb.BeginTransactionRequest{ - Session: sh.getID(), - Options: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadOnly_{ - ReadOnly: buildTransactionOptionsReadOnly(t.getTimestampBound(), true), - }, - }, - }, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "begin_BeginTransaction"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "begin_BeginTransaction", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - - if isSessionNotFoundError(err) { - sh.destroy() - continue - } else if err == nil { - tx = res.Id - if res.ReadTimestamp != nil { - rts = time.Unix(res.ReadTimestamp.Seconds, int64(res.ReadTimestamp.Nanos)) - } - } else { - err = ToSpannerError(err) - } - break - } - t.mu.Lock() - - // defer function will be executed with t.mu being held. - locked = true - - // During the execution of t.begin(), t.Close() was invoked. - if t.state == txClosed { - return errSessionClosed(sh) - } - - // If begin() fails, this allows other queries to take over the - // initialization. - t.tx = nil - if err == nil { - t.tx = tx - t.rts = rts - t.sh = sh - // State transite to txActive. - t.state = txActive - } - return err -} - -// no-op for ReadOnlyTransaction. -func (t *ReadOnlyTransaction) updatePrecommitToken(token *sppb.MultiplexedSessionPrecommitToken) { - return -} - -// acquire implements txReadEnv.acquire. -func (t *ReadOnlyTransaction) acquire(ctx context.Context) (*sessionHandle, *sppb.TransactionSelector, error) { - if err := checkNestedTxn(ctx); err != nil { - return nil, nil, err - } - if t.singleUse { - return t.acquireSingleUse(ctx) - } - return t.acquireMultiUse(ctx) -} - -func (t *ReadOnlyTransaction) acquireSingleUse(ctx context.Context) (*sessionHandle, *sppb.TransactionSelector, error) { - t.mu.Lock() - defer t.mu.Unlock() - switch t.state { - case txClosed: - // A closed single-use transaction can never be reused. - return nil, nil, errTxClosed() - case txNew: - t.state = txClosed - ts := &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_SingleUse{ - SingleUse: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadOnly_{ - ReadOnly: buildTransactionOptionsReadOnly(t.tb, true), - }, - }, - }, - } - sh, err := t.sp.takeMultiplexed(ctx) - if err != nil { - return nil, nil, err - } - - // Install session handle into t, which can be used for readonly - // operations later. - t.sh = sh - return sh, ts, nil - } - us := t.state - - // SingleUse transaction should only be in either txNew state or txClosed - // state. - return nil, nil, errUnexpectedTxState(us) -} - -func (t *ReadOnlyTransaction) acquireMultiUse(ctx context.Context) (*sessionHandle, *sppb.TransactionSelector, error) { - for { - t.mu.Lock() - switch t.state { - case txClosed: - t.mu.Unlock() - return nil, nil, errTxClosed() - case txNew: - // State transit to txInit so that no further TimestampBound change - // is accepted. - t.state = txInit - t.mu.Unlock() - continue - case txInit: - if t.tx != nil { - // Wait for a transaction ID to become ready. - txReadyOrClosed := t.txReadyOrClosed - t.mu.Unlock() - select { - case <-txReadyOrClosed: - // Need to check transaction state again. - continue - case <-ctx.Done(): - // The waiting for initialization is timeout, return error - // directly. - return nil, nil, errTxInitTimeout() - } - } - // Take the ownership of initializing the transaction. - t.tx = transactionID{} - t.mu.Unlock() - // Begin a read-only transaction. - if t.beginTransactionOption == InlinedBeginTransaction { - sh, err := t.sp.takeMultiplexed(ctx) - if err != nil { - return nil, nil, err - } - t.sh = sh - - opts := buildTransactionOptionsReadOnly(t.getTimestampBound(), true) - ts := &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Begin{ - Begin: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadOnly_{ - ReadOnly: opts, - }, - }, - }, - } - return t.sh, ts, nil - } - if err := t.begin(ctx); err != nil { - return nil, nil, err - } - - // If t.begin() succeeded, t.state should have been changed to - // txActive, so we can just continue here. - continue - case txActive: - sh := t.sh - ts := &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Id{ - Id: t.tx, - }, - } - t.mu.Unlock() - return sh, ts, nil - } - state := t.state - t.mu.Unlock() - return nil, nil, errUnexpectedTxState(state) - } -} - -func (t *ReadOnlyTransaction) getTransactionSelector() *sppb.TransactionSelector { - t.mu.Lock() - defer t.mu.Unlock() - if t.singleUse { - return &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_SingleUse{ - SingleUse: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadOnly_{ - ReadOnly: buildTransactionOptionsReadOnly(t.tb, true), - }, - }, - }, - } - } - if t.state == txActive { - return &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Id{ - Id: t.tx, - }, - } - } - opts := buildTransactionOptionsReadOnly(t.tb, true) - return &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Begin{ - Begin: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadOnly_{ - ReadOnly: opts, - }, - }, - }, - } -} - -func (t *ReadOnlyTransaction) setTransactionID(tx transactionID) { - t.mu.Lock() - defer t.mu.Unlock() - // When inline begin transaction fails close the transaction to retry with explicit begin transaction - if tx == nil { - t.state = txClosed - // unblock other waiting operations to abort and retry with explicit begin transaction. - close(t.txReadyOrClosed) - t.txReadyOrClosed = make(chan struct{}) - return - } - t.tx = tx - t.state = txActive - close(t.txReadyOrClosed) - t.txReadyOrClosed = make(chan struct{}) -} - -func (t *ReadOnlyTransaction) setTimestamp(ts time.Time) { - t.mu.Lock() - defer t.mu.Unlock() - if t.rts.IsZero() { - t.rts = ts - } -} - -// release implements txReadEnv.release. -func (t *ReadOnlyTransaction) release(err error) { - t.mu.Lock() - sh := t.sh - t.mu.Unlock() - if sh != nil { // sh could be nil if t.acquire() fails. - if isSessionNotFoundError(err) || isClientClosing(err) { - sh.destroy() - } - if t.singleUse { - // If session handle is already destroyed, this becomes a noop. - sh.recycle() - } - } -} - -// Close closes a ReadOnlyTransaction, the transaction cannot perform any reads -// after being closed. -func (t *ReadOnlyTransaction) Close() { - if t.singleUse { - return - } - t.mu.Lock() - if t.state != txClosed { - t.state = txClosed - close(t.txReadyOrClosed) - } - sh := t.sh - t.mu.Unlock() - if sh == nil { - return - } - // If session handle is already destroyed, this becomes a noop. If there are - // still active queries and if the recycled session is reused before they - // complete, Cloud Spanner will cancel them on behalf of the new transaction - // on the session. - if sh != nil { - sh.recycle() - } -} - -// Timestamp returns the timestamp chosen to perform reads and queries in this -// transaction. The value can only be read after some read or query has either -// returned some data or completed without returning any data. -func (t *ReadOnlyTransaction) Timestamp() (time.Time, error) { - t.mu.Lock() - defer t.mu.Unlock() - if t.rts.IsZero() { - return t.rts, errRtsUnavailable() - } - return t.rts, nil -} - -// WithTimestampBound specifies the TimestampBound to use for read or query. -// This can only be used before the first read or query is invoked. Note: -// bounded staleness is not available with general ReadOnlyTransactions; use a -// single-use ReadOnlyTransaction instead. -// -// The returned value is the ReadOnlyTransaction so calls can be chained. -func (t *ReadOnlyTransaction) WithTimestampBound(tb TimestampBound) *ReadOnlyTransaction { - t.mu.Lock() - defer t.mu.Unlock() - if t.state == txNew { - // Only allow to set TimestampBound before the first query. - t.tb = tb - } - return t -} - -// WithBeginTransactionOption specifies how the read-only transaction should be started. -// The default is to execute a BeginTransaction RPC before any statements are executed. -// Set this to InlinedBeginTransaction to include the BeginTransaction option with the -// first statement in the transaction. This saves one round-trip to Spanner. This is -// more efficient if you are not executing multiple queries in parallel at the start of -// the transaction. -func (t *ReadOnlyTransaction) WithBeginTransactionOption(option BeginTransactionOption) *ReadOnlyTransaction { - t.mu.Lock() - defer t.mu.Unlock() - if t.state == txNew { - // Only allow to set BeginTransactionOption before the first query. - t.beginTransactionOption = option - } - return t -} - -func (t *ReadOnlyTransaction) setSessionEligibilityForLongRunning(sh *sessionHandle) { - if t != nil && sh != nil { - sh.mu.Lock() - t.mu.Lock() - sh.eligibleForLongRunning = t.isLongRunningTransaction - t.mu.Unlock() - sh.mu.Unlock() - } -} - -// ReadWriteTransaction provides a locking read-write transaction. -// -// This type of transaction is the only way to write data into Cloud Spanner; -// (*Client).Apply, (*Client).ApplyAtLeastOnce, (*Client).PartitionedUpdate use -// transactions internally. These transactions rely on pessimistic locking and, -// if necessary, two-phase commit. Locking read-write transactions may abort, -// requiring the application to retry. However, the interface exposed by -// (*Client).ReadWriteTransaction eliminates the need for applications to write -// retry loops explicitly. -// -// Locking transactions may be used to atomically read-modify-write data -// anywhere in a database. This type of transaction is externally consistent. -// -// Clients should attempt to minimize the amount of time a transaction is -// active. Faster transactions commit with higher probability and cause less -// contention. Cloud Spanner attempts to keep read locks active as long as the -// transaction continues to do reads. Long periods of inactivity at the client -// may cause Cloud Spanner to release a transaction's locks and abort it. -// -// Reads performed within a transaction acquire locks on the data being -// read. Writes can only be done at commit time, after all reads have been -// completed. Conceptually, a read-write transaction consists of zero or more -// reads or SQL queries followed by a commit. -// -// See (*Client).ReadWriteTransaction for an example. -// -// # Semantics -// -// Cloud Spanner can commit the transaction if all read locks it acquired are -// still valid at commit time, and it is able to acquire write locks for all -// writes. Cloud Spanner can abort the transaction for any reason. If a commit -// attempt returns ABORTED, Cloud Spanner guarantees that the transaction has -// not modified any user data in Cloud Spanner. -// -// Unless the transaction commits, Cloud Spanner makes no guarantees about how -// long the transaction's locks were held for. It is an error to use Cloud -// Spanner locks for any sort of mutual exclusion other than between Cloud -// Spanner transactions themselves. -// -// # Aborted transactions -// -// Application code does not need to retry explicitly; RunInTransaction will -// automatically retry a transaction if an attempt results in an abort. The lock -// priority of a transaction increases after each prior aborted transaction, -// meaning that the next attempt has a slightly better chance of success than -// before. -// -// Under some circumstances (e.g., many transactions attempting to modify the -// same row(s)), a transaction can abort many times in a short period before -// successfully committing. Thus, it is not a good idea to cap the number of -// retries a transaction can attempt; instead, it is better to limit the total -// amount of wall time spent retrying. -// -// # Idle transactions -// -// A transaction is considered idle if it has no outstanding reads or SQL -// queries and has not started a read or SQL query within the last 10 -// seconds. Idle transactions can be aborted by Cloud Spanner so that they don't -// hold on to locks indefinitely. In that case, the commit will fail with error -// ABORTED. -// -// If this behavior is undesirable, periodically executing a simple SQL query -// in the transaction (e.g., SELECT 1) prevents the transaction from becoming -// idle. -type ReadWriteTransaction struct { - // txReadOnly contains methods for performing transactional reads. - txReadOnly - // tx is the transaction ID in Cloud Spanner that uniquely identifies the - // ReadWriteTransaction. It is set only once in ReadWriteTransaction.begin() - // during the initialization of ReadWriteTransaction. - tx transactionID - previousTx transactionID - precommitToken *sppb.MultiplexedSessionPrecommitToken - - // txReadyOrClosed is for broadcasting that transaction ID has been returned - // by Cloud Spanner or that transaction is closed. - txReadyOrClosed chan struct{} - // mu protects concurrent access to the internal states of - // ReadWriteTransaction. - mu sync.Mutex - // state is the current transaction status of the read-write transaction. - state txState - // wb is the set of buffered mutations waiting to be committed. - wb []*Mutation - // isLongRunningTransaction indicates whether the transaction is long-running or not. - isLongRunningTransaction bool -} - -func (t *ReadWriteTransaction) isDefaultInlinedBegin() bool { - return true -} - -// BufferWrite adds a list of mutations to the set of updates that will be -// applied when the transaction is committed. It does not actually apply the -// write until the transaction is committed, so the operation does not block. -// The effects of the write won't be visible to any reads (including reads done -// in the same transaction) until the transaction commits. -// -// See the example for Client.ReadWriteTransaction. -func (t *ReadWriteTransaction) BufferWrite(ms []*Mutation) error { - t.mu.Lock() - defer t.mu.Unlock() - if t.state == txClosed { - return errTxClosed() - } - t.wb = append(t.wb, ms...) - return nil -} - -// Update executes a DML statement against the database. It returns the number -// of affected rows. Update returns an error if the statement is a query. -// However, the query is executed, and any data read will be validated upon -// commit. -func (t *ReadWriteTransaction) Update(ctx context.Context, stmt Statement) (rowCount int64, err error) { - mode := sppb.ExecuteSqlRequest_NORMAL - return t.update(ctx, stmt, QueryOptions{ - Mode: &mode, - Options: t.qo.Options, - Priority: t.qo.Priority, - }) -} - -// UpdateWithOptions executes a DML statement against the database. It returns -// the number of affected rows. The given QueryOptions will be used for the -// execution of this statement. -func (t *ReadWriteTransaction) UpdateWithOptions(ctx context.Context, stmt Statement, opts QueryOptions) (rowCount int64, err error) { - if opts.ExcludeTxnFromChangeStreams { - return 0, errExcludeRequestLevelDmlFromChangeStreams() - } - - return t.update(ctx, stmt, t.qo.merge(opts)) -} - -func (t *ReadWriteTransaction) update(ctx context.Context, stmt Statement, opts QueryOptions) (rowCount int64, err error) { - ctx, _ = startSpan(ctx, "Update", t.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, err) }() - req, sh, err := t.prepareExecuteSQL(ctx, stmt, opts) - if err != nil { - return 0, err - } - hasInlineBeginTransaction := false - if _, ok := req.GetTransaction().GetSelector().(*sppb.TransactionSelector_Begin); ok { - hasInlineBeginTransaction = true - } - - sh.updateLastUseTime() - var md metadata.MD - resultSet, err := sh.getClient().ExecuteSql(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), req, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "update"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "update", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - if hasInlineBeginTransaction { - t.setTransactionID(nil) - return 0, t.txReadOnly.updateTxState(errInlineBeginTransactionFailed(err)) - } - return 0, t.txReadOnly.updateTxState(ToSpannerError(err)) - } - if hasInlineBeginTransaction { - if resultSet != nil && resultSet.GetMetadata() != nil && resultSet.GetMetadata().GetTransaction() != nil && - resultSet.GetMetadata().GetTransaction().GetId() != nil { - t.setTransactionID(resultSet.GetMetadata().GetTransaction().GetId()) - } else { - // retry with explicit begin transaction - t.setTransactionID(nil) - return 0, errInlineBeginTransactionFailed(nil) - } - } - t.updatePrecommitToken(resultSet.GetPrecommitToken()) - if resultSet.Stats == nil { - return 0, spannerErrorf(codes.InvalidArgument, "query passed to Update: %q", stmt.SQL) - } - - return extractRowCount(resultSet.Stats) -} - -// BatchUpdate groups one or more DML statements and sends them to Spanner in a -// single RPC. This is an efficient way to execute multiple DML statements. -// -// A slice of counts is returned, where each count represents the number of -// affected rows for the given query at the same index. If an error occurs, -// counts will be returned up to the query that encountered the error. -func (t *ReadWriteTransaction) BatchUpdate(ctx context.Context, stmts []Statement) (_ []int64, err error) { - return t.BatchUpdateWithOptions(ctx, stmts, QueryOptions{}) -} - -// BatchUpdateWithOptions groups one or more DML statements and sends them to -// Spanner in a single RPC. This is an efficient way to execute multiple DML -// statements. -// -// A slice of counts is returned, where each count represents the number of -// affected rows for the given query at the same index. If an error occurs, -// counts will be returned up to the query that encountered the error. -// -// The request tag and priority given in the QueryOptions are included with the -// RPC. Any other options that are set in the QueryOptions struct are ignored. -func (t *ReadWriteTransaction) BatchUpdateWithOptions(ctx context.Context, stmts []Statement, opts QueryOptions) (_ []int64, err error) { - if opts.ExcludeTxnFromChangeStreams { - return nil, errExcludeRequestLevelDmlFromChangeStreams() - } - return t.batchUpdateWithOptions(ctx, stmts, t.qo.merge(opts)) -} - -func (t *ReadWriteTransaction) batchUpdateWithOptions(ctx context.Context, stmts []Statement, opts QueryOptions) (_ []int64, err error) { - ctx, _ = startSpan(ctx, "BatchUpdate", t.otConfig.commonTraceStartOptions...) - defer func() { endSpan(ctx, err) }() - - sh, ts, err := t.acquire(ctx) - if err != nil { - return nil, err - } - - // Cloud Spanner will return "Session not found" on bad sessions. - sid := sh.getID() - if sid == "" { - // Might happen if transaction is closed in the middle of a API call. - return nil, errSessionClosed(sh) - } - - // mark transaction and session to be eligible for long-running - t.mu.Lock() - t.isLongRunningTransaction = true - t.mu.Unlock() - t.setSessionEligibilityForLongRunning(sh) - - var sppbStmts []*sppb.ExecuteBatchDmlRequest_Statement - for _, st := range stmts { - params, paramTypes, err := st.convertParams() - if err != nil { - return nil, err - } - sppbStmts = append(sppbStmts, &sppb.ExecuteBatchDmlRequest_Statement{ - Sql: st.SQL, - Params: params, - ParamTypes: paramTypes, - }) - } - - hasInlineBeginTransaction := false - if _, ok := ts.GetSelector().(*sppb.TransactionSelector_Begin); ok { - hasInlineBeginTransaction = true - } - - sh.updateLastUseTime() - var md metadata.MD - resp, err := sh.getClient().ExecuteBatchDml(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), &sppb.ExecuteBatchDmlRequest{ - Session: sh.getID(), - Transaction: ts, - Statements: sppbStmts, - Seqno: atomic.AddInt64(&t.sequenceNumber, 1), - RequestOptions: createRequestOptions(opts.Priority, opts.RequestTag, t.txOpts.TransactionTag), - LastStatements: opts.LastStatement, - }, gax.WithGRPCOptions(grpc.Header(&md))) - - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "batchUpdateWithOptions"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", ToSpannerError(err)) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "batchUpdateWithOptions", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - if hasInlineBeginTransaction { - t.setTransactionID(nil) - return nil, t.txReadOnly.updateTxState(errInlineBeginTransactionFailed(err)) - } - return nil, t.txReadOnly.updateTxState(ToSpannerError(err)) - } - - haveTransactionID := false - var counts []int64 - for _, rs := range resp.ResultSets { - if hasInlineBeginTransaction && !haveTransactionID && rs != nil && rs.GetMetadata() != nil && - rs.GetMetadata().GetTransaction() != nil && rs.GetMetadata().GetTransaction().GetId() != nil { - t.setTransactionID(rs.GetMetadata().GetTransaction().GetId()) - haveTransactionID = true - } - count, err := extractRowCount(rs.Stats) - if err != nil { - return nil, err - } - counts = append(counts, count) - } - if hasInlineBeginTransaction && !haveTransactionID { - // retry with explicit BeginTransaction - t.setTransactionID(nil) - return counts, t.txReadOnly.updateTxState(errInlineBeginTransactionFailed(nil)) - } - t.updatePrecommitToken(resp.PrecommitToken) - if resp.Status != nil && resp.Status.Code != 0 { - return counts, t.txReadOnly.updateTxState(spannerError(codes.Code(uint32(resp.Status.Code)), resp.Status.Message)) - } - return counts, nil -} - -// acquire implements txReadEnv.acquire. -// This will make sure that only one operation will be running with TransactionSelector::begin option -// in a ReadWriteTransaction by changing the state to init, all other operations will wait for state -// to become active/closed. If state is active transactionID is already set, if closed returns error. -func (t *ReadWriteTransaction) acquire(ctx context.Context) (*sessionHandle, *sppb.TransactionSelector, error) { - for { - t.mu.Lock() - switch t.state { - case txClosed: - if t.tx == nil { - t.mu.Unlock() - return nil, nil, t.updateTxState(errInlineBeginTransactionFailed(nil)) - } - t.mu.Unlock() - return nil, nil, errTxClosed() - case txNew: - // State transit to txInit so that only one TransactionSelector::begin - // is accepted. - t.state = txInit - sh := t.sh - ts := &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Begin{ - Begin: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadWrite_{ - ReadWrite: &sppb.TransactionOptions_ReadWrite{}, - }, - ExcludeTxnFromChangeStreams: t.txOpts.ExcludeTxnFromChangeStreams, - IsolationLevel: t.txOpts.IsolationLevel, - }, - }, - } - t.mu.Unlock() - return sh, ts, nil - case txInit: - if t.tx == nil { - // Wait for a transaction ID to become ready. - txReadyOrClosed := t.txReadyOrClosed - t.mu.Unlock() - select { - case <-txReadyOrClosed: - // Need to check transaction state again. - continue - case <-ctx.Done(): - // The waiting for initialization is timeout, return error - // directly. - return nil, nil, errTxInitTimeout() - } - } - t.mu.Unlock() - // If first statement with TransactionSelector::begin succeeded, t.state should have been changed to - // txActive, so we can just continue here. - continue - case txActive: - sh := t.sh - ts := &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Id{ - Id: t.tx, - }, - } - t.mu.Unlock() - return sh, ts, nil - default: - state := t.state - t.mu.Unlock() - return nil, nil, errUnexpectedTxState(state) - } - } -} - -func (t *ReadWriteTransaction) getTransactionSelector() *sppb.TransactionSelector { - t.mu.Lock() - defer t.mu.Unlock() - if t.state == txActive { - return &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Id{ - Id: t.tx, - }, - } - } - mode := &sppb.TransactionOptions_ReadWrite_{ - ReadWrite: &sppb.TransactionOptions_ReadWrite{ - ReadLockMode: t.txOpts.ReadLockMode, - }, - } - if t.sp.isMultiplexedSessionForRWEnabled() { - mode.ReadWrite.MultiplexedSessionPreviousTransactionId = t.previousTx - } - return &sppb.TransactionSelector{ - Selector: &sppb.TransactionSelector_Begin{ - Begin: &sppb.TransactionOptions{ - Mode: mode, - ExcludeTxnFromChangeStreams: t.txOpts.ExcludeTxnFromChangeStreams, - IsolationLevel: t.txOpts.IsolationLevel, - }, - }, - } -} - -func (t *ReadWriteTransaction) setTransactionID(tx transactionID) { - t.mu.Lock() - defer t.mu.Unlock() - // When inline begin transaction fails close the transaction to retry with explicit begin transaction - if tx == nil { - t.state = txClosed - // unblock other waiting operations to abort and retry with explicit begin transaction. - close(t.txReadyOrClosed) - t.txReadyOrClosed = make(chan struct{}) - return - } - t.tx = tx - t.state = txActive - close(t.txReadyOrClosed) - t.txReadyOrClosed = make(chan struct{}) -} - -func (t *ReadWriteTransaction) updatePrecommitToken(token *sppb.MultiplexedSessionPrecommitToken) { - if token == nil { - return - } - t.mu.Lock() - defer t.mu.Unlock() - if t.precommitToken == nil || token.SeqNum > t.precommitToken.SeqNum { - t.precommitToken = token - } -} - -// release implements txReadEnv.release. -func (t *ReadWriteTransaction) release(err error) { - t.mu.Lock() - sh := t.sh - state := t.state - t.mu.Unlock() - if sh != nil && isSessionNotFoundError(err) { - sh.destroy() - } - // if transaction is released during initialization then do explicit begin transaction - if state == txInit { - t.setTransactionID(nil) - } -} - -func (t *ReadWriteTransaction) setSessionEligibilityForLongRunning(sh *sessionHandle) { - if t != nil && sh != nil { - sh.mu.Lock() - t.mu.Lock() - sh.eligibleForLongRunning = t.isLongRunningTransaction - t.mu.Unlock() - sh.mu.Unlock() - } -} - -func beginTransaction(ctx context.Context, opts transactionBeginOptions) (transactionID, *sppb.MultiplexedSessionPrecommitToken, error) { - readWriteOptions := &sppb.TransactionOptions_ReadWrite{ - ReadLockMode: opts.txOptions.ReadLockMode, - } - - if opts.multiplexEnabled { - readWriteOptions.MultiplexedSessionPreviousTransactionId = opts.previousTx - } - - res, err := opts.client.BeginTransaction(ctx, &sppb.BeginTransactionRequest{ - Session: opts.sessionID, - Options: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadWrite_{ - ReadWrite: readWriteOptions, - }, - ExcludeTxnFromChangeStreams: opts.txOptions.ExcludeTxnFromChangeStreams, - IsolationLevel: opts.txOptions.IsolationLevel, - }, - MutationKey: opts.mutation, - }) - if err != nil { - return nil, nil, err - } - if res.Id == nil { - return nil, nil, spannerErrorf(codes.Unknown, "BeginTransaction returned a transaction with a nil ID.") - } - - return res.Id, res.GetPrecommitToken(), nil -} - -func (t *ReadWriteStmtBasedTransaction) shouldExplicitBegin(attempt int, opts TransactionOptions) bool { - if opts.BeginTransactionOption == DefaultBeginTransaction && !t.isDefaultInlinedBegin() { - return true - } - return t.ReadWriteTransaction.shouldExplicitBegin(attempt, opts) -} - -// shouldExplicitBegin checks if ReadWriteTransaction should do an explicit BeginTransaction -func (t *ReadWriteTransaction) shouldExplicitBegin(attempt int, opts TransactionOptions) bool { - if opts.BeginTransactionOption == ExplicitBeginTransaction { - return true - } - couldUseInlinedBegin := opts.BeginTransactionOption == InlinedBeginTransaction || (opts.BeginTransactionOption == DefaultBeginTransaction && t.isDefaultInlinedBegin()) - if !couldUseInlinedBegin { - return false - } - - // don't begin during the first attempt - if attempt == 0 { - return false - } - t.mu.Lock() - defer t.mu.Unlock() - // don't begin if transactionId is already set - if t == nil || t.tx != nil || t.state == txNew { - return false - } - return true -} - -// begin starts a read-write transaction on Cloud Spanner. -func (t *ReadWriteTransaction) begin(ctx context.Context, mutation *sppb.Mutation) error { - t.mu.Lock() - if t.tx != nil { - t.state = txActive - return nil - } - sh := t.sh - previousTx := t.previousTx - t.mu.Unlock() - - var ( - tx transactionID - precommitToken *sppb.MultiplexedSessionPrecommitToken - err error - ) - defer func() { - if err != nil && sh != nil { - // Got a valid session handle, but failed to initialize transaction= - // on Cloud Spanner. - if isSessionNotFoundError(err) { - sh.destroy() - } - // If sh.destroy was already executed, this becomes a noop. - sh.recycle() - } - }() - // Retry the BeginTransaction call if a 'Session not found' is returned. - for { - if sh != nil { - sh.updateLastUseTime() - } - tx, precommitToken, err = beginTransaction(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), transactionBeginOptions{ - multiplexEnabled: t.sp.isMultiplexedSessionForRWEnabled(), - sessionID: sh.getID(), - client: sh.getClient(), - txOptions: t.txOpts, - mutation: mutation, - previousTx: previousTx, - }) - if isSessionNotFoundError(err) { - sh.destroy() - // this should not happen with multiplexed session, but if it does, we should not retry with multiplexed session - sh, err = t.sp.take(ctx) - if err != nil { - return err - } - // Some operations (for ex BatchUpdate) can be long-running. For such operations set the isLongRunningTransaction flag to be true - t.setSessionEligibilityForLongRunning(sh) - continue - } else { - err = ToSpannerError(err) - } - t.updatePrecommitToken(precommitToken) - break - } - if err == nil { - t.mu.Lock() - t.tx = tx - t.sh = sh - // Transition state to txActive. - t.state = txActive - t.mu.Unlock() - } - return err -} - -// CommitResponse provides a response of a transaction commit in a database. -type CommitResponse struct { - // CommitTs is the commit time for a transaction. - CommitTs time.Time - // CommitStats is the commit statistics for a transaction. - CommitStats *sppb.CommitResponse_CommitStats -} - -// CommitOptions provides options for committing a transaction in a database. -type CommitOptions struct { - ReturnCommitStats bool - MaxCommitDelay *time.Duration -} - -// merge combines two CommitOptions that the input parameter will have higher -// order of precedence. -func (co CommitOptions) merge(opts CommitOptions) CommitOptions { - newOpts := CommitOptions{ - ReturnCommitStats: co.ReturnCommitStats || opts.ReturnCommitStats, - MaxCommitDelay: opts.MaxCommitDelay, - } - - if newOpts.MaxCommitDelay == nil { - newOpts.MaxCommitDelay = co.MaxCommitDelay - } - return newOpts -} - -// commit tries to commit a readwrite transaction to Cloud Spanner. It also -// returns the commit response for the transactions. -func (t *ReadWriteTransaction) commit(ctx context.Context, options CommitOptions) (CommitResponse, error) { - resp := CommitResponse{} - t.mu.Lock() - mutationProtos, selectedMutationProto, err := mutationsProto(t.wb) - if t.tx == nil { - if t.state == txClosed { - // inline begin transaction failed - t.mu.Unlock() - return resp, t.updateTxState(errInlineBeginTransactionFailed(nil)) - } - t.mu.Unlock() - if !t.sp.isMultiplexedSessionForRWEnabled() { - selectedMutationProto = nil - } - // mutations or empty transaction body only - if err := t.begin(ctx, selectedMutationProto); err != nil { - return resp, err - } - t.mu.Lock() - } - t.state = txClosed // No further operations after commit. - close(t.txReadyOrClosed) - t.mu.Unlock() - if err != nil { - return resp, err - } - - // In case that sessionHandle was destroyed but transaction body fails to - // report it. - sid, client := t.sh.getID(), t.sh.getClient() - if sid == "" || client == nil { - return resp, errSessionClosed(t.sh) - } - t.sh.updateLastUseTime() - - var md metadata.MD - var maxCommitDelay *durationpb.Duration - if options.MaxCommitDelay != nil { - maxCommitDelay = durationpb.New(*(options.MaxCommitDelay)) - } - performCommit := func(includeMutations bool) (*sppb.CommitResponse, error) { - req := &sppb.CommitRequest{ - Session: sid, - Transaction: &sppb.CommitRequest_TransactionId{ - TransactionId: t.tx, - }, - PrecommitToken: t.precommitToken, - RequestOptions: createRequestOptions(t.txOpts.CommitPriority, "", t.txOpts.TransactionTag), - ReturnCommitStats: options.ReturnCommitStats, - MaxCommitDelay: maxCommitDelay, - } - if includeMutations { - req.Mutations = mutationProtos - } - return client.Commit(contextWithOutgoingMetadata(ctx, t.sh.getMetadata(), t.disableRouteToLeader), req, gax.WithGRPCOptions(grpc.Header(&md))) - } - // Initial commit attempt with mutations - res, err := performCommit(true) - if err != nil { - return resp, t.txReadOnly.updateTxState(toSpannerErrorWithCommitInfo(err, true)) - } - // Retry if MultiplexedSessionRetry is present, without mutations - if res.GetMultiplexedSessionRetry() != nil { - t.updatePrecommitToken(res.GetPrecommitToken()) - res, err = performCommit(false) - } - if getGFELatencyMetricsFlag() && md != nil && t.ct != nil { - if err := createContextAndCaptureGFELatencyMetrics(ctx, t.ct, md, "commit"); err != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency. Try disabling and rerunning. Error: %v", err) - } - } - if metricErr := recordGFELatencyMetricsOT(ctx, md, "commit", t.otConfig); metricErr != nil { - trace.TracePrintf(ctx, nil, "Error in recording GFE Latency through OpenTelemetry. Error: %v", metricErr) - } - if err != nil { - return resp, t.txReadOnly.updateTxState(toSpannerErrorWithCommitInfo(err, true)) - } - if tstamp := res.GetCommitTimestamp(); tstamp != nil { - resp.CommitTs = time.Unix(tstamp.Seconds, int64(tstamp.Nanos)) - } - if options.ReturnCommitStats { - resp.CommitStats = res.CommitStats - } - if isSessionNotFoundError(err) { - t.sh.destroy() - } - return resp, err -} - -// rollback is called when a commit is aborted or the transaction body runs -// into error. -func (t *ReadWriteTransaction) rollback(ctx context.Context) { - t.mu.Lock() - // Forbid further operations on rollbacked transaction. - t.state = txClosed - if t.tx == nil { - t.mu.Unlock() - return - } - t.mu.Unlock() - // In case that sessionHandle was destroyed but transaction body fails to - // report it. - sid, client := t.sh.getID(), t.sh.getClient() - if sid == "" || client == nil { - return - } - t.sh.updateLastUseTime() - err := client.Rollback(contextWithOutgoingMetadata(ctx, t.sh.getMetadata(), t.disableRouteToLeader), &sppb.RollbackRequest{ - Session: sid, - TransactionId: t.tx, - }) - if isSessionNotFoundError(err) { - t.sh.destroy() - } -} - -// runInTransaction executes f under a read-write transaction context. -func (t *ReadWriteTransaction) runInTransaction(ctx context.Context, f func(context.Context, *ReadWriteTransaction) error) (CommitResponse, error) { - var ( - resp CommitResponse - err error - errDuringCommit bool - ) - if err = f(context.WithValue(ctx, transactionInProgressKey{}, 1), t); err == nil { - // Try to commit if transaction body returns no error. - resp, err = t.commit(ctx, t.txOpts.CommitOptions) - errDuringCommit = err != nil - } - if err != nil { - if t.tx != nil { - t.previousTx = t.tx - } - if isAbortedErr(err) { - // Retry the transaction using the same session on ABORT error. - // Cloud Spanner will create the new transaction with the previous - // one's wound-wait priority. - return resp, err - } - if isSessionNotFoundError(err) { - t.sh.destroy() - return resp, err - } - if isFailedInlineBeginTransaction(err) { - return resp, err - } - - // Rollback the transaction unless the error occurred during the - // commit. Executing a rollback after a commit has failed will - // otherwise cause an error. Note that transient errors, such as - // UNAVAILABLE, are already handled in the gRPC layer and do not show - // up here. Context errors (deadline exceeded / canceled) during - // commits are also not rolled back. - if !errDuringCommit { - t.rollback(ctx) - } - return resp, err - } - // err == nil, return commit response. - return resp, nil -} - -// ReadWriteStmtBasedTransaction provides a wrapper of ReadWriteTransaction in -// order to run a read-write transaction in a statement-based way. -// -// This struct is returned by NewReadWriteStmtBasedTransaction and contains -// Commit() and Rollback() methods to end a transaction. -type ReadWriteStmtBasedTransaction struct { - // ReadWriteTransaction contains methods for performing transactional reads. - ReadWriteTransaction - - client *Client - options TransactionOptions -} - -func (t *ReadWriteStmtBasedTransaction) isDefaultInlinedBegin() bool { - return false -} - -// NewReadWriteStmtBasedTransaction starts a read-write transaction. Commit() or -// Rollback() must be called to end a transaction. If Commit() or Rollback() is -// not called, the session that is used by the transaction will not be returned -// to the pool and cause a session leak. -// -// This method should only be used when manual error handling and retry -// management is needed. Cloud Spanner may abort a read/write transaction at any -// moment, and each statement that is executed on the transaction should be -// checked for an Aborted error, including queries and read operations. -// -// For most use cases, client.ReadWriteTransaction should be used, as it will -// handle all Aborted and 'Session not found' errors automatically. -func NewReadWriteStmtBasedTransaction(ctx context.Context, c *Client) (*ReadWriteStmtBasedTransaction, error) { - return NewReadWriteStmtBasedTransactionWithOptions(ctx, c, TransactionOptions{}) -} - -// NewReadWriteStmtBasedTransactionWithOptions starts a read-write transaction -// with configurable options. Commit() or Rollback() must be called to end a -// transaction. If Commit() or Rollback() is not called, the session that is -// used by the transaction will not be returned to the pool and cause a session -// leak. -// -// ResetForRetry resets the transaction before a retry attempt. This function -// returns a new transaction that should be used for the retry attempt. The -// transaction that is returned by this function is assigned a higher priority -// than the previous transaction, making it less probable to be aborted by -// Spanner again during the retry. -// -// NewReadWriteStmtBasedTransactionWithOptions is a configurable version of -// NewReadWriteStmtBasedTransaction. -func NewReadWriteStmtBasedTransactionWithOptions(ctx context.Context, c *Client, options TransactionOptions) (*ReadWriteStmtBasedTransaction, error) { - return newReadWriteStmtBasedTransactionWithSessionHandle(ctx, c, options, nil, nil) -} - -func newReadWriteStmtBasedTransactionWithSessionHandle(ctx context.Context, c *Client, options TransactionOptions, sh *sessionHandle, previousTransactionID transactionID) (*ReadWriteStmtBasedTransaction, error) { - var ( - err error - t *ReadWriteStmtBasedTransaction - ) - if sh == nil { - if c.idleSessions.isMultiplexedSessionForRWEnabled() { - sh, err = c.idleSessions.takeMultiplexed(ctx) - } else { - sh, err = c.idleSessions.take(ctx) - } - if err != nil { - // If session retrieval fails, just fail the transaction. - return nil, err - } - } - t = &ReadWriteStmtBasedTransaction{ - ReadWriteTransaction: ReadWriteTransaction{ - txReadyOrClosed: make(chan struct{}), - }, - client: c, - } - if previousTransactionID != nil { - // The previousTx field is updated with the most recent transaction ID. This is needed for multiplexed sessions - // to increase the priority of the new transaction during retry attempt. - // This assignment is ignored for regular sessions. - t.previousTx = previousTransactionID - } - t.txReadOnly.sp = c.idleSessions - t.txReadOnly.sh = sh - t.txReadOnly.txReadEnv = t - t.txReadOnly.qo = c.qo - t.txReadOnly.ro = c.ro - t.txReadOnly.disableRouteToLeader = c.disableRouteToLeader - t.txReadOnly.updateTxStateFunc = func(err error) error { - if isFailedInlineBeginTransaction(err) { - t.mu.Lock() - t.state = txAborted - t.mu.Unlock() - - // Convert the Internal error to an Aborted error to indicate to the caller that they should retry the - // transaction. - wrapped := errors.Unwrap(err) - if wrapped == nil { - wrapped = err - } - msg := wrapped.Error() - return spannerError(codes.Aborted, msg) - } - if ErrCode(err) == codes.Aborted { - t.mu.Lock() - t.state = txAborted - t.mu.Unlock() - } - return err - } - - t.options = options - t.txOpts = c.txo.merge(options) - t.ct = c.ct - t.otConfig = c.otConfig - - if t.shouldExplicitBegin(0, t.txOpts) { - // Explicitly begin the transactions - if err := t.explicitBegin(ctx); err != nil { - return nil, err - } - } - return t, err -} - -func (t *ReadWriteStmtBasedTransaction) explicitBegin(ctx context.Context) error { - var err error - if err = t.begin(ctx, nil); err != nil { - if t.sh != nil { - t.sh.recycle() - } - return err - } - if isUnimplementedErrorForMultiplexedRW(err) { - t.client.idleSessions.disableMultiplexedSessionForRW() - } - return nil -} - -// Commit tries to commit a readwrite transaction to Cloud Spanner. It also -// returns the commit timestamp for the transactions. -func (t *ReadWriteStmtBasedTransaction) Commit(ctx context.Context) (time.Time, error) { - resp, err := t.CommitWithReturnResp(ctx) - return resp.CommitTs, err -} - -// CommitWithReturnResp tries to commit a readwrite transaction. It also returns -// the commit timestamp and stats for the transactions. -func (t *ReadWriteStmtBasedTransaction) CommitWithReturnResp(ctx context.Context) (CommitResponse, error) { - resp, err := t.commit(ctx, t.txOpts.CommitOptions) - // Rolling back an aborted transaction is not necessary. - if err != nil && status.Code(err) != codes.Aborted { - t.rollback(ctx) - } - if t.sh != nil { - t.sh.recycle() - t.sh = nil - } - return resp, err -} - -// Rollback is called to cancel the ongoing transaction that has not been -// committed yet. -func (t *ReadWriteStmtBasedTransaction) Rollback(ctx context.Context) { - t.rollback(ctx) - if t.sh != nil { - t.sh.recycle() - t.sh = nil - } -} - -// ResetForRetry resets the transaction before a retry. This should be -// called if the transaction was aborted by Spanner and the application -// wants to retry the transaction. -// It is recommended to use this method above creating a new transaction, -// as this method will give the transaction a higher priority and thus a -// smaller probability of being aborted again by Spanner. -func (t *ReadWriteStmtBasedTransaction) ResetForRetry(ctx context.Context) (*ReadWriteStmtBasedTransaction, error) { - if t.state != txAborted { - return nil, fmt.Errorf("ResetForRetry should only be called on an active transaction that was aborted by Spanner") - } - - var previousTransactionID transactionID - if t.tx != nil { - // Track the current transactionId that is ABORTED. - previousTransactionID = t.tx - } else { - // In case the current transactionId is nil, then look at the previousTx. - previousTransactionID = t.previousTx - } - // Create a new transaction that re-uses the current session if it is available. - // It should always use an explicit BeginTransaction RPC to ensure that the first - // statement is included in the transaction. - t.options.BeginTransactionOption = ExplicitBeginTransaction - return newReadWriteStmtBasedTransactionWithSessionHandle(ctx, t.client, t.options, t.sh, previousTransactionID) -} - -// writeOnlyTransaction provides the most efficient way of doing write-only -// transactions. It essentially does blind writes to Cloud Spanner. -type writeOnlyTransaction struct { - // sp is the session pool which writeOnlyTransaction uses to get Cloud - // Spanner sessions for blind writes. - sp *sessionPool - // transactionTag is the tag that will be included with the CommitRequest - // of the write-only transaction. - transactionTag string - // commitPriority is the RPC priority to use for the commit operation. - commitPriority sppb.RequestOptions_Priority - // disableRouteToLeader specifies if we want to disable RW/PDML requests to be routed to leader. - disableRouteToLeader bool - // ExcludeTxnFromChangeStreams controls whether to exclude recording modifications in - // current transaction from the allowed tracking change streams with DDL option - // allow_txn_exclusion=true. - excludeTxnFromChangeStreams bool - // commitOptions are applied to the Commit request for the writeOnlyTransaction.. - commitOptions CommitOptions - // isolationLevel is used to define the isolation for writeOnlyTransaction - isolationLevel sppb.TransactionOptions_IsolationLevel -} - -// applyAtLeastOnce commits a list of mutations to Cloud Spanner at least once, -// unless one of the following happens: -// -// 1. Context times out. -// 2. An unretryable error (e.g. database not found) occurs. -// 3. There is a malformed Mutation object. -func (t *writeOnlyTransaction) applyAtLeastOnce(ctx context.Context, ms ...*Mutation) (time.Time, error) { - var ( - ts time.Time - sh *sessionHandle - ) - defer func() { - if sh != nil { - sh.recycle() - } - }() - mPb, _, err := mutationsProto(ms) - if err != nil { - // Malformed mutation found, just return the error. - return ts, err - } - - var maxCommitDelay *durationpb.Duration - if t.commitOptions.MaxCommitDelay != nil { - maxCommitDelay = durationpb.New(*(t.commitOptions.MaxCommitDelay)) - } - - // Make a retryer for Aborted and certain Internal errors. - retryer := onCodes(DefaultRetryBackoff, codes.Aborted, codes.Internal) - // Apply the mutation and retry if the commit is aborted. - applyMutationWithRetry := func(ctx context.Context) error { - for { - if sh == nil || sh.getID() == "" || sh.getClient() == nil { - // No usable session for doing the commit, take one from pool. - sh, err = t.sp.takeMultiplexed(ctx) - if err != nil { - // sessionPool.Take already retries for session - // creations/retrivals. - return ToSpannerError(err) - } - } - sh.updateLastUseTime() - res, err := sh.getClient().Commit(contextWithOutgoingMetadata(ctx, sh.getMetadata(), t.disableRouteToLeader), &sppb.CommitRequest{ - Session: sh.getID(), - Transaction: &sppb.CommitRequest_SingleUseTransaction{ - SingleUseTransaction: &sppb.TransactionOptions{ - Mode: &sppb.TransactionOptions_ReadWrite_{ - ReadWrite: &sppb.TransactionOptions_ReadWrite{}, - }, - ExcludeTxnFromChangeStreams: t.excludeTxnFromChangeStreams, - IsolationLevel: t.isolationLevel, - }, - }, - Mutations: mPb, - RequestOptions: createRequestOptions(t.commitPriority, "", t.transactionTag), - MaxCommitDelay: maxCommitDelay, - }) - if err != nil && !isAbortedErr(err) { - // should not be the case with multiplexed sessions - if isSessionNotFoundError(err) { - // Discard the bad session. - sh.destroy() - } - return toSpannerErrorWithCommitInfo(err, true) - } else if err == nil { - if tstamp := res.GetCommitTimestamp(); tstamp != nil { - ts = time.Unix(tstamp.Seconds, int64(tstamp.Nanos)) - } - } - delay, shouldRetry := retryer.Retry(err) - if !shouldRetry { - return err - } - if err := gax.Sleep(ctx, delay); err != nil { - return err - } - } - } - return ts, applyMutationWithRetry(ctx) -} - -// isAbortedErr returns true if the error indicates that an gRPC call is -// aborted on the server side. -func isAbortedErr(err error) bool { - if err == nil { - return false - } - if ErrCode(err) == codes.Aborted { - return true - } - return false -} - -// transactionBeginOptions holds the parameters for beginning a transaction. -type transactionBeginOptions struct { - multiplexEnabled bool - sessionID string - client spannerClient - txOptions TransactionOptions - previousTx transactionID - mutation *sppb.Mutation -} diff --git a/vendor/cloud.google.com/go/spanner/value.go b/vendor/cloud.google.com/go/spanner/value.go deleted file mode 100644 index 2f24762af9..0000000000 --- a/vendor/cloud.google.com/go/spanner/value.go +++ /dev/null @@ -1,5955 +0,0 @@ -/* -Copyright 2017 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package spanner - -import ( - "bytes" - "database/sql" - "database/sql/driver" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "math" - "math/big" - "reflect" - "regexp" - "strconv" - "strings" - "time" - - "cloud.google.com/go/civil" - "cloud.google.com/go/internal/fields" - sppb "cloud.google.com/go/spanner/apiv1/spannerpb" - "github.com/google/uuid" - "google.golang.org/grpc/codes" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/protoadapt" - "google.golang.org/protobuf/reflect/protoreflect" - proto3 "google.golang.org/protobuf/types/known/structpb" -) - -const ( - // nullString is returned by the String methods of NullableValues when the - // underlying database value is null. - nullString = "" - commitTimestampPlaceholderString = "spanner.commit_timestamp()" - - // NumericPrecisionDigits is the maximum number of digits in a NUMERIC - // value. - NumericPrecisionDigits = 38 - - // NumericScaleDigits is the maximum number of digits after the decimal - // point in a NUMERIC value. - NumericScaleDigits = 9 -) - -// LossOfPrecisionHandlingOption describes the option to deal with loss of -// precision on numeric values. -type LossOfPrecisionHandlingOption int - -const ( - // NumericRound automatically rounds a numeric value that has a higher - // precision than what is supported by Spanner, e.g., 0.1234567895 rounds - // to 0.123456790. - NumericRound LossOfPrecisionHandlingOption = iota - // NumericError returns an error for numeric values that have a higher - // precision than what is supported by Spanner. E.g. the client returns an - // error if the application tries to insert the value 0.1234567895. - NumericError -) - -// LossOfPrecisionHandling configures how to deal with loss of precision on -// numeric values. The value of this configuration is global and will be used -// for all Spanner clients. -var LossOfPrecisionHandling LossOfPrecisionHandlingOption - -// NumericString returns a string representing a *big.Rat in a format compatible -// with Spanner SQL. It returns a floating-point literal with 9 digits after the -// decimal point. -func NumericString(r *big.Rat) string { - return r.FloatString(NumericScaleDigits) -} - -// validateNumeric returns nil if there are no errors. It will return an error -// when the numeric number is not valid. -func validateNumeric(r *big.Rat) error { - if r == nil { - return nil - } - // Add one more digit to the scale component to find out if there are more - // digits than required. - strRep := r.FloatString(NumericScaleDigits + 1) - strRep = strings.TrimRight(strRep, "0") - strRep = strings.TrimLeft(strRep, "-") - s := strings.Split(strRep, ".") - whole := s[0] - scale := s[1] - if len(scale) > NumericScaleDigits { - return fmt.Errorf("max scale for a numeric is %d. The requested numeric has more", NumericScaleDigits) - } - if len(whole) > NumericPrecisionDigits-NumericScaleDigits { - return fmt.Errorf("max precision for the whole component of a numeric is %d. The requested numeric has a whole component with precision %d", NumericPrecisionDigits-NumericScaleDigits, len(whole)) - } - return nil -} - -var ( - // CommitTimestamp is a special value used to tell Cloud Spanner to insert - // the commit timestamp of the transaction into a column. It can be used in - // a Mutation, or directly used in InsertStruct or InsertMap. See - // ExampleCommitTimestamp. This is just a placeholder and the actual value - // stored in this variable has no meaning. - CommitTimestamp = commitTimestamp - commitTimestamp = time.Unix(0, 0).In(time.FixedZone("CommitTimestamp placeholder", 0xDB)) - - jsonUseNumber bool - - protoMsgReflectType = reflect.TypeOf((*proto.Message)(nil)).Elem() - protoEnumReflectType = reflect.TypeOf((*protoreflect.Enum)(nil)).Elem() - - errPayloadNil = errors.New("payload should not be nil") -) - -// UseNumberWithJSONDecoderEncoder specifies whether Cloud Spanner JSON numbers are decoded -// as Number (preserving precision) or float64 (risking loss). -// Defaults to the same behavior as the standard Go library, which means decoding to float64. -// Call this method to enable lossless precision. -// NOTE 1: Calling this method affects the behavior of all clients created by this library, both existing and future instances. -// NOTE 2: This method sets a global variable that is used by the client to encode/decode JSON numbers. Access to the global variable is not synchronized. You should only call this method when there are no goroutines encoding/decoding Cloud Spanner JSON values. It is recommended to only call this method during the initialization of your application, and preferably before you create any Cloud Spanner clients, and/or in tests when there are no queries being executed. -func UseNumberWithJSONDecoderEncoder(useNumber bool) { - jsonUseNumber = useNumber -} - -func jsonUnmarshal(data []byte, v any) error { - dec := json.NewDecoder(bytes.NewReader(data)) - if jsonUseNumber { - dec.UseNumber() - } - return dec.Decode(v) -} - -// jsonIsNull returns whether v matches JSON null literal -func jsonIsNull(v []byte) bool { - return string(v) == "null" -} - -// Encoder is the interface implemented by a custom type that can be encoded to -// a supported type by Spanner. A code example: -// -// type customField struct { -// Prefix string -// Suffix string -// } -// -// // Convert a customField value to a string -// func (cf customField) EncodeSpanner() (interface{}, error) { -// var b bytes.Buffer -// b.WriteString(cf.Prefix) -// b.WriteString("-") -// b.WriteString(cf.Suffix) -// return b.String(), nil -// } -type Encoder interface { - EncodeSpanner() (interface{}, error) -} - -// Decoder is the interface implemented by a custom type that can be decoded -// from a supported type by Spanner. A code example: -// -// type customField struct { -// Prefix string -// Suffix string -// } -// -// // Convert a string to a customField value -// func (cf *customField) DecodeSpanner(val interface{}) (err error) { -// strVal, ok := val.(string) -// if !ok { -// return fmt.Errorf("failed to decode customField: %v", val) -// } -// s := strings.Split(strVal, "-") -// if len(s) > 1 { -// cf.Prefix = s[0] -// cf.Suffix = s[1] -// } -// return nil -// } -type Decoder interface { - DecodeSpanner(input interface{}) error -} - -// NullableValue is the interface implemented by all null value wrapper types. -type NullableValue interface { - // IsNull returns true if the underlying database value is null. - IsNull() bool -} - -// NullInt64 represents a Cloud Spanner INT64 that may be NULL. -type NullInt64 struct { - Int64 int64 // Int64 contains the value when it is non-NULL, and zero when NULL. - Valid bool // Valid is true if Int64 is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullInt64. -func (n NullInt64) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullInt64 -func (n NullInt64) String() string { - if !n.Valid { - return nullString - } - return fmt.Sprintf("%v", n.Int64) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullInt64. -func (n NullInt64) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Int64) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullInt64. -func (n *NullInt64) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Int64 = int64(0) - n.Valid = false - return nil - } - num, err := strconv.ParseInt(string(payload), 10, 64) - if err != nil { - return fmt.Errorf("payload cannot be converted to int64: got %v", string(payload)) - } - n.Int64 = num - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullInt64) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Int64, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullInt64) Scan(value interface{}) error { - if value == nil { - n.Int64, n.Valid = 0, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullInt64: %v", p) - case *int64: - n.Int64 = *p - case int64: - n.Int64 = p - case *NullInt64: - n.Int64 = p.Int64 - n.Valid = p.Valid - case NullInt64: - n.Int64 = p.Int64 - n.Valid = p.Valid - case string: - i64, err := strconv.ParseInt(p, 10, 64) - if err != nil { - return err - } - n.Int64 = i64 - n.Valid = true - case *string: - i64, err := strconv.ParseInt(*p, 10, 64) - if err != nil { - return err - } - n.Int64 = i64 - n.Valid = true - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullInt64) GormDataType() string { - return "INT64" -} - -// NullString represents a Cloud Spanner STRING that may be NULL. -type NullString struct { - StringVal string // StringVal contains the value when it is non-NULL, and an empty string when NULL. - Valid bool // Valid is true if StringVal is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullString. -func (n NullString) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullString -func (n NullString) String() string { - if !n.Valid { - return nullString - } - return n.StringVal -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullString. -func (n NullString) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.StringVal) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullString. -func (n *NullString) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.StringVal = "" - n.Valid = false - return nil - } - var s *string - if err := jsonUnmarshal(payload, &s); err != nil { - return err - } - if s != nil { - n.StringVal = *s - n.Valid = true - } else { - n.StringVal = "" - n.Valid = false - } - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullString) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.StringVal, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullString) Scan(value interface{}) error { - if value == nil { - n.StringVal, n.Valid = "", false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullString: %v", p) - case *string: - n.StringVal = *p - case string: - n.StringVal = p - case *NullString: - n.StringVal = p.StringVal - n.Valid = p.Valid - case NullString: - n.StringVal = p.StringVal - n.Valid = p.Valid - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullString) GormDataType() string { - return "STRING(MAX)" -} - -// NullFloat64 represents a Cloud Spanner FLOAT64 that may be NULL. -type NullFloat64 struct { - Float64 float64 // Float64 contains the value when it is non-NULL, and zero when NULL. - Valid bool // Valid is true if Float64 is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullFloat64. -func (n NullFloat64) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullFloat64 -func (n NullFloat64) String() string { - if !n.Valid { - return nullString - } - return fmt.Sprintf("%v", n.Float64) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullFloat64. -func (n NullFloat64) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Float64) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullFloat64. -func (n *NullFloat64) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Float64 = float64(0) - n.Valid = false - return nil - } - num, err := strconv.ParseFloat(string(payload), 64) - if err != nil { - return fmt.Errorf("payload cannot be converted to float64: got %v", string(payload)) - } - n.Float64 = num - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullFloat64) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Float64, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullFloat64) Scan(value interface{}) error { - if value == nil { - n.Float64, n.Valid = 0, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullFloat64: %v", p) - case *float64: - n.Float64 = *p - case float64: - n.Float64 = p - case *NullFloat64: - n.Float64 = p.Float64 - n.Valid = p.Valid - case NullFloat64: - n.Float64 = p.Float64 - n.Valid = p.Valid - case string: - f, err := strconv.ParseFloat(p, 64) - if err != nil { - return err - } - n.Float64 = f - n.Valid = true - case *string: - f, err := strconv.ParseFloat(*p, 64) - if err != nil { - return err - } - n.Float64 = f - n.Valid = true - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullFloat64) GormDataType() string { - return "FLOAT64" -} - -// NullFloat32 represents a Cloud Spanner FLOAT32 that may be NULL. -type NullFloat32 struct { - Float32 float32 // Float32 contains the value when it is non-NULL, and zero when NULL. - Valid bool // Valid is true if FLOAT32 is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullFloat32. -func (n NullFloat32) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullFloat32 -func (n NullFloat32) String() string { - if !n.Valid { - return nullString - } - return fmt.Sprintf("%v", n.Float32) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullFloat32. -func (n NullFloat32) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Float32) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullFloat32. -func (n *NullFloat32) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Float32 = float32(0) - n.Valid = false - return nil - } - num, err := strconv.ParseFloat(string(payload), 32) - if err != nil { - return fmt.Errorf("payload cannot be converted to float32: got %v", string(payload)) - } - n.Float32 = float32(num) - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullFloat32) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Float32, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullFloat32) Scan(value interface{}) error { - if value == nil { - n.Float32, n.Valid = 0, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullFloat32: %v", p) - case *float32: - n.Float32 = *p - case float32: - n.Float32 = p - case *NullFloat32: - n.Float32 = p.Float32 - n.Valid = p.Valid - case NullFloat32: - n.Float32 = p.Float32 - n.Valid = p.Valid - case string: - f, err := strconv.ParseFloat(p, 32) - if err != nil { - return err - } - n.Float32 = float32(f) - n.Valid = true - case *string: - f, err := strconv.ParseFloat(*p, 32) - if err != nil { - return err - } - n.Float32 = float32(f) - n.Valid = true - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullFloat32) GormDataType() string { - return "FLOAT32" -} - -// NullBool represents a Cloud Spanner BOOL that may be NULL. -type NullBool struct { - Bool bool // Bool contains the value when it is non-NULL, and false when NULL. - Valid bool // Valid is true if Bool is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullBool. -func (n NullBool) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullBool -func (n NullBool) String() string { - if !n.Valid { - return nullString - } - return fmt.Sprintf("%v", n.Bool) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullBool. -func (n NullBool) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Bool) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullBool. -func (n *NullBool) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Bool = false - n.Valid = false - return nil - } - b, err := strconv.ParseBool(string(payload)) - if err != nil { - return fmt.Errorf("payload cannot be converted to bool: got %v", string(payload)) - } - n.Bool = b - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullBool) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Bool, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullBool) Scan(value interface{}) error { - if value == nil { - n.Bool, n.Valid = false, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullBool: %v", p) - case *bool: - n.Bool = *p - case bool: - n.Bool = p - case *NullBool: - n.Bool = p.Bool - n.Valid = p.Valid - case NullBool: - n.Bool = p.Bool - n.Valid = p.Valid - case string: - f, err := strconv.ParseBool(p) - if err != nil { - return err - } - n.Bool = f - n.Valid = true - case *string: - f, err := strconv.ParseBool(*p) - if err != nil { - return err - } - n.Bool = f - n.Valid = true - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullBool) GormDataType() string { - return "BOOL" -} - -// NullTime represents a Cloud Spanner TIMESTAMP that may be null. -type NullTime struct { - Time time.Time // Time contains the value when it is non-NULL, and a zero time.Time when NULL. - Valid bool // Valid is true if Time is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullTime. -func (n NullTime) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullTime -func (n NullTime) String() string { - if !n.Valid { - return nullString - } - return n.Time.Format(time.RFC3339Nano) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullTime. -func (n NullTime) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Time) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullTime. -func (n *NullTime) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Time = time.Time{} - n.Valid = false - return nil - } - payload, err := trimDoubleQuotes(payload) - if err != nil { - return err - } - s := string(payload) - t, err := time.Parse(time.RFC3339Nano, s) - if err != nil { - return fmt.Errorf("payload cannot be converted to time.Time: got %v", string(payload)) - } - n.Time = t - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullTime) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Time, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullTime) Scan(value interface{}) error { - if value == nil { - n.Time, n.Valid = time.Time{}, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullTime: %v", p) - case *time.Time: - n.Time = *p - case time.Time: - n.Time = p - case *NullTime: - n.Time = p.Time - n.Valid = p.Valid - case NullTime: - n.Time = p.Time - n.Valid = p.Valid - case string: - f, err := time.Parse(time.RFC3339Nano, p) - if err != nil { - return err - } - n.Time = f - n.Valid = true - case *string: - f, err := time.Parse(time.RFC3339Nano, *p) - if err != nil { - return err - } - n.Time = f - n.Valid = true - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullTime) GormDataType() string { - return "TIMESTAMP" -} - -// NullDate represents a Cloud Spanner DATE that may be null. -type NullDate struct { - Date civil.Date // Date contains the value when it is non-NULL, and a zero civil.Date when NULL. - Valid bool // Valid is true if Date is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullDate. -func (n NullDate) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullDate -func (n NullDate) String() string { - if !n.Valid { - return nullString - } - return n.Date.String() -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullDate. -func (n NullDate) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Date) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullDate. -func (n *NullDate) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Date = civil.Date{} - n.Valid = false - return nil - } - payload, err := trimDoubleQuotes(payload) - if err != nil { - return err - } - s := string(payload) - t, err := civil.ParseDate(s) - if err != nil { - return fmt.Errorf("payload cannot be converted to civil.Date: got %v", string(payload)) - } - n.Date = t - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullDate) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Date, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullDate) Scan(value interface{}) error { - if value == nil { - n.Date, n.Valid = civil.Date{}, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - d := civil.Date{} - if err := d.Scan(value); err != nil { - return err - } - n.Date = d - n.Valid = true - case *civil.Date: - n.Date = *p - case civil.Date: - n.Date = p - case *NullDate: - n.Date = p.Date - n.Valid = p.Valid - case NullDate: - n.Date = p.Date - n.Valid = p.Valid - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullDate) GormDataType() string { - return "DATE" -} - -// NullNumeric represents a Cloud Spanner Numeric that may be NULL. -type NullNumeric struct { - Numeric big.Rat // Numeric contains the value when it is non-NULL, and a zero big.Rat when NULL. - Valid bool // Valid is true if Numeric is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullNumeric. -func (n NullNumeric) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullNumeric -func (n NullNumeric) String() string { - if !n.Valid { - return nullString - } - return fmt.Sprintf("%v", NumericString(&n.Numeric)) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullNumeric. -func (n NullNumeric) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, NumericString(&n.Numeric)) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullNumeric. -func (n *NullNumeric) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Numeric = big.Rat{} - n.Valid = false - return nil - } - payload, err := trimDoubleQuotes(payload) - if err != nil { - return err - } - s := string(payload) - val, ok := (&big.Rat{}).SetString(s) - if !ok { - return fmt.Errorf("payload cannot be converted to big.Rat: got %v", string(payload)) - } - n.Numeric = *val - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullNumeric) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.Numeric, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullNumeric) Scan(value interface{}) error { - if value == nil { - n.Numeric, n.Valid = big.Rat{}, false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullNumeric: %v", p) - case *big.Rat: - n.Numeric = *p - case big.Rat: - n.Numeric = p - case *NullNumeric: - n.Numeric = p.Numeric - n.Valid = p.Valid - case NullNumeric: - n.Numeric = p.Numeric - n.Valid = p.Valid - case string: - y, ok := (&big.Rat{}).SetString(p) - if !ok { - return errUnexpectedNumericStr(p) - } - n.Numeric = *y - n.Valid = true - case *string: - y, ok := (&big.Rat{}).SetString(*p) - if !ok { - return errUnexpectedNumericStr(*p) - } - n.Numeric = *y - n.Valid = true - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullNumeric) GormDataType() string { - return "NUMERIC" -} - -// NullJSON represents a Cloud Spanner JSON that may be NULL. -// -// This type must always be used when encoding values to a JSON column in Cloud -// Spanner. -// -// NullJSON does not implement the driver.Valuer and sql.Scanner interfaces, as -// the underlying value can be anything. This means that the type NullJSON must -// also be used when calling sql.Row#Scan(dest ...interface{}) for a JSON -// column. -type NullJSON struct { - Value interface{} // Val contains the value when it is non-NULL, and nil when NULL. - Valid bool // Valid is true if Json is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullJSON. -func (n NullJSON) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullJSON. -func (n NullJSON) String() string { - if !n.Valid { - return nullString - } - b, err := json.Marshal(n.Value) - if err != nil { - return fmt.Sprintf("error: %v", err) - } - return fmt.Sprintf("%v", string(b)) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullJSON. -func (n NullJSON) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Value) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullJSON. -func (n *NullJSON) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Valid = false - return nil - } - var v interface{} - err := jsonUnmarshal(payload, &v) - if err != nil { - return fmt.Errorf("payload cannot be converted to a struct: got %v, err: %w", string(payload), err) - } - n.Value = v - n.Valid = true - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullJSON) GormDataType() string { - return "JSON" -} - -// PGNumeric represents a Cloud Spanner PG Numeric that may be NULL. -type PGNumeric struct { - Numeric string // Numeric contains the value when it is non-NULL, and an empty string when NULL. - Valid bool // Valid is true if Numeric is not NULL. -} - -// IsNull implements NullableValue.IsNull for PGNumeric. -func (n PGNumeric) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for PGNumeric -func (n PGNumeric) String() string { - if !n.Valid { - return nullString - } - return n.Numeric -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for PGNumeric. -func (n PGNumeric) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Numeric) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for PGNumeric. -func (n *PGNumeric) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Numeric = "" - n.Valid = false - return nil - } - payload, err := trimDoubleQuotes(payload) - if err != nil { - return err - } - n.Numeric = string(payload) - n.Valid = true - return nil -} - -// NullProtoMessage represents a Cloud Spanner PROTO that may be NULL. -// To write a NULL value using NullProtoMessage set ProtoMessageVal to typed nil and set Valid to true. -type NullProtoMessage struct { - ProtoMessageVal proto.Message // ProtoMessageVal contains the value when Valid is true, and nil when NULL. - Valid bool // Valid is true if ProtoMessageVal is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullProtoMessage. -func (n NullProtoMessage) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullProtoMessage. -func (n NullProtoMessage) String() string { - if !n.Valid { - return nullString - } - return protoadapt.MessageV1Of(n.ProtoMessageVal).String() -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullProtoMessage. -func (n NullProtoMessage) MarshalJSON() ([]byte, error) { - if n.Valid { - return json.Marshal(n.ProtoMessageVal) - } - return []byte("null"), nil -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullProtoMessage. -func (n *NullProtoMessage) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.ProtoMessageVal = nil - n.Valid = false - return nil - } - err := jsonUnmarshal(payload, n.ProtoMessageVal) - if err != nil { - return fmt.Errorf("payload cannot be converted to a proto message: err: %s", err) - } - n.Valid = true - return nil -} - -// NullProtoEnum represents a Cloud Spanner ENUM that may be NULL. -// To write a NULL value using NullProtoEnum set ProtoEnumVal to typed nil and set Valid to true. -type NullProtoEnum struct { - ProtoEnumVal protoreflect.Enum // ProtoEnumVal contains the value when Valid is true, and nil when NULL. - Valid bool // Valid is true if ProtoEnumVal is not NULL. -} - -// IsNull implements NullableValue.IsNull for NullProtoEnum. -func (n NullProtoEnum) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullProtoEnum. -func (n NullProtoEnum) String() string { - if !n.Valid { - return nullString - } - return fmt.Sprintf("%v", n.ProtoEnumVal) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullProtoEnum. -func (n NullProtoEnum) MarshalJSON() ([]byte, error) { - if n.Valid && n.ProtoEnumVal != nil { - return []byte(fmt.Sprintf("%v", n.ProtoEnumVal.Number())), nil - } - return []byte("null"), nil -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullProtoEnum. -func (n *NullProtoEnum) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.ProtoEnumVal = nil - n.Valid = false - return nil - } - if reflect.ValueOf(n.ProtoEnumVal).Kind() != reflect.Ptr { - return errNotAPointerField(n, n.ProtoEnumVal) - } - num, err := strconv.ParseInt(string(payload), 10, 64) - if err != nil { - return fmt.Errorf("payload cannot be converted to Enum: got %v", string(payload)) - } - reflect.ValueOf(n.ProtoEnumVal).Elem().SetInt(num) - n.Valid = true - return nil -} - -// NullUUID represents a Cloud Spanner UUID that may be NULL. -type NullUUID struct { - UUID uuid.UUID - Valid bool -} - -// IsNull implements NullableValue.IsNull for NullUUID. -func (n NullUUID) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullUUID -func (n NullUUID) String() string { - if !n.Valid { - return nullString - } - return n.UUID.String() -} - -// MarshalJSON NullUUID json.Marshaler.MarshalJSON for NullUUID. -func (n NullUUID) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.UUID) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullUUID. -func (n *NullUUID) UnmarshalJSON(payload []byte) error { - if payload == nil { - return fmt.Errorf("payload should not be nil") - } - if jsonIsNull(payload) { - n.Valid = false - return nil - } - parsedUUID, err := uuid.ParseBytes(payload) - if err != nil { - return fmt.Errorf("payload cannot be converted to uuid: got %v", string(payload)) - } - n.UUID = parsedUUID - n.Valid = true - return nil -} - -// Value implements the driver.Valuer interface. -func (n NullUUID) Value() (driver.Value, error) { - if n.IsNull() { - return nil, nil - } - return n.UUID, nil -} - -// Scan implements the sql.Scanner interface. -func (n *NullUUID) Scan(value interface{}) error { - if value == nil { - n.Valid = false - return nil - } - n.Valid = true - switch p := value.(type) { - default: - return spannerErrorf(codes.InvalidArgument, "invalid type for NullUUID: %v", p) - case *uuid.UUID: - n.UUID = *p - case uuid.UUID: - n.UUID = p - case *NullUUID: - n.UUID = p.UUID - n.Valid = p.Valid - case NullUUID: - n.UUID = p.UUID - n.Valid = p.Valid - } - return nil -} - -// GormDataType is used by gorm to determine the default data type for fields with this type. -func (n NullUUID) GormDataType() string { - return "UUID" -} - -// NullRow represents a Cloud Spanner STRUCT that may be NULL. -// See also the document for Row. -// Note that NullRow is not a valid Cloud Spanner column Type. -type NullRow struct { - Row Row // Row contains the value when it is non-NULL, and a zero Row when NULL. - Valid bool // Valid is true if Row is not NULL. -} - -// PGJsonB represents a Cloud Spanner PGJsonB that may be NULL. -type PGJsonB struct { - Value interface{} // Val contains the value when it is non-NULL, and nil when NULL. - Valid bool // Valid is true if PGJsonB is not NULL. - // This is here to support customer wrappers around PGJsonB type, this will help during getDecodableSpannerType - // to differentiate between PGJsonB and NullJSON types. - _ bool -} - -// IsNull implements NullableValue.IsNull for PGJsonB. -func (n PGJsonB) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for PGJsonB. -func (n PGJsonB) String() string { - if !n.Valid { - return nullString - } - b, err := json.Marshal(n.Value) - if err != nil { - return fmt.Sprintf("error: %v", err) - } - return fmt.Sprintf("%v", string(b)) -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for PGJsonB. -func (n PGJsonB) MarshalJSON() ([]byte, error) { - return nulljson(n.Valid, n.Value) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for PGJsonB. -func (n *PGJsonB) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - if jsonIsNull(payload) { - n.Valid = false - return nil - } - - var v interface{} - err := jsonUnmarshal(payload, &v) - if err != nil { - return fmt.Errorf("payload cannot be converted to a struct: got %v, err: %w", string(payload), err) - } - n.Value = v - n.Valid = true - return nil -} - -func nulljson(valid bool, v interface{}) ([]byte, error) { - if !valid { - return []byte("null"), nil - } - return json.Marshal(v) -} - -// GenericColumnValue represents the generic encoded value and type of the -// column. See google.spanner.v1.ResultSet proto for details. This can be -// useful for proxying query results when the result types are not known in -// advance. -// -// If you populate a GenericColumnValue from a row using Row.Column or related -// methods, do not modify the contents of Type and Value. -type GenericColumnValue struct { - Type *sppb.Type - Value *proto3.Value -} - -// Decode decodes a GenericColumnValue. The ptr argument should be a pointer -// to a Go value that can accept v. -func (v GenericColumnValue) Decode(ptr interface{}) error { - return decodeValue(v.Value, v.Type, ptr) -} - -// NewGenericColumnValue creates a GenericColumnValue from Go value that is -// valid for Cloud Spanner. -func newGenericColumnValue(v interface{}) (*GenericColumnValue, error) { - value, typ, err := encodeValue(v) - if err != nil { - return nil, err - } - return &GenericColumnValue{Value: value, Type: typ}, nil -} - -// errTypeMismatch returns error for destination not having a compatible type -// with source Cloud Spanner type. -func errTypeMismatch(srcCode, elCode sppb.TypeCode, dst interface{}) error { - s := srcCode.String() - if srcCode == sppb.TypeCode_ARRAY { - s = fmt.Sprintf("%v[%v]", srcCode, elCode) - } - return spannerErrorf(codes.InvalidArgument, "type %T cannot be used for decoding %s", dst, s) -} - -// errNilSpannerType returns error for nil Cloud Spanner type in decoding. -func errNilSpannerType() error { - return spannerErrorf(codes.FailedPrecondition, "unexpected nil Cloud Spanner data type in decoding") -} - -// errNilSrc returns error for decoding from nil proto value. -func errNilSrc() error { - return spannerErrorf(codes.FailedPrecondition, "unexpected nil Cloud Spanner value in decoding") -} - -// errNilDst returns error for decoding into nil interface{}. -func errNilDst(dst interface{}) error { - return spannerErrorf(codes.InvalidArgument, "cannot decode into nil type %T", dst) -} - -// errNilDstField returns error for decoding into nil interface{} of Value field in NullProtoMessage or NullProtoEnum. -func errNilDstField(dst interface{}, field string) error { - return spannerErrorf(codes.InvalidArgument, "field %s in %T cannot be nil", field, dst) -} - -// errNilArrElemType returns error for input Cloud Spanner data type being a array but without a -// non-nil array element type. -func errNilArrElemType(t *sppb.Type) error { - return spannerErrorf(codes.FailedPrecondition, "array type %v is with nil array element type", t) -} - -// errNotValidSrc returns error if Valid field is false for NullProtoMessage and NullProtoEnum -func errNotValidSrc(dst interface{}) error { - return spannerErrorf(codes.InvalidArgument, "field \"Valid\" of %T cannot be set to false when writing data to Cloud Spanner. Use typed nil in %T to write null values to Cloud Spanner", dst, dst) -} - -func errUnsupportedEmbeddedStructFields(fname string) error { - return spannerErrorf(codes.InvalidArgument, "Embedded field: %s. Embedded and anonymous fields are not allowed "+ - "when converting Go structs to Cloud Spanner STRUCT values. To create a STRUCT value with an "+ - "unnamed field, use a `spanner:\"\"` field tag.", fname) -} - -// errDstNotForNull returns error for decoding a SQL NULL value into a destination which doesn't -// support NULL values. -func errDstNotForNull(dst interface{}) error { - return spannerErrorf(codes.InvalidArgument, "destination %T cannot support NULL SQL values", dst) -} - -// errBadEncoding returns error for decoding wrongly encoded types. -func errBadEncoding(v *proto3.Value, err error) error { - return spannerErrorf(codes.FailedPrecondition, "%v wasn't correctly encoded: <%v>", v, err) -} - -// errNotAPointer returns error for decoding a non pointer type. -func errNotAPointer(dst interface{}) error { - return spannerErrorf(codes.InvalidArgument, "destination %T must be a pointer", dst) -} - -// errNotAPointerField returns error for decoding a non pointer type. -func errNotAPointerField(dst interface{}, dstField interface{}) error { - return spannerErrorf(codes.InvalidArgument, "destination %T in %T must be a pointer", dstField, dst) -} - -func errNilNotAllowed(dst interface{}, name string) error { - return spannerErrorf(codes.InvalidArgument, "destination %T does not support Null values. Use %s, an array with pointer type elements to read Null values", dst, name) -} - -func parseNullTime(v *proto3.Value, p *NullTime, code sppb.TypeCode, isNull bool) error { - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_TIMESTAMP { - return errTypeMismatch(code, sppb.TypeCode_TYPE_CODE_UNSPECIFIED, p) - } - if isNull { - *p = NullTime{} - return nil - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := time.Parse(time.RFC3339Nano, x) - if err != nil { - return errBadEncoding(v, err) - } - p.Valid = true - p.Time = y - return nil -} - -// tryDecodePointerToDecoder attempts to decode a **T where *T implements Decoder -// Returns (handled, error) - handled=true if this case was processed -func tryDecodePointerToDecoder(ptr interface{}, t *sppb.Type, v *proto3.Value, isNull bool) (bool, error) { - rv := reflect.ValueOf(ptr) - if rv.Kind() != reflect.Ptr || rv.Type().Elem().Kind() != reflect.Ptr { - return false, nil - } - - elemType := rv.Type().Elem().Elem() - if !reflect.PointerTo(elemType).Implements(reflect.TypeOf((*Decoder)(nil)).Elem()) { - return false, nil - } - - if isNull { - rv.Elem().Set(reflect.Zero(rv.Elem().Type())) - return true, nil - } - - // Create a new instance of the underlying type - newInstance := reflect.New(elemType) - if decodedVal, ok := newInstance.Interface().(Decoder); ok { - x, err := getGenericValue(t, v) - if err != nil { - return true, err - } - if err := decodedVal.DecodeSpanner(x); err != nil { - return true, err - } - rv.Elem().Set(newInstance) - return true, nil - } - - return false, nil -} - -// decodeValue decodes a protobuf Value into a pointer to a Go value, as -// specified by sppb.Type. -func decodeValue(v *proto3.Value, t *sppb.Type, ptr interface{}, opts ...DecodeOptions) error { - if v == nil { - return errNilSrc() - } - if t == nil { - return errNilSpannerType() - } - code := t.Code - typeAnnotation := t.TypeAnnotation - acode := sppb.TypeCode_TYPE_CODE_UNSPECIFIED - atypeAnnotation := sppb.TypeAnnotationCode_TYPE_ANNOTATION_CODE_UNSPECIFIED - if code == sppb.TypeCode_ARRAY { - if t.ArrayElementType == nil { - return errNilArrElemType(t) - } - acode = t.ArrayElementType.Code - atypeAnnotation = t.ArrayElementType.TypeAnnotation - } - - if code == sppb.TypeCode_PROTO && reflect.TypeOf(ptr).Elem().Kind() == reflect.Ptr { - pve := reflect.ValueOf(ptr).Elem() - if pve.IsNil() { - pve.Set(reflect.New(pve.Type().Elem())) - } - ptr = pve.Interface() - } - - _, isNull := v.Kind.(*proto3.Value_NullValue) - - // Do the decoding based on the type of ptr. - switch p := ptr.(type) { - case nil: - return errNilDst(nil) - case *string: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_STRING { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getStringValue(v) - if err != nil { - return err - } - *p = x - case *NullString, **string, *sql.NullString: - // Most Null* types are automatically supported for both spanner.Null* and sql.Null* types, except for - // NullString, and we need to add explicit support for it here. The reason that the other types are - // automatically supported is that they use the same field names (e.g. spanner.NullBool and sql.NullBool both - // contain the fields Valid and Bool). spanner.NullString has a field StringVal, sql.NullString has a field - // String. - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_STRING { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullString: - *sp = NullString{} - case **string: - *sp = nil - case *sql.NullString: - *sp = sql.NullString{} - } - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *NullString: - sp.Valid = true - sp.StringVal = x - case **string: - *sp = &x - case *sql.NullString: - sp.Valid = true - sp.String = x - } - case *[]NullString, *[]*string: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_STRING { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullString: - *sp = nil - case *[]*string: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullString: - y, err := decodeNullStringArray(x) - if err != nil { - return err - } - *sp = y - case *[]*string: - y, err := decodeStringPointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]string: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_STRING { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeStringArray(x) - if err != nil { - return err - } - *p = y - case *[]byte: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_BYTES && code != sppb.TypeCode_PROTO { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := base64.StdEncoding.DecodeString(x) - if err != nil { - return errBadEncoding(v, err) - } - *p = y - case *[][]byte: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_BYTES && acode != sppb.TypeCode_PROTO { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeByteArray(x) - if err != nil { - return err - } - *p = y - case *int64: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_INT64 && code != sppb.TypeCode_ENUM { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := strconv.ParseInt(x, 10, 64) - if err != nil { - return errBadEncoding(v, err) - } - *p = y - case *NullInt64, **int64: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_INT64 && code != sppb.TypeCode_ENUM { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullInt64: - *sp = NullInt64{} - case **int64: - *sp = nil - } - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := strconv.ParseInt(x, 10, 64) - if err != nil { - return errBadEncoding(v, err) - } - switch sp := ptr.(type) { - case *NullInt64: - sp.Valid = true - sp.Int64 = y - case **int64: - *sp = &y - } - case *[]NullInt64, *[]*int64: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_INT64 && acode != sppb.TypeCode_ENUM { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullInt64: - *sp = nil - case *[]*int64: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullInt64: - y, err := decodeNullInt64Array(x) - if err != nil { - return err - } - *sp = y - case *[]*int64: - y, err := decodeInt64PointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]int64: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_INT64 && acode != sppb.TypeCode_ENUM { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeInt64Array(x) - if err != nil { - return err - } - *p = y - case *bool: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_BOOL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getBoolValue(v) - if err != nil { - return err - } - *p = x - case *NullBool, **bool: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_BOOL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullBool: - *sp = NullBool{} - case **bool: - *sp = nil - } - break - } - x, err := getBoolValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *NullBool: - sp.Valid = true - sp.Bool = x - case **bool: - *sp = &x - } - case *[]NullBool, *[]*bool: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_BOOL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullBool: - *sp = nil - case *[]*bool: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullBool: - y, err := decodeNullBoolArray(x) - if err != nil { - return err - } - *sp = y - case *[]*bool: - y, err := decodeBoolPointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]bool: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_BOOL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeBoolArray(x) - if err != nil { - return err - } - *p = y - case *float64: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_FLOAT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getFloat64Value(v) - if err != nil { - return err - } - *p = x - case *NullFloat64, **float64: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_FLOAT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullFloat64: - *sp = NullFloat64{} - case **float64: - *sp = nil - } - break - } - x, err := getFloat64Value(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *NullFloat64: - sp.Valid = true - sp.Float64 = x - case **float64: - *sp = &x - } - case *[]NullFloat64, *[]*float64: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_FLOAT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullFloat64: - *sp = nil - case *[]*float64: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullFloat64: - y, err := decodeNullFloat64Array(x) - if err != nil { - return err - } - *sp = y - case *[]*float64: - y, err := decodeFloat64PointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]float64: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_FLOAT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeFloat64Array(x) - if err != nil { - return err - } - *p = y - case *float32: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_FLOAT32 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getFloat32Value(v) - if err != nil { - return err - } - *p = x - case *NullFloat32, **float32: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_FLOAT32 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullFloat32: - *sp = NullFloat32{} - case **float32: - *sp = nil - } - break - } - x, err := getFloat32Value(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *NullFloat32: - sp.Valid = true - sp.Float32 = x - case **float32: - *sp = &x - } - case *[]NullFloat32, *[]*float32: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_FLOAT32 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullFloat32: - *sp = nil - case *[]*float32: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullFloat32: - y, err := decodeNullFloat32Array(x) - if err != nil { - return err - } - *sp = y - case *[]*float32: - y, err := decodeFloat32PointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]float32: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_FLOAT32 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeFloat32Array(x) - if err != nil { - return err - } - *p = y - case *big.Rat: - if code != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x := v.GetStringValue() - y, ok := (&big.Rat{}).SetString(x) - if !ok { - return errUnexpectedNumericStr(x) - } - *p = *y - case *NullJSON: - if p == nil { - return errNilDst(p) - } - if code == sppb.TypeCode_ARRAY { - if acode != sppb.TypeCode_JSON { - return errTypeMismatch(code, acode, ptr) - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeNullJSONArrayToNullJSON(x) - if err != nil { - return err - } - *p = *y - } else { - if code != sppb.TypeCode_JSON { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = NullJSON{} - break - } - x := v.GetStringValue() - var y interface{} - err := jsonUnmarshal([]byte(x), &y) - if err != nil { - return err - } - *p = NullJSON{y, true} - } - case *[]NullJSON: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_JSON { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeNullJSONArray(x) - if err != nil { - return err - } - *p = y - case *NullNumeric: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = NullNumeric{} - break - } - x := v.GetStringValue() - y, ok := (&big.Rat{}).SetString(x) - if !ok { - return errUnexpectedNumericStr(x) - } - *p = NullNumeric{*y, true} - case **big.Rat: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x := v.GetStringValue() - y, ok := (&big.Rat{}).SetString(x) - if !ok { - return errUnexpectedNumericStr(x) - } - *p = y - case *[]NullNumeric, *[]*big.Rat: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullNumeric: - *sp = nil - case *[]*big.Rat: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullNumeric: - y, err := decodeNullNumericArray(x) - if err != nil { - return err - } - *sp = y - case *[]*big.Rat: - y, err := decodeNumericPointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]big.Rat: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeNumericArray(x) - if err != nil { - return err - } - *p = y - case *PGNumeric: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_NUMERIC || typeAnnotation != sppb.TypeAnnotationCode_PG_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = PGNumeric{} - break - } - *p = PGNumeric{v.GetStringValue(), true} - case *[]PGNumeric: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_NUMERIC || atypeAnnotation != sppb.TypeAnnotationCode_PG_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodePGNumericArray(x) - if err != nil { - return err - } - *p = y - case *PGJsonB: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_JSON || typeAnnotation != sppb.TypeAnnotationCode_PG_JSONB { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = PGJsonB{} - break - } - x := v.GetStringValue() - var y interface{} - err := jsonUnmarshal([]byte(x), &y) - if err != nil { - return err - } - *p = PGJsonB{Value: y, Valid: true} - case *[]PGJsonB: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_JSON || typeAnnotation != sppb.TypeAnnotationCode_PG_JSONB { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodePGJsonBArray(x) - if err != nil { - return err - } - *p = y - case *time.Time: - var nt NullTime - if isNull { - return errDstNotForNull(ptr) - } - err := parseNullTime(v, &nt, code, isNull) - if err != nil { - return err - } - *p = nt.Time - case *NullTime: - err := parseNullTime(v, p, code, isNull) - if err != nil { - return err - } - case **time.Time: - var nt NullTime - if isNull { - *p = nil - break - } - err := parseNullTime(v, &nt, code, isNull) - if err != nil { - return err - } - *p = &nt.Time - case *[]NullTime, *[]*time.Time: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_TIMESTAMP { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullTime: - *sp = nil - case *[]*time.Time: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullTime: - y, err := decodeNullTimeArray(x) - if err != nil { - return err - } - *sp = y - case *[]*time.Time: - y, err := decodeTimePointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]time.Time: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_TIMESTAMP { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeTimeArray(x) - if err != nil { - return err - } - *p = y - case *civil.Date: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_DATE { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := civil.ParseDate(x) - if err != nil { - return errBadEncoding(v, err) - } - *p = y - case *NullDate, **civil.Date: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_DATE { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullDate: - *sp = NullDate{} - case **civil.Date: - *sp = nil - } - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := civil.ParseDate(x) - if err != nil { - return errBadEncoding(v, err) - } - switch sp := ptr.(type) { - case *NullDate: - sp.Valid = true - sp.Date = y - case **civil.Date: - *sp = &y - } - case *[]NullDate, *[]*civil.Date: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_DATE { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullDate: - *sp = nil - case *[]*civil.Date: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullDate: - y, err := decodeNullDateArray(x) - if err != nil { - return err - } - *sp = y - case *[]*civil.Date: - y, err := decodeDatePointerArray(x) - if err != nil { - return err - } - *sp = y - } - case *[]civil.Date: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_DATE { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeDateArray(x) - if err != nil { - return err - } - *p = y - case *[]NullRow: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_STRUCT { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeRowArray(t.ArrayElementType.StructType, x) - if err != nil { - return err - } - *p = y - case *GenericColumnValue: - *p = GenericColumnValue{Type: t, Value: v} - case protoreflect.Enum: - if p == nil { - return errNilDst(p) - } - if reflect.ValueOf(p).Kind() != reflect.Ptr { - return errNotAPointer(p) - } - if code != sppb.TypeCode_ENUM && code != sppb.TypeCode_INT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - y, err := getIntegerFromStringValue(v) - if err != nil { - return err - } - reflect.ValueOf(p).Elem().SetInt(y) - case *NullProtoEnum: - if p == nil { - return errNilDst(p) - } - if p.ProtoEnumVal == nil { - return errNilDstField(p, "ProtoEnumVal") - } - if reflect.ValueOf(p.ProtoEnumVal).Kind() != reflect.Ptr { - return errNotAPointer(p) - } - if code != sppb.TypeCode_ENUM && code != sppb.TypeCode_INT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = NullProtoEnum{} - break - } - y, err := getIntegerFromStringValue(v) - if err != nil { - return err - } - reflect.ValueOf(p.ProtoEnumVal).Elem().SetInt(y) - p.Valid = true - case proto.Message: - // Check if the pointer is a custom type that implements spanner.Decoder - // interface. - if decodedVal, ok := ptr.(Decoder); ok { - x, err := getGenericValue(t, v) - if err != nil { - return err - } - return decodedVal.DecodeSpanner(x) - } - // Check if the pointer is a pointer to a pointer, and if the underlying type implements Decoder - if handled, err := tryDecodePointerToDecoder(ptr, t, v, isNull); handled { - return err - } - if p == nil { - return errNilDst(p) - } - if reflect.ValueOf(p).Kind() != reflect.Ptr { - return errNotAPointer(p) - } - if code != sppb.TypeCode_PROTO && code != sppb.TypeCode_BYTES { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - y, err := getBytesFromStringValue(v) - if err != nil { - return err - } - err = proto.Unmarshal(y, p) - if err != nil { - return err - } - case *NullProtoMessage: - if p == nil { - return errNilDst(p) - } - if p.ProtoMessageVal == nil { - return errNilDstField(p, "ProtoMessageVal") - } - if reflect.ValueOf(p.ProtoMessageVal).Kind() != reflect.Ptr { - return errNotAPointer(p.ProtoMessageVal) - } - if code != sppb.TypeCode_PROTO && code != sppb.TypeCode_BYTES { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = NullProtoMessage{} - break - } - y, err := getBytesFromStringValue(v) - if err != nil { - return err - } - err = proto.Unmarshal(y, p.ProtoMessageVal) - if err != nil { - return err - } - p.Valid = true - case *Interval: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_INTERVAL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getStringValue(v) - if err != nil { - return err - } - interval, err := ParseInterval(x) - if err != nil { - return errBadEncoding(v, err) - } - *p = interval - case *NullInterval: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_INTERVAL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = NullInterval{} - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - interval, err := ParseInterval(x) - if err != nil { - return errBadEncoding(v, err) - } - *p = NullInterval{interval, true} - case *[]Interval: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_INTERVAL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeIntervalArray(x) - if err != nil { - return err - } - *p = y - case *[]NullInterval: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_INTERVAL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeNullIntervalArray(x) - if err != nil { - return err - } - *p = y - case *[]*Interval: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_INTERVAL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeIntervalPointerArray(x) - if err != nil { - return err - } - *p = y - case *uuid.UUID: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_UUID { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - return errDstNotForNull(ptr) - } - x, err := getUUIDValue(v) - if err != nil { - return err - } - *p = x - case *NullUUID, **uuid.UUID: - if p == nil { - return errNilDst(p) - } - if code != sppb.TypeCode_UUID { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *NullUUID: - *sp = NullUUID{} - case **uuid.UUID: - *sp = nil - } - break - } - x, err := getUUIDValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *NullUUID: - sp.Valid = true - sp.UUID = x - case **uuid.UUID: - *sp = &x - } - case *[]uuid.UUID: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_UUID { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - *p = nil - break - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeUUIDArray(x) - if err != nil { - return err - } - *p = y - case *[]NullUUID, *[]*uuid.UUID: - if p == nil { - return errNilDst(p) - } - if acode != sppb.TypeCode_UUID { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - switch sp := ptr.(type) { - case *[]NullUUID: - *sp = nil - case *[]*NullUUID: - *sp = nil - } - break - } - x, err := getListValue(v) - if err != nil { - return err - } - switch sp := ptr.(type) { - case *[]NullUUID: - y, err := decodeNullUUIDArray(x) - if err != nil { - return err - } - *sp = y - case *[]*uuid.UUID: - y, err := decodeUUIDPointerArray(x) - if err != nil { - return err - } - *sp = y - } - default: - // Check if the pointer is a custom type that implements spanner.Decoder - // interface. - if decodedVal, ok := ptr.(Decoder); ok { - x, err := getGenericValue(t, v) - if err != nil { - return err - } - return decodedVal.DecodeSpanner(x) - } - // Check if the pointer is a pointer to a pointer, and if the underlying type implements Decoder - if handled, err := tryDecodePointerToDecoder(ptr, t, v, isNull); handled { - return err - } - - // Check if the pointer is a variant of a base type. - decodableType := getDecodableSpannerType(ptr, true) - if decodableType != spannerTypeUnknown { - if isNull && !decodableType.supportsNull() { - return errDstNotForNull(ptr) - } - return decodableType.decodeValueToCustomType(v, t, acode, atypeAnnotation, ptr) - } - - rv := reflect.ValueOf(ptr) - typ := rv.Type() - // Check if the interface{} is a pointer and is of type array of proto columns - if typ.Kind() == reflect.Ptr && isAnArrayOfProtoColumn(ptr) && code == sppb.TypeCode_ARRAY { - if isNull { - rv.Elem().Set(reflect.Zero(rv.Elem().Type())) - break - } - // Get the user-defined type of the proto array - etyp := typ.Elem().Elem() - switch acode { - case sppb.TypeCode_PROTO, sppb.TypeCode_BYTES: - if etyp.Implements(protoMsgReflectType) { - if etyp.Kind() == reflect.Ptr { - x, err := getListValue(v) - if err != nil { - return err - } - return decodeProtoMessagePtrArray(x, t.ArrayElementType, rv) - } - return errTypeMismatch(code, acode, ptr) - } - case sppb.TypeCode_ENUM, sppb.TypeCode_INT64: - if etyp.Implements(protoEnumReflectType) { - x, err := getListValue(v) - if err != nil { - return err - } - if etyp.Kind() == reflect.Ptr { - return decodeProtoEnumPtrArray(x, t.ArrayElementType, rv) - } - return decodeProtoEnumArray(x, t.ArrayElementType, rv, ptr) - } - } - } - - // Check if the proto encoding is for an array of structs. - if !(code == sppb.TypeCode_ARRAY && acode == sppb.TypeCode_STRUCT) { - return errTypeMismatch(code, acode, ptr) - } - vp := reflect.ValueOf(p) - if !vp.IsValid() { - return errNilDst(p) - } - if !isPtrStructPtrSlice(vp.Type()) { - // The container is not a slice of struct pointers. - return fmt.Errorf("the container is not a slice of struct pointers: %v", errTypeMismatch(code, acode, ptr)) - } - // Only use reflection for nil detection on slow path. - // Also, IsNil panics on many types, so check it after the type check. - if vp.IsNil() { - return errNilDst(p) - } - if isNull { - // The proto Value is encoding NULL, set the pointer to struct - // slice to nil as well. - vp.Elem().Set(reflect.Zero(vp.Elem().Type())) - break - } - x, err := getListValue(v) - if err != nil { - return err - } - s := decodeSetting{ - Lenient: false, - } - for _, opt := range opts { - opt.Apply(&s) - } - if err = decodeStructArray(t.ArrayElementType.StructType, x, p, s.Lenient); err != nil { - return err - } - } - return nil -} - -// decodableSpannerType represents the Go types that a value from a Spanner -// database can be converted to. -type decodableSpannerType uint - -const ( - spannerTypeUnknown decodableSpannerType = iota - spannerTypeInvalid - spannerTypeNonNullString - spannerTypeByteArray - spannerTypeNonNullInt64 - spannerTypeNonNullBool - spannerTypeNonNullFloat64 - spannerTypeNonNullFloat32 - spannerTypeNonNullNumeric - spannerTypeNonNullTime - spannerTypeNonNullDate - spannerTypeNonNullUUID - spannerTypeNullString - spannerTypeNullInt64 - spannerTypeNullBool - spannerTypeNullFloat64 - spannerTypeNullFloat32 - spannerTypeNullTime - spannerTypeNullDate - spannerTypeNullNumeric - spannerTypeNullJSON - spannerTypeNullUUID - spannerTypePGNumeric - spannerTypePGJsonB - spannerTypeNonNullInterval - spannerTypeNullInterval - spannerTypeArrayOfNonNullString - spannerTypeArrayOfByteArray - spannerTypeArrayOfNonNullInt64 - spannerTypeArrayOfNonNullBool - spannerTypeArrayOfNonNullFloat64 - spannerTypeArrayOfNonNullFloat32 - spannerTypeArrayOfNonNullNumeric - spannerTypeArrayOfNonNullTime - spannerTypeArrayOfNonNullDate - spannerTypeArrayOfNonNullUUID - spannerTypeArrayOfNullString - spannerTypeArrayOfNullInt64 - spannerTypeArrayOfNullBool - spannerTypeArrayOfNullFloat64 - spannerTypeArrayOfNullFloat32 - spannerTypeArrayOfNullNumeric - spannerTypeArrayOfNullJSON - spannerTypeArrayOfNullTime - spannerTypeArrayOfNullDate - spannerTypeArrayOfNullUUID - spannerTypeArrayOfPGNumeric - spannerTypeArrayOfPGJsonB - spannerTypeArrayOfNonNullInterval - spannerTypeArrayOfNullInterval -) - -// supportsNull returns true for the Go types that can hold a null value from -// Spanner. -func (d decodableSpannerType) supportsNull() bool { - switch d { - case spannerTypeNonNullString, spannerTypeNonNullInt64, spannerTypeNonNullBool, spannerTypeNonNullFloat64, spannerTypeNonNullFloat32, spannerTypeNonNullTime, spannerTypeNonNullDate, spannerTypeNonNullNumeric, spannerTypeNonNullUUID: - return false - default: - return true - } -} - -// The following list of types represent the struct types that represent a -// specific Spanner data type in Go. If a pointer to one of these types is -// passed to decodeValue, the client library will decode one column value into -// the struct. For pointers to all other struct types, the client library will -// treat it as a generic struct that should contain a field for each column in -// the result set that is being decoded. - -var typeOfNonNullTime = reflect.TypeOf(time.Time{}) -var typeOfNonNullDate = reflect.TypeOf(civil.Date{}) -var typeOfNonNullNumeric = reflect.TypeOf(big.Rat{}) -var typeOfNonNullUUID = reflect.TypeOf(uuid.UUID{}) -var typeOfNullString = reflect.TypeOf(NullString{}) -var typeOfNullInt64 = reflect.TypeOf(NullInt64{}) -var typeOfNullBool = reflect.TypeOf(NullBool{}) -var typeOfNullFloat64 = reflect.TypeOf(NullFloat64{}) -var typeOfNullFloat32 = reflect.TypeOf(NullFloat32{}) -var typeOfNullTime = reflect.TypeOf(NullTime{}) -var typeOfNullDate = reflect.TypeOf(NullDate{}) -var typeOfNullNumeric = reflect.TypeOf(NullNumeric{}) -var typeOfNullJSON = reflect.TypeOf(NullJSON{}) -var typeOfNullUUID = reflect.TypeOf(NullUUID{}) -var typeOfPGNumeric = reflect.TypeOf(PGNumeric{}) -var typeOfPGJsonB = reflect.TypeOf(PGJsonB{}) -var typeOfNonNullInterval = reflect.TypeOf(Interval{}) -var typeOfNullInterval = reflect.TypeOf(NullInterval{}) - -// getDecodableSpannerType returns the corresponding decodableSpannerType of -// the given pointer. -func getDecodableSpannerType(ptr interface{}, isPtr bool) decodableSpannerType { - var val reflect.Value - var kind reflect.Kind - if isPtr { - val = reflect.Indirect(reflect.ValueOf(ptr)) - } else { - val = reflect.ValueOf(ptr) - } - kind = val.Kind() - if kind == reflect.Invalid { - return spannerTypeInvalid - } - switch kind { - case reflect.Invalid: - return spannerTypeInvalid - case reflect.Array: - t := val.Type() - if t.ConvertibleTo(typeOfNonNullUUID) { - return spannerTypeNonNullUUID - } - case reflect.String: - return spannerTypeNonNullString - case reflect.Int64: - return spannerTypeNonNullInt64 - case reflect.Bool: - return spannerTypeNonNullBool - case reflect.Float32: - return spannerTypeNonNullFloat32 - case reflect.Float64: - return spannerTypeNonNullFloat64 - case reflect.Ptr: - t := val.Type() - if t.ConvertibleTo(typeOfNullNumeric) { - return spannerTypeNullNumeric - } - if t.ConvertibleTo(typeOfNullJSON) { - return spannerTypeNullJSON - } - if t.ConvertibleTo(typeOfPGJsonB) { - return spannerTypePGJsonB - } - case reflect.Struct: - t := val.Type() - if t.ConvertibleTo(typeOfNonNullNumeric) { - return spannerTypeNonNullNumeric - } - if t.ConvertibleTo(typeOfNonNullTime) { - return spannerTypeNonNullTime - } - if t.ConvertibleTo(typeOfNonNullDate) { - return spannerTypeNonNullDate - } - if t.ConvertibleTo(typeOfNonNullInterval) { - return spannerTypeNonNullInterval - } - if t.ConvertibleTo(typeOfNullString) { - return spannerTypeNullString - } - if t.ConvertibleTo(typeOfNullInt64) { - return spannerTypeNullInt64 - } - if t.ConvertibleTo(typeOfNullBool) { - return spannerTypeNullBool - } - if t.ConvertibleTo(typeOfNullFloat64) { - return spannerTypeNullFloat64 - } - if t.ConvertibleTo(typeOfNullFloat32) { - return spannerTypeNullFloat32 - } - if t.ConvertibleTo(typeOfNullTime) { - return spannerTypeNullTime - } - if t.ConvertibleTo(typeOfNullDate) { - return spannerTypeNullDate - } - if t.ConvertibleTo(typeOfNullNumeric) { - return spannerTypeNullNumeric - } - if t.ConvertibleTo(typeOfNullJSON) { - return spannerTypeNullJSON - } - if t.ConvertibleTo(typeOfNullUUID) { - return spannerTypeNullUUID - } - if t.ConvertibleTo(typeOfPGNumeric) { - return spannerTypePGNumeric - } - if t.ConvertibleTo(typeOfPGJsonB) { - return spannerTypePGJsonB - } - if t.ConvertibleTo(typeOfNullInterval) { - return spannerTypeNullInterval - } - case reflect.Slice: - kind := val.Type().Elem().Kind() - switch kind { - case reflect.Invalid: - return spannerTypeUnknown - case reflect.String: - return spannerTypeArrayOfNonNullString - case reflect.Uint8: - return spannerTypeByteArray - case reflect.Int64: - return spannerTypeArrayOfNonNullInt64 - case reflect.Bool: - return spannerTypeArrayOfNonNullBool - case reflect.Float64: - return spannerTypeArrayOfNonNullFloat64 - case reflect.Float32: - return spannerTypeArrayOfNonNullFloat32 - case reflect.Array: - elemType := val.Type().Elem() - if elemType.ConvertibleTo(typeOfNonNullUUID) { - return spannerTypeArrayOfNonNullUUID - } - case reflect.Ptr: - t := val.Type().Elem() - if t.ConvertibleTo(typeOfNullNumeric) { - return spannerTypeArrayOfNullNumeric - } - case reflect.Struct: - t := val.Type().Elem() - if t.ConvertibleTo(typeOfNonNullNumeric) { - return spannerTypeArrayOfNonNullNumeric - } - if t.ConvertibleTo(typeOfNonNullTime) { - return spannerTypeArrayOfNonNullTime - } - if t.ConvertibleTo(typeOfNonNullDate) { - return spannerTypeArrayOfNonNullDate - } - if t.ConvertibleTo(typeOfNullString) { - return spannerTypeArrayOfNullString - } - if t.ConvertibleTo(typeOfNullInt64) { - return spannerTypeArrayOfNullInt64 - } - if t.ConvertibleTo(typeOfNullBool) { - return spannerTypeArrayOfNullBool - } - if t.ConvertibleTo(typeOfNullFloat64) { - return spannerTypeArrayOfNullFloat64 - } - if t.ConvertibleTo(typeOfNullFloat32) { - return spannerTypeArrayOfNullFloat32 - } - if t.ConvertibleTo(typeOfNullTime) { - return spannerTypeArrayOfNullTime - } - if t.ConvertibleTo(typeOfNullDate) { - return spannerTypeArrayOfNullDate - } - if t.ConvertibleTo(typeOfNullNumeric) { - return spannerTypeArrayOfNullNumeric - } - if t.ConvertibleTo(typeOfNullJSON) { - return spannerTypeArrayOfNullJSON - } - if t.ConvertibleTo(typeOfPGNumeric) { - return spannerTypeArrayOfPGNumeric - } - if t.ConvertibleTo(typeOfPGJsonB) { - return spannerTypeArrayOfPGJsonB - } - if t.ConvertibleTo(typeOfNullUUID) { - return spannerTypeArrayOfNullUUID - } - case reflect.Slice: - // The only array-of-array type that is supported is [][]byte. - kind := val.Type().Elem().Elem().Kind() - switch kind { - case reflect.Uint8: - return spannerTypeArrayOfByteArray - } - } - } - - // reflect.TypeOf(v) - // Not convertible to a known base type. - return spannerTypeUnknown -} - -// decodeValueToCustomType decodes a protobuf Value into a pointer to a Go -// value. It must be possible to convert the value to the type pointed to by -// the pointer. -func (dsc decodableSpannerType) decodeValueToCustomType(v *proto3.Value, t *sppb.Type, acode sppb.TypeCode, atypeAnnotation sppb.TypeAnnotationCode, ptr interface{}) error { - code := t.Code - typeAnnotation := t.TypeAnnotation - _, isNull := v.Kind.(*proto3.Value_NullValue) - if dsc == spannerTypeInvalid { - return errNilDst(ptr) - } - if isNull && !dsc.supportsNull() { - return errDstNotForNull(ptr) - } - - var result interface{} - switch dsc { - case spannerTypeNonNullString, spannerTypeNullString: - if code != sppb.TypeCode_STRING { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullString{} - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - if dsc == spannerTypeNonNullString { - result = &x - } else { - result = &NullString{x, !isNull} - } - case spannerTypeByteArray: - if code != sppb.TypeCode_BYTES && code != sppb.TypeCode_PROTO { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = []byte(nil) - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := base64.StdEncoding.DecodeString(x) - if err != nil { - return errBadEncoding(v, err) - } - result = y - case spannerTypeNonNullInt64, spannerTypeNullInt64: - if code != sppb.TypeCode_INT64 && code != sppb.TypeCode_ENUM { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullInt64{} - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := strconv.ParseInt(x, 10, 64) - if err != nil { - return errBadEncoding(v, err) - } - if dsc == spannerTypeNonNullInt64 { - result = &y - } else { - result = &NullInt64{y, !isNull} - } - case spannerTypeNonNullBool, spannerTypeNullBool: - if code != sppb.TypeCode_BOOL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullBool{} - break - } - x, err := getBoolValue(v) - if err != nil { - return err - } - if dsc == spannerTypeNonNullBool { - result = &x - } else { - result = &NullBool{x, !isNull} - } - case spannerTypeNonNullFloat64, spannerTypeNullFloat64: - if code != sppb.TypeCode_FLOAT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullFloat64{} - break - } - x, err := getFloat64Value(v) - if err != nil { - return err - } - if dsc == spannerTypeNonNullFloat64 { - result = &x - } else { - result = &NullFloat64{x, !isNull} - } - case spannerTypeNonNullFloat32, spannerTypeNullFloat32: - if code != sppb.TypeCode_FLOAT32 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullFloat32{} - break - } - x, err := getFloat32Value(v) - if err != nil { - return err - } - if dsc == spannerTypeNonNullFloat32 { - result = &x - } else { - result = &NullFloat32{x, !isNull} - } - case spannerTypeNonNullNumeric, spannerTypeNullNumeric: - if code != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullNumeric{} - break - } - x := v.GetStringValue() - y, ok := (&big.Rat{}).SetString(x) - if !ok { - return errUnexpectedNumericStr(x) - } - if dsc == spannerTypeNonNullNumeric { - result = y - } else { - result = &NullNumeric{*y, true} - } - case spannerTypePGNumeric: - if code != sppb.TypeCode_NUMERIC || typeAnnotation != sppb.TypeAnnotationCode_PG_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &PGNumeric{} - break - } - result = &PGNumeric{v.GetStringValue(), true} - case spannerTypeNullJSON: - if code != sppb.TypeCode_JSON { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullJSON{} - break - } - x := v.GetStringValue() - var y interface{} - err := jsonUnmarshal([]byte(x), &y) - if err != nil { - return err - } - result = &NullJSON{y, true} - case spannerTypePGJsonB: - if code != sppb.TypeCode_JSON || typeAnnotation != sppb.TypeAnnotationCode_PG_JSONB { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &PGJsonB{} - break - } - x := v.GetStringValue() - var y interface{} - err := jsonUnmarshal([]byte(x), &y) - if err != nil { - return err - } - result = &PGJsonB{Value: y, Valid: true} - case spannerTypeNonNullTime, spannerTypeNullTime: - var nt NullTime - err := parseNullTime(v, &nt, code, isNull) - if err != nil { - return err - } - if dsc == spannerTypeNonNullTime { - result = &nt.Time - } else { - result = &nt - } - case spannerTypeNonNullDate, spannerTypeNullDate: - if code != sppb.TypeCode_DATE { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullDate{} - break - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := civil.ParseDate(x) - if err != nil { - return errBadEncoding(v, err) - } - if dsc == spannerTypeNonNullDate { - result = &y - } else { - result = &NullDate{y, !isNull} - } - case spannerTypeNonNullUUID, spannerTypeNullUUID: - if code != sppb.TypeCode_UUID { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - result = &NullUUID{} - break - } - x, err := getUUIDValue(v) - if err != nil { - return err - } - if dsc == spannerTypeNonNullUUID { - result = &x - } else { - result = &NullUUID{x, !isNull} - } - case spannerTypeArrayOfNonNullString, spannerTypeArrayOfNullString: - if acode != sppb.TypeCode_STRING { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, stringType(), "STRING") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfByteArray: - if acode != sppb.TypeCode_BYTES && acode != sppb.TypeCode_PROTO { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, bytesType(), "BYTES") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullInt64, spannerTypeArrayOfNullInt64: - if acode != sppb.TypeCode_INT64 && acode != sppb.TypeCode_ENUM { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, intType(), "INT64") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullBool, spannerTypeArrayOfNullBool: - if acode != sppb.TypeCode_BOOL { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, boolType(), "BOOL") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullFloat32, spannerTypeArrayOfNullFloat32: - if acode != sppb.TypeCode_FLOAT32 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, float32Type(), "FLOAT32") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullFloat64, spannerTypeArrayOfNullFloat64: - if acode != sppb.TypeCode_FLOAT64 { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, floatType(), "FLOAT64") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullNumeric, spannerTypeArrayOfNullNumeric: - if acode != sppb.TypeCode_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, numericType(), "NUMERIC") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfPGNumeric: - if acode != sppb.TypeCode_NUMERIC || atypeAnnotation != sppb.TypeAnnotationCode_PG_NUMERIC { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, pgNumericType(), "PGNUMERIC") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNullJSON: - if acode != sppb.TypeCode_JSON { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, jsonType(), "JSON") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfPGJsonB: - if acode != sppb.TypeCode_JSON || atypeAnnotation != sppb.TypeAnnotationCode_PG_JSONB { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, pgJsonbType(), "PGJSONB") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullTime, spannerTypeArrayOfNullTime: - if acode != sppb.TypeCode_TIMESTAMP { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, timeType(), "TIMESTAMP") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullDate, spannerTypeArrayOfNullDate: - if acode != sppb.TypeCode_DATE { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, dateType(), "DATE") - if err != nil { - return err - } - result = y - case spannerTypeArrayOfNonNullUUID, spannerTypeArrayOfNullUUID: - if acode != sppb.TypeCode_UUID { - return errTypeMismatch(code, acode, ptr) - } - if isNull { - ptr = nil - return nil - } - x, err := getListValue(v) - if err != nil { - return err - } - y, err := decodeGenericArray(reflect.TypeOf(ptr).Elem(), x, uuidType(), "UUID") - if err != nil { - return err - } - result = y - default: - // This should not be possible. - return fmt.Errorf("unknown decodable type found: %v", dsc) - } - source := reflect.Indirect(reflect.ValueOf(result)) - destination := reflect.Indirect(reflect.ValueOf(ptr)) - destination.Set(source.Convert(destination.Type())) - return nil -} - -// errSrvVal returns an error for getting a wrong source protobuf value in decoding. -func errSrcVal(v *proto3.Value, want string) error { - return spannerErrorf(codes.FailedPrecondition, "cannot use %v(Kind: %T) as %s Value", - v, v.GetKind(), want) -} - -// getIntegerFromStringValue returns the integer value of the string value encoded in proto3.Value v -func getIntegerFromStringValue(v *proto3.Value) (int64, error) { - x, err := getStringValue(v) - if err != nil { - return 0, err - } - y, err := strconv.ParseInt(x, 10, 64) - if err != nil { - return 0, errBadEncoding(v, err) - } - return y, nil -} - -// getBytesFromStringValue returns the bytes value of the string value encoded in proto3.Value v -func getBytesFromStringValue(v *proto3.Value) ([]byte, error) { - x, err := getStringValue(v) - if err != nil { - return nil, err - } - y, err := base64.StdEncoding.DecodeString(x) - if err != nil { - return nil, errBadEncoding(v, err) - } - return y, nil -} - -// getStringValue returns the string value encoded in proto3.Value v whose -// kind is proto3.Value_StringValue. -func getStringValue(v *proto3.Value) (string, error) { - if x, ok := v.GetKind().(*proto3.Value_StringValue); ok && x != nil { - return x.StringValue, nil - } - return "", errSrcVal(v, "String") -} - -// getBoolValue returns the bool value encoded in proto3.Value v whose -// kind is proto3.Value_BoolValue. -func getBoolValue(v *proto3.Value) (bool, error) { - if x, ok := v.GetKind().(*proto3.Value_BoolValue); ok && x != nil { - return x.BoolValue, nil - } - return false, errSrcVal(v, "Bool") -} - -// getListValue returns the proto3.ListValue contained in proto3.Value v whose -// kind is proto3.Value_ListValue. -func getListValue(v *proto3.Value) (*proto3.ListValue, error) { - if x, ok := v.GetKind().(*proto3.Value_ListValue); ok && x != nil { - return x.ListValue, nil - } - return nil, errSrcVal(v, "List") -} - -// getGenericValue returns the interface{} value encoded in proto3.Value. -func getGenericValue(t *sppb.Type, v *proto3.Value) (interface{}, error) { - switch x := v.GetKind().(type) { - case *proto3.Value_NumberValue: - return x.NumberValue, nil - case *proto3.Value_BoolValue: - return x.BoolValue, nil - case *proto3.Value_StringValue: - return x.StringValue, nil - case *proto3.Value_ListValue: - return x.ListValue, nil - case *proto3.Value_NullValue: - return getTypedNil(t) - default: - return 0, errSrcVal(v, "Number, Bool, String, List") - } -} - -func getTypedNil(t *sppb.Type) (interface{}, error) { - switch t.Code { - case sppb.TypeCode_FLOAT64: - var f *float64 - return f, nil - case sppb.TypeCode_BOOL: - var b *bool - return b, nil - default: - // The encoding for most types is string, except for the ones listed - // above. - var s *string - return s, nil - } -} - -// errUnexpectedNumericStr returns error for decoder getting an unexpected -// string for representing special numeric values. -func errUnexpectedNumericStr(s string) error { - return spannerErrorf(codes.FailedPrecondition, "unexpected string value %q for numeric number", s) -} - -// errUnexpectedFloat64Str returns error for decoder getting an unexpected -// string for representing special float values. -func errUnexpectedFloat64Str(s string) error { - return spannerErrorf(codes.FailedPrecondition, "unexpected string value %q for float64 number", s) -} - -// getFloat64Value returns the float64 value encoded in proto3.Value v whose -// kind is proto3.Value_NumberValue / proto3.Value_StringValue. -// Cloud Spanner uses string to encode NaN, Infinity and -Infinity. -func getFloat64Value(v *proto3.Value) (float64, error) { - switch x := v.GetKind().(type) { - case *proto3.Value_NumberValue: - if x == nil { - break - } - return x.NumberValue, nil - case *proto3.Value_StringValue: - if x == nil { - break - } - switch x.StringValue { - case "NaN": - return math.NaN(), nil - case "Infinity": - return math.Inf(1), nil - case "-Infinity": - return math.Inf(-1), nil - default: - return 0, errUnexpectedFloat64Str(x.StringValue) - } - } - return 0, errSrcVal(v, "Number") -} - -// errUnexpectedFloat32Str returns error for decoder getting an unexpected -// string for representing special float values. -func errUnexpectedFloat32Str(s string) error { - return spannerErrorf(codes.FailedPrecondition, "unexpected string value %q for float32 number", s) -} - -// getFloat32Value returns the float32 value encoded in proto3.Value v whose -// kind is proto3.Value_NumberValue / proto3.Value_StringValue. -// Cloud Spanner uses string to encode NaN, Infinity and -Infinity. -func getFloat32Value(v *proto3.Value) (float32, error) { - switch x := v.GetKind().(type) { - case *proto3.Value_NumberValue: - if x == nil { - break - } - return float32(x.NumberValue), nil - case *proto3.Value_StringValue: - if x == nil { - break - } - switch x.StringValue { - case "NaN": - return float32(math.NaN()), nil - case "Infinity": - return float32(math.Inf(1)), nil - case "-Infinity": - return float32(math.Inf(-1)), nil - default: - return 0, errUnexpectedFloat32Str(x.StringValue) - } - } - return 0, errSrcVal(v, "Number") -} - -// getUUIDValue returns the uuid value encoded in proto3.Value v whose -// kind is proto3.Value_StringValue. -func getUUIDValue(v *proto3.Value) (uuid.UUID, error) { - x, err := getStringValue(v) - if err != nil { - return uuid.UUID{}, err - } - u, err := uuid.Parse(x) - if err != nil { - return uuid.UUID{}, errBadEncoding(v, err) - } - return u, nil -} - -// errNilListValue returns error for unexpected nil ListValue in decoding Cloud Spanner ARRAYs. -func errNilListValue(sqlType string) error { - return spannerErrorf(codes.FailedPrecondition, "unexpected nil ListValue in decoding %v array", sqlType) -} - -// errDecodeArrayElement returns error for failure in decoding single array element. -func errDecodeArrayElement(i int, v proto.Message, sqlType string, err error) error { - var se *Error - if !errors.As(err, &se) { - return spannerErrorf(codes.Unknown, - "cannot decode %v(array element %v) as %v, error = <%v>", v, i, sqlType, err) - } - se.decorate(fmt.Sprintf("cannot decode %v(array element %v) as %v", v, i, sqlType)) - return se -} - -// decodeGenericArray decodes proto3.ListValue pb into a slice which type is -// determined through reflection. -func decodeGenericArray(tp reflect.Type, pb *proto3.ListValue, t *sppb.Type, sqlType string) (interface{}, error) { - if pb == nil { - return nil, errNilListValue(sqlType) - } - a := reflect.MakeSlice(tp, len(pb.Values), len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, t, a.Index(i).Addr().Interface()); err != nil { - return nil, errDecodeArrayElement(i, v, "STRING", err) - } - } - return a.Interface(), nil -} - -// decodeNullStringArray decodes proto3.ListValue pb into a NullString slice. -func decodeNullStringArray(pb *proto3.ListValue) ([]NullString, error) { - if pb == nil { - return nil, errNilListValue("STRING") - } - a := make([]NullString, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, stringType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "STRING", err) - } - } - return a, nil -} - -// decodeStringPointerArray decodes proto3.ListValue pb into a *string slice. -func decodeStringPointerArray(pb *proto3.ListValue) ([]*string, error) { - if pb == nil { - return nil, errNilListValue("STRING") - } - a := make([]*string, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, stringType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "STRING", err) - } - } - return a, nil -} - -// decodeStringArray decodes proto3.ListValue pb into a string slice. -func decodeStringArray(pb *proto3.ListValue) ([]string, error) { - if pb == nil { - return nil, errNilListValue("STRING") - } - a := make([]string, len(pb.Values)) - st := stringType() - for i, v := range pb.Values { - if err := decodeValue(v, st, &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "STRING", err) - } - } - return a, nil -} - -// decodeNullInt64Array decodes proto3.ListValue pb into a NullInt64 slice. -func decodeNullInt64Array(pb *proto3.ListValue) ([]NullInt64, error) { - if pb == nil { - return nil, errNilListValue("INT64") - } - a := make([]NullInt64, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, intType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "INT64", err) - } - } - return a, nil -} - -// decodeInt64PointerArray decodes proto3.ListValue pb into a *int64 slice. -func decodeInt64PointerArray(pb *proto3.ListValue) ([]*int64, error) { - if pb == nil { - return nil, errNilListValue("INT64") - } - a := make([]*int64, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, intType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "INT64", err) - } - } - return a, nil -} - -// decodeInt64Array decodes proto3.ListValue pb into a int64 slice. -func decodeInt64Array(pb *proto3.ListValue) ([]int64, error) { - if pb == nil { - return nil, errNilListValue("INT64") - } - a := make([]int64, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, intType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "INT64", err) - } - } - return a, nil -} - -// decodeNullBoolArray decodes proto3.ListValue pb into a NullBool slice. -func decodeNullBoolArray(pb *proto3.ListValue) ([]NullBool, error) { - if pb == nil { - return nil, errNilListValue("BOOL") - } - a := make([]NullBool, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, boolType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "BOOL", err) - } - } - return a, nil -} - -// decodeBoolPointerArray decodes proto3.ListValue pb into a *bool slice. -func decodeBoolPointerArray(pb *proto3.ListValue) ([]*bool, error) { - if pb == nil { - return nil, errNilListValue("BOOL") - } - a := make([]*bool, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, boolType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "BOOL", err) - } - } - return a, nil -} - -// decodeBoolArray decodes proto3.ListValue pb into a bool slice. -func decodeBoolArray(pb *proto3.ListValue) ([]bool, error) { - if pb == nil { - return nil, errNilListValue("BOOL") - } - a := make([]bool, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, boolType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "BOOL", err) - } - } - return a, nil -} - -// decodeNullFloat64Array decodes proto3.ListValue pb into a NullFloat64 slice. -func decodeNullFloat64Array(pb *proto3.ListValue) ([]NullFloat64, error) { - if pb == nil { - return nil, errNilListValue("FLOAT64") - } - a := make([]NullFloat64, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, floatType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "FLOAT64", err) - } - } - return a, nil -} - -// decodeFloat64PointerArray decodes proto3.ListValue pb into a *float slice. -func decodeFloat64PointerArray(pb *proto3.ListValue) ([]*float64, error) { - if pb == nil { - return nil, errNilListValue("FLOAT64") - } - a := make([]*float64, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, floatType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "FLOAT64", err) - } - } - return a, nil -} - -// decodeFloat64Array decodes proto3.ListValue pb into a float64 slice. -func decodeFloat64Array(pb *proto3.ListValue) ([]float64, error) { - if pb == nil { - return nil, errNilListValue("FLOAT64") - } - a := make([]float64, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, floatType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "FLOAT64", err) - } - } - return a, nil -} - -// decodeNullFloat32Array decodes proto3.ListValue pb into a NullFloat32 slice. -func decodeNullFloat32Array(pb *proto3.ListValue) ([]NullFloat32, error) { - if pb == nil { - return nil, errNilListValue("FLOAT32") - } - a := make([]NullFloat32, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, float32Type(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "FLOAT32", err) - } - } - return a, nil -} - -// decodeFloat32PointerArray decodes proto3.ListValue pb into a *float32 slice. -func decodeFloat32PointerArray(pb *proto3.ListValue) ([]*float32, error) { - if pb == nil { - return nil, errNilListValue("FLOAT32") - } - a := make([]*float32, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, float32Type(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "FLOAT32", err) - } - } - return a, nil -} - -// decodeFloat32Array decodes proto3.ListValue pb into a float32 slice. -func decodeFloat32Array(pb *proto3.ListValue) ([]float32, error) { - if pb == nil { - return nil, errNilListValue("FLOAT32") - } - a := make([]float32, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, float32Type(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "FLOAT32", err) - } - } - return a, nil -} - -// decodeNullNumericArray decodes proto3.ListValue pb into a NullNumeric slice. -func decodeNullNumericArray(pb *proto3.ListValue) ([]NullNumeric, error) { - if pb == nil { - return nil, errNilListValue("NUMERIC") - } - a := make([]NullNumeric, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, numericType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "NUMERIC", err) - } - } - return a, nil -} - -// decodeNullJSONArray decodes proto3.ListValue pb into a NullJSON slice. -func decodeNullJSONArray(pb *proto3.ListValue) ([]NullJSON, error) { - if pb == nil { - return nil, errNilListValue("JSON") - } - a := make([]NullJSON, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, jsonType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "JSON", err) - } - } - return a, nil -} - -// decodeJsonBArray decodes proto3.ListValue pb into a JsonB slice. -func decodePGJsonBArray(pb *proto3.ListValue) ([]PGJsonB, error) { - if pb == nil { - return nil, errNilListValue("PGJSONB") - } - a := make([]PGJsonB, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, pgJsonbType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "PGJSONB", err) - } - } - return a, nil -} - -// decodeNullJSONArray decodes proto3.ListValue pb into a NullJSON pointer. -func decodeNullJSONArrayToNullJSON(pb *proto3.ListValue) (*NullJSON, error) { - if pb == nil { - return nil, errNilListValue("JSON") - } - strs := []string{} - for _, v := range pb.Values { - if _, ok := v.Kind.(*proto3.Value_NullValue); ok { - strs = append(strs, "null") - } else { - strs = append(strs, v.GetStringValue()) - } - } - s := fmt.Sprintf("[%s]", strings.Join(strs, ",")) - var y interface{} - err := jsonUnmarshal([]byte(s), &y) - if err != nil { - return nil, err - } - return &NullJSON{y, true}, nil -} - -// decodeNumericPointerArray decodes proto3.ListValue pb into a *big.Rat slice. -func decodeNumericPointerArray(pb *proto3.ListValue) ([]*big.Rat, error) { - if pb == nil { - return nil, errNilListValue("NUMERIC") - } - a := make([]*big.Rat, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, numericType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "NUMERIC", err) - } - } - return a, nil -} - -// decodeNumericArray decodes proto3.ListValue pb into a big.Rat slice. -func decodeNumericArray(pb *proto3.ListValue) ([]big.Rat, error) { - if pb == nil { - return nil, errNilListValue("NUMERIC") - } - a := make([]big.Rat, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, numericType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "NUMERIC", err) - } - } - return a, nil -} - -// decodePGNumericArray decodes proto3.ListValue pb into a PGNumeric slice. -func decodePGNumericArray(pb *proto3.ListValue) ([]PGNumeric, error) { - if pb == nil { - return nil, errNilListValue("PGNUMERIC") - } - a := make([]PGNumeric, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, pgNumericType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "PGNUMERIC", err) - } - } - return a, nil -} - -// decodeByteArray decodes proto3.ListValue pb into a slice of byte slice. -func decodeByteArray(pb *proto3.ListValue) ([][]byte, error) { - if pb == nil { - return nil, errNilListValue("BYTES") - } - a := make([][]byte, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, bytesType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "BYTES", err) - } - } - return a, nil -} - -// decodeProtoMessagePtrArray decodes proto3.ListValue pb into a *proto.Message slice. -// The elements in the array implements proto.Message interface only if the element is a pointer (e.g. *ProtoMessage). -// However, if the element is a value (e.g. ProtoMessage), then it does not implement proto.Message. -// Therefore, decodeProtoMessagePtrArray allows decoding of proto message array if the array element is a pointer only. -func decodeProtoMessagePtrArray(pb *proto3.ListValue, t *sppb.Type, rv reflect.Value) error { - if pb == nil { - return errNilListValue("PROTO") - } - etyp := rv.Type().Elem().Elem().Elem() - a := reflect.MakeSlice(rv.Type().Elem(), len(pb.Values), len(pb.Values)) - for i, v := range pb.Values { - _, isNull := v.Kind.(*proto3.Value_NullValue) - if isNull { - continue - } - msg := reflect.New(etyp).Interface().(proto.Message) - if err := decodeValue(v, t, msg); err != nil { - return errDecodeArrayElement(i, v, "PROTO", err) - } - a.Index(i).Set(reflect.ValueOf(msg)) - } - rv.Elem().Set(a) - return nil -} - -// decodeProtoEnumPtrArray decodes proto3.ListValue pb into a *protoreflect.Enum slice. -func decodeProtoEnumPtrArray(pb *proto3.ListValue, t *sppb.Type, rv reflect.Value) error { - if pb == nil { - return errNilListValue("ENUM") - } - etyp := rv.Type().Elem().Elem().Elem() - a := reflect.MakeSlice(rv.Type().Elem(), len(pb.Values), len(pb.Values)) - for i, v := range pb.Values { - _, isNull := v.Kind.(*proto3.Value_NullValue) - if isNull { - continue - } - enum := reflect.New(etyp).Interface().(protoreflect.Enum) - if err := decodeValue(v, t, enum); err != nil { - return errDecodeArrayElement(i, v, "ENUM", err) - } - a.Index(i).Set(reflect.ValueOf(enum)) - } - rv.Elem().Set(a) - return nil -} - -// decodeProtoEnumArray decodes proto3.ListValue pb into a protoreflect.Enum slice. -func decodeProtoEnumArray(pb *proto3.ListValue, t *sppb.Type, rv reflect.Value, ptr interface{}) error { - if pb == nil { - return errNilListValue("ENUM") - } - a := reflect.MakeSlice(rv.Type().Elem(), len(pb.Values), len(pb.Values)) - // decodeValue method can decode only if ENUM is a pointer type. - // As the ENUM element in the Array is not a pointer type we cannot use decodeValue method - // and hence handle it separately. - for i, v := range pb.Values { - _, isNull := v.Kind.(*proto3.Value_NullValue) - // As the ENUM elements in the array are value type and not pointer type, - // we cannot support NULL values in the array - if isNull { - return errNilNotAllowed(ptr, "*[]*protoreflect.Enum") - } - x, err := getStringValue(v) - if err != nil { - return err - } - y, err := strconv.ParseInt(x, 10, 64) - if err != nil { - return errBadEncoding(v, err) - } - a.Index(i).SetInt(y) - } - rv.Elem().Set(a) - return nil -} - -// decodeNullTimeArray decodes proto3.ListValue pb into a NullTime slice. -func decodeNullTimeArray(pb *proto3.ListValue) ([]NullTime, error) { - if pb == nil { - return nil, errNilListValue("TIMESTAMP") - } - a := make([]NullTime, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, timeType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "TIMESTAMP", err) - } - } - return a, nil -} - -// decodeTimePointerArray decodes proto3.ListValue pb into a NullTime slice. -func decodeTimePointerArray(pb *proto3.ListValue) ([]*time.Time, error) { - if pb == nil { - return nil, errNilListValue("TIMESTAMP") - } - a := make([]*time.Time, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, timeType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "TIMESTAMP", err) - } - } - return a, nil -} - -// decodeTimeArray decodes proto3.ListValue pb into a time.Time slice. -func decodeTimeArray(pb *proto3.ListValue) ([]time.Time, error) { - if pb == nil { - return nil, errNilListValue("TIMESTAMP") - } - a := make([]time.Time, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, timeType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "TIMESTAMP", err) - } - } - return a, nil -} - -// decodeNullDateArray decodes proto3.ListValue pb into a NullDate slice. -func decodeNullDateArray(pb *proto3.ListValue) ([]NullDate, error) { - if pb == nil { - return nil, errNilListValue("DATE") - } - a := make([]NullDate, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, dateType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "DATE", err) - } - } - return a, nil -} - -// decodeDatePointerArray decodes proto3.ListValue pb into a *civil.Date slice. -func decodeDatePointerArray(pb *proto3.ListValue) ([]*civil.Date, error) { - if pb == nil { - return nil, errNilListValue("DATE") - } - a := make([]*civil.Date, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, dateType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "DATE", err) - } - } - return a, nil -} - -// decodeDateArray decodes proto3.ListValue pb into a civil.Date slice. -func decodeDateArray(pb *proto3.ListValue) ([]civil.Date, error) { - if pb == nil { - return nil, errNilListValue("DATE") - } - a := make([]civil.Date, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, dateType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "DATE", err) - } - } - return a, nil -} - -// decodeNullUUIDArray decodes proto3.ListValue pb into a NullUUID slice. -func decodeNullUUIDArray(pb *proto3.ListValue) ([]NullUUID, error) { - if pb == nil { - return nil, errNilListValue("UUID") - } - a := make([]NullUUID, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, uuidType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "UUID", err) - } - } - return a, nil -} - -// decodeUUIDPointerArray decodes proto3.ListValue pb into a *uuid.UUID slice. -func decodeUUIDPointerArray(pb *proto3.ListValue) ([]*uuid.UUID, error) { - if pb == nil { - return nil, errNilListValue("UUID") - } - a := make([]*uuid.UUID, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, uuidType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "UUID", err) - } - } - return a, nil -} - -// decodeUUIDArray decodes proto3.ListValue pb into a uuid.UUID slice. -func decodeUUIDArray(pb *proto3.ListValue) ([]uuid.UUID, error) { - if pb == nil { - return nil, errNilListValue("UUID") - } - a := make([]uuid.UUID, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, uuidType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "UUID", err) - } - } - return a, nil -} - -func errNotStructElement(i int, v *proto3.Value) error { - return errDecodeArrayElement(i, v, "STRUCT", - spannerErrorf(codes.FailedPrecondition, "%v(type: %T) doesn't encode Cloud Spanner STRUCT", v, v)) -} - -// decodeRowArray decodes proto3.ListValue pb into a NullRow slice according to -// the structural information given in sppb.StructType ty. -func decodeRowArray(ty *sppb.StructType, pb *proto3.ListValue) ([]NullRow, error) { - if pb == nil { - return nil, errNilListValue("STRUCT") - } - a := make([]NullRow, len(pb.Values)) - for i := range pb.Values { - switch v := pb.Values[i].GetKind().(type) { - case *proto3.Value_ListValue: - a[i] = NullRow{ - Row: Row{ - fields: ty.Fields, - vals: v.ListValue.Values, - }, - Valid: true, - } - // Null elements not currently supported by the server, see - // https://cloud.google.com/spanner/docs/query-syntax#using-structs-with-select - case *proto3.Value_NullValue: - // no-op, a[i] is NullRow{} already - default: - return nil, errNotStructElement(i, pb.Values[i]) - } - } - return a, nil -} - -// errNilSpannerStructType returns error for unexpected nil Cloud Spanner STRUCT -// schema type in decoding. -func errNilSpannerStructType() error { - return spannerErrorf(codes.FailedPrecondition, "unexpected nil StructType in decoding Cloud Spanner STRUCT") -} - -// errDupGoField returns error for duplicated Go STRUCT field names -func errDupGoField(s interface{}, name string) error { - return spannerErrorf(codes.InvalidArgument, "Go struct %+v(type %T) has duplicate fields for GO STRUCT field %s", s, s, name) -} - -// errUnnamedField returns error for decoding a Cloud Spanner STRUCT with -// unnamed field into a Go struct. -func errUnnamedField(ty *sppb.StructType, i int) error { - return spannerErrorf(codes.InvalidArgument, "unnamed field %v in Cloud Spanner STRUCT %+v", i, ty) -} - -// errNoOrDupGoField returns error for decoding a Cloud Spanner -// STRUCT into a Go struct which is either missing a field, or has duplicate -// fields. -func errNoOrDupGoField(s interface{}, f string) error { - return spannerErrorf(codes.InvalidArgument, "Go struct %+v(type %T) has no or duplicate fields for Cloud Spanner STRUCT field %v", s, s, f) -} - -// errDupColNames returns error for duplicated Cloud Spanner STRUCT field names -// found in decoding a Cloud Spanner STRUCT into a Go struct. -func errDupSpannerField(f string, ty *sppb.StructType) error { - return spannerErrorf(codes.InvalidArgument, "duplicated field name %q in Cloud Spanner STRUCT %+v", f, ty) -} - -// errDecodeStructField returns error for failure in decoding a single field of -// a Cloud Spanner STRUCT. -func errDecodeStructField(ty *sppb.StructType, f string, err error) error { - var se *Error - if !errors.As(err, &se) { - return spannerErrorf(codes.Unknown, - "cannot decode field %v of Cloud Spanner STRUCT %+v, error = <%v>", f, ty, err) - } - se.decorate(fmt.Sprintf("cannot decode field %v of Cloud Spanner STRUCT %+v", f, ty)) - return se -} - -// decodeSetting contains all the settings for decoding from spanner struct -type decodeSetting struct { - Lenient bool -} - -// DecodeOptions is the interface to change decode struct settings -type DecodeOptions interface { - Apply(s *decodeSetting) -} - -type withLenient struct{ lenient bool } - -func (w withLenient) Apply(s *decodeSetting) { - s.Lenient = w.lenient -} - -// WithLenient returns a DecodeOptions that allows decoding into a struct with missing fields in database. -func WithLenient() DecodeOptions { - return withLenient{lenient: true} -} - -// decodeStruct decodes proto3.ListValue pb into struct referenced by pointer -// ptr, according to -// the structural information given in sppb.StructType ty. -func decodeStruct(ty *sppb.StructType, pb *proto3.ListValue, ptr interface{}, lenient bool) error { - if reflect.ValueOf(ptr).IsNil() { - return errNilDst(ptr) - } - if ty == nil { - return errNilSpannerStructType() - } - // t holds the structural information of ptr. - t := reflect.TypeOf(ptr).Elem() - // v is the actual value that ptr points to. - v := reflect.ValueOf(ptr).Elem() - - fields, err := fieldCache.Fields(t) - if err != nil { - return ToSpannerError(err) - } - // return error if lenient is true and destination has duplicate exported columns - if lenient { - fieldNames := getAllFieldNames(v) - for _, f := range fieldNames { - if fields.Match(f) == nil { - return errDupGoField(ptr, f) - } - } - } - seen := map[string]bool{} - for i, f := range ty.Fields { - if f.Name == "" { - return errUnnamedField(ty, i) - } - sf := fields.Match(f.Name) - if sf == nil { - if lenient { - continue - } - return errNoOrDupGoField(ptr, f.Name) - } - if seen[f.Name] { - // We don't allow duplicated field name. - return errDupSpannerField(f.Name, ty) - } - opts := []DecodeOptions{withLenient{lenient: lenient}} - // Try to decode a single field. - if err := decodeValue(pb.Values[i], f.Type, v.FieldByIndex(sf.Index).Addr().Interface(), opts...); err != nil { - return errDecodeStructField(ty, f.Name, err) - } - // Mark field f.Name as processed. - seen[f.Name] = true - } - return nil -} - -// isPtrStructPtrSlice returns true if ptr is a pointer to a slice of struct pointers. -func isPtrStructPtrSlice(t reflect.Type) bool { - if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Slice { - // t is not a pointer to a slice. - return false - } - if t = t.Elem(); t.Elem().Kind() != reflect.Ptr || t.Elem().Elem().Kind() != reflect.Struct { - // the slice that t points to is not a slice of struct pointers. - return false - } - return true -} - -// decodeStructArray decodes proto3.ListValue pb into struct slice referenced by -// pointer ptr, according to the -// structural information given in a sppb.StructType. -func decodeStructArray(ty *sppb.StructType, pb *proto3.ListValue, ptr interface{}, lenient bool) error { - if pb == nil { - return errNilListValue("STRUCT") - } - // Type of the struct pointers stored in the slice that ptr points to. - ts := reflect.TypeOf(ptr).Elem().Elem() - // The slice that ptr points to, might be nil at this point. - v := reflect.ValueOf(ptr).Elem() - // Allocate empty slice. - v.Set(reflect.MakeSlice(v.Type(), 0, len(pb.Values))) - // Decode every struct in pb.Values. - for i, pv := range pb.Values { - // Check if pv is a NULL value. - if _, isNull := pv.Kind.(*proto3.Value_NullValue); isNull { - // Append a nil pointer to the slice. - v.Set(reflect.Append(v, reflect.New(ts).Elem())) - continue - } - // Allocate empty struct. - s := reflect.New(ts.Elem()) - // Get proto3.ListValue l from proto3.Value pv. - l, err := getListValue(pv) - if err != nil { - return errDecodeArrayElement(i, pv, "STRUCT", err) - } - // Decode proto3.ListValue l into struct referenced by s.Interface(). - if err = decodeStruct(ty, l, s.Interface(), lenient); err != nil { - return errDecodeArrayElement(i, pv, "STRUCT", err) - } - // Append the decoded struct back into the slice. - v.Set(reflect.Append(v, s)) - } - return nil -} - -func getAllFieldNames(v reflect.Value) []string { - var names []string - typeOfT := v.Type() - for i := 0; i < v.NumField(); i++ { - f := v.Field(i) - fieldType := typeOfT.Field(i) - exported := (fieldType.PkgPath == "") - // If a named field is unexported, ignore it. An anonymous - // unexported field is processed, because it may contain - // exported fields, which are visible. - if !exported && !fieldType.Anonymous { - continue - } - if f.Kind() == reflect.Struct { - if fieldType.Anonymous { - names = append(names, getAllFieldNames(reflect.ValueOf(f.Interface()))...) - } - continue - } - name, keep, _, _ := spannerTagParser(fieldType.Tag) - if !keep { - continue - } - if name == "" { - name = fieldType.Name - } - names = append(names, name) - } - return names -} - -// errEncoderUnsupportedType returns error for not being able to encode a value -// of certain type. -func errEncoderUnsupportedType(v interface{}) error { - return spannerErrorf(codes.InvalidArgument, "client doesn't support type %T", v) -} - -// encodeValue encodes a Go native type into a proto3.Value. -func encodeValue(v interface{}) (*proto3.Value, *sppb.Type, error) { - pb := &proto3.Value{ - Kind: &proto3.Value_NullValue{NullValue: proto3.NullValue_NULL_VALUE}, - } - var pt *sppb.Type - var err error - switch v := v.(type) { - case nil: - case Interval: - pb.Kind = stringKind(v.String()) - pt = &sppb.Type{Code: sppb.TypeCode_INTERVAL} - case []Interval: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(&sppb.Type{Code: sppb.TypeCode_INTERVAL}) - case NullInterval: - if !v.Valid { - pt = &sppb.Type{Code: sppb.TypeCode_INTERVAL} - break - } - return encodeValue(v.Interval) - case []NullInterval: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(intervalType()) - case string: - pb.Kind = stringKind(v) - pt = stringType() - case NullString: - if v.Valid { - return encodeValue(v.StringVal) - } - pt = stringType() - case sql.NullString: - if v.Valid { - return encodeValue(v.String) - } - pt = stringType() - case []string: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(stringType()) - case []NullString: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(stringType()) - case *string: - if v != nil { - return encodeValue(*v) - } - pt = stringType() - case []*string: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(stringType()) - case []byte: - if v != nil { - pb.Kind = stringKind(base64.StdEncoding.EncodeToString(v)) - } - pt = bytesType() - case [][]byte: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(bytesType()) - case int: - pb.Kind = stringKind(strconv.FormatInt(int64(v), 10)) - pt = intType() - case []int: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(intType()) - case int64: - pb.Kind = stringKind(strconv.FormatInt(v, 10)) - pt = intType() - case []int64: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(intType()) - case NullInt64: - if v.Valid { - return encodeValue(v.Int64) - } - pt = intType() - case []NullInt64: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(intType()) - case *int64: - if v != nil { - return encodeValue(*v) - } - pt = intType() - case []*int64: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(intType()) - case bool: - pb.Kind = &proto3.Value_BoolValue{BoolValue: v} - pt = boolType() - case []bool: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(boolType()) - case NullBool: - if v.Valid { - return encodeValue(v.Bool) - } - pt = boolType() - case []NullBool: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(boolType()) - case *bool: - if v != nil { - return encodeValue(*v) - } - pt = boolType() - case []*bool: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(boolType()) - case float64: - pb.Kind = &proto3.Value_NumberValue{NumberValue: v} - pt = floatType() - case []float64: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(floatType()) - case NullFloat64: - if v.Valid { - return encodeValue(v.Float64) - } - pt = floatType() - case []NullFloat64: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(floatType()) - case *float64: - if v != nil { - return encodeValue(*v) - } - pt = floatType() - case []*float64: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(floatType()) - case float32: - pb.Kind = &proto3.Value_NumberValue{NumberValue: float64(v)} - pt = float32Type() - case []float32: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(float32Type()) - case NullFloat32: - if v.Valid { - return encodeValue(v.Float32) - } - pt = float32Type() - case []NullFloat32: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(float32Type()) - case *float32: - if v != nil { - return encodeValue(*v) - } - pt = float32Type() - case []*float32: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(float32Type()) - case big.Rat: - switch LossOfPrecisionHandling { - case NumericError: - err = validateNumeric(&v) - if err != nil { - return nil, nil, err - } - case NumericRound: - // pass - } - pb.Kind = stringKind(NumericString(&v)) - pt = numericType() - case []big.Rat: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(numericType()) - case NullNumeric: - if v.Valid { - return encodeValue(v.Numeric) - } - pt = numericType() - case []NullNumeric: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(numericType()) - case PGNumeric: - if v.Valid { - pb.Kind = stringKind(v.Numeric) - } - return pb, pgNumericType(), nil - case []PGNumeric: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(pgNumericType()) - case NullJSON: - if v.Valid { - b, err := json.Marshal(v.Value) - if err != nil { - return nil, nil, err - } - pb.Kind = stringKind(string(b)) - } - return pb, jsonType(), nil - case []NullJSON: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(jsonType()) - case PGJsonB: - if v.Valid { - b, err := json.Marshal(v.Value) - if err != nil { - return nil, nil, err - } - pb.Kind = stringKind(string(b)) - } - return pb, pgJsonbType(), nil - case []PGJsonB: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(pgJsonbType()) - case *big.Rat: - switch LossOfPrecisionHandling { - case NumericError: - err = validateNumeric(v) - if err != nil { - return nil, nil, err - } - case NumericRound: - // pass - } - if v != nil { - pb.Kind = stringKind(NumericString(v)) - } - pt = numericType() - case []*big.Rat: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(numericType()) - case time.Time: - if v == commitTimestamp { - pb.Kind = stringKind(commitTimestampPlaceholderString) - } else { - pb.Kind = stringKind(v.UTC().Format(time.RFC3339Nano)) - } - pt = timeType() - case []time.Time: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(timeType()) - case NullTime: - if v.Valid { - return encodeValue(v.Time) - } - pt = timeType() - case []NullTime: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(timeType()) - case *time.Time: - if v != nil { - return encodeValue(*v) - } - pt = timeType() - case []*time.Time: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(timeType()) - case civil.Date: - pb.Kind = stringKind(v.String()) - pt = dateType() - case []civil.Date: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(dateType()) - case NullDate: - if v.Valid { - return encodeValue(v.Date) - } - pt = dateType() - case []NullDate: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(dateType()) - case *civil.Date: - if v != nil { - return encodeValue(*v) - } - pt = dateType() - case []*civil.Date: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(dateType()) - case uuid.UUID: - pb.Kind = stringKind(v.String()) - pt = uuidType() - case []uuid.UUID: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(uuidType()) - case []*uuid.UUID: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(uuidType()) - case NullUUID: - if v.Valid { - return encodeValue(v.UUID) - } - pt = uuidType() - case []NullUUID: - if v != nil { - pb, err = encodeArray(len(v), func(i int) interface{} { return v[i] }) - if err != nil { - return nil, nil, err - } - } - pt = listType(uuidType()) - case uuid.NullUUID: - nullUUID := NullUUID{UUID: v.UUID, Valid: v.Valid} - return encodeValue(nullUUID) - case *uuid.UUID: - if v != nil { - return encodeValue(*v) - } - pt = uuidType() - case *NullUUID: - if v != nil { - return encodeValue(*v) - } - pt = uuidType() - case *uuid.NullUUID: - if v != nil { - return encodeValue(*v) - } - pt = uuidType() - case GenericColumnValue: - // Deep clone to ensure subsequent changes to v before - // transmission don't affect our encoded value. - pb = proto.Clone(v.Value).(*proto3.Value) - pt = proto.Clone(v.Type).(*sppb.Type) - case []GenericColumnValue: - return nil, nil, errEncoderUnsupportedType(v) - case protoreflect.Enum: - // Check if the value is of protoreflect.Enum type that implements spanner.Encoder - // interface. - if encodedVal, ok := v.(Encoder); ok { - nv, err := encodedVal.EncodeSpanner() - if err != nil { - return nil, nil, err - } - return encodeValue(nv) - } - - if v != nil { - var protoEnumfqn string - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr || !rv.IsNil() { - pb.Kind = stringKind(strconv.FormatInt(int64(v.Number()), 10)) - protoEnumfqn = string(v.Descriptor().FullName()) - } else { - defaultType := reflect.Zero(rv.Type().Elem()).Interface().(protoreflect.Enum) - protoEnumfqn = string(defaultType.Descriptor().FullName()) - } - pt = protoEnumType(protoEnumfqn) - } - case NullProtoEnum: - if v.Valid { - return encodeValue(v.ProtoEnumVal) - } - return nil, nil, errNotValidSrc(v) - case proto.Message: - // Check if the value is of proto.Message type that implements spanner.Encoder - // interface. - if encodedVal, ok := v.(Encoder); ok { - nv, err := encodedVal.EncodeSpanner() - if err != nil { - return nil, nil, err - } - return encodeValue(nv) - } - - if v != nil { - if v.ProtoReflect().IsValid() { - bytes, err := proto.Marshal(v) - if err != nil { - return nil, nil, err - } - pb.Kind = stringKind(base64.StdEncoding.EncodeToString(bytes)) - } - protoMessagefqn := string(v.ProtoReflect().Descriptor().FullName()) - pt = protoMessageType(protoMessagefqn) - } - case NullProtoMessage: - if v.Valid { - return encodeValue(v.ProtoMessageVal) - } - return nil, nil, errNotValidSrc(v) - default: - // Check if the value is a custom type that implements spanner.Encoder - // interface. - if encodedVal, ok := v.(Encoder); ok { - nv, err := encodedVal.EncodeSpanner() - if err != nil { - return nil, nil, err - } - return encodeValue(nv) - } - - // Check if the value is a variant of a base type. - decodableType := getDecodableSpannerType(v, false) - if decodableType != spannerTypeUnknown && decodableType != spannerTypeInvalid { - converted, err := convertCustomTypeValue(decodableType, v) - if err != nil { - return nil, nil, err - } - return encodeValue(converted) - } - - if !isStructOrArrayOfStructValue(v) && !isAnArrayOfProtoColumn(v) { - return nil, nil, errEncoderUnsupportedType(v) - } - typ := reflect.TypeOf(v) - - // Value is a Go struct value/ptr. - if (typ.Kind() == reflect.Struct) || - (typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct) { - return encodeStruct(v) - } - - // Value is a slice of Go struct values/ptrs. - if typ.Kind() == reflect.Slice { - if isAnArrayOfProtoColumn(v) { - return encodeProtoArray(v) - } - return encodeStructArray(v) - } - } - return pb, pt, nil -} - -func convertCustomTypeValue(sourceType decodableSpannerType, v interface{}) (interface{}, error) { - // destination will be initialized to a base type. The input value will be - // converted to this type and copied to destination. - var destination reflect.Value - switch sourceType { - case spannerTypeInvalid: - return nil, errors.New("cannot encode a value to type spannerTypeInvalid") - case spannerTypeNonNullString: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(""))) - case spannerTypeNullString: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullString{}))) - case spannerTypeByteArray: - // Return a nil array directly if the input value is nil instead of - // creating an empty slice and returning that. - if reflect.ValueOf(v).IsNil() { - return []byte(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]byte{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeNonNullInt64: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(int64(0)))) - case spannerTypeNullInt64: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullInt64{}))) - case spannerTypeNonNullBool: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(false))) - case spannerTypeNullBool: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullBool{}))) - case spannerTypeNonNullFloat64: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(float64(0.0)))) - case spannerTypeNullFloat64: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullFloat64{}))) - case spannerTypeNonNullFloat32: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(float32(0.0)))) - case spannerTypeNullFloat32: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullFloat32{}))) - case spannerTypeNonNullTime: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(time.Time{}))) - case spannerTypeNullTime: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullTime{}))) - case spannerTypeNonNullDate: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(civil.Date{}))) - case spannerTypeNullDate: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullDate{}))) - case spannerTypeNonNullNumeric: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(big.Rat{}))) - case spannerTypeNullNumeric: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullNumeric{}))) - case spannerTypeNullJSON: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullJSON{}))) - case spannerTypePGJsonB: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(PGJsonB{}))) - case spannerTypePGNumeric: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(PGNumeric{}))) - case spannerTypeNonNullUUID: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(uuid.UUID{}))) - case spannerTypeNullUUID: - destination = reflect.Indirect(reflect.New(reflect.TypeOf(NullUUID{}))) - case spannerTypeArrayOfNonNullString: - if reflect.ValueOf(v).IsNil() { - return []string(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]string{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullString: - if reflect.ValueOf(v).IsNil() { - return []NullString(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullString{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfByteArray: - if reflect.ValueOf(v).IsNil() { - return [][]byte(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([][]byte{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullInt64: - if reflect.ValueOf(v).IsNil() { - return []int64(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]int64{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullInt64: - if reflect.ValueOf(v).IsNil() { - return []NullInt64(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullInt64{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullBool: - if reflect.ValueOf(v).IsNil() { - return []bool(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]bool{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullBool: - if reflect.ValueOf(v).IsNil() { - return []NullBool(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullBool{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullFloat64: - if reflect.ValueOf(v).IsNil() { - return []float64(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]float64{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullFloat64: - if reflect.ValueOf(v).IsNil() { - return []NullFloat64(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullFloat64{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullFloat32: - if reflect.ValueOf(v).IsNil() { - return []float32(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]float32{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullFloat32: - if reflect.ValueOf(v).IsNil() { - return []NullFloat32(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullFloat32{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullTime: - if reflect.ValueOf(v).IsNil() { - return []time.Time(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]time.Time{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullTime: - if reflect.ValueOf(v).IsNil() { - return []NullTime(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullTime{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullDate: - if reflect.ValueOf(v).IsNil() { - return []civil.Date(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]civil.Date{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullDate: - if reflect.ValueOf(v).IsNil() { - return []NullDate(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullDate{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullNumeric: - if reflect.ValueOf(v).IsNil() { - return []big.Rat(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]big.Rat{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullNumeric: - if reflect.ValueOf(v).IsNil() { - return []NullNumeric(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullNumeric{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullJSON: - if reflect.ValueOf(v).IsNil() { - return []NullJSON(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullJSON{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfPGJsonB: - if reflect.ValueOf(v).IsNil() { - return []PGJsonB(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]PGJsonB{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfPGNumeric: - if reflect.ValueOf(v).IsNil() { - return []PGNumeric(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]PGNumeric{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullInterval: - if reflect.ValueOf(v).IsNil() { - return []Interval(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]Interval{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullInterval: - if reflect.ValueOf(v).IsNil() { - return []NullInterval(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullInterval{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNonNullUUID: - if reflect.ValueOf(v).IsNil() { - return []uuid.UUID{}, nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]uuid.UUID{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - case spannerTypeArrayOfNullUUID: - if reflect.ValueOf(v).IsNil() { - return []NullUUID(nil), nil - } - destination = reflect.MakeSlice(reflect.TypeOf([]NullUUID{}), reflect.ValueOf(v).Len(), reflect.ValueOf(v).Cap()) - default: - // This should not be possible. - return nil, fmt.Errorf("unknown decodable type found: %v", sourceType) - } - // destination has been initialized. Convert and copy the input value to - // destination. That must be done per element if the input type is a slice - // or an array. - if destination.Kind() == reflect.Slice || destination.Kind() == reflect.Array { - sourceSlice := reflect.ValueOf(v) - for i := 0; i < destination.Len(); i++ { - source := sourceSlice.Index(i) - destination.Index(i).Set(source.Convert(destination.Type().Elem())) - } - } else { - source := reflect.ValueOf(v) - destination.Set(source.Convert(destination.Type())) - } - // Return the converted value. - return destination.Interface(), nil -} - -// Encodes a Go struct value/ptr in v to the spanner Value and Type protos. v -// itself must be non-nil. -func encodeStruct(v interface{}) (*proto3.Value, *sppb.Type, error) { - typ := reflect.TypeOf(v) - val := reflect.ValueOf(v) - - // Pointer to struct. - if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { - typ = typ.Elem() - if val.IsNil() { - // nil pointer to struct, representing a NULL STRUCT value. Use a - // dummy value to get the type. - _, st, err := encodeStruct(reflect.Zero(typ).Interface()) - if err != nil { - return nil, nil, err - } - return nullProto(), st, nil - } - val = val.Elem() - } - - if typ.Kind() != reflect.Struct { - return nil, nil, errEncoderUnsupportedType(v) - } - - stf := make([]*sppb.StructType_Field, 0, typ.NumField()) - stv := make([]*proto3.Value, 0, typ.NumField()) - - for i := 0; i < typ.NumField(); i++ { - // If the field has a 'spanner' tag, use the value of that tag as the field name. - // This is used to build STRUCT types with unnamed/duplicate fields. - sf := typ.Field(i) - fval := val.Field(i) - - // Embedded fields are not allowed. - if sf.Anonymous { - return nil, nil, errUnsupportedEmbeddedStructFields(sf.Name) - } - - // Unexported fields are ignored. - if !fval.CanInterface() { - continue - } - - fname, ok := sf.Tag.Lookup("spanner") - if !ok { - fname = sf.Name - } - - eval, etype, err := encodeValue(fval.Interface()) - if err != nil { - return nil, nil, err - } - - stf = append(stf, mkField(fname, etype)) - stv = append(stv, eval) - } - - return listProto(stv...), structType(stf...), nil -} - -// Encodes a slice of Go struct values/ptrs in v to the spanner Value and Type -// protos. v itself must be non-nil. -func encodeStructArray(v interface{}) (*proto3.Value, *sppb.Type, error) { - etyp := reflect.TypeOf(v).Elem() - sliceval := reflect.ValueOf(v) - - // Slice of pointers to structs. - if etyp.Kind() == reflect.Ptr { - etyp = etyp.Elem() - } - - // Use a dummy struct value to get the element type. - _, elemTyp, err := encodeStruct(reflect.Zero(etyp).Interface()) - if err != nil { - return nil, nil, err - } - - // nil slice represents a NULL array-of-struct. - if sliceval.IsNil() { - return nullProto(), listType(elemTyp), nil - } - - values := make([]*proto3.Value, 0, sliceval.Len()) - - for i := 0; i < sliceval.Len(); i++ { - ev, _, err := encodeStruct(sliceval.Index(i).Interface()) - if err != nil { - return nil, nil, err - } - values = append(values, ev) - } - return listProto(values...), listType(elemTyp), nil -} - -// Encodes a slice of proto messages or enum in v to the spanner Value and Type -// protos. -func encodeProtoArray(v interface{}) (*proto3.Value, *sppb.Type, error) { - pb := nullProto() - var pt *sppb.Type - var err error - sliceval := reflect.ValueOf(v) - etyp := reflect.TypeOf(v).Elem() - - if etyp.Implements(protoMsgReflectType) { - if !sliceval.IsNil() { - pb, err = encodeProtoMessageArray(sliceval.Len(), func(i int) reflect.Value { return sliceval.Index(i) }) - if err != nil { - return nil, nil, err - } - } - defaultInstance := reflect.Zero(etyp).Interface().(proto.Message) - protoMessagefqn := string(defaultInstance.ProtoReflect().Descriptor().FullName()) - pt = listType(protoMessageType(protoMessagefqn)) - } else if etyp.Implements(protoEnumReflectType) { - if !sliceval.IsNil() { - pb, err = encodeProtoEnumArray(sliceval.Len(), func(i int) reflect.Value { return sliceval.Index(i) }) - if err != nil { - return nil, nil, err - } - } - if etyp.Kind() == reflect.Ptr { - etyp = etyp.Elem() - } - defaultInstance := reflect.Zero(etyp).Interface().(protoreflect.Enum) - protoEnumfqn := string(defaultInstance.Descriptor().FullName()) - pt = listType(protoEnumType(protoEnumfqn)) - } - return pb, pt, nil -} - -func isStructOrArrayOfStructValue(v interface{}) bool { - typ := reflect.TypeOf(v) - if typ.Kind() == reflect.Slice { - typ = typ.Elem() - } - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - return typ.Kind() == reflect.Struct -} - -func isAnArrayOfProtoColumn(v interface{}) bool { - typ := reflect.TypeOf(v) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - if typ.Kind() == reflect.Slice { - typ = typ.Elem() - } - return typ.Implements(protoMsgReflectType) || typ.Implements(protoEnumReflectType) -} - -func isSupportedMutationType(v interface{}) bool { - switch v.(type) { - case nil, string, *string, NullString, []string, []*string, []NullString, - []byte, [][]byte, - int, []int, int64, *int64, []int64, []*int64, NullInt64, []NullInt64, - bool, *bool, []bool, []*bool, NullBool, []NullBool, - float64, *float64, []float64, []*float64, NullFloat64, []NullFloat64, - float32, *float32, []float32, []*float32, NullFloat32, []NullFloat32, - time.Time, *time.Time, []time.Time, []*time.Time, NullTime, []NullTime, - civil.Date, *civil.Date, []civil.Date, []*civil.Date, NullDate, []NullDate, - big.Rat, *big.Rat, []big.Rat, []*big.Rat, NullNumeric, []NullNumeric, uuid.UUID, []uuid.UUID, *uuid.UUID, []*uuid.UUID, NullUUID, []NullUUID, - Interval, *Interval, []Interval, []*Interval, NullInterval, []NullInterval, - GenericColumnValue, proto.Message, protoreflect.Enum, NullProtoMessage, NullProtoEnum: - return true - default: - // Check if the custom type implements spanner.Encoder interface. - if _, ok := v.(Encoder); ok { - return true - } - - if isAnArrayOfProtoColumn(v) { - return true - } - - decodableType := getDecodableSpannerType(v, false) - return decodableType != spannerTypeUnknown && decodableType != spannerTypeInvalid - } -} - -// encodeValueArray encodes a Value array into a proto3.ListValue. -func encodeValueArray(vs []interface{}) (*proto3.ListValue, error) { - lv := &proto3.ListValue{} - lv.Values = make([]*proto3.Value, 0, len(vs)) - for _, v := range vs { - if !isSupportedMutationType(v) { - return nil, errEncoderUnsupportedType(v) - } - pb, _, err := encodeValue(v) - if err != nil { - return nil, err - } - lv.Values = append(lv.Values, pb) - } - return lv, nil -} - -// encodeArray assumes that all values of the array element type encode without -// error. -func encodeArray(len int, at func(int) interface{}) (*proto3.Value, error) { - vs := make([]*proto3.Value, len) - var err error - for i := 0; i < len; i++ { - vs[i], _, err = encodeValue(at(i)) - if err != nil { - return nil, err - } - } - return listProto(vs...), nil -} - -func encodeProtoMessageArray(len int, at func(int) reflect.Value) (*proto3.Value, error) { - vs := make([]*proto3.Value, len) - var err error - for i := 0; i < len; i++ { - v := at(i).Interface().(proto.Message) - vs[i], _, err = encodeValue(v) - if err != nil { - return nil, err - } - } - return listProto(vs...), nil -} - -func encodeProtoEnumArray(len int, at func(int) reflect.Value) (*proto3.Value, error) { - vs := make([]*proto3.Value, len) - var err error - for i := 0; i < len; i++ { - v := at(i).Interface().(protoreflect.Enum) - vs[i], _, err = encodeValue(v) - if err != nil { - return nil, err - } - } - return listProto(vs...), nil -} - -func spannerTagParser(t reflect.StructTag) (name string, keep bool, other interface{}, err error) { - if s := t.Get("spanner"); s != "" { - if s == "-" { - return "", false, nil, nil - } - return s, true, nil, nil - } - return "", true, nil, nil -} - -var fieldCache = fields.NewCache(spannerTagParser, nil, nil) - -func trimDoubleQuotes(payload []byte) ([]byte, error) { - if len(payload) <= 1 || payload[0] != '"' || payload[len(payload)-1] != '"' { - return nil, fmt.Errorf("payload is too short or not wrapped with double quotes: got %q", string(payload)) - } - // Remove the double quotes at the beginning and the end. - return payload[1 : len(payload)-1], nil -} - -// Interval represents a Spanner INTERVAL type that may be NULL. -// An interval is a combination of months, days and nanoseconds. -// Internally, Spanner supports Interval value with the following range of individual fields: -// months: [-120000, 120000] -// days: [-3660000, 3660000] -// nanoseconds: [-316224000000000000000, 316224000000000000000] -type Interval struct { - Months int32 // Months component of the interval - Days int32 // Days component of the interval - Nanos *big.Int // Nanoseconds component of the interval -} - -// NullInterval represents a Spanner INTERVAL that may be NULL. -type NullInterval struct { - Interval Interval // Interval contains the value when it is non-NULL - Valid bool // Valid is true if Interval is not NULL -} - -// IsNull implements NullableValue.IsNull for NullInterval. -func (n NullInterval) IsNull() bool { - return !n.Valid -} - -// String implements Stringer.String for NullInterval. -func (n NullInterval) String() string { - if !n.Valid { - return nullString - } - return n.Interval.String() -} - -// String returns the ISO8601 duration format string representation of the interval. -func (i Interval) String() string { - var result strings.Builder - result.WriteString("P") - - years := i.Months / 12 - months := i.Months % 12 - if years != 0 { - result.WriteString(fmt.Sprintf("%dY", years)) - } - if months != 0 { - result.WriteString(fmt.Sprintf("%dM", months)) - } - - // Handle days - if i.Days != 0 { - result.WriteString(fmt.Sprintf("%dD", i.Days)) - } - - if i.Nanos != nil && i.Nanos.Sign() != 0 { - result.WriteString("T") - nanos := new(big.Int).Set(i.Nanos) - isNegative := nanos.Sign() < 0 - if isNegative { - nanos.Neg(nanos) - } - - nanosPerHour := new(big.Int).SetInt64(3600000000000) - hours := new(big.Int).Div(nanos, nanosPerHour) - if hours.Sign() != 0 { - if isNegative { - result.WriteString("-") - } - result.WriteString(fmt.Sprintf("%sH", hours.String())) - } - nanos.Mod(nanos, nanosPerHour) - - nanosPerMinute := new(big.Int).SetInt64(60000000000) - minutes := new(big.Int).Div(nanos, nanosPerMinute) - if minutes.Sign() != 0 { - if isNegative { - result.WriteString("-") - } - result.WriteString(fmt.Sprintf("%sM", minutes.String())) - } - nanos.Mod(nanos, nanosPerMinute) - - nanosPerSecond := new(big.Int).SetInt64(1000000000) - seconds := new(big.Int).Div(nanos, nanosPerSecond) - nanosFraction := new(big.Int).Mod(nanos, nanosPerSecond) - - if seconds.Sign() != 0 || nanosFraction.Sign() != 0 { - if isNegative { - result.WriteString("-") - } - if seconds.Sign() != 0 { - result.WriteString(seconds.String()) - } else if nanosFraction.Sign() != 0 { - result.WriteString("0") - } - if nanosFraction.Sign() != 0 { - absNanos := new(big.Int) - absNanos.Abs(nanosFraction) - nanoStr := fmt.Sprintf("%09d", absNanos) - - trimmed := strings.TrimRight(nanoStr, "0") - if len(trimmed) <= 3 { - for len(trimmed) < 3 { - trimmed += "0" - } - } else if len(trimmed) <= 6 { - for len(trimmed) < 6 { - trimmed += "0" - } - } else { - for len(trimmed) < 9 { - trimmed += "0" - } - } - result.WriteString("." + trimmed) - } - result.WriteString("S") - } - } - - if result.Len() == 1 { - result.WriteString("0Y") // Special case for zero interval - } - - return result.String() -} - -// MarshalJSON implements json.Marshaler.MarshalJSON for NullInterval. -func (n NullInterval) MarshalJSON() ([]byte, error) { - if !n.Valid { - return []byte("null"), nil - } - return json.Marshal(n.Interval.String()) -} - -// UnmarshalJSON implements json.Unmarshaler.UnmarshalJSON for NullInterval. -func (n *NullInterval) UnmarshalJSON(payload []byte) error { - if payload == nil { - return errPayloadNil - } - - if jsonIsNull(payload) { - n.Valid = false - return nil - } - - var s string - if err := json.Unmarshal(payload, &s); err != nil { - return err - } - - interval, err := ParseInterval(s) - if err != nil { - return err - } - - n.Interval = interval - n.Valid = true - return nil -} - -// ParseInterval parses an ISO8601 duration format string into an Interval. -func ParseInterval(s string) (Interval, error) { - var interval Interval - interval.Nanos = new(big.Int) - - pattern := `^P(-?\d+Y)?(-?\d+M)?(-?\d+D)?(T(-?\d+H)?(-?\d+M)?(-?((\d+([.,]\d{1,9})?)|([.,]\d{1,9}))S)?)?$` - re := regexp.MustCompile(pattern) - - if !re.MatchString(s) { - return Interval{}, fmt.Errorf("invalid interval format: %s", s) - } - - parts := re.FindStringSubmatch(s) - if parts == nil { - return Interval{}, fmt.Errorf("invalid interval format: %s", s) - } - - if len(s) == 1 { - return Interval{}, fmt.Errorf("invalid interval format: at least one component (Y/M/D/H/M/S) is required: %s", s) - } - - // Verify that at least one component is present (Y, M, D, H, M, or S) - if parts[1] == "" && parts[2] == "" && parts[3] == "" && parts[4] == "" { - return Interval{}, fmt.Errorf("invalid interval format: at least one component (Y/M/D/H/M/S) is required: %s", s) - } - - if parts[4] == "T" && parts[5] == "" && parts[6] == "" && parts[7] == "" { - return Interval{}, fmt.Errorf("invalid interval format: time designator 'T' present but no time components specified: %s", s) - } - - var parseNum = func(s string, suffix string) int64 { - if s == "" { - return 0 - } - s = strings.TrimSuffix(s, suffix) - - num, _ := strconv.ParseInt(s, 10, 64) - return num - } - - years := parseNum(parts[1], "Y") - months := parseNum(parts[2], "M") - interval.Months = int32(years*12 + months) - - interval.Days = int32(parseNum(parts[3], "D")) - - if parts[4] != "" { // Has time component - // Convert hours to nanoseconds - hours := parseNum(parts[5], "H") - hoursStr := strconv.FormatInt(hours, 10) - hoursValue := new(big.Int) - hoursValue.SetString(hoursStr, 10) - - nanosPerHour := new(big.Int) - nanosPerHour.SetString("3600000000000", 10) - - hoursNanos := new(big.Int) - hoursNanos.Mul(nanosPerHour, hoursValue) - interval.Nanos = hoursNanos - - minutes := parseNum(parts[6], "M") - minutesNanos := new(big.Int).SetInt64(minutes * 60000000000) - interval.Nanos.Add(interval.Nanos, minutesNanos) - - if parts[7] != "" { - seconds := strings.TrimSuffix(parts[7], "S") - - if strings.Contains(seconds, ",") { - seconds = strings.Replace(seconds, ",", ".", 1) - } - - secondsParts := strings.Split(seconds, ".") - var secondsInt int64 - var fractionStr string - - if len(secondsParts) == 1 { - if strings.HasPrefix(seconds, ".") { - fractionStr = secondsParts[0] - } else { - secondsInt, _ = strconv.ParseInt(secondsParts[0], 10, 64) - } - } else if len(secondsParts) == 2 { - secondsInt, _ = strconv.ParseInt(secondsParts[0], 10, 64) - fractionStr = secondsParts[1] - } - - secondsNanos := new(big.Int).SetInt64(secondsInt * 1000000000) - interval.Nanos.Add(interval.Nanos, secondsNanos) - - if fractionStr != "" { - for len(fractionStr) < 9 { - fractionStr += "0" - } - if len(fractionStr) > 9 { - fractionStr = fractionStr[:9] - } - - fractionalNanos, _ := strconv.ParseInt(fractionStr, 10, 64) - if strings.HasPrefix(seconds, "-") { - fractionalNanos = -fractionalNanos - } - interval.Nanos.Add(interval.Nanos, big.NewInt(fractionalNanos)) - } - } - } - - return interval, nil -} - -// Value implements the driver.Valuer interface for NullInterval. -func (n NullInterval) Value() (driver.Value, error) { - if !n.Valid { - return nil, nil - } - return n.String(), nil -} - -// Scan implements the sql.Scanner interface for NullInterval. -func (n *NullInterval) Scan(value interface{}) error { - if value == nil { - n.Interval, n.Valid = Interval{}, false - return nil - } - - switch v := value.(type) { - case string: - interval, err := ParseInterval(v) - if err != nil { - return err - } - n.Interval = interval - n.Valid = true - return nil - default: - return fmt.Errorf("cannot convert %v (%T) to Interval", value, value) - } -} - -// GormDataType implements the gorm.GormDataTypeInterface interface for NullInterval. -func (n NullInterval) GormDataType() string { - return "INTERVAL" -} - -// decodeIntervalArray decodes proto3.ListValue pb into a Interval slice. -func decodeIntervalArray(pb *proto3.ListValue) ([]Interval, error) { - if pb == nil { - return nil, errNilListValue("INTERVAL") - } - a := make([]Interval, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, intervalType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "INTERVAL", err) - } - } - return a, nil -} - -// decodeNullIntervalArray decodes proto3.ListValue pb into a NullInterval slice. -func decodeNullIntervalArray(pb *proto3.ListValue) ([]NullInterval, error) { - if pb == nil { - return nil, errNilListValue("INTERVAL") - } - a := make([]NullInterval, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, intervalType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "INTERVAL", err) - } - } - return a, nil -} - -// decodeIntervalPointerArray decodes proto3.ListValue pb into a *Interval slice. -func decodeIntervalPointerArray(pb *proto3.ListValue) ([]*Interval, error) { - if pb == nil { - return nil, errNilListValue("INTERVAL") - } - a := make([]*Interval, len(pb.Values)) - for i, v := range pb.Values { - if err := decodeValue(v, intervalType(), &a[i]); err != nil { - return nil, errDecodeArrayElement(i, v, "INTERVAL", err) - } - } - return a, nil -} diff --git a/vendor/cloud.google.com/go/storage/CHANGES.md b/vendor/cloud.google.com/go/storage/CHANGES.md index adb9cc8537..10d5dd169e 100644 --- a/vendor/cloud.google.com/go/storage/CHANGES.md +++ b/vendor/cloud.google.com/go/storage/CHANGES.md @@ -1,6 +1,38 @@ # Changes +## [1.57.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.57.0...storage/v1.57.1) (2025-10-28) + + +### Bug Fixes +* **storage:** Takeover idempotence ([#13230](https://github.com/googleapis/google-cloud-go/issues/13230)) ([cc5d2a1](https://github.com/googleapis/google-cloud-go/commit/cc5d2a12293a509a14da9bea8a86c8655eaf4a71)) +* **storage:** Copy metadata when using Copier with grpc ([#12919](https://github.com/googleapis/google-cloud-go/issues/12919)) ([57a2e80](https://github.com/googleapis/google-cloud-go/commit/57a2e804f690ec8d4c55fd1c73b0dafd5cff46e5)) +* **storage:** Fix takeover response handling ([#13239](https://github.com/googleapis/google-cloud-go/issues/13239)) ([26d75bc](https://github.com/googleapis/google-cloud-go/commit/26d75bc08e242348d26691877aba7fa68cf30f7f)) +* **storage:** Remove default timeout for gRPC operations ([#13022](https://github.com/googleapis/google-cloud-go/issues/13022)) ([b94c3ba](https://github.com/googleapis/google-cloud-go/commit/b94c3ba69994d9c56ae8f302449dd8df6f287296)) +* **storage:** Skip download of file outside of target dir ([#12945](https://github.com/googleapis/google-cloud-go/issues/12945)) ([6259aee](https://github.com/googleapis/google-cloud-go/commit/6259aeec393d0d996961cac38396daa57ad1a290)) +* **storage:** Upgrade gRPC service registration func ([8fffca2](https://github.com/googleapis/google-cloud-go/commit/8fffca2819fa3dc858c213aa0c503e0df331b084)) + +## [1.57.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.56.1...storage/v1.57.0) (2025-09-23) + + +### Features + +* **storage/control:** Add new GetIamPolicy, SetIamPolicy, and TestIamPermissions RPCs ([d73f912](https://github.com/googleapis/google-cloud-go/commit/d73f9123be77bb3278f48d510cd0fb22feb605bc)) +* **storage:** Post support dynamic key name ([#12677](https://github.com/googleapis/google-cloud-go/issues/12677)) ([9e761f9](https://github.com/googleapis/google-cloud-go/commit/9e761f961a2c4351b3e0793ed655314ac5853903)) +* **storage:** WithMeterProvider allows custom meter provider configuration ([#12668](https://github.com/googleapis/google-cloud-go/issues/12668)) ([7f574b0](https://github.com/googleapis/google-cloud-go/commit/7f574b01e0b454c1ef5c13e6a58075e394ee990d)) + + +### Bug Fixes + +* **storage:** Free buffers in Bidi Reader ([#12839](https://github.com/googleapis/google-cloud-go/issues/12839)) ([bc247fd](https://github.com/googleapis/google-cloud-go/commit/bc247fdc3f5234a8bd6934e58d5b0b578f1335cb)) +* **storage:** Make Writer thread-safe. ([#12753](https://github.com/googleapis/google-cloud-go/issues/12753)) ([9ea380b](https://github.com/googleapis/google-cloud-go/commit/9ea380bea5b980a9054d201be4f315a195da2182)) +* **storage:** No progress report for oneshot write ([#12746](https://github.com/googleapis/google-cloud-go/issues/12746)) ([b97c286](https://github.com/googleapis/google-cloud-go/commit/b97c286ec369a10a81b1a8a3a1aae18b46d2dfbc)) + + +### Performance Improvements + +* **storage:** Pipeline gRPC writes ([#12422](https://github.com/googleapis/google-cloud-go/issues/12422)) ([1f2c5fe](https://github.com/googleapis/google-cloud-go/commit/1f2c5fe2843724302086fe04cb8dab8b515969c5)) + ## [1.56.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.56.0...storage/v1.56.1) (2025-08-19) diff --git a/vendor/cloud.google.com/go/storage/bucket.go b/vendor/cloud.google.com/go/storage/bucket.go index 60a5ffb5b3..a8e56ed173 100644 --- a/vendor/cloud.google.com/go/storage/bucket.go +++ b/vendor/cloud.google.com/go/storage/bucket.go @@ -225,6 +225,11 @@ func (b *BucketHandle) SignedURL(object string, opts *SignedURLOptions) (string, // to be non-nil. You may need to set the GoogleAccessID and PrivateKey fields // in some cases. Read more on the [automatic detection of credentials] for this method. // +// To allow the unauthenticated client to upload to any object name in the +// bucket with a given prefix rather than a specific object name, you can pass +// an empty string for object and set [PostPolicyV4Options].Conditions to +// include [ConditionStartsWith]("$key", "prefix"). +// // [automatic detection of credentials]: https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing func (b *BucketHandle) GenerateSignedPostPolicyV4(object string, opts *PostPolicyV4Options) (*PostPolicyV4, error) { // Make a copy of opts so we don't modify the pointer parameter. diff --git a/vendor/cloud.google.com/go/storage/copy.go b/vendor/cloud.google.com/go/storage/copy.go index a0b9a2683c..d10e377ffe 100644 --- a/vendor/cloud.google.com/go/storage/copy.go +++ b/vendor/cloud.google.com/go/storage/copy.go @@ -18,8 +18,6 @@ import ( "context" "errors" "fmt" - - "cloud.google.com/go/internal/trace" ) // CopierFrom creates a Copier that can copy src to dst. @@ -82,8 +80,8 @@ type Copier struct { // Run performs the copy. func (c *Copier) Run(ctx context.Context) (attrs *ObjectAttrs, err error) { - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Copier.Run") - defer func() { trace.EndSpan(ctx, err) }() + ctx, _ = startSpan(ctx, "Copier.Run") + defer func() { endSpan(ctx, err) }() if err := c.src.validate(); err != nil { return nil, err @@ -180,8 +178,8 @@ type Composer struct { // Run performs the compose operation. func (c *Composer) Run(ctx context.Context) (attrs *ObjectAttrs, err error) { - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Composer.Run") - defer func() { trace.EndSpan(ctx, err) }() + ctx, _ = startSpan(ctx, "Composer.Run") + defer func() { endSpan(ctx, err) }() if err := c.dst.validate(); err != nil { return nil, err diff --git a/vendor/cloud.google.com/go/storage/doc.go b/vendor/cloud.google.com/go/storage/doc.go index 6a64c6c03b..3726432c86 100644 --- a/vendor/cloud.google.com/go/storage/doc.go +++ b/vendor/cloud.google.com/go/storage/doc.go @@ -364,7 +364,7 @@ to add a [custom audit logging] header: This package includes support for the [Cloud Storage gRPC API]. This implementation uses gRPC rather than the default JSON & XML APIs to make requests to Cloud Storage. All methods on the [Client] support -the gRPC API, with the exception of [GetServiceAccount], [Notification], +the gRPC API, with the exception of the [Client.ServiceAccount], [Notification], and [HMACKey] methods. The Cloud Storage gRPC API is generally available. @@ -390,7 +390,10 @@ Requirements to use Direct Connectivity include: - Your client must use service account authentication. Additional requirements for Direct Connectivity are documented in the -[Cloud Storage gRPC docs]. +[Cloud Storage gRPC docs]. If all requirements are met, the client will +use Direct Connectivity by default without requiring any client options +or environment variables. To disable Direct Connectivity, you can set +the environment variable GOOGLE_CLOUD_DISABLE_DIRECT_PATH=true. Dependencies for the gRPC API may slightly increase the size of binaries for applications depending on this package. If you are not using gRPC, you can use diff --git a/vendor/cloud.google.com/go/storage/experimental/experimental.go b/vendor/cloud.google.com/go/storage/experimental/experimental.go index a178f9ebb3..819e105d70 100644 --- a/vendor/cloud.google.com/go/storage/experimental/experimental.go +++ b/vendor/cloud.google.com/go/storage/experimental/experimental.go @@ -33,17 +33,25 @@ import ( // It sets how often to emit metrics [metric.WithInterval] when using // [metric.NewPeriodicReader] // When using Cloud Monitoring interval must be at minimum 1 [time.Minute]. +// This option is ignored if WithMeterProvider is also set. func WithMetricInterval(metricInterval time.Duration) option.ClientOption { return internal.WithMetricInterval.(func(time.Duration) option.ClientOption)(metricInterval) } // WithMetricExporter provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient]. // Set an alternate client-side metric Exporter to emit metrics through. -// Must implement [metric.Exporter] +// Must implement [metric.Exporter]. This option is ignored if WithMeterProvider is also set. func WithMetricExporter(ex *metric.Exporter) option.ClientOption { return internal.WithMetricExporter.(func(*metric.Exporter) option.ClientOption)(ex) } +// WithMeterProvider provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient]. +// Set an alternate client-side meter provider to emit metrics through. +// This option takes precedence over WithMetricExporter and WithMetricInterval. +func WithMeterProvider(mp *metric.MeterProvider) option.ClientOption { + return internal.WithMeterProvider.(func(*metric.MeterProvider) option.ClientOption)(mp) +} + // WithReadStallTimeout provides a [option.ClientOption] that may be passed to [storage.NewClient]. // It enables the client to retry stalled requests when starting a download from // Cloud Storage. If the timeout elapses with no response from the server, the request diff --git a/vendor/cloud.google.com/go/storage/grpc_client.go b/vendor/cloud.google.com/go/storage/grpc_client.go index 5850bcc1c0..82d7a27e60 100644 --- a/vendor/cloud.google.com/go/storage/grpc_client.go +++ b/vendor/cloud.google.com/go/storage/grpc_client.go @@ -26,7 +26,6 @@ import ( "sync" "cloud.google.com/go/iam/apiv1/iampb" - "cloud.google.com/go/internal/trace" gapic "cloud.google.com/go/storage/internal/apiv2" "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2" @@ -100,9 +99,10 @@ func defaultGRPCOptions() []option.ClientOption { } else { // Only enable DirectPath when the emulator is not being targeted. defaults = append(defaults, - internaloption.EnableDirectPath(true), internaloption.AllowNonDefaultServiceAccount(true), - internaloption.EnableDirectPathXds()) + internaloption.EnableDirectPath(true), + internaloption.EnableDirectPathXds(), + internaloption.AllowHardBoundTokens("ALTS")) } return defaults @@ -124,9 +124,11 @@ func enableClientMetrics(ctx context.Context, s *settings, config storageConfig) project = c.ProjectID } metricsContext, err := newGRPCMetricContext(ctx, metricsConfig{ - project: project, - interval: config.metricInterval, - manualReader: config.manualReader}, + project: project, + interval: config.metricInterval, + manualReader: config.manualReader, + meterProvider: config.meterProvider, + }, ) if err != nil { return nil, fmt.Errorf("gRPC Metrics: %w", err) @@ -140,7 +142,7 @@ func newGRPCStorageClient(ctx context.Context, opts ...storageOption) (*grpcStor s := initSettings(opts...) s.clientOption = append(defaultGRPCOptions(), s.clientOption...) // Disable all gax-level retries in favor of retry logic in the veneer client. - s.gax = append(s.gax, gax.WithRetry(nil)) + s.gax = append(s.gax, gax.WithRetry(nil), gax.WithTimeout(0)) config := newStorageConfig(s.clientOption...) if config.readAPIWasSet { @@ -950,14 +952,24 @@ func (c *grpcStorageClient) ComposeObject(ctx context.Context, req *composeObjec } func (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) { s := callSettings(c.settings, opts...) - obj := req.dstObject.attrs.toProtoObject("") + + var dst *storagepb.Object + // If the destination object attributes are not set, do not include them + // in the request. This indicates that the object attributes should be + // copied from the source object. + if req.dstObject.attrs.isZero() { + dst = nil + } else { + dst = req.dstObject.attrs.toProtoObject("") + } + call := &storagepb.RewriteObjectRequest{ SourceBucket: bucketResourceName(globalProjectAlias, req.srcObject.bucket), SourceObject: req.srcObject.name, RewriteToken: req.token, DestinationBucket: bucketResourceName(globalProjectAlias, req.dstObject.bucket), DestinationName: req.dstObject.name, - Destination: obj, + Destination: dst, DestinationKmsKey: req.dstObject.keyName, DestinationPredefinedAcl: req.predefinedACL, CommonObjectRequestParams: toProtoCommonObjectRequestParams(req.dstObject.encryptionKey), @@ -1066,8 +1078,8 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params return nil, errors.New("storage: MultiRangeDownloader requires the experimental.WithGRPCBidiReads option") } - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewMultiRangeDownloader") - defer func() { trace.EndSpan(ctx, err) }() + ctx, _ = startSpan(ctx, "grpcStorageClient.NewMultiRangeDownloader") + defer func() { endSpan(ctx, err) }() s := callSettings(c.settings, opts...) // Force the use of the custom codec to enable zero-copy reads. s.gax = append(s.gax, gax.WithGRPCOptions( @@ -1611,8 +1623,8 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange return c.NewRangeReaderReadObject(ctx, params, opts...) } - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReader") - defer func() { trace.EndSpan(ctx, err) }() + ctx, _ = startSpan(ctx, "grpcStorageClient.NewRangeReader") + defer func() { endSpan(ctx, err) }() s := callSettings(c.settings, opts...) @@ -2028,6 +2040,10 @@ func (r *gRPCReader) Read(p []byte) (int, error) { n, found := r.currMsg.readAndUpdateCRC(p, 1, func(b []byte) { r.updateCRC(b) }) + // If we are done reading the current msg, free buffers. + if r.currMsg.done { + r.currMsg.databufs.Free() + } // If data for our readID was found, we can update `seen` and return. if found { @@ -2080,6 +2096,8 @@ func (r *gRPCReader) WriteTo(w io.Writer) (int64, error) { r.updateCRC(b) }) r.seen += written + // We have processed the message, so free the buffer + r.currMsg.databufs.Free() if err != nil { return r.seen - alreadySeen, err } diff --git a/vendor/cloud.google.com/go/storage/grpc_metrics.go b/vendor/cloud.google.com/go/storage/grpc_metrics.go index f7bebd1def..0442101574 100644 --- a/vendor/cloud.google.com/go/storage/grpc_metrics.go +++ b/vendor/cloud.google.com/go/storage/grpc_metrics.go @@ -126,6 +126,7 @@ type metricsConfig struct { project string interval time.Duration customExporter *metric.Exporter + meterProvider *metric.MeterProvider manualReader *metric.ManualReader // used by tests disableExporter bool // used by tests disables exports resourceOpts []resource.Option // used by tests @@ -172,7 +173,10 @@ func newGRPCMetricContext(ctx context.Context, cfg metricsConfig) (*metricsConte meterOpts = append(meterOpts, metric.WithReader( metric.NewPeriodicReader(&exporterLogSuppressor{Exporter: exporter}, metric.WithInterval(interval)))) } - provider := metric.NewMeterProvider(meterOpts...) + provider := cfg.meterProvider + if provider == nil { + provider = metric.NewMeterProvider(meterOpts...) + } mo := opentelemetry.MetricsOptions{ MeterProvider: provider, Metrics: stats.NewMetrics( diff --git a/vendor/cloud.google.com/go/storage/grpc_reader.go b/vendor/cloud.google.com/go/storage/grpc_reader.go index 14ec5048d8..0fd848cad6 100644 --- a/vendor/cloud.google.com/go/storage/grpc_reader.go +++ b/vendor/cloud.google.com/go/storage/grpc_reader.go @@ -22,7 +22,6 @@ import ( "hash/crc32" "io" - "cloud.google.com/go/internal/trace" "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2" "google.golang.org/grpc" @@ -83,8 +82,8 @@ func (bytesCodecReadObject) Name() string { // NewRangeReaderReadObject is the legacy (non-bidi) implementation of reads. func (c *grpcStorageClient) NewRangeReaderReadObject(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) { - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReaderReadObject") - defer func() { trace.EndSpan(ctx, err) }() + ctx, _ = startSpan(ctx, "grpcStorageClient.NewRangeReaderReadObject") + defer func() { endSpan(ctx, err) }() s := callSettings(c.settings, opts...) diff --git a/vendor/cloud.google.com/go/storage/grpc_writer.go b/vendor/cloud.google.com/go/storage/grpc_writer.go index 3d82e59517..a83a90d0f6 100644 --- a/vendor/cloud.google.com/go/storage/grpc_writer.go +++ b/vendor/cloud.google.com/go/storage/grpc_writer.go @@ -19,7 +19,9 @@ import ( "errors" "fmt" "io" + "net/http" "net/url" + "strings" "time" gapic "cloud.google.com/go/storage/internal/apiv2" @@ -42,311 +44,745 @@ const ( maxPerMessageWriteSize int = int(storagepb.ServiceConstants_MAX_WRITE_CHUNK_BYTES) ) -func withBidiWriteObjectRedirectionErrorRetries(s *settings) (newr *retryConfig) { - oldr := s.retry - newr = oldr.clone() - if newr == nil { - newr = &retryConfig{} +func (w *gRPCWriter) Write(p []byte) (n int, err error) { + done := make(chan struct{}) + cmd := &gRPCWriterCommandWrite{p: p, done: done} + select { + case <-w.donec: + return 0, w.streamResult + case w.writesChan <- cmd: + // write command successfully delivered to sender. We no longer own cmd. + break } - if (oldr.policy == RetryIdempotent && !s.idempotent) || oldr.policy == RetryNever { - // We still retry redirection errors even when settings indicate not to - // retry. - // - // The protocol requires us to respect redirection errors, so RetryNever has - // to ignore them. - // - // Idempotency is always protected by redirection errors: they either - // contain a handle which can be used as idempotency information, or they do - // not contain a handle and are "affirmative failures" which indicate that - // no server-side action occurred. - newr.policy = RetryAlways - newr.shouldRetry = func(err error) bool { - return errors.Is(err, bidiWriteObjectRedirectionError{}) - } - return newr + + select { + case <-w.donec: + return 0, w.streamResult + case <-done: + return len(p), nil } - // If retry settings allow retries normally, fall back to that behavior. - newr.shouldRetry = func(err error) bool { - if errors.Is(err, bidiWriteObjectRedirectionError{}) { - return true - } - v := oldr.runShouldRetry(err) - return v +} + +func (w *gRPCWriter) Flush() (int64, error) { + done := make(chan int64) + cmd := &gRPCWriterCommandFlush{done: done} + select { + case <-w.donec: + return 0, w.streamResult + case w.writesChan <- cmd: + // flush command successfully delivered to sender. We no longer own cmd. + break } - return newr + + select { + case <-w.donec: + return 0, w.streamResult + case f := <-done: + return f, nil + } +} + +func (w *gRPCWriter) Close() error { + w.CloseWithError(nil) + return w.streamResult } -type flushResult struct { - err error - offset int64 +func (w *gRPCWriter) CloseWithError(err error) error { + // N.B. CloseWithError always returns nil! + select { + case <-w.donec: + return nil + case w.writesChan <- &gRPCWriterCommandClose{err: err}: + break + } + <-w.donec + return nil } -type gRPCInternalWriter struct { - flushSupported bool - flushInProgress bool +func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (internalWriter, error) { + if params.attrs.Retention != nil { + // TO-DO: remove once ObjectRetention is available - see b/308194853 + return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC") + } + + spec := &storagepb.WriteObjectSpec{ + Resource: params.attrs.toProtoObject(params.bucket), + Appendable: proto.Bool(params.append), + } + // WriteObject doesn't support the generation condition, so use default. + if err := applyCondsProto("WriteObject", defaultGen, params.conds, spec); err != nil { + return nil, err + } - pw *io.PipeWriter + s := callSettings(c.settings, opts...) - flushComplete chan flushResult -} + if s.retry == nil { + s.retry = defaultRetry.clone() + } + if params.append { + s.retry = withBidiWriteObjectRedirectionErrorRetries(s) + } + + chunkRetryDeadline := defaultWriteChunkRetryDeadline + if params.chunkRetryDeadline != 0 { + chunkRetryDeadline = params.chunkRetryDeadline + } + + ctx := params.ctx + if s.userProject != "" { + ctx = setUserProjectMetadata(ctx, s.userProject) + } + + chunkSize := gRPCChunkSize(params.chunkSize) + writeQuantum := maxPerMessageWriteSize + if writeQuantum > chunkSize { + writeQuantum = chunkSize + } + sendableUnits := chunkSize / writeQuantum + // There's no strict requirement that the chunk size be an exact multiple of + // the writeQuantum. In that case, there will be a tail segment of less than + // writeQuantum. + lastSegmentStart := sendableUnits * writeQuantum + if lastSegmentStart < chunkSize { + sendableUnits++ + } + + if params.append && params.appendGen >= 0 && params.setTakeoverOffset == nil { + return nil, errors.New("storage: no way to report offset for appendable takeover") + } + + w := &gRPCWriter{ + preRunCtx: ctx, + c: c, + settings: s, + + bucket: params.bucket, + attrs: params.attrs, + conds: params.conds, + spec: spec, + encryptionKey: params.encryptionKey, -func (giw *gRPCInternalWriter) Flush() (int64, error) { - if !giw.flushSupported { - return 0, errors.New("Flush is supported only if Writer.Append is set to true") + setError: params.setError, + progress: params.progress, + setObj: params.setObj, + setSize: params.setSize, + setTakeoverOffset: params.setTakeoverOffset, + + flushSupported: params.append, + sendCRC32C: params.sendCRC32C, + forceOneShot: params.chunkSize <= 0, + forceEmptyContentType: params.forceEmptyContentType, + append: params.append, + appendGen: params.appendGen, + finalizeOnClose: params.finalizeOnClose, + + buf: make([]byte, 0, chunkSize), + writeQuantum: writeQuantum, + lastSegmentStart: lastSegmentStart, + sendableUnits: sendableUnits, + bufUnsentIdx: 0, + bufFlushedIdx: -1, // Handle flushes to length 0 + bufBaseOffset: 0, + + chunkRetryDeadline: chunkRetryDeadline, + abandonRetriesTime: time.Time{}, + attempts: 0, + lastErr: nil, + streamSender: nil, + + writesChan: make(chan gRPCWriterCommand, 1), + currentCommand: nil, + streamResult: nil, + donec: params.donec, } - giw.flushInProgress = true - giw.pw.Close() + go func() { + if err := w.gatherFirstBuffer(); err != nil { + w.streamResult = err + w.setError(err) + close(w.donec) + return + } + + if w.attrs.ContentType == "" && !w.forceEmptyContentType { + w.spec.Resource.ContentType = w.detectContentType() + } + w.streamSender = w.pickBufferSender() + + w.streamResult = checkCanceled(run(w.preRunCtx, func(ctx context.Context) error { + w.lastErr = w.writeLoop(ctx) + return w.lastErr + }, w.settings.retry, w.settings.idempotent)) + w.setError(w.streamResult) + close(w.donec) + }() - // Return the offset based on flushComplete. - r := <-giw.flushComplete - return r.offset, r.err + return w, nil } -// Forward other methods to *io.PipeWriter -func (giw *gRPCInternalWriter) Write(p []byte) (int, error) { - return giw.pw.Write(p) +// gRPCWriter is a wrapper around the the gRPC client-stream API that manages +// sending chunks of data provided by the user over the stream. +type gRPCWriter struct { + preRunCtx context.Context + c *grpcStorageClient + settings *settings + + bucket string + attrs *ObjectAttrs + conds *Conditions + spec *storagepb.WriteObjectSpec + encryptionKey []byte + + setError func(error) + progress func(int64) + setObj func(*ObjectAttrs) + setSize func(int64) + setTakeoverOffset func(int64) + + flushSupported bool + sendCRC32C bool + forceOneShot bool + forceEmptyContentType bool + append bool + appendGen int64 + finalizeOnClose bool + + buf []byte + // A writeQuantum is the largest quantity of data which can be sent to the + // service in a single message. + writeQuantum int + lastSegmentStart int + sendableUnits int + bufUnsentIdx int + bufFlushedIdx int + bufBaseOffset int64 + + chunkRetryDeadline time.Duration + abandonRetriesTime time.Time + attempts int + lastErr error + streamSender gRPCBidiWriteBufferSender + + // Communication from the user goroutine to the stream management goroutines + writesChan chan gRPCWriterCommand + currentCommand gRPCWriterCommand + forcedStreamResult error + streamResult error + donec chan struct{} } -func (giw *gRPCInternalWriter) Close() error { - return giw.pw.Close() +func (w *gRPCWriter) pickBufferSender() gRPCBidiWriteBufferSender { + if w.append { + // Appendable object semantics + if w.appendGen >= 0 { + return w.newGRPCAppendTakeoverWriteBufferSender() + } + return w.newGRPCAppendableObjectBufferSender() + } + if w.forceOneShot { + // One shot semantics - no progress reports + w.progress = func(int64) {} + return w.newGRPCOneshotBidiWriteBufferSender() + } + // Resumable write semantics + return w.newGRPCResumableBidiWriteBufferSender() } -func (giw *gRPCInternalWriter) CloseWithError(err error) error { - return giw.pw.CloseWithError(err) +// sendBufferToTarget uses cs to send slices of buf, which starts at baseOffset +// bytes into the object. Slices are sent until flushAt bytes have sent, in +// which case the final request is a flush, or until len(buf) < w.writeQuantum. +// +// handleCompletion is called for any completions that arrive during sends. +// +// Returns the last byte offset sent. Returns true if all desired requests were +// delivered, and false if cs.completions was closed before all requests could +// be delivered. +func (w *gRPCWriter) sendBufferToTarget(cs gRPCWriterCommandHandleChans, buf []byte, baseOffset int64, flushAt int, handleCompletion func(gRPCBidiWriteCompletion)) (int64, bool) { + sent := 0 + if len(buf) > flushAt { + buf = buf[:flushAt] + } + for len(buf) > 0 && (len(buf) >= w.writeQuantum || len(buf) >= flushAt-sent) { + q := w.writeQuantum + if flushAt-sent < w.writeQuantum { + q = flushAt - sent + } + req := gRPCBidiWriteRequest{ + buf: buf[:q], + offset: baseOffset + int64(sent), + flush: q == flushAt-sent, + } + if !cs.deliverRequestUnlessCompleted(req, handleCompletion) { + return baseOffset + int64(sent), false + } + buf = buf[q:] + sent += q + } + return baseOffset + int64(sent), true } -func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (internalWriter, error) { - var offset int64 - errorf := params.setError - setObj := params.setObj - pr, pw := io.Pipe() +func (w *gRPCWriter) handleCompletion(c gRPCBidiWriteCompletion) { + if c.resource != nil { + w.setObj(newObjectFromProto(c.resource)) + } - s := callSettings(c.settings, opts...) + // Already handled this completion + if c.flushOffset <= w.bufBaseOffset+int64(w.bufFlushedIdx) { + return + } - retryDeadline := defaultWriteChunkRetryDeadline - if params.chunkRetryDeadline != 0 { - retryDeadline = params.chunkRetryDeadline + w.bufFlushedIdx = int(c.flushOffset - w.bufBaseOffset) + if w.bufFlushedIdx >= len(w.buf) { + // We can clear w.buf + w.bufBaseOffset = c.flushOffset + w.bufUnsentIdx = 0 + w.bufFlushedIdx = 0 + w.buf = w.buf[:0] } - if s.retry == nil { - s.retry = defaultRetry.clone() + w.setSize(c.flushOffset) + w.progress(c.flushOffset) +} + +func (w *gRPCWriter) withCommandRetryDeadline(f func() error) error { + w.abandonRetriesTime = time.Now().Add(w.chunkRetryDeadline) + err := f() + if err == nil { + w.abandonRetriesTime = time.Time{} } - if params.append { - s.retry = withBidiWriteObjectRedirectionErrorRetries(s) + return err +} + +// Gather write commands before starting the actual write. Returns nil if the +// stream should be started, and an error otherwise. +func (w *gRPCWriter) gatherFirstBuffer() error { + if w.append && w.appendGen >= 0 { + // For takeovers, kick off the stream immediately since we need to know the + // takeover offset to issue writes. + return nil } - s.retry.maxRetryDuration = retryDeadline - gw, err := newGRPCWriter(c, s, params, pr, pr, pw) - if err != nil { - errorf(err) - pr.CloseWithError(err) - close(params.donec) - return nil, err + for cmd := range w.writesChan { + switch v := cmd.(type) { + case *gRPCWriterCommandWrite: + if len(w.buf)+len(v.p) <= cap(w.buf) { + // We have not started sending yet, and we can stage all data without + // starting a send. Compare against cap(w.buf) instead of + // w.writeQuantum: that way we can perform a oneshot upload for objects + // which fit in one chunk, even though we will cut the request into + // w.writeQuantum units when we do start sending. + origLen := len(w.buf) + w.buf = w.buf[:origLen+len(v.p)] + copy(w.buf[origLen:], v.p) + close(v.done) + } else { + // Too large. Handle it in writeLoop. + w.currentCommand = cmd + return nil + } + break + case *gRPCWriterCommandClose: + // If we get here, data (if any) fits in w.buf, so we can force oneshot. + w.forceOneShot = true + w.currentCommand = cmd + // No need to start sending if v.err is not nil. + return v.err + default: + // Have to start sending! + w.currentCommand = cmd + return nil + } } + // Nothing should ever close w.writesChan, so we should never get here + return errors.New("storage.Writer: unexpectedly closed w.writesChan") +} - var o *storagepb.Object +func (w *gRPCWriter) writeLoop(ctx context.Context) error { + w.attempts++ + // Return an error if we've been waiting for a single operation for too long. + if !w.abandonRetriesTime.IsZero() && time.Now().After(w.abandonRetriesTime) { + return fmt.Errorf("storage: retry deadline of %s reached after %v attempts; last error: %w", w.chunkRetryDeadline, w.attempts, w.lastErr) + } + // Allow each request in w.buf to be sent and result in a completion without + // blocking. + requests := make(chan gRPCBidiWriteRequest, w.sendableUnits) + completions := make(chan gRPCBidiWriteCompletion, w.sendableUnits) + // Only one request ack will be outstanding at a time. + requestAcks := make(chan struct{}, 1) + chcs := gRPCWriterCommandHandleChans{requests, requestAcks, completions} + bscs := gRPCBufSenderChans{requests, requestAcks, completions} + ctx, cancel := context.WithCancel(ctx) + defer cancel() + w.streamSender.connect(ctx, bscs, w.settings.gax...) + + // Send any full quantum in w.buf, possibly including a flush + if err := w.withCommandRetryDeadline(func() error { + sentOffset, ok := w.sendBufferToTarget(chcs, w.buf, w.bufBaseOffset, cap(w.buf), + w.handleCompletion) + if !ok { + return w.streamSender.err() + } + w.bufUnsentIdx = int(sentOffset - w.bufBaseOffset) + // We may have observed a completion that is after all of w.buf if we also + // have a write command in w.currentCommand which sent a flush, but failed + // before the completion could be delivered. + if w.bufUnsentIdx < 0 { + w.bufUnsentIdx = 0 + } + return nil + }); err != nil { + return err + } - // If we are taking over an appendable object, send the first message here - // to get the append offset. - if params.append && params.appendGen >= 0 { - // Create the buffer sender. This opens a stream and blocks until we - // get a response that tells us what offset to write from. - wbs, err := gw.newGRPCAppendTakeoverWriteBufferSender(params.ctx) - if err != nil { - return nil, fmt.Errorf("storage: creating buffer sender: %w", err) + err := func() error { + for { + if w.currentCommand != nil { + if err := w.withCommandRetryDeadline(func() error { + return w.currentCommand.handle(w, chcs) + }); err != nil { + return err + } + w.currentCommand = nil + } + select { + case c, ok := <-completions: + if !ok { + return w.streamSender.err() + } + w.handleCompletion(c) + case cmd, ok := <-w.writesChan: + if !ok { + // Nothing should ever close w.writesChan, so we should never get here + return errors.New("storage.Writer: unexpectedly closed w.writesChan") + } + w.currentCommand = cmd + } } - // Propagate append offset to caller and buffer sending logic below. - params.setTakeoverOffset(wbs.takeoverOffset) - offset = wbs.takeoverOffset - gw.streamSender = wbs - o = wbs.objResource - setObj(newObjectFromProto(o)) + }() + if err == nil { + err = errors.New("storage.Writer: unexpected nil error from write loop") + } + var closeErr *gRPCWriterCommandClose + if !errors.As(err, &closeErr) { + // Not a shutdown. + return err } - // This function reads the data sent to the pipe and sends sets of messages - // on the gRPC client-stream as the buffer is filled. - go func() { - err := func() error { - // Unless the user told us the content type, we have to determine it from - // the first read. - if params.attrs.ContentType == "" && !params.forceEmptyContentType { - gw.reader, gw.spec.Resource.ContentType = gax.DetermineContentType(gw.reader) + if closeErr.err == nil { + // Clean shutdown. Send any remaining tail. + req := gRPCBidiWriteRequest{ + buf: w.buf[w.bufUnsentIdx:], + offset: w.bufBaseOffset + int64(w.bufUnsentIdx), + flush: true, + finishWrite: true, + } + if err := w.withCommandRetryDeadline(func() error { + if !chcs.deliverRequestUnlessCompleted(req, w.handleCompletion) { + return w.streamSender.err() } + return nil + }); err != nil { + return err + } + } else { + // Unclean shutdown. Cancel the context so we clean up expeditiously. + cancel() + } - // Loop until there is an error or the Object has been finalized. - for { - // Note: This blocks until either the buffer is full or EOF is read. - recvd, doneReading, err := gw.read() - if err != nil { - return err - } + close(requests) + for c := range completions { + w.handleCompletion(c) + } + if closeErr.err == nil { + return w.streamSender.err() + } + return closeErr.err +} - uploadBuff := func(ctx context.Context) error { - obj, err := gw.uploadBuffer(ctx, recvd, offset, doneReading) - if obj != nil { - o = obj - setObj(newObjectFromProto(o)) - } - return err - } +// gRPCWriterCommandHandleChans contains the channels that a gRPCWriterCommand +// implementation must use to send requests and get notified of completions. +// Requests are delivered on a write-only channel, request acks and completions +// arrive on read-only channels. +type gRPCWriterCommandHandleChans struct { + requests chan<- gRPCBidiWriteRequest + requestAcks <-chan struct{} + completions <-chan gRPCBidiWriteCompletion +} - // Add routing headers to the context metadata for single-shot and resumable - // writes. Append writes need to set this at a lower level to pass the routing - // token. - bctx := gw.ctx - if !gw.append { - bctx = bucketContext(bctx, gw.bucket) - } - err = run(bctx, uploadBuff, gw.settings.retry, s.idempotent) - offset += int64(recvd) - // If this buffer upload was triggered by a flush, reset and - // communicate back the result. - if gw.iw.flushInProgress { - gw.setSize(offset) - gw.iw.flushInProgress = false - gw.iw.flushComplete <- flushResult{offset: offset, err: err} - } - if err != nil { - return err - } - // When we are done reading data without errors, set the object and - // finish. - if doneReading { - // Build Object from server's response. - setObj(newObjectFromProto(o)) - return nil - } +// gRPCBufSenderChans contains the channels that a gRPCBidiWriteBufferSender +// must use to get notified of requests and deliver completions. Requests arrive +// on a read-only channel, request acks and completions are delivered on +// write-only channels. +type gRPCBufSenderChans struct { + requests <-chan gRPCBidiWriteRequest + requestAcks chan<- struct{} + completions chan<- gRPCBidiWriteCompletion +} + +// deliverRequestUnlessCompleted submits req to cs.requests, unless +// cs.completions is closed first. If a completion arrives before the request is +// enqueued, handleCompletion is called. +// +// Returns true if request was successfully enqueued, and false if completions +// was closed first. +func (cs gRPCWriterCommandHandleChans) deliverRequestUnlessCompleted(req gRPCBidiWriteRequest, handleCompletion func(gRPCBidiWriteCompletion)) bool { + for { + select { + case cs.requests <- req: + return true + case c, ok := <-cs.completions: + if !ok { + return false } - }() + handleCompletion(c) + } + } +} - // These calls are still valid if err is nil - err = checkCanceled(err) - errorf(err) - gw.pr.CloseWithError(err) - close(params.donec) - }() +// gRPCWriterCommand represents an operation on a gRPCWriter +type gRPCWriterCommand interface { + // handle applies the command to a gRPCWriter. + // + // Implementations may return an error. In that case, the command may be + // retried with a new gRPCWriterCommandHandleChans instance. + handle(*gRPCWriter, gRPCWriterCommandHandleChans) error +} - return gw.iw, nil +type gRPCWriterCommandWrite struct { + p []byte + done chan struct{} } -func newGRPCWriter(c *grpcStorageClient, s *settings, params *openWriterParams, r io.Reader, pr *io.PipeReader, pw *io.PipeWriter) (*gRPCWriter, error) { - if params.attrs.Retention != nil { - // TO-DO: remove once ObjectRetention is available - see b/308194853 - return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC") +func (c *gRPCWriterCommandWrite) handle(w *gRPCWriter, cs gRPCWriterCommandHandleChans) error { + if len(c.p) == 0 { + // No data to write. + close(c.done) + return nil } - size := googleapi.MinUploadChunkSize - // A completely bufferless upload (params.chunkSize <= 0) is not possible in - // gRPC because the buffer must be provided to the message. Use the minimum - // size possible. - if params.chunkSize > 0 { - size = params.chunkSize + wblen := len(w.buf) + allKnownBytes := wblen + len(c.p) + fullBufs := allKnownBytes / cap(w.buf) + partialBuf := allKnownBytes % cap(w.buf) + if partialBuf == 0 { + // If we would exactly fill some number of cap(w.buf) units, we don't need + // to block on the flush for the last one. We know that c.p is not empty, so + // allKnownBytes is not 0 and therefore if partialBuf is 0, fullBufs is not + // 0. + fullBufs-- + partialBuf = cap(w.buf) } - // Round up chunksize to nearest 256KiB - if size%googleapi.MinUploadChunkSize != 0 { - size += googleapi.MinUploadChunkSize - (size % googleapi.MinUploadChunkSize) + if fullBufs == 0 { + // Everything fits in w.buf. Copy in and send from there. + w.buf = w.buf[:allKnownBytes] + copied := copy(w.buf[wblen:], c.p) + // Now that it's in w.buf, clear it from the command in case we retry. + c.p = c.p[copied:] + sending := w.buf[w.bufUnsentIdx:] + sentOffset, ok := w.sendBufferToTarget(cs, sending, w.bufBaseOffset+int64(w.bufUnsentIdx), cap(sending), + w.handleCompletion) + if !ok { + return w.streamSender.err() + } + w.bufUnsentIdx = int(sentOffset - w.bufBaseOffset) + close(c.done) + return nil } - if s.userProject != "" { - params.ctx = setUserProjectMetadata(params.ctx, s.userProject) + // We have at least one full buffer, followed by a partial. The first full + // buffer is the interesting one. We don't actually have to copy all of c.p + // in: we can send from it in place, except for any partial quantum at the + // tail of w.buf. Send that quantum... + toNextWriteQuantum := func() int { + if wblen > w.lastSegmentStart { + return cap(w.buf) - wblen + } + if wblen%w.writeQuantum == 0 { + return 0 + } + return w.writeQuantum - (wblen % w.writeQuantum) + }() + w.buf = w.buf[:wblen+toNextWriteQuantum] + copied := copy(w.buf[wblen:], c.p) + c.p = c.p[copied:] + firstFullBufFromCmd := cap(w.buf) - len(w.buf) + + sending := w.buf[w.bufUnsentIdx:] + sentOffset, ok := w.sendBufferToTarget(cs, sending, w.bufBaseOffset+int64(w.bufUnsentIdx), cap(sending), + w.handleCompletion) + if !ok { + return w.streamSender.err() } - spec := &storagepb.WriteObjectSpec{ - Resource: params.attrs.toProtoObject(params.bucket), - Appendable: proto.Bool(params.append), + // ...then send the prefix of c.p which could fill w.buf + cmdBaseOffset := w.bufBaseOffset + int64(len(w.buf)) + cmdBuf := c.p + trimCommandBuf := func(cmp gRPCBidiWriteCompletion) { + w.handleCompletion(cmp) + // After a completion, keep c.p up to date with w.buf's tail. + bufTail := w.bufBaseOffset + int64(len(w.buf)) + if bufTail <= cmdBaseOffset { + return + } + trim := int(bufTail - cmdBaseOffset) + if len(c.p) < trim { + trim = len(c.p) + } + c.p = c.p[trim:] + cmdBaseOffset = bufTail + } + offset := cmdBaseOffset + sentOffset, ok = w.sendBufferToTarget(cs, cmdBuf, offset, firstFullBufFromCmd, + trimCommandBuf) + if !ok { + return w.streamSender.err() } - var appendSpec *storagepb.AppendObjectSpec - if params.append && params.appendGen >= 0 { - appendSpec = &storagepb.AppendObjectSpec{ - Bucket: bucketResourceName(globalProjectAlias, params.bucket), - Object: params.attrs.Name, - Generation: params.appendGen, + cmdBuf = cmdBuf[int(sentOffset-offset):] + offset = sentOffset + + // Remaining full buffers can be satisfied entirely from cmdBuf with no copies. + for i := 0; i < fullBufs-1; i++ { + sentOffset, ok = w.sendBufferToTarget(cs, cmdBuf, offset, cap(w.buf), + trimCommandBuf) + if !ok { + return w.streamSender.err() } + cmdBuf = cmdBuf[int(sentOffset-offset):] + offset = sentOffset } - // WriteObject doesn't support the generation condition, so use default. - if err := applyCondsProto("WriteObject", defaultGen, params.conds, spec); err != nil { - return nil, err + + // Send the last partial buffer. We need to flush to offset before we can copy + // the rest of cmdBuf into w.buf and complete this command. + sentOffset, ok = w.sendBufferToTarget(cs, cmdBuf, offset, cap(w.buf), + trimCommandBuf) + if !ok { + return w.streamSender.err() + } + // Finally, we need the sender to ack to let us know c.p can be released. + if !cs.deliverRequestUnlessCompleted(gRPCBidiWriteRequest{requestAck: true}, trimCommandBuf) { + return w.streamSender.err() } + ackOutstanding := true + for ackOutstanding || (w.bufBaseOffset+int64(w.bufFlushedIdx)) < offset { + select { + case cmp, ok := <-cs.completions: + if !ok { + return w.streamSender.err() + } + trimCommandBuf(cmp) + case <-cs.requestAcks: + ackOutstanding = false + } + } + toCopyIn := cmdBuf[int(w.bufBaseOffset-offset):] + w.buf = w.buf[:len(toCopyIn)] + copy(w.buf, toCopyIn) + w.bufUnsentIdx = int(sentOffset - w.bufBaseOffset) + close(c.done) + return nil +} - return &gRPCWriter{ - buf: make([]byte, size), - c: c, - ctx: params.ctx, - reader: r, - pr: pr, - iw: &gRPCInternalWriter{ - flushSupported: params.append, - flushInProgress: false, - pw: pw, - flushComplete: make(chan flushResult), - }, - bucket: params.bucket, - attrs: params.attrs, - conds: params.conds, - spec: spec, - appendSpec: appendSpec, - encryptionKey: params.encryptionKey, - settings: s, - progress: params.progress, - setSize: params.setSize, - sendCRC32C: params.sendCRC32C, - forceOneShot: params.chunkSize <= 0, - forceEmptyContentType: params.forceEmptyContentType, - append: params.append, - finalizeOnClose: params.finalizeOnClose, - }, nil +type gRPCWriterCommandFlush struct { + done chan int64 } -// gRPCWriter is a wrapper around the the gRPC client-stream API that manages -// sending chunks of data provided by the user over the stream. -type gRPCWriter struct { - c *grpcStorageClient - buf []byte - reader io.Reader - pr *io.PipeReader // Keep track of pr to update post-flush - iw *gRPCInternalWriter +func (c *gRPCWriterCommandFlush) handle(w *gRPCWriter, cs gRPCWriterCommandHandleChans) error { + flushTarget := w.bufBaseOffset + int64(len(w.buf)) + // We know that there are at most w.writeQuantum bytes in + // w.buf[w.bufUnsentIdx:], because we send anything more inline when handling + // a write. + req := gRPCBidiWriteRequest{ + buf: w.buf[w.bufUnsentIdx:], + offset: w.bufBaseOffset + int64(w.bufUnsentIdx), + flush: true, + finishWrite: false, + } + if !cs.deliverRequestUnlessCompleted(req, w.handleCompletion) { + return w.streamSender.err() + } + // Successful flushes will clear w.buf. + for (w.bufBaseOffset + int64(w.bufFlushedIdx)) < flushTarget { + c, ok := <-cs.completions + if !ok { + // Stream failure + return w.streamSender.err() + } + w.handleCompletion(c) + } + // handleCompletion has cleared w.buf and updated w.bufUnsentIdx by now. + c.done <- flushTarget + return nil +} - ctx context.Context +type gRPCWriterCommandClose struct { + err error +} - bucket string - attrs *ObjectAttrs - conds *Conditions - spec *storagepb.WriteObjectSpec - appendSpec *storagepb.AppendObjectSpec - encryptionKey []byte - settings *settings - progress func(int64) - setSize func(int64) +func (e *gRPCWriterCommandClose) Error() string { + return e.err.Error() +} - sendCRC32C bool - forceOneShot bool - forceEmptyContentType bool - append bool - finalizeOnClose bool +func (c *gRPCWriterCommandClose) handle(w *gRPCWriter, cs gRPCWriterCommandHandleChans) error { + // N.B. c is not nil, even if c.err is nil! + return c +} + +// Detect content type using bytes first from baseBuf, then from pendingBuf if +// there are not enough bytes in baseBuf. +func (w *gRPCWriter) detectContentType() string { + wblen := len(w.buf) + // If the current command is a write, we want to be able to update it in + // place. If the + cmdbuf := &([]byte{}) + if c, ok := w.currentCommand.(*gRPCWriterCommandWrite); ok { + cmdbuf = &c.p + } + if wblen == 0 { + // Use the command in place + return http.DetectContentType(*cmdbuf) + } + if wblen >= w.writeQuantum { + // Use w.buf in place + return http.DetectContentType(w.buf) + } - streamSender gRPCBidiWriteBufferSender + // We need to put bytes from the command onto w.buf. Try to fill a + // writeQuantum since we'll have to do that in order to send, anyway. + newSz := w.writeQuantum + if wblen+len(*cmdbuf) < newSz { + newSz = wblen + len(*cmdbuf) + } + w.buf = w.buf[:newSz] + copied := copy(w.buf[wblen:], *cmdbuf) + *cmdbuf = (*cmdbuf)[copied:] + return http.DetectContentType(w.buf) } -func bucketContext(ctx context.Context, bucket string) context.Context { - hds := []string{"x-goog-request-params", fmt.Sprintf("bucket=projects/_/buckets/%s", url.QueryEscape(bucket))} - return gax.InsertMetadataIntoOutgoingContext(ctx, hds...) +type gRPCBidiWriteRequest struct { + buf []byte + offset int64 + flush bool + finishWrite bool + // If requestAck is true, no other message fields may be set. Buffer senders + // must ack on the requestAcks channel if all prior messages on the requests + // channel have been delivered to gRPC. + requestAck bool } -// drainInboundStream calls stream.Recv() repeatedly until an error is returned. -// It returns the last Resource received on the stream, or nil if no Resource -// was returned. drainInboundStream always returns a non-nil error. io.EOF -// indicates all messages were successfully read. -func drainInboundStream(stream storagepb.Storage_BidiWriteObjectClient) (object *storagepb.Object, err error) { - for err == nil { - var resp *storagepb.BidiWriteObjectResponse - resp, err = stream.Recv() - // GetResource() returns nil on a nil response - if resp.GetResource() != nil { - object = resp.GetResource() - } +type gRPCBidiWriteCompletion struct { + flushOffset int64 + resource *storagepb.Object +} + +func completion(r *storagepb.BidiWriteObjectResponse) *gRPCBidiWriteCompletion { + switch c := r.WriteStatus.(type) { + case *storagepb.BidiWriteObjectResponse_PersistedSize: + return &gRPCBidiWriteCompletion{flushOffset: c.PersistedSize} + case *storagepb.BidiWriteObjectResponse_Resource: + return &gRPCBidiWriteCompletion{flushOffset: c.Resource.GetSize(), resource: c.Resource} + default: + return nil } - return object, err } func bidiWriteObjectRequest(buf []byte, offset int64, flush, finishWrite bool) *storagepb.BidiWriteObjectRequest { @@ -369,464 +805,448 @@ func bidiWriteObjectRequest(buf []byte, offset int64, flush, finishWrite bool) * } type gRPCBidiWriteBufferSender interface { - // sendBuffer implementations should upload buf, respecting flush and - // finishWrite. Callers must guarantee that buf is not too long to fit in a - // gRPC message. + // connect implementations may attempt to establish a connection for issuing + // writes. + // + // In case of an error, implementations must close the completion channel. The + // write loop will inspect err() after that channel is closed and before any + // subsequent calls to connect(). // - // If flush is true, implementations must not return until the data in buf is - // stable. If finishWrite is true, implementations must return the object on - // success. - sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (*storagepb.Object, error) + // If a request is delivered with flush true, implementations must request + // that the service make the data stable. If a request is delivered with + // finishWrite true, no subsequent messages will be delivered on the channel, + // and implementations must attempt to tear down the connection cleanly after + // sending the request. In both cases, the write loop will stall unless the + // completion channel is closed or receives a completion indicating that + // offset+len(buf) is persisted. + connect(context.Context, gRPCBufSenderChans, ...gax.CallOption) + + // err implementations must return the error on the stream. err() must be safe + // to call after the completion channel provided to connect() is closed. The + // write loop will not make concurrent calls to connect() and err(). + err() error } type gRPCOneshotBidiWriteBufferSender struct { - firstMessage *storagepb.BidiWriteObjectRequest raw *gapic.Client - stream storagepb.Storage_BidiWriteObjectClient - settings *settings + bucket string + firstMessage *storagepb.BidiWriteObjectRequest + streamErr error } -func (w *gRPCWriter) newGRPCOneshotBidiWriteBufferSender() (*gRPCOneshotBidiWriteBufferSender, error) { - firstMessage := &storagepb.BidiWriteObjectRequest{ - FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{ - WriteObjectSpec: w.spec, +func (w *gRPCWriter) newGRPCOneshotBidiWriteBufferSender() *gRPCOneshotBidiWriteBufferSender { + return &gRPCOneshotBidiWriteBufferSender{ + raw: w.c.raw, + bucket: w.bucket, + firstMessage: &storagepb.BidiWriteObjectRequest{ + FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{ + WriteObjectSpec: w.spec, + }, + CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), + // For a non-resumable upload, checksums must be sent in this message. + // TODO: Currently the checksums are only sent on the first message + // of the stream, but in the future, we must also support sending it + // on the *last* message of the stream (instead of the first). + ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), }, - CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), - // For a non-resumable upload, checksums must be sent in this message. - // TODO: Currently the checksums are only sent on the first message - // of the stream, but in the future, we must also support sending it - // on the *last* message of the stream (instead of the first). - ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), } - - return &gRPCOneshotBidiWriteBufferSender{ - firstMessage: firstMessage, - raw: w.c.raw, - settings: w.settings, - }, nil } -func (s *gRPCOneshotBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) { - var firstMessage *storagepb.BidiWriteObjectRequest - if s.stream == nil { - s.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...) - if err != nil { - return +func (s *gRPCOneshotBidiWriteBufferSender) err() error { return s.streamErr } + +// drainInboundStream calls stream.Recv() repeatedly until an error is returned. +// It returns the last Resource received on the stream, or nil if no Resource +// was returned. drainInboundStream always returns a non-nil error. io.EOF +// indicates all messages were successfully read. +func drainInboundStream(stream storagepb.Storage_BidiWriteObjectClient) (object *storagepb.Object, err error) { + for err == nil { + var resp *storagepb.BidiWriteObjectResponse + resp, err = stream.Recv() + // GetResource() returns nil on a nil response + if resp.GetResource() != nil { + object = resp.GetResource() } - firstMessage = s.firstMessage - } - req := bidiWriteObjectRequest(buf, offset, flush, finishWrite) - if firstMessage != nil { - proto.Merge(req, firstMessage) } + return object, err +} - sendErr := s.stream.Send(req) - if sendErr != nil { - obj, err = drainInboundStream(s.stream) - s.stream = nil - if sendErr != io.EOF { - err = sendErr - } +func (s *gRPCOneshotBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) { + s.streamErr = nil + ctx = gRPCWriteRequestParams{bucket: s.bucket}.apply(ctx) + stream, err := s.raw.BidiWriteObject(ctx, opts...) + if err != nil { + s.streamErr = err + close(cs.completions) return } - // Oneshot uploads assume all flushes succeed - if finishWrite { - s.stream.CloseSend() - // Oneshot uploads only read from the response stream on completion or - // failure - obj, err = drainInboundStream(s.stream) - s.stream = nil - if err == io.EOF { - err = nil + go func() { + firstSend := true + for r := range cs.requests { + if r.requestAck { + cs.requestAcks <- struct{}{} + continue + } + + req := bidiWriteObjectRequest(r.buf, r.offset, r.flush, r.finishWrite) + if firstSend { + proto.Merge(req, s.firstMessage) + firstSend = false + } + + if err := stream.Send(req); err != nil { + _, s.streamErr = drainInboundStream(stream) + if err != io.EOF { + s.streamErr = err + } + close(cs.completions) + return + } + + if r.finishWrite { + stream.CloseSend() + // Oneshot uploads only read from the response stream on completion or + // failure + obj, err := drainInboundStream(stream) + if obj == nil || err != io.EOF { + s.streamErr = err + } else { + cs.completions <- gRPCBidiWriteCompletion{flushOffset: obj.GetSize(), resource: obj} + } + close(cs.completions) + return + } + + // Oneshot uploads assume all flushes succeed + if r.flush { + cs.completions <- gRPCBidiWriteCompletion{flushOffset: r.offset + int64(len(r.buf))} + } } - } - return + }() } type gRPCResumableBidiWriteBufferSender struct { - queryRetry *retryConfig - upid string - progress func(int64) - raw *gapic.Client - forceFirstMessage bool - stream storagepb.Storage_BidiWriteObjectClient - flushOffset int64 - settings *settings -} - -func (w *gRPCWriter) newGRPCResumableBidiWriteBufferSender(ctx context.Context) (*gRPCResumableBidiWriteBufferSender, error) { - req := &storagepb.StartResumableWriteRequest{ - WriteObjectSpec: w.spec, - CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), - // TODO: Currently the checksums are only sent on the request to initialize - // the upload, but in the future, we must also support sending it - // on the *last* message of the stream. - ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), - } + raw *gapic.Client + bucket string - var upid string - err := run(ctx, func(ctx context.Context) error { - upres, err := w.c.raw.StartResumableWrite(ctx, req, w.settings.gax...) - upid = upres.GetUploadId() - return err - }, w.settings.retry, w.settings.idempotent) - if err != nil { - return nil, err - } + startWriteRequest *storagepb.StartResumableWriteRequest + upid string - // Set up an initial connection for the 0 offset, so we don't query state - // unnecessarily for the first buffer. If we fail, we'll just retry in the - // normal connect path. - stream, err := w.c.raw.BidiWriteObject(ctx, w.settings.gax...) - if err != nil { - stream = nil - } + streamErr error +} +func (w *gRPCWriter) newGRPCResumableBidiWriteBufferSender() *gRPCResumableBidiWriteBufferSender { return &gRPCResumableBidiWriteBufferSender{ - queryRetry: w.settings.retry, - upid: upid, - progress: w.progress, - raw: w.c.raw, - forceFirstMessage: true, - stream: stream, - settings: w.settings, - }, nil + raw: w.c.raw, + bucket: w.bucket, + startWriteRequest: &storagepb.StartResumableWriteRequest{ + WriteObjectSpec: w.spec, + CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), + // TODO: Currently the checksums are only sent on the request to initialize + // the upload, but in the future, we must also support sending it + // on the *last* message of the stream. + ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), + }, + } } -// queryProgress is a helper that queries the status of the resumable upload -// associated with the given upload ID. -func (s *gRPCResumableBidiWriteBufferSender) queryProgress(ctx context.Context) (int64, error) { - var persistedSize int64 - err := run(ctx, func(ctx context.Context) error { - q, err := s.raw.QueryWriteStatus(ctx, &storagepb.QueryWriteStatusRequest{ - UploadId: s.upid, - }, s.settings.gax...) - // q.GetPersistedSize() will return 0 if q is nil. - persistedSize = q.GetPersistedSize() - return err - }, s.queryRetry, true) +func (s *gRPCResumableBidiWriteBufferSender) err() error { return s.streamErr } - return persistedSize, err -} +func (s *gRPCResumableBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) { + s.streamErr = nil + ctx = gRPCWriteRequestParams{bucket: s.bucket}.apply(ctx) -func (s *gRPCResumableBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) { - if s.stream == nil { - // Determine offset and reconnect - s.flushOffset, err = s.queryProgress(ctx) + if s.startWriteRequest != nil { + upres, err := s.raw.StartResumableWrite(ctx, s.startWriteRequest, opts...) if err != nil { + s.streamErr = err + close(cs.completions) return } - s.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...) + s.upid = upres.GetUploadId() + s.startWriteRequest = nil + } else { + q, err := s.raw.QueryWriteStatus(ctx, &storagepb.QueryWriteStatusRequest{UploadId: s.upid}, opts...) if err != nil { + s.streamErr = err + close(cs.completions) return } - s.forceFirstMessage = true - } - - // clean up buf. We'll still write the message if a flush/finishWrite was - // requested. - if offset < s.flushOffset { - trim := s.flushOffset - offset - if int64(len(buf)) <= trim { - trim = int64(len(buf)) - } - buf = buf[trim:] - offset += trim - } - if len(buf) == 0 && !flush && !finishWrite { - // no need to send anything - return nil, nil - } - - req := bidiWriteObjectRequest(buf, offset, flush, finishWrite) - if s.forceFirstMessage { - req.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: s.upid} - s.forceFirstMessage = false - } - - sendErr := s.stream.Send(req) - if sendErr != nil { - obj, err = drainInboundStream(s.stream) - s.stream = nil - if err == io.EOF { - // This is unexpected - we got an error on Send(), but not on Recv(). - // Bubble up the sendErr. - err = sendErr - } - return + cs.completions <- gRPCBidiWriteCompletion{flushOffset: q.GetPersistedSize()} } - if finishWrite { - s.stream.CloseSend() - obj, err = drainInboundStream(s.stream) - s.stream = nil - if err == io.EOF { - err = nil - if obj.GetSize() > s.flushOffset { - s.progress(obj.GetSize()) - } - } + stream, err := s.raw.BidiWriteObject(ctx, opts...) + if err != nil { + s.streamErr = err + close(cs.completions) return } - if flush { - resp, err := s.stream.Recv() - if err != nil { - return nil, err - } - persistedOffset := resp.GetPersistedSize() - if persistedOffset > s.flushOffset { - s.flushOffset = persistedOffset - s.progress(s.flushOffset) - } - } - return -} + go func() { + var sendErr, recvErr error + sendDone := make(chan struct{}) + recvDone := make(chan struct{}) + + go func() { + sendErr = func() error { + firstSend := true + for { + select { + case <-recvDone: + // Because `requests` is not connected to the gRPC machinery, we + // have to check for asynchronous termination on the receive side. + return nil + case r, ok := <-cs.requests: + if !ok { + stream.CloseSend() + return nil + } + if r.requestAck { + cs.requestAcks <- struct{}{} + continue + } + req := bidiWriteObjectRequest(r.buf, r.offset, r.flush, r.finishWrite) + if firstSend { + req.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: s.upid} + firstSend = false + } + if err := stream.Send(req); err != nil { + return err + } + if r.finishWrite { + stream.CloseSend() + return nil + } + } + } + }() + close(sendDone) + }() -// uploadBuffer uploads the buffer at the given offset using a bi-directional -// Write stream. It will open a new stream if necessary (on the first call or -// after resuming from failure) and chunk the buffer per maxPerMessageWriteSize. -// The final Object is returned on success if doneReading is true. -// -// Returns object and any error that is not retriable. -func (w *gRPCWriter) uploadBuffer(ctx context.Context, recvd int, start int64, doneReading bool) (obj *storagepb.Object, err error) { - if w.streamSender == nil { - if w.append { - // Appendable object semantics - w.streamSender, err = w.newGRPCAppendableObjectBufferSender() - } else if doneReading || w.forceOneShot { - // One shot semantics - w.streamSender, err = w.newGRPCOneshotBidiWriteBufferSender() - } else { - // Resumable write semantics - w.streamSender, err = w.newGRPCResumableBidiWriteBufferSender(ctx) - } - if err != nil { - return - } - } + go func() { + recvErr = func() error { + for { + resp, err := stream.Recv() + if err != nil { + return err + } + if c := completion(resp); c != nil { + cs.completions <- *c + } + } + }() + close(recvDone) + }() - data := w.buf[:recvd] - offset := start - // We want to go through this loop at least once, in case we have to - // finishWrite with an empty buffer. - for { - // Send as much as we can fit into a single gRPC message. Only flush once, - // when sending the very last message. - l := maxPerMessageWriteSize - flush := false - if len(data) <= l { - l = len(data) - flush = true + <-sendDone + <-recvDone + // Prefer recvErr since that's where RPC errors are delivered + if recvErr != nil { + s.streamErr = recvErr + } else if sendErr != nil { + s.streamErr = sendErr } - obj, err = w.streamSender.sendBuffer(ctx, data[:l], offset, flush, flush && doneReading) - if err != nil { - return nil, err - } - data = data[l:] - offset += int64(l) - if len(data) == 0 { - // Update object size to match persisted offset. - if obj != nil { - obj.Size = offset - } - break - } - } - return -} - -// read copies the data in the reader to the given buffer and reports how much -// data was read into the buffer and if there is no more data to read (EOF). -// read returns when either 1. the buffer is full, 2. Writer.Flush was called, -// or 3. Writer.Close was called. -func (w *gRPCWriter) read() (int, bool, error) { - // Set n to -1 to start the Read loop. - var n, recvd int = -1, 0 - var err error - for err == nil && n != 0 { - // The routine blocks here until data is received. - n, err = w.reader.Read(w.buf[recvd:]) - recvd += n - } - var done bool - if err == io.EOF { - err = nil - // EOF can come from Writer.Flush or Writer.Close. - if w.iw.flushInProgress { - // Reset pipe for additional writes after the flush. - pr, pw := io.Pipe() - w.reader = pr - w.pr = pr - w.iw.pw = pw - } else { - done = true + if s.streamErr == io.EOF { + s.streamErr = nil } - } - return recvd, done, err + close(cs.completions) + }() } -func checkCanceled(err error) error { - if status.Code(err) == codes.Canceled { - return context.Canceled - } +type gRPCAppendBidiWriteBufferSender struct { + raw *gapic.Client + bucket string + routingToken *string - return err -} + firstMessage *storagepb.BidiWriteObjectRequest -type gRPCAppendBidiWriteBufferSender struct { - bucket string - routingToken *string - raw *gapic.Client - settings *settings - stream storagepb.Storage_BidiWriteObjectClient - firstMessage *storagepb.BidiWriteObjectRequest objectChecksums *storagepb.ObjectChecksums - finalizeOnClose bool + objResource *storagepb.Object - forceFirstMessage bool - progress func(int64) - flushOffset int64 - takeoverOffset int64 - objResource *storagepb.Object // Captures received obj to set w.Attrs. - - // Fields used to report responses from the receive side of the stream - // recvs is closed when the current recv goroutine is complete. recvErr is set - // to the result of that stream (including io.EOF to indicate success) - recvs <-chan *storagepb.BidiWriteObjectResponse - recvErr error + streamErr error } +func (s *gRPCAppendBidiWriteBufferSender) err() error { return s.streamErr } + // Use for a newly created appendable object. -func (w *gRPCWriter) newGRPCAppendableObjectBufferSender() (*gRPCAppendBidiWriteBufferSender, error) { - s := &gRPCAppendBidiWriteBufferSender{ - bucket: w.spec.GetResource().GetBucket(), - raw: w.c.raw, - settings: w.settings, +func (w *gRPCWriter) newGRPCAppendableObjectBufferSender() *gRPCAppendBidiWriteBufferSender { + return &gRPCAppendBidiWriteBufferSender{ + raw: w.c.raw, + bucket: w.bucket, firstMessage: &storagepb.BidiWriteObjectRequest{ FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{ WriteObjectSpec: w.spec, }, CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), }, - objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), - finalizeOnClose: w.finalizeOnClose, - forceFirstMessage: true, - progress: w.progress, - flushOffset: -1, // We should ack flushes to length 0. + objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), + finalizeOnClose: w.finalizeOnClose, } - return s, nil } -// Use for a takeover of an appendable object. -// Unlike newGRPCAppendableObjectBufferSender, this blocks until the stream is -// open because it needs to get the append offset from the server. -func (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender(ctx context.Context) (*gRPCAppendBidiWriteBufferSender, error) { - s := &gRPCAppendBidiWriteBufferSender{ - bucket: w.spec.GetResource().GetBucket(), - raw: w.c.raw, - settings: w.settings, - firstMessage: &storagepb.BidiWriteObjectRequest{ - FirstMessage: &storagepb.BidiWriteObjectRequest_AppendObjectSpec{ - AppendObjectSpec: w.appendSpec, - }, - }, - objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), - finalizeOnClose: w.finalizeOnClose, - forceFirstMessage: true, - progress: w.progress, - } - if err := s.connect(ctx); err != nil { - return nil, fmt.Errorf("storage: opening appendable write stream: %w", err) - } - _, err := s.sendOnConnectedStream(nil, 0, false, false, true) +func (s *gRPCAppendBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) { + s.streamErr = nil + ctx = gRPCWriteRequestParams{appendable: true, bucket: s.bucket, routingToken: s.routingToken}.apply(ctx) + + stream, err := s.raw.BidiWriteObject(ctx, opts...) if err != nil { - return nil, err - } - firstResp := <-s.recvs - // Check recvErr after getting the response. - if s.recvErr != nil { - return nil, s.recvErr + s.streamErr = err + close(cs.completions) + return } - // Object resource is returned in the first response on takeover, so capture - // this now. - s.objResource = firstResp.GetResource() - s.takeoverOffset = firstResp.GetResource().GetSize() - return s, nil + go s.handleStream(stream, cs, true) } -func (s *gRPCAppendBidiWriteBufferSender) connect(ctx context.Context) (err error) { - err = func() error { - // If this is a forced first message, we've already determined it's safe to - // send. - if s.forceFirstMessage { - s.forceFirstMessage = false - return nil - } - - // It's always ok to reconnect if there is a handle. This is the common - // case. - if s.firstMessage.GetAppendObjectSpec().GetWriteHandle() != nil { - return nil - } - // Also always okay to reconnect if there is a generation. - if s.firstMessage.GetAppendObjectSpec().GetGeneration() != 0 { - return nil - } - // Also always ok to reconnect if we've seen a redirect token - if s.routingToken != nil { - return nil - } - - // We can also reconnect if the first message has an if_generation_match or - // if_metageneration_match condition. Note that negative conditions like - // if_generation_not_match are not necessarily safe to retry. - aos := s.firstMessage.GetAppendObjectSpec() - wos := s.firstMessage.GetWriteObjectSpec() +func (s *gRPCAppendBidiWriteBufferSender) handleStream(stream storagepb.Storage_BidiWriteObjectClient, cs gRPCBufSenderChans, firstSend bool) { + var sendErr, recvErr error + sendDone := make(chan struct{}) + recvDone := make(chan struct{}) - if aos != nil && aos.IfMetagenerationMatch != nil { - return nil - } + go func() { + sendErr = func() error { + for { + select { + case <-recvDone: + // Because `requests` is not connected to the gRPC machinery, we + // have to check for asynchronous termination on the receive side. + return nil + case r, ok := <-cs.requests: + if !ok { + stream.CloseSend() + return nil + } + if r.requestAck { + cs.requestAcks <- struct{}{} + continue + } + err := s.send(stream, r.buf, r.offset, r.flush, r.finishWrite, firstSend) + firstSend = false + if err != nil { + return err + } + if r.finishWrite { + stream.CloseSend() + return nil + } + } + } + }() + close(sendDone) + }() - if wos != nil && wos.IfGenerationMatch != nil { - return nil - } - if wos != nil && wos.IfMetagenerationMatch != nil { - return nil - } + go func() { + recvErr = func() error { + for { + resp, err := stream.Recv() + if err != nil { + return s.maybeHandleRedirectionError(err) + } + s.maybeUpdateFirstMessage(resp) - // Otherwise, it is not safe to reconnect. - return errors.New("cannot safely reconnect; no write handle or preconditions") + if c := completion(resp); c != nil { + cs.completions <- *c + } + } + }() + close(recvDone) }() - if err != nil { - return err + + <-sendDone + <-recvDone + // Prefer recvErr since that's where RPC errors are delivered + if recvErr != nil { + s.streamErr = recvErr + } else if sendErr != nil { + s.streamErr = sendErr + } + if s.streamErr == io.EOF { + s.streamErr = nil } + close(cs.completions) +} + +type gRPCAppendTakeoverBidiWriteBufferSender struct { + gRPCAppendBidiWriteBufferSender + takeoverReported bool + handleTakeoverCompletion func(gRPCBidiWriteCompletion) +} - return s.startReceiver(ctx) +func writeObjectSpecAsAppendObjectSpec(s *storagepb.WriteObjectSpec, gen int64) *storagepb.AppendObjectSpec { + return &storagepb.AppendObjectSpec{ + Bucket: s.GetResource().GetBucket(), + Object: s.GetResource().GetName(), + Generation: gen, + IfMetagenerationMatch: s.IfMetagenerationMatch, + IfMetagenerationNotMatch: s.IfMetagenerationNotMatch, + } } -func (s *gRPCAppendBidiWriteBufferSender) withRequestParams(ctx context.Context) context.Context { - param := fmt.Sprintf("appendable=true&bucket=%s", s.bucket) - if s.routingToken != nil { - param = param + fmt.Sprintf("&routing_token=%s", *s.routingToken) +// Use for a takeover of an appendable object. +func (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender() *gRPCAppendTakeoverBidiWriteBufferSender { + return &gRPCAppendTakeoverBidiWriteBufferSender{ + gRPCAppendBidiWriteBufferSender: gRPCAppendBidiWriteBufferSender{ + raw: w.c.raw, + bucket: w.bucket, + firstMessage: &storagepb.BidiWriteObjectRequest{ + FirstMessage: &storagepb.BidiWriteObjectRequest_AppendObjectSpec{ + AppendObjectSpec: writeObjectSpecAsAppendObjectSpec(w.spec, w.appendGen), + }, + }, + objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), + finalizeOnClose: w.finalizeOnClose, + }, + takeoverReported: false, + handleTakeoverCompletion: func(c gRPCBidiWriteCompletion) { + w.handleCompletion(c) + w.setTakeoverOffset(c.flushOffset) + }, } - return gax.InsertMetadataIntoOutgoingContext(ctx, "x-goog-request-params", param) } -func (s *gRPCAppendBidiWriteBufferSender) startReceiver(ctx context.Context) (err error) { - s.stream, err = s.raw.BidiWriteObject(s.withRequestParams(ctx), s.settings.gax...) +func (s *gRPCAppendTakeoverBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) { + s.streamErr = nil + ctx = gRPCWriteRequestParams{appendable: true, bucket: s.bucket, routingToken: s.routingToken}.apply(ctx) + + stream, err := s.raw.BidiWriteObject(ctx, opts...) if err != nil { + s.streamErr = err + close(cs.completions) return } - recvs := make(chan *storagepb.BidiWriteObjectResponse) - s.recvs = recvs - s.recvErr = nil - go s.receiveMessages(recvs) - return + // This blocks until we know the takeover offset from the server on first + // connection + firstSend := true + if !s.takeoverReported { + if err := s.send(stream, nil, 0, false, false, true); err != nil { + s.streamErr = err + close(cs.completions) + return + } + firstSend = false + + resp, err := stream.Recv() + if err != nil { + s.streamErr = err + close(cs.completions) + return + } + + c := completion(resp) + if c == nil { + s.streamErr = fmt.Errorf("storage: unexpectedly no size in initial takeover response %+v", resp) + close(cs.completions) + return + } + + s.maybeUpdateFirstMessage(resp) + s.takeoverReported = true + s.handleTakeoverCompletion(*c) + } + + go s.handleStream(stream, cs, firstSend) } func (s *gRPCAppendBidiWriteBufferSender) ensureFirstMessageAppendObjectSpec() { @@ -865,72 +1285,40 @@ func (e bidiWriteObjectRedirectionError) Error() string { return "" } -func (s *gRPCAppendBidiWriteBufferSender) handleRedirectionError(e *storagepb.BidiWriteObjectRedirectedError) bool { - if e.RoutingToken == nil { - // This shouldn't happen, but we don't want to blindly retry here. Instead, - // surface the error to the caller. - return false - } - - if e.WriteHandle != nil { - // If we get back a write handle, we should use it. We can only use it - // on an append object spec. - s.ensureFirstMessageAppendObjectSpec() - s.firstMessage.GetAppendObjectSpec().WriteHandle = e.WriteHandle - // Generation is meant to only come with the WriteHandle, so ignore it - // otherwise. - if e.Generation != nil { - s.firstMessage.GetAppendObjectSpec().Generation = e.GetGeneration() - } - } - - s.routingToken = e.RoutingToken - return true -} - -func (s *gRPCAppendBidiWriteBufferSender) receiveMessages(resps chan<- *storagepb.BidiWriteObjectResponse) { - resp, err := s.stream.Recv() - for err == nil { - s.maybeUpdateFirstMessage(resp) - - if resp.WriteStatus != nil { - // We only get a WriteStatus if this was a solicited message (either - // state_lookup: true or finish_write: true). Unsolicited messages may - // arrive to update our handle if necessary. We don't want to block on - // this channel write if this was an unsolicited message. - resps <- resp - } - - resp, err = s.stream.Recv() - } - +func (s *gRPCAppendBidiWriteBufferSender) maybeHandleRedirectionError(err error) error { if st, ok := status.FromError(err); ok && st.Code() == codes.Aborted { for _, d := range st.Details() { if e, ok := d.(*storagepb.BidiWriteObjectRedirectedError); ok { - // If we can handle this error, wrap it with the sentinel so it gets - // retried. - if ok := s.handleRedirectionError(e); ok { - err = fmt.Errorf("%w%w", bidiWriteObjectRedirectionError{}, err) + if e.RoutingToken == nil { + // This shouldn't happen, but we don't want to blindly retry here. + // Instead, surface the error to the caller. + return err + } + + if e.WriteHandle != nil { + // If we get back a write handle, we should use it. We can only use it + // on an append object spec. + s.ensureFirstMessageAppendObjectSpec() + s.firstMessage.GetAppendObjectSpec().WriteHandle = e.WriteHandle + // Generation is meant to only come with the WriteHandle, so ignore it + // otherwise. + if e.Generation != nil { + s.firstMessage.GetAppendObjectSpec().Generation = e.GetGeneration() + } } + + s.routingToken = e.RoutingToken + return fmt.Errorf("%w%w", bidiWriteObjectRedirectionError{}, err) } } } - - // TODO: automatically reconnect on retriable recv errors, even if there are - // no sends occurring. - s.recvErr = err - close(resps) + return err } -func (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offset int64, flush, finishWrite, sendFirstMessage bool) (obj *storagepb.Object, err error) { - var req *storagepb.BidiWriteObjectRequest +func (s *gRPCAppendBidiWriteBufferSender) send(stream storagepb.Storage_BidiWriteObjectClient, buf []byte, offset int64, flush, finishWrite, sendFirstMessage bool) error { finalizeObject := finishWrite && s.finalizeOnClose - if finishWrite { - // Always flush when finishing the Write, even if not finalizing. - req = bidiWriteObjectRequest(buf, offset, true, finalizeObject) - } else { - req = bidiWriteObjectRequest(buf, offset, flush, false) - } + flush = flush || finishWrite + req := bidiWriteObjectRequest(buf, offset, flush, finalizeObject) if finalizeObject { // appendable objects pass checksums on the finalize message only req.ObjectChecksums = s.objectChecksums @@ -939,90 +1327,84 @@ func (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offs proto.Merge(req, s.firstMessage) } - if err = s.stream.Send(req); err != nil { - return nil, err - } + return stream.Send(req) +} - if finishWrite { - s.stream.CloseSend() - for resp := range s.recvs { - if resp.GetResource() != nil { - obj = resp.GetResource() - } - // When closing the stream, update the object resource to reflect - // the persisted size. We get a new object from the stream if - // the object was finalized, but not if it's unfinalized. - if s.objResource != nil && resp.GetPersistedSize() > 0 { - s.objResource.Size = resp.GetPersistedSize() - } - } - if s.recvErr != io.EOF { - return nil, s.recvErr - } - if obj.GetSize() > s.flushOffset { - s.flushOffset = obj.GetSize() - s.progress(s.flushOffset) - } - return +func checkCanceled(err error) error { + if status.Code(err) == codes.Canceled { + return context.Canceled } - if flush { - // We don't necessarily expect multiple responses for a single flush, but - // this allows the server to send multiple responses if it wants to. - flushOffset := s.flushOffset + return err +} - for flushOffset < offset+int64(len(buf)) { - resp, ok := <-s.recvs - if !ok { - return nil, s.recvErr - } - pSize := resp.GetPersistedSize() - rSize := resp.GetResource().GetSize() - if flushOffset < pSize { - flushOffset = pSize - } - if flushOffset < rSize { - flushOffset = rSize - } - // On the first flush, we expect to get an object resource back and - // should return it. - if resp.GetResource() != nil { - obj = resp.GetResource() - } - } - if s.flushOffset < flushOffset { - s.flushOffset = flushOffset - s.progress(s.flushOffset) - } +// gRPCChunkSize returns the chunk size to use based on the requested chunk +// size. +// +// The chunk size returned is always greater than 0 and a multiple of +// googleapi.MinUploadChunkSize +func gRPCChunkSize(requestSize int) int { + size := googleapi.MinUploadChunkSize + if requestSize > size { + size = requestSize + } + + if size%googleapi.MinUploadChunkSize != 0 { + size += googleapi.MinUploadChunkSize - (size % googleapi.MinUploadChunkSize) } - return + return size } -func (s *gRPCAppendBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) { - for { - sendFirstMessage := false - if s.stream == nil { - sendFirstMessage = true - if err = s.connect(ctx); err != nil { - return - } - } +type gRPCWriteRequestParams struct { + appendable bool + bucket string + routingToken *string +} - obj, err = s.sendOnConnectedStream(buf, offset, flush, finishWrite, sendFirstMessage) - if obj != nil { - s.objResource = obj - } - if err == nil { - return - } +func (p gRPCWriteRequestParams) apply(ctx context.Context) context.Context { + hds := make([]string, 0, 3) + if p.appendable { + hds = append(hds, "appendable=true") + } + if p.bucket != "" { + hds = append(hds, fmt.Sprintf("bucket=projects/_/buckets/%s", url.QueryEscape(p.bucket))) + } + if p.routingToken != nil { + hds = append(hds, fmt.Sprintf("routing_token=%s", *p.routingToken)) + } + return gax.InsertMetadataIntoOutgoingContext(ctx, "x-goog-request-params", strings.Join(hds, "&")) +} - // await recv stream termination - for range s.recvs { +func withBidiWriteObjectRedirectionErrorRetries(s *settings) (newr *retryConfig) { + oldr := s.retry + newr = oldr.clone() + if newr == nil { + newr = &retryConfig{} + } + if (oldr.policy == RetryIdempotent && !s.idempotent) || oldr.policy == RetryNever { + // We still retry redirection errors even when settings indicate not to + // retry. + // + // The protocol requires us to respect redirection errors, so RetryNever has + // to ignore them. + // + // Idempotency is always protected by redirection errors: they either + // contain a handle which can be used as idempotency information, or they do + // not contain a handle and are "affirmative failures" which indicate that + // no server-side action occurred. + newr.policy = RetryAlways + newr.shouldRetry = func(err error) bool { + return errors.Is(err, bidiWriteObjectRedirectionError{}) } - if s.recvErr != io.EOF { - err = s.recvErr + return newr + } + // If retry settings allow retries normally, fall back to that behavior. + newr.shouldRetry = func(err error) bool { + if errors.Is(err, bidiWriteObjectRedirectionError{}) { + return true } - s.stream = nil - return + v := oldr.runShouldRetry(err) + return v } + return newr } diff --git a/vendor/cloud.google.com/go/storage/http_client.go b/vendor/cloud.google.com/go/storage/http_client.go index a4b601300d..a0ddadf71f 100644 --- a/vendor/cloud.google.com/go/storage/http_client.go +++ b/vendor/cloud.google.com/go/storage/http_client.go @@ -33,7 +33,6 @@ import ( "cloud.google.com/go/auth" "cloud.google.com/go/iam/apiv1/iampb" "cloud.google.com/go/internal/optional" - "cloud.google.com/go/internal/trace" "github.com/google/uuid" "github.com/googleapis/gax-go/v2/callctx" "google.golang.org/api/googleapi" @@ -847,8 +846,8 @@ func (c *httpStorageClient) NewMultiRangeDownloader(ctx context.Context, params } func (c *httpStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) { - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.httpStorageClient.NewRangeReader") - defer func() { trace.EndSpan(ctx, err) }() + ctx, _ = startSpan(ctx, "httpStorageClient.NewRangeReader") + defer func() { endSpan(ctx, err) }() s := callSettings(c.settings, opts...) diff --git a/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go b/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go index ee6639e49d..c98d7dd1a7 100644 --- a/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go +++ b/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go @@ -22,13 +22,9 @@ package storagepb import ( iampb "cloud.google.com/go/iam/apiv1/iampb" - context "context" _ "google.golang.org/genproto/googleapis/api/annotations" status "google.golang.org/genproto/googleapis/rpc/status" date "google.golang.org/genproto/googleapis/type/date" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status1 "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" @@ -10352,1459 +10348,3 @@ func file_google_storage_v2_storage_proto_init() { file_google_storage_v2_storage_proto_goTypes = nil file_google_storage_v2_storage_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// StorageClient is the client API for Storage service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type StorageClient interface { - // Permanently deletes an empty bucket. - DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Returns metadata for the specified bucket. - GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) - // Creates a new bucket. - CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) - // Retrieves a list of buckets for a given project. - ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) - // Locks retention policy on a bucket. - LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) - // Gets the IAM policy for a specified bucket. - // The `resource` field in the request should be - // `projects/_/buckets/{bucket}` for a bucket, or - // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` - // for a managed folder. - GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) - // Updates an IAM policy for the specified bucket. - // The `resource` field in the request should be - // `projects/_/buckets/{bucket}` for a bucket, or - // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` - // for a managed folder. - SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) - // Tests a set of permissions on the given bucket, object, or managed folder - // to see which, if any, are held by the caller. - // The `resource` field in the request should be - // `projects/_/buckets/{bucket}` for a bucket, - // `projects/_/buckets/{bucket}/objects/{object}` for an object, or - // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` - // for a managed folder. - TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) - // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method. - UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) - // Concatenates a list of existing objects into a new object in the same - // bucket. - ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) - // Deletes an object and its metadata. Deletions are permanent if versioning - // is not enabled for the bucket, or if the generation parameter is used, or - // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not - // enabled for the bucket. - // When this API is used to delete an object from a bucket that has soft - // delete policy enabled, the object becomes soft deleted, and the - // `softDeleteTime` and `hardDeleteTime` properties are set on the object. - // This API cannot be used to permanently delete soft-deleted objects. - // Soft-deleted objects are permanently deleted according to their - // `hardDeleteTime`. - // - // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject] - // API to restore soft-deleted objects until the soft delete retention period - // has passed. - // - // **IAM Permissions**: - // - // Requires `storage.objects.delete` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // Restores a soft-deleted object. - RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) - // Cancels an in-progress resumable upload. - // - // Any attempts to write to the resumable upload after cancelling the upload - // will fail. - // - // The behavior for currently in progress write operations is not guaranteed - - // they could either complete before the cancellation or fail if the - // cancellation completes first. - CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) - // Retrieves object metadata. - // - // **IAM Permissions**: - // - // Requires `storage.objects.get` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. To return object ACLs, the authenticated user must also have - // the `storage.objects.getIamPolicy` permission. - GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) - // Retrieves object data. - // - // **IAM Permissions**: - // - // Requires `storage.objects.get` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) - // Reads an object's data. - // - // This is a bi-directional API with the added support for reading multiple - // ranges within one stream both within and across multiple messages. - // If the server encountered an error for any of the inputs, the stream will - // be closed with the relevant error code. - // Because the API allows for multiple outstanding requests, when the stream - // is closed the error response will contain a BidiReadObjectRangesError proto - // in the error extension describing the error for each outstanding read_id. - // - // **IAM Permissions**: - // - // Requires `storage.objects.get` - // - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - // - // This API is currently in preview and is not yet available for general - // use. - BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) - // Updates an object's metadata. - // Equivalent to JSON API's storage.objects.patch. - UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) - // Stores a new object and metadata. - // - // An object can be written either in a single message stream or in a - // resumable sequence of message streams. To write using a single stream, - // the client should include in the first message of the stream an - // `WriteObjectSpec` describing the destination bucket, object, and any - // preconditions. Additionally, the final message must set 'finish_write' to - // true, or else it is an error. - // - // For a resumable write, the client should instead call - // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request. - // They should then attach the returned `upload_id` to the first message of - // each following call to `WriteObject`. If the stream is closed before - // finishing the upload (either explicitly by the client or due to a network - // error or an error response from the server), the client should do as - // follows: - // - Check the result Status of the stream, to determine if writing can be - // resumed on this stream or must be restarted from scratch (by calling - // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED, - // INTERNAL, and UNAVAILABLE. For each case, the client should use binary - // exponential backoff before retrying. Additionally, writes can be - // resumed after RESOURCE_EXHAUSTED errors, but only after taking - // appropriate measures, which may include reducing aggregate send rate - // across clients and/or requesting a quota increase for your project. - // - If the call to `WriteObject` returns `ABORTED`, that indicates - // concurrent attempts to update the resumable write, caused either by - // multiple racing clients or by a single client where the previous - // request was timed out on the client side but nonetheless reached the - // server. In this case the client should take steps to prevent further - // concurrent writes (e.g., increase the timeouts, stop using more than - // one process to perform the upload, etc.), and then should follow the - // steps below for resuming the upload. - // - For resumable errors, the client should call `QueryWriteStatus()` and - // then continue writing from the returned `persisted_size`. This may be - // less than the amount of data the client previously sent. Note also that - // it is acceptable to send data starting at an offset earlier than the - // returned `persisted_size`; in this case, the service will skip data at - // offsets that were already persisted (without checking that it matches - // the previously written data), and write only the data starting from the - // persisted offset. Even though the data isn't written, it may still - // incur a performance cost over resuming at the correct write offset. - // This behavior can make client-side handling simpler in some cases. - // - Clients must only send data that is a multiple of 256 KiB per message, - // unless the object is being finished with `finish_write` set to `true`. - // - // The service will not view the object as complete until the client has - // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any - // requests on a stream after sending a request with `finish_write` set to - // `true` will cause an error. The client **should** check the response it - // receives to determine how much data the service was able to commit and - // whether the service views the object as complete. - // - // Attempting to resume an already finalized object will result in an OK - // status, with a `WriteObjectResponse` containing the finalized object's - // metadata. - // - // Alternatively, the BidiWriteObject operation may be used to write an - // object with controls over flushing and the ability to fetch the ability to - // determine the current persisted size. - // - // **IAM Permissions**: - // - // Requires `storage.objects.create` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) - // Stores a new object and metadata. - // - // This is similar to the WriteObject call with the added support for - // manual flushing of persisted state, and the ability to determine current - // persisted size without closing the stream. - // - // The client may specify one or both of the `state_lookup` and `flush` fields - // in each BidiWriteObjectRequest. If `flush` is specified, the data written - // so far will be persisted to storage. If `state_lookup` is specified, the - // service will respond with a BidiWriteObjectResponse that contains the - // persisted size. If both `flush` and `state_lookup` are specified, the flush - // will always occur before a `state_lookup`, so that both may be set in the - // same request and the returned state will be the state of the object - // post-flush. When the stream is closed, a BidiWriteObjectResponse will - // always be sent to the client, regardless of the value of `state_lookup`. - BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) - // Retrieves a list of objects matching the criteria. - // - // **IAM Permissions**: - // - // The authenticated user requires `storage.objects.list` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) - // to use this method. To return object ACLs, the authenticated user must also - // have the `storage.objects.getIamPolicy` permission. - ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) - // Rewrites a source object to a destination object. Optionally overrides - // metadata. - RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) - // Starts a resumable write operation. This - // method is part of the [Resumable - // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. - // This allows you to upload large objects in multiple chunks, which is more - // resilient to network interruptions than a single upload. The validity - // duration of the write operation, and the consequences of it becoming - // invalid, are service-dependent. - // - // **IAM Permissions**: - // - // Requires `storage.objects.create` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) - // Determines the `persisted_size` of an object that is being written. This - // method is part of the [resumable - // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. - // The returned value is the size of the object that has been persisted so - // far. The value can be used as the `write_offset` for the next `Write()` - // call. - // - // If the object does not exist, meaning if it was deleted, or the - // first `Write()` has not yet reached the service, this method returns the - // error `NOT_FOUND`. - // - // This method is useful for clients that buffer data and need to know which - // data can be safely evicted. The client can call `QueryWriteStatus()` at any - // time to determine how much data has been logged for this object. - // For any sequence of `QueryWriteStatus()` calls for a given - // object name, the sequence of returned `persisted_size` values are - // non-decreasing. - QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) - // Moves the source object to the destination object in the same bucket. - MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) -} - -type storageClient struct { - cc grpc.ClientConnInterface -} - -func NewStorageClient(cc grpc.ClientConnInterface) StorageClient { - return &storageClient{cc} -} - -func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteBucket", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { - out := new(Bucket) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetBucket", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { - out := new(Bucket) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/CreateBucket", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) { - out := new(ListBucketsResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ListBuckets", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) { - out := new(Bucket) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/LockBucketRetentionPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { - out := new(iampb.Policy) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetIamPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { - out := new(iampb.Policy) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/SetIamPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) { - out := new(iampb.TestIamPermissionsResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/TestIamPermissions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { - out := new(Bucket) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/UpdateBucket", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) { - out := new(Object) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ComposeObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) { - out := new(Object) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/RestoreObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) { - out := new(CancelResumableWriteResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/CancelResumableWrite", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) { - out := new(Object) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[0], "/google.storage.v2.Storage/ReadObject", opts...) - if err != nil { - return nil, err - } - x := &storageReadObjectClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Storage_ReadObjectClient interface { - Recv() (*ReadObjectResponse, error) - grpc.ClientStream -} - -type storageReadObjectClient struct { - grpc.ClientStream -} - -func (x *storageReadObjectClient) Recv() (*ReadObjectResponse, error) { - m := new(ReadObjectResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *storageClient) BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[1], "/google.storage.v2.Storage/BidiReadObject", opts...) - if err != nil { - return nil, err - } - x := &storageBidiReadObjectClient{stream} - return x, nil -} - -type Storage_BidiReadObjectClient interface { - Send(*BidiReadObjectRequest) error - Recv() (*BidiReadObjectResponse, error) - grpc.ClientStream -} - -type storageBidiReadObjectClient struct { - grpc.ClientStream -} - -func (x *storageBidiReadObjectClient) Send(m *BidiReadObjectRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *storageBidiReadObjectClient) Recv() (*BidiReadObjectResponse, error) { - m := new(BidiReadObjectResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) { - out := new(Object) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/UpdateObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[2], "/google.storage.v2.Storage/WriteObject", opts...) - if err != nil { - return nil, err - } - x := &storageWriteObjectClient{stream} - return x, nil -} - -type Storage_WriteObjectClient interface { - Send(*WriteObjectRequest) error - CloseAndRecv() (*WriteObjectResponse, error) - grpc.ClientStream -} - -type storageWriteObjectClient struct { - grpc.ClientStream -} - -func (x *storageWriteObjectClient) Send(m *WriteObjectRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *storageWriteObjectClient) CloseAndRecv() (*WriteObjectResponse, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(WriteObjectResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *storageClient) BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) { - stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[3], "/google.storage.v2.Storage/BidiWriteObject", opts...) - if err != nil { - return nil, err - } - x := &storageBidiWriteObjectClient{stream} - return x, nil -} - -type Storage_BidiWriteObjectClient interface { - Send(*BidiWriteObjectRequest) error - Recv() (*BidiWriteObjectResponse, error) - grpc.ClientStream -} - -type storageBidiWriteObjectClient struct { - grpc.ClientStream -} - -func (x *storageBidiWriteObjectClient) Send(m *BidiWriteObjectRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *storageBidiWriteObjectClient) Recv() (*BidiWriteObjectResponse, error) { - m := new(BidiWriteObjectResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) { - out := new(ListObjectsResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ListObjects", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) { - out := new(RewriteResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/RewriteObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) { - out := new(StartResumableWriteResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/StartResumableWrite", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) { - out := new(QueryWriteStatusResponse) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/QueryWriteStatus", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *storageClient) MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) { - out := new(Object) - err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/MoveObject", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// StorageServer is the server API for Storage service. -type StorageServer interface { - // Permanently deletes an empty bucket. - DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) - // Returns metadata for the specified bucket. - GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) - // Creates a new bucket. - CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) - // Retrieves a list of buckets for a given project. - ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) - // Locks retention policy on a bucket. - LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) - // Gets the IAM policy for a specified bucket. - // The `resource` field in the request should be - // `projects/_/buckets/{bucket}` for a bucket, or - // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` - // for a managed folder. - GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) - // Updates an IAM policy for the specified bucket. - // The `resource` field in the request should be - // `projects/_/buckets/{bucket}` for a bucket, or - // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` - // for a managed folder. - SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) - // Tests a set of permissions on the given bucket, object, or managed folder - // to see which, if any, are held by the caller. - // The `resource` field in the request should be - // `projects/_/buckets/{bucket}` for a bucket, - // `projects/_/buckets/{bucket}/objects/{object}` for an object, or - // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` - // for a managed folder. - TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) - // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method. - UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) - // Concatenates a list of existing objects into a new object in the same - // bucket. - ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) - // Deletes an object and its metadata. Deletions are permanent if versioning - // is not enabled for the bucket, or if the generation parameter is used, or - // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not - // enabled for the bucket. - // When this API is used to delete an object from a bucket that has soft - // delete policy enabled, the object becomes soft deleted, and the - // `softDeleteTime` and `hardDeleteTime` properties are set on the object. - // This API cannot be used to permanently delete soft-deleted objects. - // Soft-deleted objects are permanently deleted according to their - // `hardDeleteTime`. - // - // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject] - // API to restore soft-deleted objects until the soft delete retention period - // has passed. - // - // **IAM Permissions**: - // - // Requires `storage.objects.delete` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) - // Restores a soft-deleted object. - RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) - // Cancels an in-progress resumable upload. - // - // Any attempts to write to the resumable upload after cancelling the upload - // will fail. - // - // The behavior for currently in progress write operations is not guaranteed - - // they could either complete before the cancellation or fail if the - // cancellation completes first. - CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) - // Retrieves object metadata. - // - // **IAM Permissions**: - // - // Requires `storage.objects.get` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. To return object ACLs, the authenticated user must also have - // the `storage.objects.getIamPolicy` permission. - GetObject(context.Context, *GetObjectRequest) (*Object, error) - // Retrieves object data. - // - // **IAM Permissions**: - // - // Requires `storage.objects.get` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error - // Reads an object's data. - // - // This is a bi-directional API with the added support for reading multiple - // ranges within one stream both within and across multiple messages. - // If the server encountered an error for any of the inputs, the stream will - // be closed with the relevant error code. - // Because the API allows for multiple outstanding requests, when the stream - // is closed the error response will contain a BidiReadObjectRangesError proto - // in the error extension describing the error for each outstanding read_id. - // - // **IAM Permissions**: - // - // Requires `storage.objects.get` - // - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - // - // This API is currently in preview and is not yet available for general - // use. - BidiReadObject(Storage_BidiReadObjectServer) error - // Updates an object's metadata. - // Equivalent to JSON API's storage.objects.patch. - UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) - // Stores a new object and metadata. - // - // An object can be written either in a single message stream or in a - // resumable sequence of message streams. To write using a single stream, - // the client should include in the first message of the stream an - // `WriteObjectSpec` describing the destination bucket, object, and any - // preconditions. Additionally, the final message must set 'finish_write' to - // true, or else it is an error. - // - // For a resumable write, the client should instead call - // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request. - // They should then attach the returned `upload_id` to the first message of - // each following call to `WriteObject`. If the stream is closed before - // finishing the upload (either explicitly by the client or due to a network - // error or an error response from the server), the client should do as - // follows: - // - Check the result Status of the stream, to determine if writing can be - // resumed on this stream or must be restarted from scratch (by calling - // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED, - // INTERNAL, and UNAVAILABLE. For each case, the client should use binary - // exponential backoff before retrying. Additionally, writes can be - // resumed after RESOURCE_EXHAUSTED errors, but only after taking - // appropriate measures, which may include reducing aggregate send rate - // across clients and/or requesting a quota increase for your project. - // - If the call to `WriteObject` returns `ABORTED`, that indicates - // concurrent attempts to update the resumable write, caused either by - // multiple racing clients or by a single client where the previous - // request was timed out on the client side but nonetheless reached the - // server. In this case the client should take steps to prevent further - // concurrent writes (e.g., increase the timeouts, stop using more than - // one process to perform the upload, etc.), and then should follow the - // steps below for resuming the upload. - // - For resumable errors, the client should call `QueryWriteStatus()` and - // then continue writing from the returned `persisted_size`. This may be - // less than the amount of data the client previously sent. Note also that - // it is acceptable to send data starting at an offset earlier than the - // returned `persisted_size`; in this case, the service will skip data at - // offsets that were already persisted (without checking that it matches - // the previously written data), and write only the data starting from the - // persisted offset. Even though the data isn't written, it may still - // incur a performance cost over resuming at the correct write offset. - // This behavior can make client-side handling simpler in some cases. - // - Clients must only send data that is a multiple of 256 KiB per message, - // unless the object is being finished with `finish_write` set to `true`. - // - // The service will not view the object as complete until the client has - // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any - // requests on a stream after sending a request with `finish_write` set to - // `true` will cause an error. The client **should** check the response it - // receives to determine how much data the service was able to commit and - // whether the service views the object as complete. - // - // Attempting to resume an already finalized object will result in an OK - // status, with a `WriteObjectResponse` containing the finalized object's - // metadata. - // - // Alternatively, the BidiWriteObject operation may be used to write an - // object with controls over flushing and the ability to fetch the ability to - // determine the current persisted size. - // - // **IAM Permissions**: - // - // Requires `storage.objects.create` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - WriteObject(Storage_WriteObjectServer) error - // Stores a new object and metadata. - // - // This is similar to the WriteObject call with the added support for - // manual flushing of persisted state, and the ability to determine current - // persisted size without closing the stream. - // - // The client may specify one or both of the `state_lookup` and `flush` fields - // in each BidiWriteObjectRequest. If `flush` is specified, the data written - // so far will be persisted to storage. If `state_lookup` is specified, the - // service will respond with a BidiWriteObjectResponse that contains the - // persisted size. If both `flush` and `state_lookup` are specified, the flush - // will always occur before a `state_lookup`, so that both may be set in the - // same request and the returned state will be the state of the object - // post-flush. When the stream is closed, a BidiWriteObjectResponse will - // always be sent to the client, regardless of the value of `state_lookup`. - BidiWriteObject(Storage_BidiWriteObjectServer) error - // Retrieves a list of objects matching the criteria. - // - // **IAM Permissions**: - // - // The authenticated user requires `storage.objects.list` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) - // to use this method. To return object ACLs, the authenticated user must also - // have the `storage.objects.getIamPolicy` permission. - ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) - // Rewrites a source object to a destination object. Optionally overrides - // metadata. - RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) - // Starts a resumable write operation. This - // method is part of the [Resumable - // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. - // This allows you to upload large objects in multiple chunks, which is more - // resilient to network interruptions than a single upload. The validity - // duration of the write operation, and the consequences of it becoming - // invalid, are service-dependent. - // - // **IAM Permissions**: - // - // Requires `storage.objects.create` - // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on - // the bucket. - StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) - // Determines the `persisted_size` of an object that is being written. This - // method is part of the [resumable - // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. - // The returned value is the size of the object that has been persisted so - // far. The value can be used as the `write_offset` for the next `Write()` - // call. - // - // If the object does not exist, meaning if it was deleted, or the - // first `Write()` has not yet reached the service, this method returns the - // error `NOT_FOUND`. - // - // This method is useful for clients that buffer data and need to know which - // data can be safely evicted. The client can call `QueryWriteStatus()` at any - // time to determine how much data has been logged for this object. - // For any sequence of `QueryWriteStatus()` calls for a given - // object name, the sequence of returned `persisted_size` values are - // non-decreasing. - QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) - // Moves the source object to the destination object in the same bucket. - MoveObject(context.Context, *MoveObjectRequest) (*Object, error) -} - -// UnimplementedStorageServer can be embedded to have forward compatible implementations. -type UnimplementedStorageServer struct { -} - -func (*UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteBucket not implemented") -} -func (*UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetBucket not implemented") -} -func (*UnimplementedStorageServer) CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateBucket not implemented") -} -func (*UnimplementedStorageServer) ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListBuckets not implemented") -} -func (*UnimplementedStorageServer) LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) { - return nil, status1.Errorf(codes.Unimplemented, "method LockBucketRetentionPolicy not implemented") -} -func (*UnimplementedStorageServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") -} -func (*UnimplementedStorageServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) { - return nil, status1.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") -} -func (*UnimplementedStorageServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") -} -func (*UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateBucket not implemented") -} -func (*UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ComposeObject not implemented") -} -func (*UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteObject not implemented") -} -func (*UnimplementedStorageServer) RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) { - return nil, status1.Errorf(codes.Unimplemented, "method RestoreObject not implemented") -} -func (*UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CancelResumableWrite not implemented") -} -func (*UnimplementedStorageServer) GetObject(context.Context, *GetObjectRequest) (*Object, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetObject not implemented") -} -func (*UnimplementedStorageServer) ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error { - return status1.Errorf(codes.Unimplemented, "method ReadObject not implemented") -} -func (*UnimplementedStorageServer) BidiReadObject(Storage_BidiReadObjectServer) error { - return status1.Errorf(codes.Unimplemented, "method BidiReadObject not implemented") -} -func (*UnimplementedStorageServer) UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) { - return nil, status1.Errorf(codes.Unimplemented, "method UpdateObject not implemented") -} -func (*UnimplementedStorageServer) WriteObject(Storage_WriteObjectServer) error { - return status1.Errorf(codes.Unimplemented, "method WriteObject not implemented") -} -func (*UnimplementedStorageServer) BidiWriteObject(Storage_BidiWriteObjectServer) error { - return status1.Errorf(codes.Unimplemented, "method BidiWriteObject not implemented") -} -func (*UnimplementedStorageServer) ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListObjects not implemented") -} -func (*UnimplementedStorageServer) RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method RewriteObject not implemented") -} -func (*UnimplementedStorageServer) StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method StartResumableWrite not implemented") -} -func (*UnimplementedStorageServer) QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method QueryWriteStatus not implemented") -} -func (*UnimplementedStorageServer) MoveObject(context.Context, *MoveObjectRequest) (*Object, error) { - return nil, status1.Errorf(codes.Unimplemented, "method MoveObject not implemented") -} - -func RegisterStorageServer(s *grpc.Server, srv StorageServer) { - s.RegisterService(&_Storage_serviceDesc, srv) -} - -func _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteBucketRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).DeleteBucket(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/DeleteBucket", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetBucketRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).GetBucket(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/GetBucket", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_CreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateBucketRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).CreateBucket(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/CreateBucket", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).CreateBucket(ctx, req.(*CreateBucketRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListBucketsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).ListBuckets(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/ListBuckets", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LockBucketRetentionPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).LockBucketRetentionPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/LockBucketRetentionPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockBucketRetentionPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(iampb.GetIamPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).GetIamPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/GetIamPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(iampb.SetIamPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).SetIamPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/SetIamPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(iampb.TestIamPermissionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).TestIamPermissions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/TestIamPermissions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateBucketRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).UpdateBucket(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/UpdateBucket", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ComposeObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).ComposeObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/ComposeObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).DeleteObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/DeleteObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RestoreObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).RestoreObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/RestoreObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).RestoreObject(ctx, req.(*RestoreObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_CancelResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CancelResumableWriteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).CancelResumableWrite(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/CancelResumableWrite", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).CancelResumableWrite(ctx, req.(*CancelResumableWriteRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).GetObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/GetObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_ReadObject_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ReadObjectRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(StorageServer).ReadObject(m, &storageReadObjectServer{stream}) -} - -type Storage_ReadObjectServer interface { - Send(*ReadObjectResponse) error - grpc.ServerStream -} - -type storageReadObjectServer struct { - grpc.ServerStream -} - -func (x *storageReadObjectServer) Send(m *ReadObjectResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Storage_BidiReadObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(StorageServer).BidiReadObject(&storageBidiReadObjectServer{stream}) -} - -type Storage_BidiReadObjectServer interface { - Send(*BidiReadObjectResponse) error - Recv() (*BidiReadObjectRequest, error) - grpc.ServerStream -} - -type storageBidiReadObjectServer struct { - grpc.ServerStream -} - -func (x *storageBidiReadObjectServer) Send(m *BidiReadObjectResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *storageBidiReadObjectServer) Recv() (*BidiReadObjectRequest, error) { - m := new(BidiReadObjectRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).UpdateObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/UpdateObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_WriteObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(StorageServer).WriteObject(&storageWriteObjectServer{stream}) -} - -type Storage_WriteObjectServer interface { - SendAndClose(*WriteObjectResponse) error - Recv() (*WriteObjectRequest, error) - grpc.ServerStream -} - -type storageWriteObjectServer struct { - grpc.ServerStream -} - -func (x *storageWriteObjectServer) SendAndClose(m *WriteObjectResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *storageWriteObjectServer) Recv() (*WriteObjectRequest, error) { - m := new(WriteObjectRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _Storage_BidiWriteObject_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(StorageServer).BidiWriteObject(&storageBidiWriteObjectServer{stream}) -} - -type Storage_BidiWriteObjectServer interface { - Send(*BidiWriteObjectResponse) error - Recv() (*BidiWriteObjectRequest, error) - grpc.ServerStream -} - -type storageBidiWriteObjectServer struct { - grpc.ServerStream -} - -func (x *storageBidiWriteObjectServer) Send(m *BidiWriteObjectResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *storageBidiWriteObjectServer) Recv() (*BidiWriteObjectRequest, error) { - m := new(BidiWriteObjectRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListObjectsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).ListObjects(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/ListObjects", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RewriteObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).RewriteObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/RewriteObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartResumableWriteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).StartResumableWrite(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/StartResumableWrite", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryWriteStatusRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).QueryWriteStatus(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/QueryWriteStatus", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Storage_MoveObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MoveObjectRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StorageServer).MoveObject(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.storage.v2.Storage/MoveObject", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StorageServer).MoveObject(ctx, req.(*MoveObjectRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Storage_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.storage.v2.Storage", - HandlerType: (*StorageServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "DeleteBucket", - Handler: _Storage_DeleteBucket_Handler, - }, - { - MethodName: "GetBucket", - Handler: _Storage_GetBucket_Handler, - }, - { - MethodName: "CreateBucket", - Handler: _Storage_CreateBucket_Handler, - }, - { - MethodName: "ListBuckets", - Handler: _Storage_ListBuckets_Handler, - }, - { - MethodName: "LockBucketRetentionPolicy", - Handler: _Storage_LockBucketRetentionPolicy_Handler, - }, - { - MethodName: "GetIamPolicy", - Handler: _Storage_GetIamPolicy_Handler, - }, - { - MethodName: "SetIamPolicy", - Handler: _Storage_SetIamPolicy_Handler, - }, - { - MethodName: "TestIamPermissions", - Handler: _Storage_TestIamPermissions_Handler, - }, - { - MethodName: "UpdateBucket", - Handler: _Storage_UpdateBucket_Handler, - }, - { - MethodName: "ComposeObject", - Handler: _Storage_ComposeObject_Handler, - }, - { - MethodName: "DeleteObject", - Handler: _Storage_DeleteObject_Handler, - }, - { - MethodName: "RestoreObject", - Handler: _Storage_RestoreObject_Handler, - }, - { - MethodName: "CancelResumableWrite", - Handler: _Storage_CancelResumableWrite_Handler, - }, - { - MethodName: "GetObject", - Handler: _Storage_GetObject_Handler, - }, - { - MethodName: "UpdateObject", - Handler: _Storage_UpdateObject_Handler, - }, - { - MethodName: "ListObjects", - Handler: _Storage_ListObjects_Handler, - }, - { - MethodName: "RewriteObject", - Handler: _Storage_RewriteObject_Handler, - }, - { - MethodName: "StartResumableWrite", - Handler: _Storage_StartResumableWrite_Handler, - }, - { - MethodName: "QueryWriteStatus", - Handler: _Storage_QueryWriteStatus_Handler, - }, - { - MethodName: "MoveObject", - Handler: _Storage_MoveObject_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "ReadObject", - Handler: _Storage_ReadObject_Handler, - ServerStreams: true, - }, - { - StreamName: "BidiReadObject", - Handler: _Storage_BidiReadObject_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "WriteObject", - Handler: _Storage_WriteObject_Handler, - ClientStreams: true, - }, - { - StreamName: "BidiWriteObject", - Handler: _Storage_BidiWriteObject_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, - Metadata: "google/storage/v2/storage.proto", -} diff --git a/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage_grpc.pb.go b/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage_grpc.pb.go new file mode 100644 index 0000000000..ab2fa11b28 --- /dev/null +++ b/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage_grpc.pb.go @@ -0,0 +1,1522 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.7 +// source: google/storage/v2/storage.proto + +package storagepb + +import ( + iampb "cloud.google.com/go/iam/apiv1/iampb" + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Storage_DeleteBucket_FullMethodName = "/google.storage.v2.Storage/DeleteBucket" + Storage_GetBucket_FullMethodName = "/google.storage.v2.Storage/GetBucket" + Storage_CreateBucket_FullMethodName = "/google.storage.v2.Storage/CreateBucket" + Storage_ListBuckets_FullMethodName = "/google.storage.v2.Storage/ListBuckets" + Storage_LockBucketRetentionPolicy_FullMethodName = "/google.storage.v2.Storage/LockBucketRetentionPolicy" + Storage_GetIamPolicy_FullMethodName = "/google.storage.v2.Storage/GetIamPolicy" + Storage_SetIamPolicy_FullMethodName = "/google.storage.v2.Storage/SetIamPolicy" + Storage_TestIamPermissions_FullMethodName = "/google.storage.v2.Storage/TestIamPermissions" + Storage_UpdateBucket_FullMethodName = "/google.storage.v2.Storage/UpdateBucket" + Storage_ComposeObject_FullMethodName = "/google.storage.v2.Storage/ComposeObject" + Storage_DeleteObject_FullMethodName = "/google.storage.v2.Storage/DeleteObject" + Storage_RestoreObject_FullMethodName = "/google.storage.v2.Storage/RestoreObject" + Storage_CancelResumableWrite_FullMethodName = "/google.storage.v2.Storage/CancelResumableWrite" + Storage_GetObject_FullMethodName = "/google.storage.v2.Storage/GetObject" + Storage_ReadObject_FullMethodName = "/google.storage.v2.Storage/ReadObject" + Storage_BidiReadObject_FullMethodName = "/google.storage.v2.Storage/BidiReadObject" + Storage_UpdateObject_FullMethodName = "/google.storage.v2.Storage/UpdateObject" + Storage_WriteObject_FullMethodName = "/google.storage.v2.Storage/WriteObject" + Storage_BidiWriteObject_FullMethodName = "/google.storage.v2.Storage/BidiWriteObject" + Storage_ListObjects_FullMethodName = "/google.storage.v2.Storage/ListObjects" + Storage_RewriteObject_FullMethodName = "/google.storage.v2.Storage/RewriteObject" + Storage_StartResumableWrite_FullMethodName = "/google.storage.v2.Storage/StartResumableWrite" + Storage_QueryWriteStatus_FullMethodName = "/google.storage.v2.Storage/QueryWriteStatus" + Storage_MoveObject_FullMethodName = "/google.storage.v2.Storage/MoveObject" +) + +// StorageClient is the client API for Storage service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type StorageClient interface { + // Permanently deletes an empty bucket. + DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Returns metadata for the specified bucket. + GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) + // Creates a new bucket. + CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) + // Retrieves a list of buckets for a given project. + ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) + // Locks retention policy on a bucket. + LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) + // Gets the IAM policy for a specified bucket. + // The `resource` field in the request should be + // `projects/_/buckets/{bucket}` for a bucket, or + // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` + // for a managed folder. + GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) + // Updates an IAM policy for the specified bucket. + // The `resource` field in the request should be + // `projects/_/buckets/{bucket}` for a bucket, or + // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` + // for a managed folder. + SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) + // Tests a set of permissions on the given bucket, object, or managed folder + // to see which, if any, are held by the caller. + // The `resource` field in the request should be + // `projects/_/buckets/{bucket}` for a bucket, + // `projects/_/buckets/{bucket}/objects/{object}` for an object, or + // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` + // for a managed folder. + TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) + // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method. + UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) + // Concatenates a list of existing objects into a new object in the same + // bucket. + ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) + // Deletes an object and its metadata. Deletions are permanent if versioning + // is not enabled for the bucket, or if the generation parameter is used, or + // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not + // enabled for the bucket. + // When this API is used to delete an object from a bucket that has soft + // delete policy enabled, the object becomes soft deleted, and the + // `softDeleteTime` and `hardDeleteTime` properties are set on the object. + // This API cannot be used to permanently delete soft-deleted objects. + // Soft-deleted objects are permanently deleted according to their + // `hardDeleteTime`. + // + // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject] + // API to restore soft-deleted objects until the soft delete retention period + // has passed. + // + // **IAM Permissions**: + // + // Requires `storage.objects.delete` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Restores a soft-deleted object. + RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) + // Cancels an in-progress resumable upload. + // + // Any attempts to write to the resumable upload after cancelling the upload + // will fail. + // + // The behavior for currently in progress write operations is not guaranteed - + // they could either complete before the cancellation or fail if the + // cancellation completes first. + CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) + // Retrieves object metadata. + // + // **IAM Permissions**: + // + // Requires `storage.objects.get` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. To return object ACLs, the authenticated user must also have + // the `storage.objects.getIamPolicy` permission. + GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) + // Retrieves object data. + // + // **IAM Permissions**: + // + // Requires `storage.objects.get` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) + // Reads an object's data. + // + // This is a bi-directional API with the added support for reading multiple + // ranges within one stream both within and across multiple messages. + // If the server encountered an error for any of the inputs, the stream will + // be closed with the relevant error code. + // Because the API allows for multiple outstanding requests, when the stream + // is closed the error response will contain a BidiReadObjectRangesError proto + // in the error extension describing the error for each outstanding read_id. + // + // **IAM Permissions**: + // + // Requires `storage.objects.get` + // + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + // + // This API is currently in preview and is not yet available for general + // use. + BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) + // Updates an object's metadata. + // Equivalent to JSON API's storage.objects.patch. + UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) + // Stores a new object and metadata. + // + // An object can be written either in a single message stream or in a + // resumable sequence of message streams. To write using a single stream, + // the client should include in the first message of the stream an + // `WriteObjectSpec` describing the destination bucket, object, and any + // preconditions. Additionally, the final message must set 'finish_write' to + // true, or else it is an error. + // + // For a resumable write, the client should instead call + // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request. + // They should then attach the returned `upload_id` to the first message of + // each following call to `WriteObject`. If the stream is closed before + // finishing the upload (either explicitly by the client or due to a network + // error or an error response from the server), the client should do as + // follows: + // - Check the result Status of the stream, to determine if writing can be + // resumed on this stream or must be restarted from scratch (by calling + // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED, + // INTERNAL, and UNAVAILABLE. For each case, the client should use binary + // exponential backoff before retrying. Additionally, writes can be + // resumed after RESOURCE_EXHAUSTED errors, but only after taking + // appropriate measures, which may include reducing aggregate send rate + // across clients and/or requesting a quota increase for your project. + // - If the call to `WriteObject` returns `ABORTED`, that indicates + // concurrent attempts to update the resumable write, caused either by + // multiple racing clients or by a single client where the previous + // request was timed out on the client side but nonetheless reached the + // server. In this case the client should take steps to prevent further + // concurrent writes (e.g., increase the timeouts, stop using more than + // one process to perform the upload, etc.), and then should follow the + // steps below for resuming the upload. + // - For resumable errors, the client should call `QueryWriteStatus()` and + // then continue writing from the returned `persisted_size`. This may be + // less than the amount of data the client previously sent. Note also that + // it is acceptable to send data starting at an offset earlier than the + // returned `persisted_size`; in this case, the service will skip data at + // offsets that were already persisted (without checking that it matches + // the previously written data), and write only the data starting from the + // persisted offset. Even though the data isn't written, it may still + // incur a performance cost over resuming at the correct write offset. + // This behavior can make client-side handling simpler in some cases. + // - Clients must only send data that is a multiple of 256 KiB per message, + // unless the object is being finished with `finish_write` set to `true`. + // + // The service will not view the object as complete until the client has + // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any + // requests on a stream after sending a request with `finish_write` set to + // `true` will cause an error. The client **should** check the response it + // receives to determine how much data the service was able to commit and + // whether the service views the object as complete. + // + // Attempting to resume an already finalized object will result in an OK + // status, with a `WriteObjectResponse` containing the finalized object's + // metadata. + // + // Alternatively, the BidiWriteObject operation may be used to write an + // object with controls over flushing and the ability to fetch the ability to + // determine the current persisted size. + // + // **IAM Permissions**: + // + // Requires `storage.objects.create` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) + // Stores a new object and metadata. + // + // This is similar to the WriteObject call with the added support for + // manual flushing of persisted state, and the ability to determine current + // persisted size without closing the stream. + // + // The client may specify one or both of the `state_lookup` and `flush` fields + // in each BidiWriteObjectRequest. If `flush` is specified, the data written + // so far will be persisted to storage. If `state_lookup` is specified, the + // service will respond with a BidiWriteObjectResponse that contains the + // persisted size. If both `flush` and `state_lookup` are specified, the flush + // will always occur before a `state_lookup`, so that both may be set in the + // same request and the returned state will be the state of the object + // post-flush. When the stream is closed, a BidiWriteObjectResponse will + // always be sent to the client, regardless of the value of `state_lookup`. + BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) + // Retrieves a list of objects matching the criteria. + // + // **IAM Permissions**: + // + // The authenticated user requires `storage.objects.list` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) + // to use this method. To return object ACLs, the authenticated user must also + // have the `storage.objects.getIamPolicy` permission. + ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) + // Rewrites a source object to a destination object. Optionally overrides + // metadata. + RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) + // Starts a resumable write operation. This + // method is part of the [Resumable + // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. + // This allows you to upload large objects in multiple chunks, which is more + // resilient to network interruptions than a single upload. The validity + // duration of the write operation, and the consequences of it becoming + // invalid, are service-dependent. + // + // **IAM Permissions**: + // + // Requires `storage.objects.create` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) + // Determines the `persisted_size` of an object that is being written. This + // method is part of the [resumable + // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. + // The returned value is the size of the object that has been persisted so + // far. The value can be used as the `write_offset` for the next `Write()` + // call. + // + // If the object does not exist, meaning if it was deleted, or the + // first `Write()` has not yet reached the service, this method returns the + // error `NOT_FOUND`. + // + // This method is useful for clients that buffer data and need to know which + // data can be safely evicted. The client can call `QueryWriteStatus()` at any + // time to determine how much data has been logged for this object. + // For any sequence of `QueryWriteStatus()` calls for a given + // object name, the sequence of returned `persisted_size` values are + // non-decreasing. + QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) + // Moves the source object to the destination object in the same bucket. + MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) +} + +type storageClient struct { + cc grpc.ClientConnInterface +} + +func NewStorageClient(cc grpc.ClientConnInterface) StorageClient { + return &storageClient{cc} +} + +func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, Storage_DeleteBucket_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { + out := new(Bucket) + err := c.cc.Invoke(ctx, Storage_GetBucket_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { + out := new(Bucket) + err := c.cc.Invoke(ctx, Storage_CreateBucket_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) { + out := new(ListBucketsResponse) + err := c.cc.Invoke(ctx, Storage_ListBuckets_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) { + out := new(Bucket) + err := c.cc.Invoke(ctx, Storage_LockBucketRetentionPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { + out := new(iampb.Policy) + err := c.cc.Invoke(ctx, Storage_GetIamPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { + out := new(iampb.Policy) + err := c.cc.Invoke(ctx, Storage_SetIamPolicy_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) { + out := new(iampb.TestIamPermissionsResponse) + err := c.cc.Invoke(ctx, Storage_TestIamPermissions_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { + out := new(Bucket) + err := c.cc.Invoke(ctx, Storage_UpdateBucket_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) { + out := new(Object) + err := c.cc.Invoke(ctx, Storage_ComposeObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, Storage_DeleteObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) { + out := new(Object) + err := c.cc.Invoke(ctx, Storage_RestoreObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) { + out := new(CancelResumableWriteResponse) + err := c.cc.Invoke(ctx, Storage_CancelResumableWrite_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) { + out := new(Object) + err := c.cc.Invoke(ctx, Storage_GetObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[0], Storage_ReadObject_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &storageReadObjectClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Storage_ReadObjectClient interface { + Recv() (*ReadObjectResponse, error) + grpc.ClientStream +} + +type storageReadObjectClient struct { + grpc.ClientStream +} + +func (x *storageReadObjectClient) Recv() (*ReadObjectResponse, error) { + m := new(ReadObjectResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *storageClient) BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[1], Storage_BidiReadObject_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &storageBidiReadObjectClient{stream} + return x, nil +} + +type Storage_BidiReadObjectClient interface { + Send(*BidiReadObjectRequest) error + Recv() (*BidiReadObjectResponse, error) + grpc.ClientStream +} + +type storageBidiReadObjectClient struct { + grpc.ClientStream +} + +func (x *storageBidiReadObjectClient) Send(m *BidiReadObjectRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *storageBidiReadObjectClient) Recv() (*BidiReadObjectResponse, error) { + m := new(BidiReadObjectResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) { + out := new(Object) + err := c.cc.Invoke(ctx, Storage_UpdateObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[2], Storage_WriteObject_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &storageWriteObjectClient{stream} + return x, nil +} + +type Storage_WriteObjectClient interface { + Send(*WriteObjectRequest) error + CloseAndRecv() (*WriteObjectResponse, error) + grpc.ClientStream +} + +type storageWriteObjectClient struct { + grpc.ClientStream +} + +func (x *storageWriteObjectClient) Send(m *WriteObjectRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *storageWriteObjectClient) CloseAndRecv() (*WriteObjectResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(WriteObjectResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *storageClient) BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) { + stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[3], Storage_BidiWriteObject_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &storageBidiWriteObjectClient{stream} + return x, nil +} + +type Storage_BidiWriteObjectClient interface { + Send(*BidiWriteObjectRequest) error + Recv() (*BidiWriteObjectResponse, error) + grpc.ClientStream +} + +type storageBidiWriteObjectClient struct { + grpc.ClientStream +} + +func (x *storageBidiWriteObjectClient) Send(m *BidiWriteObjectRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *storageBidiWriteObjectClient) Recv() (*BidiWriteObjectResponse, error) { + m := new(BidiWriteObjectResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) { + out := new(ListObjectsResponse) + err := c.cc.Invoke(ctx, Storage_ListObjects_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) { + out := new(RewriteResponse) + err := c.cc.Invoke(ctx, Storage_RewriteObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) { + out := new(StartResumableWriteResponse) + err := c.cc.Invoke(ctx, Storage_StartResumableWrite_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) { + out := new(QueryWriteStatusResponse) + err := c.cc.Invoke(ctx, Storage_QueryWriteStatus_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageClient) MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) { + out := new(Object) + err := c.cc.Invoke(ctx, Storage_MoveObject_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// StorageServer is the server API for Storage service. +// All implementations should embed UnimplementedStorageServer +// for forward compatibility +type StorageServer interface { + // Permanently deletes an empty bucket. + DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) + // Returns metadata for the specified bucket. + GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) + // Creates a new bucket. + CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) + // Retrieves a list of buckets for a given project. + ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) + // Locks retention policy on a bucket. + LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) + // Gets the IAM policy for a specified bucket. + // The `resource` field in the request should be + // `projects/_/buckets/{bucket}` for a bucket, or + // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` + // for a managed folder. + GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) + // Updates an IAM policy for the specified bucket. + // The `resource` field in the request should be + // `projects/_/buckets/{bucket}` for a bucket, or + // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` + // for a managed folder. + SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) + // Tests a set of permissions on the given bucket, object, or managed folder + // to see which, if any, are held by the caller. + // The `resource` field in the request should be + // `projects/_/buckets/{bucket}` for a bucket, + // `projects/_/buckets/{bucket}/objects/{object}` for an object, or + // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` + // for a managed folder. + TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) + // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method. + UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) + // Concatenates a list of existing objects into a new object in the same + // bucket. + ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) + // Deletes an object and its metadata. Deletions are permanent if versioning + // is not enabled for the bucket, or if the generation parameter is used, or + // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not + // enabled for the bucket. + // When this API is used to delete an object from a bucket that has soft + // delete policy enabled, the object becomes soft deleted, and the + // `softDeleteTime` and `hardDeleteTime` properties are set on the object. + // This API cannot be used to permanently delete soft-deleted objects. + // Soft-deleted objects are permanently deleted according to their + // `hardDeleteTime`. + // + // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject] + // API to restore soft-deleted objects until the soft delete retention period + // has passed. + // + // **IAM Permissions**: + // + // Requires `storage.objects.delete` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) + // Restores a soft-deleted object. + RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) + // Cancels an in-progress resumable upload. + // + // Any attempts to write to the resumable upload after cancelling the upload + // will fail. + // + // The behavior for currently in progress write operations is not guaranteed - + // they could either complete before the cancellation or fail if the + // cancellation completes first. + CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) + // Retrieves object metadata. + // + // **IAM Permissions**: + // + // Requires `storage.objects.get` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. To return object ACLs, the authenticated user must also have + // the `storage.objects.getIamPolicy` permission. + GetObject(context.Context, *GetObjectRequest) (*Object, error) + // Retrieves object data. + // + // **IAM Permissions**: + // + // Requires `storage.objects.get` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error + // Reads an object's data. + // + // This is a bi-directional API with the added support for reading multiple + // ranges within one stream both within and across multiple messages. + // If the server encountered an error for any of the inputs, the stream will + // be closed with the relevant error code. + // Because the API allows for multiple outstanding requests, when the stream + // is closed the error response will contain a BidiReadObjectRangesError proto + // in the error extension describing the error for each outstanding read_id. + // + // **IAM Permissions**: + // + // Requires `storage.objects.get` + // + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + // + // This API is currently in preview and is not yet available for general + // use. + BidiReadObject(Storage_BidiReadObjectServer) error + // Updates an object's metadata. + // Equivalent to JSON API's storage.objects.patch. + UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) + // Stores a new object and metadata. + // + // An object can be written either in a single message stream or in a + // resumable sequence of message streams. To write using a single stream, + // the client should include in the first message of the stream an + // `WriteObjectSpec` describing the destination bucket, object, and any + // preconditions. Additionally, the final message must set 'finish_write' to + // true, or else it is an error. + // + // For a resumable write, the client should instead call + // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request. + // They should then attach the returned `upload_id` to the first message of + // each following call to `WriteObject`. If the stream is closed before + // finishing the upload (either explicitly by the client or due to a network + // error or an error response from the server), the client should do as + // follows: + // - Check the result Status of the stream, to determine if writing can be + // resumed on this stream or must be restarted from scratch (by calling + // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED, + // INTERNAL, and UNAVAILABLE. For each case, the client should use binary + // exponential backoff before retrying. Additionally, writes can be + // resumed after RESOURCE_EXHAUSTED errors, but only after taking + // appropriate measures, which may include reducing aggregate send rate + // across clients and/or requesting a quota increase for your project. + // - If the call to `WriteObject` returns `ABORTED`, that indicates + // concurrent attempts to update the resumable write, caused either by + // multiple racing clients or by a single client where the previous + // request was timed out on the client side but nonetheless reached the + // server. In this case the client should take steps to prevent further + // concurrent writes (e.g., increase the timeouts, stop using more than + // one process to perform the upload, etc.), and then should follow the + // steps below for resuming the upload. + // - For resumable errors, the client should call `QueryWriteStatus()` and + // then continue writing from the returned `persisted_size`. This may be + // less than the amount of data the client previously sent. Note also that + // it is acceptable to send data starting at an offset earlier than the + // returned `persisted_size`; in this case, the service will skip data at + // offsets that were already persisted (without checking that it matches + // the previously written data), and write only the data starting from the + // persisted offset. Even though the data isn't written, it may still + // incur a performance cost over resuming at the correct write offset. + // This behavior can make client-side handling simpler in some cases. + // - Clients must only send data that is a multiple of 256 KiB per message, + // unless the object is being finished with `finish_write` set to `true`. + // + // The service will not view the object as complete until the client has + // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any + // requests on a stream after sending a request with `finish_write` set to + // `true` will cause an error. The client **should** check the response it + // receives to determine how much data the service was able to commit and + // whether the service views the object as complete. + // + // Attempting to resume an already finalized object will result in an OK + // status, with a `WriteObjectResponse` containing the finalized object's + // metadata. + // + // Alternatively, the BidiWriteObject operation may be used to write an + // object with controls over flushing and the ability to fetch the ability to + // determine the current persisted size. + // + // **IAM Permissions**: + // + // Requires `storage.objects.create` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + WriteObject(Storage_WriteObjectServer) error + // Stores a new object and metadata. + // + // This is similar to the WriteObject call with the added support for + // manual flushing of persisted state, and the ability to determine current + // persisted size without closing the stream. + // + // The client may specify one or both of the `state_lookup` and `flush` fields + // in each BidiWriteObjectRequest. If `flush` is specified, the data written + // so far will be persisted to storage. If `state_lookup` is specified, the + // service will respond with a BidiWriteObjectResponse that contains the + // persisted size. If both `flush` and `state_lookup` are specified, the flush + // will always occur before a `state_lookup`, so that both may be set in the + // same request and the returned state will be the state of the object + // post-flush. When the stream is closed, a BidiWriteObjectResponse will + // always be sent to the client, regardless of the value of `state_lookup`. + BidiWriteObject(Storage_BidiWriteObjectServer) error + // Retrieves a list of objects matching the criteria. + // + // **IAM Permissions**: + // + // The authenticated user requires `storage.objects.list` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) + // to use this method. To return object ACLs, the authenticated user must also + // have the `storage.objects.getIamPolicy` permission. + ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) + // Rewrites a source object to a destination object. Optionally overrides + // metadata. + RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) + // Starts a resumable write operation. This + // method is part of the [Resumable + // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. + // This allows you to upload large objects in multiple chunks, which is more + // resilient to network interruptions than a single upload. The validity + // duration of the write operation, and the consequences of it becoming + // invalid, are service-dependent. + // + // **IAM Permissions**: + // + // Requires `storage.objects.create` + // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on + // the bucket. + StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) + // Determines the `persisted_size` of an object that is being written. This + // method is part of the [resumable + // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. + // The returned value is the size of the object that has been persisted so + // far. The value can be used as the `write_offset` for the next `Write()` + // call. + // + // If the object does not exist, meaning if it was deleted, or the + // first `Write()` has not yet reached the service, this method returns the + // error `NOT_FOUND`. + // + // This method is useful for clients that buffer data and need to know which + // data can be safely evicted. The client can call `QueryWriteStatus()` at any + // time to determine how much data has been logged for this object. + // For any sequence of `QueryWriteStatus()` calls for a given + // object name, the sequence of returned `persisted_size` values are + // non-decreasing. + QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) + // Moves the source object to the destination object in the same bucket. + MoveObject(context.Context, *MoveObjectRequest) (*Object, error) +} + +// UnimplementedStorageServer should be embedded to have forward compatible implementations. +type UnimplementedStorageServer struct { +} + +func (UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteBucket not implemented") +} +func (UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetBucket not implemented") +} +func (UnimplementedStorageServer) CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateBucket not implemented") +} +func (UnimplementedStorageServer) ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListBuckets not implemented") +} +func (UnimplementedStorageServer) LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) { + return nil, status.Errorf(codes.Unimplemented, "method LockBucketRetentionPolicy not implemented") +} +func (UnimplementedStorageServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") +} +func (UnimplementedStorageServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") +} +func (UnimplementedStorageServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") +} +func (UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateBucket not implemented") +} +func (UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) { + return nil, status.Errorf(codes.Unimplemented, "method ComposeObject not implemented") +} +func (UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") +} +func (UnimplementedStorageServer) RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented") +} +func (UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CancelResumableWrite not implemented") +} +func (UnimplementedStorageServer) GetObject(context.Context, *GetObjectRequest) (*Object, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetObject not implemented") +} +func (UnimplementedStorageServer) ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error { + return status.Errorf(codes.Unimplemented, "method ReadObject not implemented") +} +func (UnimplementedStorageServer) BidiReadObject(Storage_BidiReadObjectServer) error { + return status.Errorf(codes.Unimplemented, "method BidiReadObject not implemented") +} +func (UnimplementedStorageServer) UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateObject not implemented") +} +func (UnimplementedStorageServer) WriteObject(Storage_WriteObjectServer) error { + return status.Errorf(codes.Unimplemented, "method WriteObject not implemented") +} +func (UnimplementedStorageServer) BidiWriteObject(Storage_BidiWriteObjectServer) error { + return status.Errorf(codes.Unimplemented, "method BidiWriteObject not implemented") +} +func (UnimplementedStorageServer) ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") +} +func (UnimplementedStorageServer) RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RewriteObject not implemented") +} +func (UnimplementedStorageServer) StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartResumableWrite not implemented") +} +func (UnimplementedStorageServer) QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryWriteStatus not implemented") +} +func (UnimplementedStorageServer) MoveObject(context.Context, *MoveObjectRequest) (*Object, error) { + return nil, status.Errorf(codes.Unimplemented, "method MoveObject not implemented") +} + +// UnsafeStorageServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to StorageServer will +// result in compilation errors. +type UnsafeStorageServer interface { + mustEmbedUnimplementedStorageServer() +} + +func RegisterStorageServer(s grpc.ServiceRegistrar, srv StorageServer) { + s.RegisterService(&Storage_ServiceDesc, srv) +} + +func _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteBucketRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).DeleteBucket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_DeleteBucket_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetBucketRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).GetBucket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_GetBucket_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_CreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateBucketRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).CreateBucket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_CreateBucket_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).CreateBucket(ctx, req.(*CreateBucketRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListBucketsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).ListBuckets(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_ListBuckets_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LockBucketRetentionPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).LockBucketRetentionPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_LockBucketRetentionPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockBucketRetentionPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(iampb.GetIamPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).GetIamPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_GetIamPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(iampb.SetIamPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).SetIamPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_SetIamPolicy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(iampb.TestIamPermissionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).TestIamPermissions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_TestIamPermissions_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateBucketRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).UpdateBucket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_UpdateBucket_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComposeObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).ComposeObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_ComposeObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).DeleteObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_DeleteObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).RestoreObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_RestoreObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).RestoreObject(ctx, req.(*RestoreObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_CancelResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CancelResumableWriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).CancelResumableWrite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_CancelResumableWrite_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).CancelResumableWrite(ctx, req.(*CancelResumableWriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).GetObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_GetObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_ReadObject_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(ReadObjectRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(StorageServer).ReadObject(m, &storageReadObjectServer{stream}) +} + +type Storage_ReadObjectServer interface { + Send(*ReadObjectResponse) error + grpc.ServerStream +} + +type storageReadObjectServer struct { + grpc.ServerStream +} + +func (x *storageReadObjectServer) Send(m *ReadObjectResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Storage_BidiReadObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(StorageServer).BidiReadObject(&storageBidiReadObjectServer{stream}) +} + +type Storage_BidiReadObjectServer interface { + Send(*BidiReadObjectResponse) error + Recv() (*BidiReadObjectRequest, error) + grpc.ServerStream +} + +type storageBidiReadObjectServer struct { + grpc.ServerStream +} + +func (x *storageBidiReadObjectServer) Send(m *BidiReadObjectResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *storageBidiReadObjectServer) Recv() (*BidiReadObjectRequest, error) { + m := new(BidiReadObjectRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).UpdateObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_UpdateObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_WriteObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(StorageServer).WriteObject(&storageWriteObjectServer{stream}) +} + +type Storage_WriteObjectServer interface { + SendAndClose(*WriteObjectResponse) error + Recv() (*WriteObjectRequest, error) + grpc.ServerStream +} + +type storageWriteObjectServer struct { + grpc.ServerStream +} + +func (x *storageWriteObjectServer) SendAndClose(m *WriteObjectResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *storageWriteObjectServer) Recv() (*WriteObjectRequest, error) { + m := new(WriteObjectRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Storage_BidiWriteObject_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(StorageServer).BidiWriteObject(&storageBidiWriteObjectServer{stream}) +} + +type Storage_BidiWriteObjectServer interface { + Send(*BidiWriteObjectResponse) error + Recv() (*BidiWriteObjectRequest, error) + grpc.ServerStream +} + +type storageBidiWriteObjectServer struct { + grpc.ServerStream +} + +func (x *storageBidiWriteObjectServer) Send(m *BidiWriteObjectResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *storageBidiWriteObjectServer) Recv() (*BidiWriteObjectRequest, error) { + m := new(BidiWriteObjectRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListObjectsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).ListObjects(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_ListObjects_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RewriteObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).RewriteObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_RewriteObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartResumableWriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).StartResumableWrite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_StartResumableWrite_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryWriteStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).QueryWriteStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_QueryWriteStatus_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Storage_MoveObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MoveObjectRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageServer).MoveObject(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Storage_MoveObject_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageServer).MoveObject(ctx, req.(*MoveObjectRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Storage_ServiceDesc is the grpc.ServiceDesc for Storage service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Storage_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "google.storage.v2.Storage", + HandlerType: (*StorageServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DeleteBucket", + Handler: _Storage_DeleteBucket_Handler, + }, + { + MethodName: "GetBucket", + Handler: _Storage_GetBucket_Handler, + }, + { + MethodName: "CreateBucket", + Handler: _Storage_CreateBucket_Handler, + }, + { + MethodName: "ListBuckets", + Handler: _Storage_ListBuckets_Handler, + }, + { + MethodName: "LockBucketRetentionPolicy", + Handler: _Storage_LockBucketRetentionPolicy_Handler, + }, + { + MethodName: "GetIamPolicy", + Handler: _Storage_GetIamPolicy_Handler, + }, + { + MethodName: "SetIamPolicy", + Handler: _Storage_SetIamPolicy_Handler, + }, + { + MethodName: "TestIamPermissions", + Handler: _Storage_TestIamPermissions_Handler, + }, + { + MethodName: "UpdateBucket", + Handler: _Storage_UpdateBucket_Handler, + }, + { + MethodName: "ComposeObject", + Handler: _Storage_ComposeObject_Handler, + }, + { + MethodName: "DeleteObject", + Handler: _Storage_DeleteObject_Handler, + }, + { + MethodName: "RestoreObject", + Handler: _Storage_RestoreObject_Handler, + }, + { + MethodName: "CancelResumableWrite", + Handler: _Storage_CancelResumableWrite_Handler, + }, + { + MethodName: "GetObject", + Handler: _Storage_GetObject_Handler, + }, + { + MethodName: "UpdateObject", + Handler: _Storage_UpdateObject_Handler, + }, + { + MethodName: "ListObjects", + Handler: _Storage_ListObjects_Handler, + }, + { + MethodName: "RewriteObject", + Handler: _Storage_RewriteObject_Handler, + }, + { + MethodName: "StartResumableWrite", + Handler: _Storage_StartResumableWrite_Handler, + }, + { + MethodName: "QueryWriteStatus", + Handler: _Storage_QueryWriteStatus_Handler, + }, + { + MethodName: "MoveObject", + Handler: _Storage_MoveObject_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "ReadObject", + Handler: _Storage_ReadObject_Handler, + ServerStreams: true, + }, + { + StreamName: "BidiReadObject", + Handler: _Storage_BidiReadObject_Handler, + ServerStreams: true, + ClientStreams: true, + }, + { + StreamName: "WriteObject", + Handler: _Storage_WriteObject_Handler, + ClientStreams: true, + }, + { + StreamName: "BidiWriteObject", + Handler: _Storage_BidiWriteObject_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "google/storage/v2/storage.proto", +} diff --git a/vendor/cloud.google.com/go/storage/internal/experimental.go b/vendor/cloud.google.com/go/storage/internal/experimental.go index 4482eab8a3..b8c5731fe3 100644 --- a/vendor/cloud.google.com/go/storage/internal/experimental.go +++ b/vendor/cloud.google.com/go/storage/internal/experimental.go @@ -26,6 +26,10 @@ var ( // Set an alternate client-side metric Exporter to emit metrics through. WithMetricExporter any // func (*metric.Exporter) option.ClientOption + // WithMeterProvider is a function which is implemented by storage package. + // Set an alternate client-side meter provider to emit metrics through. + WithMeterProvider any // func (*metric.MeterProvider) option.ClientOption + // WithReadStallTimeout is a function which is implemented by storage package. // It takes ReadStallTimeoutConfig as inputs and returns a option.ClientOption. WithReadStallTimeout any // func (*ReadStallTimeoutConfig) option.ClientOption diff --git a/vendor/cloud.google.com/go/storage/internal/version.go b/vendor/cloud.google.com/go/storage/internal/version.go index 54603c25c4..35b0b3b1f6 100644 --- a/vendor/cloud.google.com/go/storage/internal/version.go +++ b/vendor/cloud.google.com/go/storage/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.56.1" +const Version = "1.57.1" diff --git a/vendor/cloud.google.com/go/storage/option.go b/vendor/cloud.google.com/go/storage/option.go index 6548cc18e8..6afc669386 100644 --- a/vendor/cloud.google.com/go/storage/option.go +++ b/vendor/cloud.google.com/go/storage/option.go @@ -39,6 +39,7 @@ func init() { // initialize experimental options storageinternal.WithMetricExporter = withMetricExporter storageinternal.WithMetricInterval = withMetricInterval + storageinternal.WithMeterProvider = withMeterProvider storageinternal.WithReadStallTimeout = withReadStallTimeout storageinternal.WithGRPCBidiReads = withGRPCBidiReads storageinternal.WithZonalBucketAPIs = withZonalBucketAPIs @@ -81,6 +82,7 @@ type storageConfig struct { disableClientMetrics bool metricExporter *metric.Exporter metricInterval time.Duration + meterProvider *metric.MeterProvider manualReader *metric.ManualReader readStallTimeoutConfig *experimental.ReadStallTimeoutConfig grpcBidiReads bool @@ -203,6 +205,20 @@ type withTestMetricReaderConfig struct { metricReader *metric.ManualReader } +type withMeterProviderConfig struct { + internaloption.EmbeddableAdapter + // meter provider override + meterProvider *metric.MeterProvider +} + +func withMeterProvider(provider *metric.MeterProvider) option.ClientOption { + return &withMeterProviderConfig{meterProvider: provider} +} + +func (w *withMeterProviderConfig) ApplyStorageOpt(c *storageConfig) { + c.meterProvider = w.meterProvider +} + func withTestMetricReader(ex *metric.ManualReader) option.ClientOption { return &withTestMetricReaderConfig{metricReader: ex} } diff --git a/vendor/cloud.google.com/go/storage/post_policy_v4.go b/vendor/cloud.google.com/go/storage/post_policy_v4.go index 6bc73fb7af..4b2feea954 100644 --- a/vendor/cloud.google.com/go/storage/post_policy_v4.go +++ b/vendor/cloud.google.com/go/storage/post_policy_v4.go @@ -252,9 +252,6 @@ func GenerateSignedPostPolicyV4(bucket, object string, opts *PostPolicyV4Options if bucket == "" { return nil, errors.New("storage: bucket must be non-empty") } - if object == "" { - return nil, errors.New("storage: object must be non-empty") - } now := utcNow() if err := validatePostPolicyV4Options(opts, now); err != nil { return nil, err diff --git a/vendor/cloud.google.com/go/storage/reader.go b/vendor/cloud.google.com/go/storage/reader.go index 793c1b2e0e..0c5f5be0ab 100644 --- a/vendor/cloud.google.com/go/storage/reader.go +++ b/vendor/cloud.google.com/go/storage/reader.go @@ -23,8 +23,6 @@ import ( "strings" "sync" "time" - - "cloud.google.com/go/internal/trace" ) var crc32cTable = crc32.MakeTable(crc32.Castagnoli) @@ -116,7 +114,8 @@ func (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, error) { func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) { // This span covers the life of the reader. It is closed via the context // in Reader.Close. - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Reader") + ctx, _ = startSpan(ctx, "Object.Reader") + defer func() { endSpan(ctx, err) }() if err := o.validate(); err != nil { return nil, err @@ -150,8 +149,6 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) // span now if there is an error. if err == nil { r.ctx = ctx - } else { - trace.EndSpan(ctx, err) } return r, err @@ -167,7 +164,8 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) func (o *ObjectHandle) NewMultiRangeDownloader(ctx context.Context) (mrd *MultiRangeDownloader, err error) { // This span covers the life of the reader. It is closed via the context // in Reader.Close. - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.MultiRangeDownloader") + ctx, _ = startSpan(ctx, "Object.MultiRangeDownloader") + defer func() { endSpan(ctx, err) }() if err := o.validate(); err != nil { return nil, err @@ -195,8 +193,6 @@ func (o *ObjectHandle) NewMultiRangeDownloader(ctx context.Context) (mrd *MultiR // span now if there is an error. if err == nil { r.ctx = ctx - } else { - trace.EndSpan(ctx, err) } return r, err @@ -285,7 +281,7 @@ type Reader struct { // Close closes the Reader. It must be called when done reading. func (r *Reader) Close() error { err := r.reader.Close() - trace.EndSpan(r.ctx, err) + endSpan(r.ctx, err) return err } @@ -436,7 +432,7 @@ func (mrd *MultiRangeDownloader) Add(output io.Writer, offset, length int64, cal // Call [MultiRangeDownloader.Wait] to avoid this error. func (mrd *MultiRangeDownloader) Close() error { err := mrd.reader.close() - trace.EndSpan(mrd.ctx, err) + endSpan(mrd.ctx, err) return err } diff --git a/vendor/cloud.google.com/go/storage/storage.go b/vendor/cloud.google.com/go/storage/storage.go index 41cf960724..32a145b8d5 100644 --- a/vendor/cloud.google.com/go/storage/storage.go +++ b/vendor/cloud.google.com/go/storage/storage.go @@ -40,7 +40,6 @@ import ( "cloud.google.com/go/auth" "cloud.google.com/go/internal/optional" - "cloud.google.com/go/internal/trace" "cloud.google.com/go/storage/internal" "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2" @@ -1248,7 +1247,7 @@ type MoveObjectDestination struct { // It is the caller's responsibility to call Close when writing is done. To // stop writing without saving the data, cancel the context. func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer { - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Writer") + ctx, _ = startSpan(ctx, "Object.Writer") return &Writer{ ctx: ctx, o: o, @@ -1284,16 +1283,18 @@ func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer { // objects which were created append semantics and not finalized. // This feature is in preview and is not yet available for general use. func (o *ObjectHandle) NewWriterFromAppendableObject(ctx context.Context, opts *AppendableWriterOpts) (*Writer, int64, error) { - ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Writer") + ctx, _ = startSpan(ctx, "Object.WriterFromAppendableObject") if o.gen < 0 { return nil, 0, errors.New("storage: ObjectHandle.Generation must be set to use NewWriterFromAppendableObject") } + toc := make(chan int64) w := &Writer{ - ctx: ctx, - o: o, - donec: make(chan struct{}), - ObjectAttrs: ObjectAttrs{Name: o.object}, - Append: true, + ctx: ctx, + o: o, + donec: make(chan struct{}), + ObjectAttrs: ObjectAttrs{Name: o.object}, + Append: true, + setTakeoverOffset: func(to int64) { toc <- to }, } opts.apply(w) if w.ChunkSize == 0 { @@ -1303,7 +1304,16 @@ func (o *ObjectHandle) NewWriterFromAppendableObject(ctx context.Context, opts * if err != nil { return nil, 0, err } - return w, w.takeoverOffset, nil + // Block until we discover the takeover offset, or the stream fails + select { + case to, ok := <-toc: + if !ok { + return nil, 0, errors.New("storage: unexpectedly did not discover takeover offset") + } + return w, to, nil + case <-w.donec: + return nil, 0, w.err + } } // AppendableWriterOpts provides options to set on a Writer initialized @@ -1662,6 +1672,12 @@ type ObjectAttrs struct { HardDeleteTime time.Time } +// isZero reports whether the ObjectAttrs struct is empty (i.e. all the +// fields are their zero value). +func (o *ObjectAttrs) isZero() bool { + return reflect.DeepEqual(o, &ObjectAttrs{}) +} + // ObjectRetention contains the retention configuration for this object. type ObjectRetention struct { // Mode is the retention policy's mode on this object. Valid values are diff --git a/vendor/cloud.google.com/go/storage/writer.go b/vendor/cloud.google.com/go/storage/writer.go index bc0893eeac..ae5a4d667f 100644 --- a/vendor/cloud.google.com/go/storage/writer.go +++ b/vendor/cloud.google.com/go/storage/writer.go @@ -22,8 +22,6 @@ import ( "sync" "time" "unicode/utf8" - - "cloud.google.com/go/internal/trace" ) // Interface internalWriter wraps low-level implementations which may vary @@ -159,9 +157,9 @@ type Writer struct { donec chan struct{} // closed after err and obj are set. obj *ObjectAttrs - mu sync.Mutex - err error - takeoverOffset int64 // offset from which the writer started appending to the object. + mu sync.Mutex + err error + setTakeoverOffset func(int64) } // Write appends to w. It implements the io.Writer interface. @@ -261,7 +259,7 @@ func (w *Writer) Close() error { w.closed = true w.mu.Lock() defer w.mu.Unlock() - trace.EndSpan(w.ctx, w.err) + endSpan(w.ctx, w.err) return w.err } @@ -274,6 +272,8 @@ func (w *Writer) openWriter() (err error) { } isIdempotent := w.o.conds != nil && (w.o.conds.GenerationMatch >= 0 || w.o.conds.DoesNotExist) + // Append operations that takeover a specific generation are idempotent. + isIdempotent = isIdempotent || w.Append && w.o.gen > 0 opts := makeStorageOpts(isIdempotent, w.o.retry, w.o.userProject) params := &openWriterParams{ ctx: w.ctx, @@ -297,7 +297,7 @@ func (w *Writer) openWriter() (err error) { w.obj.Size = n } }, - setTakeoverOffset: func(n int64) { w.takeoverOffset = n }, + setTakeoverOffset: w.setTakeoverOffset, forceEmptyContentType: w.ForceEmptyContentType, } if err := w.ctx.Err(); err != nil { diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/LICENSE b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/README.md b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/README.md deleted file mode 100644 index 47d809846f..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/README.md +++ /dev/null @@ -1,18 +0,0 @@ - -## How to test Spanner integration - -1. Set GCP project id with GCP_PROJECT_ID environment variable. - - export GCP_PROJECT_ID=test-project - -1. Set service key credentials file using GOOGLE_APPLICATION_CREDENTIALS env variable. - - export GOOGLE_APPLICATION_CREDENTIALS=/service/account/credentials.json - -1. Run the tests. - - go test -v - -To skip Spanner setup run - - SKIP_SPANNER=true go test -v diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/doc.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/doc.go deleted file mode 100644 index aae869fb56..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/doc.go +++ /dev/null @@ -1,129 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/* -Package grpcgcp provides grpc supports for Google Cloud APIs. -For now it provides connection management with affinity support. - -Note: "channel" is analagous to "connection" in our context. - -Usage: - -1. First, initialize the api configuration. There are two ways: - - 1a. Create a json file defining the configuration and read it. - - // Create some_api_config.json - { - "channelPool": { - "maxSize": 4, - "maxConcurrentStreamsLowWatermark": 50 - }, - "method": [ - { - "name": [ "/some.api.v1/Method1" ], - "affinity": { - "command": "BIND", - "affinityKey": "key1" - } - }, - { - "name": [ "/some.api.v1/Method2" ], - "affinity": { - "command": "BOUND", - "affinityKey": "key2" - } - }, - { - "name": [ "/some.api.v1/Method3" ], - "affinity": { - "command": "UNBIND", - "affinityKey": "key3" - } - } - ] - } - - jsonFile, err := ioutil.ReadFile("some_api_config.json") - if err != nil { - t.Fatalf("Failed to read config file: %v", err) - } - jsonCfg := string(jsonFile) - - 1b. Create apiConfig directly and convert it to json. - - // import ( - // configpb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" - // ) - - apiConfig := &configpb.ApiConfig{ - ChannelPool: &configpb.ChannelPoolConfig{ - MaxSize: 4, - MaxConcurrentStreamsLowWatermark: 50, - }, - Method: []*configpb.MethodConfig{ - &configpb.MethodConfig{ - Name: []string{"/some.api.v1/Method1"}, - Affinity: &configpb.AffinityConfig{ - Command: configpb.AffinityConfig_BIND, - AffinityKey: "key1", - }, - }, - &configpb.MethodConfig{ - Name: []string{"/some.api.v1/Method2"}, - Affinity: &configpb.AffinityConfig{ - Command: configpb.AffinityConfig_BOUND, - AffinityKey: "key2", - }, - }, - &configpb.MethodConfig{ - Name: []string{"/some.api.v1/Method3"}, - Affinity: &configpb.AffinityConfig{ - Command: configpb.AffinityConfig_UNBIND, - AffinityKey: "key3", - }, - }, - }, - } - - c, err := protojson.Marshal(apiConfig) - if err != nil { - t.Fatalf("cannot json encode config: %v", err) - } - jsonCfg := string(c) - -2. Make ClientConn with specific DialOptions to enable grpc_gcp load balancer -with provided configuration. And specify gRPC-GCP interceptors. - - conn, err := grpc.Dial( - target, - // Register and specify the grpc-gcp load balancer. - grpc.WithDisableServiceConfig(), - grpc.WithDefaultServiceConfig( - fmt.Sprintf( - `{"loadBalancingConfig": [{"%s":%s}]}`, - grpcgcp.Name, - jsonCfg, - ), - ), - // Set grpcgcp interceptors. - grpc.WithUnaryInterceptor(grpcgcp.GCPUnaryClientInterceptor), - grpc.WithStreamInterceptor(grpcgcp.GCPStreamClientInterceptor), - ) -*/ -package grpcgcp // import "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_balancer.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_balancer.go deleted file mode 100644 index 293cffb6d5..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_balancer.go +++ /dev/null @@ -1,581 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpcgcp - -import ( - "context" - "encoding/json" - "fmt" - "sync" - "sync/atomic" - "time" - - "google.golang.org/grpc/balancer" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/resolver" - "google.golang.org/grpc/serviceconfig" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" - - pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" -) - -var _ balancer.Balancer = (*gcpBalancer)(nil) // Ensure gcpBalancer implements Balancer - -const ( - // Name is the name of grpc_gcp balancer. - Name = "grpc_gcp" - - healthCheckEnabled = true - defaultMinSize = 1 - defaultMaxSize = 4 - defaultMaxStreams = 100 -) - -func init() { - balancer.Register(newBuilder()) -} - -type gcpBalancerBuilder struct { - balancer.ConfigParser -} - -type GCPBalancerConfig struct { - serviceconfig.LoadBalancingConfig - *pb.ApiConfig -} - -func (bb *gcpBalancerBuilder) Build( - cc balancer.ClientConn, - opt balancer.BuildOptions, -) balancer.Balancer { - gb := &gcpBalancer{ - cc: cc, - methodCfg: make(map[string]*pb.AffinityConfig), - affinityMap: make(map[string]balancer.SubConn), - fallbackMap: make(map[string]balancer.SubConn), - scRefs: make(map[balancer.SubConn]*subConnRef), - scStates: make(map[balancer.SubConn]connectivity.State), - refreshingScRefs: make(map[balancer.SubConn]*subConnRef), - scRefList: []*subConnRef{}, - rrRefId: ^uint32(0), - csEvltr: &connectivityStateEvaluator{}, - // Initialize picker to a picker that always return - // ErrNoSubConnAvailable, because when state of a SubConn changes, we - // may call UpdateBalancerState with this picker. - picker: newErrPicker(balancer.ErrNoSubConnAvailable), - } - gb.log = NewGCPLogger(compLogger, fmt.Sprintf("[gcpBalancer %p]", gb)) - return gb -} - -func (*gcpBalancerBuilder) Name() string { - return Name -} - -// ParseConfig converts raw json config into GCPBalancerConfig. -// This is called by ClientConn on any load balancer config update. -// After parsing the config, ClientConn calls UpdateClientConnState passing the config. -func (*gcpBalancerBuilder) ParseConfig(j json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { - c := &GCPBalancerConfig{ - ApiConfig: &pb.ApiConfig{}, - } - err := protojson.Unmarshal(j, c) - return c, err -} - -// newBuilder creates a new grpcgcp balancer builder. -func newBuilder() balancer.Builder { - return &gcpBalancerBuilder{} -} - -// connectivityStateEvaluator gets updated by addrConns when their -// states transition, based on which it evaluates the state of -// ClientConn. -type connectivityStateEvaluator struct { - numReady uint64 // Number of addrConns in ready state. - numConnecting uint64 // Number of addrConns in connecting state. - numTransientFailure uint64 // Number of addrConns in transientFailure. -} - -// recordTransition records state change happening in every subConn and based on -// that it evaluates what aggregated state should be. -// It can only transition between Ready, Connecting and TransientFailure. Other states, -// Idle and Shutdown are transitioned into by ClientConn; in the beginning of the connection -// before any subConn is created ClientConn is in idle state. In the end when ClientConn -// closes it is in Shutdown state. -// -// recordTransition should only be called synchronously from the same goroutine. -func (cse *connectivityStateEvaluator) recordTransition( - oldState, - newState connectivity.State, -) connectivity.State { - // Update counters. - for idx, state := range []connectivity.State{oldState, newState} { - updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new. - switch state { - case connectivity.Ready: - cse.numReady += updateVal - case connectivity.Connecting: - cse.numConnecting += updateVal - case connectivity.TransientFailure: - cse.numTransientFailure += updateVal - } - } - - // Evaluate. - if cse.numReady > 0 { - return connectivity.Ready - } - if cse.numConnecting > 0 { - return connectivity.Connecting - } - return connectivity.TransientFailure -} - -// subConnRef keeps reference to the real SubConn with its -// connectivity state, affinity count and streams count. -type subConnRef struct { - subConn balancer.SubConn - stateSignal chan struct{} // This channel is closed and re-created when subConn or its state changes. - affinityCnt int32 // Keeps track of the number of keys bound to the subConn. - streamsCnt int32 // Keeps track of the number of streams opened on the subConn. - lastResp time.Time // Timestamp of the last response from the server. - deCalls uint32 // Keeps track of deadline exceeded calls since last response. - refreshing bool // If this subconn is in the process of refreshing. - refreshCnt uint32 // Number of refreshes since last response. -} - -func (ref *subConnRef) getAffinityCnt() int32 { - return atomic.LoadInt32(&ref.affinityCnt) -} - -func (ref *subConnRef) getStreamsCnt() int32 { - return atomic.LoadInt32(&ref.streamsCnt) -} - -func (ref *subConnRef) affinityIncr() { - atomic.AddInt32(&ref.affinityCnt, 1) -} - -func (ref *subConnRef) affinityDecr() { - atomic.AddInt32(&ref.affinityCnt, -1) -} - -func (ref *subConnRef) streamsIncr() { - atomic.AddInt32(&ref.streamsCnt, 1) -} - -func (ref *subConnRef) streamsDecr() { - atomic.AddInt32(&ref.streamsCnt, -1) -} - -func (ref *subConnRef) deCallsInc() uint32 { - return atomic.AddUint32(&ref.deCalls, 1) -} - -func (ref *subConnRef) gotResp() { - ref.lastResp = time.Now() - atomic.StoreUint32(&ref.deCalls, 0) - ref.refreshCnt = 0 -} - -type gcpBalancer struct { - cfg *GCPBalancerConfig - methodCfg map[string]*pb.AffinityConfig - - addrs []resolver.Address - cc balancer.ClientConn - csEvltr *connectivityStateEvaluator - state connectivity.State - - mu sync.RWMutex - affinityMap map[string]balancer.SubConn - fallbackMap map[string]balancer.SubConn - scStates map[balancer.SubConn]connectivity.State - scRefs map[balancer.SubConn]*subConnRef - scRefList []*subConnRef - rrRefId uint32 - - // Map from a fresh SubConn to the subConnRef where we want to refresh subConn. - refreshingScRefs map[balancer.SubConn]*subConnRef - // Unresponsive detection enabled flag. - unresponsiveDetection bool - - picker balancer.Picker - log grpclog.LoggerV2 -} - -func (gb *gcpBalancer) initializeConfig(cfg *GCPBalancerConfig) { - gb.cfg = &GCPBalancerConfig{ - ApiConfig: &pb.ApiConfig{ - ChannelPool: &pb.ChannelPoolConfig{}, - }, - } - if cfg != nil && cfg.ApiConfig != nil { - gb.cfg = &GCPBalancerConfig{ - ApiConfig: proto.Clone(cfg.ApiConfig).(*pb.ApiConfig), - } - } - - if gb.cfg.GetChannelPool() == nil { - gb.cfg.ChannelPool = &pb.ChannelPoolConfig{} - } - cp := gb.cfg.GetChannelPool() - if cp.GetMinSize() == 0 { - cp.MinSize = defaultMinSize - } - if cp.GetMaxSize() == 0 { - cp.MaxSize = defaultMaxSize - } - if cp.GetMaxConcurrentStreamsLowWatermark() == 0 { - cp.MaxConcurrentStreamsLowWatermark = defaultMaxStreams - } - mp := make(map[string]*pb.AffinityConfig) - methodCfgs := gb.cfg.GetMethod() - for _, methodCfg := range methodCfgs { - methodNames := methodCfg.GetName() - affinityCfg := methodCfg.GetAffinity() - if methodNames != nil && affinityCfg != nil { - for _, method := range methodNames { - mp[method] = affinityCfg - } - } - } - gb.methodCfg = mp - gb.unresponsiveDetection = cp.GetUnresponsiveCalls() > 0 && cp.GetUnresponsiveDetectionMs() > 0 - gb.enforceMinSize() -} - -func (gb *gcpBalancer) enforceMinSize() { - for len(gb.scRefs) < int(gb.cfg.GetChannelPool().GetMinSize()) { - gb.addSubConn() - } -} - -func (gb *gcpBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error { - gb.mu.Lock() - defer gb.mu.Unlock() - addrs := ccs.ResolverState.Addresses - if gb.log.V(FINE) { - gb.log.Infoln("got new resolved addresses: ", addrs, " and balancer config: ", ccs.BalancerConfig) - } - gb.addrs = addrs - if gb.cfg == nil { - cfg, ok := ccs.BalancerConfig.(*GCPBalancerConfig) - if !ok && ccs.BalancerConfig != nil { - return fmt.Errorf("provided config is not GCPBalancerConfig: %v", ccs.BalancerConfig) - } - gb.initializeConfig(cfg) - } - - if len(gb.scRefs) == 0 { - gb.newSubConn() - return nil - } - - for _, scRef := range gb.scRefs { - // TODO(weiranf): update streams count when new addrs resolved? - scRef.subConn.UpdateAddresses(addrs) - scRef.subConn.Connect() - } - - return nil -} - -func (gb *gcpBalancer) ResolverError(err error) { - gb.log.Warningf("ResolverError: %v", err) -} - -// check current connection pool size -func (gb *gcpBalancer) getConnectionPoolSize() int { - // TODO(golobokov): replace this with locked increase of subconns. - gb.mu.Lock() - defer gb.mu.Unlock() - return len(gb.scRefs) -} - -// newSubConn creates a new SubConn using cc.NewSubConn and initialize the subConnRef -// if none of the subconns are in the Connecting state. -func (gb *gcpBalancer) newSubConn() { - gb.mu.Lock() - defer gb.mu.Unlock() - - // there are chances the newly created subconns are still connecting, - // we can wait on those new subconns. - for _, scState := range gb.scStates { - if scState == connectivity.Connecting || scState == connectivity.Idle { - return - } - } - gb.addSubConn() -} - -// addSubConn creates a new SubConn using cc.NewSubConn and initialize the subConnRef. -// Must be called holding the mutex lock. -func (gb *gcpBalancer) addSubConn() { - sc, err := gb.cc.NewSubConn( - gb.addrs, - balancer.NewSubConnOptions{HealthCheckEnabled: healthCheckEnabled}, - ) - if err != nil { - gb.log.Errorf("failed to NewSubConn: %v", err) - return - } - gb.scRefs[sc] = &subConnRef{ - subConn: sc, - stateSignal: make(chan struct{}), - lastResp: time.Now(), - } - gb.scStates[sc] = connectivity.Idle - gb.scRefList = append(gb.scRefList, gb.scRefs[sc]) - sc.Connect() -} - -// getReadySubConnRef returns a subConnRef and a bool. The bool indicates whether -// the boundKey exists in the affinityMap. If returned subConnRef is a nil, it -// means the underlying subconn is not READY yet. -func (gb *gcpBalancer) getReadySubConnRef(boundKey string) (*subConnRef, bool) { - gb.mu.Lock() - defer gb.mu.Unlock() - - if sc, ok := gb.affinityMap[boundKey]; ok { - if gb.scStates[sc] != connectivity.Ready { - // It's possible that the bound subconn is not in the readySubConns list, - // If it's not ready, we throw ErrNoSubConnAvailable or - // fallback to a previously mapped ready subconn or the least busy. - if gb.cfg.GetChannelPool().GetFallbackToReady() { - if sc, ok := gb.fallbackMap[boundKey]; ok { - return gb.scRefs[sc], true - } - // Try to create fallback mapping. - if scRef, err := gb.picker.(*gcpPicker).getLeastBusySubConnRef(); err == nil { - gb.fallbackMap[boundKey] = scRef.subConn - return scRef, true - } - } - return nil, true - } - return gb.scRefs[sc], true - } - return nil, false -} - -func (gb *gcpBalancer) getSubConnRoundRobin(ctx context.Context) *subConnRef { - if len(gb.scRefList) == 0 { - gb.newSubConn() - } - scRef := gb.scRefList[atomic.AddUint32(&gb.rrRefId, 1)%uint32(len(gb.scRefList))] - - gb.mu.RLock() - if state := gb.scStates[scRef.subConn]; state == connectivity.Ready { - gb.mu.RUnlock() - return scRef - } else { - grpclog.Infof("grpcgcp.gcpBalancer: scRef is not ready: %v", state) - } - - ticker := time.NewTicker(time.Millisecond * 100) - defer ticker.Stop() - - // Wait until SubConn is ready or call context is done. - for gb.scStates[scRef.subConn] != connectivity.Ready { - sigChan := scRef.stateSignal - gb.mu.RUnlock() - select { - case <-ctx.Done(): - return scRef - case <-ticker.C: - case <-sigChan: - } - gb.mu.RLock() - } - gb.mu.RUnlock() - - return scRef -} - -// bindSubConn binds the given affinity key to an existing subConnRef. -func (gb *gcpBalancer) bindSubConn(bindKey string, sc balancer.SubConn) { - gb.mu.Lock() - defer gb.mu.Unlock() - _, ok := gb.affinityMap[bindKey] - if !ok { - gb.affinityMap[bindKey] = sc - } - gb.scRefs[sc].affinityIncr() -} - -// unbindSubConn removes the existing binding associated with the key. -func (gb *gcpBalancer) unbindSubConn(boundKey string) { - gb.mu.Lock() - defer gb.mu.Unlock() - boundSC, ok := gb.affinityMap[boundKey] - if ok { - gb.scRefs[boundSC].affinityDecr() - delete(gb.affinityMap, boundKey) - } -} - -// regeneratePicker takes a snapshot of the balancer, and generates a picker -// from it. The picker is -// - errPicker with ErrTransientFailure if the balancer is in TransientFailure, -// - built by the pickerBuilder with all READY SubConns otherwise. -func (gb *gcpBalancer) regeneratePicker() { - if gb.state == connectivity.TransientFailure { - gb.picker = newErrPicker(balancer.ErrTransientFailure) - return - } - readyRefs := []*subConnRef{} - - // Select ready subConns from subConn map. - for sc, scState := range gb.scStates { - if scState == connectivity.Ready { - readyRefs = append(readyRefs, gb.scRefs[sc]) - } - } - gb.picker = newGCPPicker(readyRefs, gb) -} - -func (gb *gcpBalancer) UpdateSubConnState(sc balancer.SubConn, scs balancer.SubConnState) { - gb.mu.Lock() - defer gb.mu.Unlock() - s := scs.ConnectivityState - - if scRef, found := gb.refreshingScRefs[sc]; found { - if gb.log.V(FINE) { - gb.log.Infof("handle replacement SubConn state change: %p, %v", sc, s) - } - if s != connectivity.Ready { - // Ignore the replacement sc until it's ready. - return - } - - // Replace SubConn of the scRef with the fresh SubConn (sc) concluding - // the refresh process initiated by refresh(*subConnRef). - oldSc := scRef.subConn - gb.scStates[sc] = gb.scStates[oldSc] - delete(gb.refreshingScRefs, sc) - delete(gb.scRefs, oldSc) - delete(gb.scStates, oldSc) - gb.scRefs[sc] = scRef - scRef.subConn = sc - scRef.deCalls = 0 - scRef.lastResp = time.Now() - scRef.refreshing = false - scRef.refreshCnt++ - gb.cc.RemoveSubConn(oldSc) - } - - if gb.log.V(FINE) { - gb.log.Infof("handle SubConn state change: %p, %v", sc, s) - } - - oldS, ok := gb.scStates[sc] - if !ok { - if gb.log.V(FINE) { - gb.log.Infof( - "got state changes for an unknown/replaced SubConn: %p, %v", - sc, - s, - ) - } - return - } - gb.scStates[sc] = s - switch s { - case connectivity.Idle: - sc.Connect() - case connectivity.Shutdown: - delete(gb.scRefs, sc) - delete(gb.scStates, sc) - } - if oldS == connectivity.Ready && s != oldS { - // Subconn is broken. Remove fallback mapping to this subconn. - for k, v := range gb.fallbackMap { - if v == sc { - delete(gb.fallbackMap, k) - } - } - } - if oldS != connectivity.Ready && s == connectivity.Ready { - // Remove fallback mapping for the keys of recovered subconn. - for k := range gb.fallbackMap { - if gb.affinityMap[k] == sc { - delete(gb.fallbackMap, k) - } - } - } - - oldAggrState := gb.state - gb.state = gb.csEvltr.recordTransition(oldS, s) - - // Regenerate picker when one of the following happens: - // - this sc became ready from not-ready - // - this sc became not-ready from ready - // - the aggregated state of balancer became TransientFailure from non-TransientFailure - // - the aggregated state of balancer became non-TransientFailure from TransientFailure - if (s == connectivity.Ready) != (oldS == connectivity.Ready) || - (gb.state == connectivity.TransientFailure) != (oldAggrState == connectivity.TransientFailure) { - gb.regeneratePicker() - gb.cc.UpdateState(balancer.State{ - ConnectivityState: gb.state, - Picker: gb.picker, - }) - } - - if scRef := gb.scRefs[sc]; scRef != nil { - // Inform of the state change. - close(scRef.stateSignal) - scRef.stateSignal = make(chan struct{}) - } -} - -// refresh initiates a new SubConn for a specific subConnRef and starts connecting. -// If the refresh is already initiated for the ref, then this is a no-op. -func (gb *gcpBalancer) refresh(ref *subConnRef) { - if ref.refreshing { - return - } - gb.mu.Lock() - defer gb.mu.Unlock() - if ref.refreshing { - return - } - ref.refreshing = true - sc, err := gb.cc.NewSubConn( - gb.addrs, - balancer.NewSubConnOptions{HealthCheckEnabled: healthCheckEnabled}, - ) - if err != nil { - gb.log.Errorf("failed to create a replacement SubConn with NewSubConn: %v", err) - return - } - gb.refreshingScRefs[sc] = ref - sc.Connect() -} - -func (gb *gcpBalancer) Close() { -} - -// ExitIdle is a no-op because the gcpBalancer will always try to reconnect and -// never enter "Idle" state after it's built. When a SubConn enters Idle, the -// balancer will immediately call sc.Connect() begin re-connecting it. -func (gb *gcpBalancer) ExitIdle() {} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_interceptor.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_interceptor.go deleted file mode 100644 index c0d77f1ce0..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_interceptor.go +++ /dev/null @@ -1,130 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpcgcp - -import ( - "context" - "sync" - - "google.golang.org/grpc" -) - -type key int - -var gcpKey key - -type gcpContext struct { - // request message used for pre-process of an affinity call - reqMsg interface{} - // response message used for post-process of an affinity call - replyMsg interface{} -} - -// GCPUnaryClientInterceptor intercepts the execution of a unary RPC -// and injects necessary information to be used by the picker. -func GCPUnaryClientInterceptor( - ctx context.Context, - method string, - req interface{}, - reply interface{}, - cc *grpc.ClientConn, - invoker grpc.UnaryInvoker, - opts ...grpc.CallOption, -) error { - gcpCtx := &gcpContext{ - reqMsg: req, - replyMsg: reply, - } - ctx = context.WithValue(ctx, gcpKey, gcpCtx) - - return invoker(ctx, method, req, reply, cc, opts...) -} - -// GCPStreamClientInterceptor intercepts the execution of a client streaming RPC -// and injects necessary information to be used by the picker. -func GCPStreamClientInterceptor( - ctx context.Context, - desc *grpc.StreamDesc, - cc *grpc.ClientConn, - method string, - streamer grpc.Streamer, - opts ...grpc.CallOption, -) (grpc.ClientStream, error) { - // This constructor does not create a real ClientStream, - // it only stores all parameters and let SendMsg() to create ClientStream. - cs := &gcpClientStream{ - ctx: ctx, - desc: desc, - cc: cc, - method: method, - streamer: streamer, - opts: opts, - } - cs.cond = sync.NewCond(cs) - return cs, nil -} - -type gcpClientStream struct { - sync.Mutex - grpc.ClientStream - - cond *sync.Cond - initStreamErr error - - ctx context.Context - desc *grpc.StreamDesc - cc *grpc.ClientConn - method string - streamer grpc.Streamer - opts []grpc.CallOption -} - -func (cs *gcpClientStream) SendMsg(m interface{}) error { - cs.Lock() - // Initialize underlying ClientStream when getting the first request. - if cs.ClientStream == nil { - ctx := context.WithValue(cs.ctx, gcpKey, &gcpContext{reqMsg: m}) - realCS, err := cs.streamer(ctx, cs.desc, cs.cc, cs.method, cs.opts...) - if err != nil { - cs.initStreamErr = err - cs.Unlock() - cs.cond.Broadcast() - return err - } - cs.ClientStream = realCS - } - cs.Unlock() - cs.cond.Broadcast() - return cs.ClientStream.SendMsg(m) -} - -func (cs *gcpClientStream) RecvMsg(m interface{}) error { - // If RecvMsg is called before SendMsg, it should wait until cs.ClientStream - // is initialized or the initialization failed. - cs.Lock() - for cs.initStreamErr == nil && cs.ClientStream == nil { - cs.cond.Wait() - } - if cs.initStreamErr != nil { - cs.Unlock() - return cs.initStreamErr - } - cs.Unlock() - return cs.ClientStream.RecvMsg(m) -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_logger.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_logger.go deleted file mode 100644 index 9870fa1235..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_logger.go +++ /dev/null @@ -1,98 +0,0 @@ -package grpcgcp - -import ( - "strings" - - "google.golang.org/grpc/grpclog" -) - -const ( - FINE = 90 - FINEST = 99 -) - -var compLogger = grpclog.Component("grpcgcp") - -type gcpLogger struct { - logger grpclog.LoggerV2 - prefix string -} - -// Make sure gcpLogger implements grpclog.LoggerV2. -var _ grpclog.LoggerV2 = (*gcpLogger)(nil) - -func NewGCPLogger(logger grpclog.LoggerV2, prefix string) *gcpLogger { - p := prefix - if !strings.HasSuffix(p, " ") { - p = p + " " - } - return &gcpLogger{ - logger: logger, - prefix: p, - } -} - -// Error implements grpclog.LoggerV2. -func (l *gcpLogger) Error(args ...interface{}) { - l.logger.Error(append([]interface{}{l.prefix}, args)...) -} - -// Errorf implements grpclog.LoggerV2. -func (l *gcpLogger) Errorf(format string, args ...interface{}) { - l.logger.Errorf(l.prefix+format, args...) -} - -// Errorln implements grpclog.LoggerV2. -func (l *gcpLogger) Errorln(args ...interface{}) { - l.logger.Errorln(append([]interface{}{l.prefix}, args)...) -} - -// Fatal implements grpclog.LoggerV2. -func (l *gcpLogger) Fatal(args ...interface{}) { - l.logger.Fatal(append([]interface{}{l.prefix}, args)...) -} - -// Fatalf implements grpclog.LoggerV2. -func (l *gcpLogger) Fatalf(format string, args ...interface{}) { - l.logger.Fatalf(l.prefix+format, args...) -} - -// Fatalln implements grpclog.LoggerV2. -func (l *gcpLogger) Fatalln(args ...interface{}) { - l.logger.Fatalln(append([]interface{}{l.prefix}, args)...) -} - -// Info implements grpclog.LoggerV2. -func (l *gcpLogger) Info(args ...interface{}) { - l.logger.Info(append([]interface{}{l.prefix}, args)...) -} - -// Infof implements grpclog.LoggerV2. -func (l *gcpLogger) Infof(format string, args ...interface{}) { - l.logger.Infof(l.prefix+format, args...) -} - -// Infoln implements grpclog.LoggerV2. -func (l *gcpLogger) Infoln(args ...interface{}) { - l.logger.Infoln(append([]interface{}{l.prefix}, args)...) -} - -// V implements grpclog.LoggerV2. -func (l *gcpLogger) V(level int) bool { - return l.logger.V(level) -} - -// Warning implements grpclog.LoggerV2. -func (l *gcpLogger) Warning(args ...interface{}) { - l.logger.Warning(append([]interface{}{l.prefix}, args)...) -} - -// Warningf implements grpclog.LoggerV2. -func (l *gcpLogger) Warningf(format string, args ...interface{}) { - l.logger.Warningf(l.prefix+format, args...) -} - -// Warningln implements grpclog.LoggerV2. -func (l *gcpLogger) Warningln(args ...interface{}) { - l.logger.Warningln(append([]interface{}{l.prefix}, args)...) -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_multiendpoint.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_multiendpoint.go deleted file mode 100644 index 9ee507437a..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_multiendpoint.go +++ /dev/null @@ -1,408 +0,0 @@ -/* - * - * Copyright 2023 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpcgcp - -import ( - "context" - "fmt" - "sync" - "sync/atomic" - - "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint" - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/grpclog" - "google.golang.org/protobuf/encoding/protojson" - "google.golang.org/protobuf/proto" - - pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" -) - -var gmeCounter uint32 - -type contextMEKey int - -var meKey contextMEKey - -// NewMEContext returns a new Context that carries Multiendpoint name. -func NewMEContext(ctx context.Context, name string) context.Context { - return context.WithValue(ctx, meKey, name) -} - -// FromMEContext returns the MultiEndpoint name stored in ctx, if any. -func FromMEContext(ctx context.Context) (string, bool) { - name, ok := ctx.Value(meKey).(string) - return name, ok -} - -// GCPMultiEndpoint holds the state of MultiEndpoints-enabled gRPC client connection. -// -// The purposes of GCPMultiEndpoint are: -// -// - Fallback to an alternative endpoint (host:port) of a gRPC service when the original -// endpoint is completely unavailable. -// - Be able to route an RPC call to a specific group of endpoints. -// - Be able to reconfigure endpoints in runtime. -// -// A group of endpoints is called a [multiendpoint.MultiEndpoint] and is essentially a list of endpoints -// where priority is defined by the position in the list with the first endpoint having top -// priority. A MultiEndpoint tracks endpoints' availability. When a MultiEndpoint is picked for an -// RPC call, it picks the top priority endpoint that is currently available. More information on the -// [multiendpoint.MultiEndpoint]. -// -// GCPMultiEndpoint can have one or more MultiEndpoint identified by its name -- arbitrary -// string provided in the [GCPMultiEndpointOptions] when configuring MultiEndpoints. This name -// can be used to route an RPC call to this MultiEndpoint by using the [NewMEContext]. -// -// GCPMultiEndpoint uses [GCPMultiEndpointOptions] for initial configuration. -// An updated configuration can be provided at any time later using [UpdateMultiEndpoints]. -// -// Example: -// -// Let's assume we have a service with read and write operations and the following backends: -// -// - service.example.com -- the main set of backends supporting all operations -// - service-fallback.example.com -- read-write replica supporting all operations -// - ro-service.example.com -- read-only replica supporting only read operations -// -// Example configuration: -// -// - MultiEndpoint named "default" with endpoints: -// -// 1. service.example.com:443 -// -// 2. service-fallback.example.com:443 -// -// - MultiEndpoint named "read" with endpoints: -// -// 1. ro-service.example.com:443 -// -// 2. service-fallback.example.com:443 -// -// 3. service.example.com:443 -// -// With the configuration above GCPMultiEndpoint will use the "default" MultiEndpoint by -// default. It means that RPC calls by default will use the main endpoint and if it is not available -// then the read-write replica. -// -// To offload some read calls to the read-only replica we can specify "read" MultiEndpoint in the -// context. Then these calls will use the read-only replica endpoint and if it is not available -// then the read-write replica and if it is also not available then the main endpoint. -// -// GCPMultiEndpoint creates a [grpcgcp] connection pool for every unique -// endpoint. For the example above three connection pools will be created. -// -// [GCPMultiEndpoint] implements [grpc.ClientConnInterface] and can be used -// as a [grpc.ClientConn] when creating gRPC clients. -type GCPMultiEndpoint struct { - mu sync.RWMutex - - defaultName string - mes map[string]multiendpoint.MultiEndpoint - pools map[string]*monitoredConn - opts []grpc.DialOption - gcpConfig *pb.ApiConfig - dialFunc func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) - log grpclog.LoggerV2 - - grpc.ClientConnInterface -} - -// Make sure GCPMultiEndpoint implements grpc.ClientConnInterface. -var _ grpc.ClientConnInterface = (*GCPMultiEndpoint)(nil) - -func (gme *GCPMultiEndpoint) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error { - return gme.pickConn(ctx).Invoke(ctx, method, args, reply, opts...) -} - -func (gme *GCPMultiEndpoint) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { - return gme.pickConn(ctx).NewStream(ctx, desc, method, opts...) -} - -func (gme *GCPMultiEndpoint) pickConn(ctx context.Context) *grpc.ClientConn { - name, ok := FromMEContext(ctx) - me, ook := gme.mes[name] - if !ok || !ook { - me = gme.mes[gme.defaultName] - } - return gme.pools[me.Current()].conn -} - -func (gme *GCPMultiEndpoint) Close() error { - var errs multiError - for e, mc := range gme.pools { - mc.stopMonitoring() - if err := mc.conn.Close(); err != nil { - errs = append(errs, err) - gme.log.Errorf("error while closing the pool for %q endpoint: %v", e, err) - } - if gme.log.V(FINE) { - gme.log.Infof("closed channel pool for %q endpoint.", e) - } - } - return errs.Combine() -} - -func (gme *GCPMultiEndpoint) GCPConfig() *pb.ApiConfig { - return proto.Clone(gme.gcpConfig).(*pb.ApiConfig) -} - -// GCPMultiEndpointOptions holds options to construct a MultiEndpoints-enabled gRPC client -// connection. -type GCPMultiEndpointOptions struct { - // Regular gRPC-GCP configuration to be applied to every endpoint. - GRPCgcpConfig *pb.ApiConfig - // Map of MultiEndpoints where key is the MultiEndpoint name. - MultiEndpoints map[string]*multiendpoint.MultiEndpointOptions - // Name of the default MultiEndpoint. - Default string - // Func to dial grpc ClientConn. - DialFunc func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) -} - -// NewGCPMultiEndpoint creates new [GCPMultiEndpoint] -- MultiEndpoints-enabled gRPC client -// connection. -// -// Deprecated: use NewGCPMultiEndpoint. -func NewGcpMultiEndpoint(meOpts *GCPMultiEndpointOptions, opts ...grpc.DialOption) (*GCPMultiEndpoint, error) { - return NewGCPMultiEndpoint(meOpts, opts...) -} - -// NewGCPMultiEndpoint creates new [GCPMultiEndpoint] -- MultiEndpoints-enabled gRPC client -// connection. -// -// [GCPMultiEndpoint] implements [grpc.ClientConnInterface] and can be used -// as a [grpc.ClientConn] when creating gRPC clients. -func NewGCPMultiEndpoint(meOpts *GCPMultiEndpointOptions, opts ...grpc.DialOption) (*GCPMultiEndpoint, error) { - // Read config, create multiendpoints and pools. - o, err := makeOpts(meOpts, opts) - if err != nil { - return nil, err - } - gme := &GCPMultiEndpoint{ - mes: make(map[string]multiendpoint.MultiEndpoint), - pools: make(map[string]*monitoredConn), - defaultName: meOpts.Default, - opts: o, - gcpConfig: proto.Clone(meOpts.GRPCgcpConfig).(*pb.ApiConfig), - dialFunc: meOpts.DialFunc, - log: NewGCPLogger(compLogger, fmt.Sprintf("[GCPMultiEndpoint #%d]", atomic.AddUint32(&gmeCounter, 1))), - } - if gme.dialFunc == nil { - gme.dialFunc = func(_ context.Context, target string, opts ...grpc.DialOption) (*grpc.ClientConn, error) { - return grpc.Dial(target, opts...) - } - } - if err := gme.UpdateMultiEndpoints(meOpts); err != nil { - return nil, err - } - return gme, nil -} - -func makeOpts(meOpts *GCPMultiEndpointOptions, opts []grpc.DialOption) ([]grpc.DialOption, error) { - grpcGCPjsonConfig, err := protojson.Marshal(meOpts.GRPCgcpConfig) - if err != nil { - return nil, err - } - o := append([]grpc.DialOption{}, opts...) - o = append(o, []grpc.DialOption{ - grpc.WithDisableServiceConfig(), - grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, Name, string(grpcGCPjsonConfig))), - grpc.WithChainUnaryInterceptor(GCPUnaryClientInterceptor), - grpc.WithChainStreamInterceptor(GCPStreamClientInterceptor), - }...) - - return o, nil -} - -type monitoredConn struct { - endpoint string - conn *grpc.ClientConn - gme *GCPMultiEndpoint - cancel context.CancelFunc -} - -func newMonitoredConn(endpoint string, conn *grpc.ClientConn, gme *GCPMultiEndpoint) (mc *monitoredConn) { - ctx, cancel := context.WithCancel(context.Background()) - mc = &monitoredConn{ - endpoint: endpoint, - conn: conn, - gme: gme, - cancel: cancel, - } - go mc.monitor(ctx) - return -} - -func (mc *monitoredConn) notify(state connectivity.State) { - if mc.gme.log.V(FINE) { - mc.gme.log.Infof("%q endpoint state changed to %v", mc.endpoint, state) - } - // Inform all multiendpoints. - mc.gme.mu.RLock() - for _, me := range mc.gme.mes { - me.SetEndpointAvailability(mc.endpoint, state == connectivity.Ready) - } - mc.gme.mu.RUnlock() -} - -func (mc *monitoredConn) monitor(ctx context.Context) { - for { - currentState := mc.conn.GetState() - mc.notify(currentState) - if !mc.conn.WaitForStateChange(ctx, currentState) { - break - } - } -} - -func (mc *monitoredConn) stopMonitoring() { - mc.cancel() -} - -// UpdateMultiEndpoints reconfigures MultiEndpoints. -// -// MultiEndpoints are matched with the current ones by name. -// -// - If a current MultiEndpoint is missing in the updated list, the MultiEndpoint will be -// removed. -// - A new MultiEndpoint will be created for every new name in the list. -// - For an existing MultiEndpoint only its endpoints will be updated (no recovery timeout -// change). -// -// Endpoints are matched by the endpoint address (usually in the form of address:port). -// -// - If an existing endpoint is not used by any MultiEndpoint in the updated list, then the -// connection poll for this endpoint will be shutdown. -// - A connection pool will be created for every new endpoint. -// - For an existing endpoint nothing will change (the connection pool will not be re-created, -// thus no connection credentials change, nor connection configuration change). -func (gme *GCPMultiEndpoint) UpdateMultiEndpoints(meOpts *GCPMultiEndpointOptions) error { - gme.mu.Lock() - defer gme.mu.Unlock() - if _, ok := meOpts.MultiEndpoints[meOpts.Default]; !ok { - return fmt.Errorf("default MultiEndpoint %q missing options", meOpts.Default) - } - - validPools := make(map[string]bool) - for _, meo := range meOpts.MultiEndpoints { - for _, e := range meo.Endpoints { - validPools[e] = true - } - } - - // Add missing pools. - for e := range validPools { - if _, ok := gme.pools[e]; !ok { - // This creates a ClientConn with the gRPC-GCP balancer managing connection pool. - conn, err := gme.dialFunc(context.Background(), e, gme.opts...) - if err != nil { - return err - } - if gme.log.V(FINE) { - gme.log.Infof("created new channel pool for %q endpoint.", e) - } - gme.pools[e] = newMonitoredConn(e, conn, gme) - } - } - - // Add new multi-endpoints and update existing. - for name, meo := range meOpts.MultiEndpoints { - if me, ok := gme.mes[name]; ok { - // Updating existing MultiEndpoint. - me.SetEndpoints(meo.Endpoints) - continue - } - - // Add new MultiEndpoint. - if gme.log.V(FINE) { - gme.log.Infof("creating new %q multiendpoint.", name) - } - me, err := multiendpoint.NewMultiEndpoint(meo) - if err != nil { - return err - } - gme.mes[name] = me - } - gme.defaultName = meOpts.Default - - // Remove obsolete MultiEndpoints. - for name := range gme.mes { - if _, ok := meOpts.MultiEndpoints[name]; !ok { - delete(gme.mes, name) - if gme.log.V(FINE) { - gme.log.Infof("removed obsolete %q multiendpoint.", name) - } - } - } - - // Remove obsolete pools. - for e, mc := range gme.pools { - if _, ok := validPools[e]; !ok { - if err := mc.conn.Close(); err != nil { - gme.log.Errorf("error while closing the pool for %q endpoint: %v", e, err) - } - if gme.log.V(FINE) { - gme.log.Infof("closed channel pool for %q endpoint.", e) - } - mc.stopMonitoring() - delete(gme.pools, e) - } - } - - // Trigger status update. - for e, mc := range gme.pools { - s := mc.conn.GetState() - for _, me := range gme.mes { - me.SetEndpointAvailability(e, s == connectivity.Ready) - } - } - return nil -} - -type multiError []error - -func (m multiError) Error() string { - s, n := "", 0 - for _, e := range m { - if e != nil { - if n == 0 { - s = e.Error() - } - n++ - } - } - switch n { - case 0: - return "(0 errors)" - case 1: - return s - case 2: - return s + " (and 1 other error)" - } - return fmt.Sprintf("%s (and %d other errors)", s, n-1) -} - -func (m multiError) Combine() error { - if len(m) == 0 { - return nil - } - - return m -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_picker.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_picker.go deleted file mode 100644 index 5223236257..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/gcp_picker.go +++ /dev/null @@ -1,276 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpcgcp - -import ( - "context" - "fmt" - "reflect" - "strings" - "sync" - "time" - - "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" - "google.golang.org/grpc/balancer" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/status" -) - -// Deadline exceeded gRPC error caused by client-side context reached deadline. -var deErr = status.Error(codes.DeadlineExceeded, context.DeadlineExceeded.Error()) - -func newGCPPicker(readySCRefs []*subConnRef, gb *gcpBalancer) balancer.Picker { - gp := &gcpPicker{ - gb: gb, - scRefs: readySCRefs, - } - gp.log = NewGCPLogger(gb.log, fmt.Sprintf("[gcpPicker %p]", gp)) - return gp -} - -type gcpPicker struct { - gb *gcpBalancer - mu sync.Mutex - scRefs []*subConnRef - log grpclog.LoggerV2 -} - -func (p *gcpPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { - if len(p.scRefs) <= 0 { - if p.log.V(FINEST) { - p.log.Info("returning balancer.ErrNoSubConnAvailable as no subconns are available.") - } - return balancer.PickResult{}, balancer.ErrNoSubConnAvailable - } - - ctx := info.Ctx - gcpCtx, hasGCPCtx := ctx.Value(gcpKey).(*gcpContext) - boundKey := "" - locator := "" - var cmd grpc_gcp.AffinityConfig_Command - - if mcfg, ok := p.gb.methodCfg[info.FullMethodName]; ok { - locator = mcfg.GetAffinityKey() - cmd = mcfg.GetCommand() - if hasGCPCtx && (cmd == grpc_gcp.AffinityConfig_BOUND || cmd == grpc_gcp.AffinityConfig_UNBIND) { - a, err := getAffinityKeysFromMessage(locator, gcpCtx.reqMsg) - if err != nil { - return balancer.PickResult{}, fmt.Errorf( - "failed to retrieve affinity key from request message: %v", err) - } - boundKey = a[0] - } - } - - scRef, err := p.getAndIncrementSubConnRef(info.Ctx, boundKey, cmd) - if err != nil { - return balancer.PickResult{}, err - } - if scRef == nil { - if p.log.V(FINEST) { - p.log.Info("returning balancer.ErrNoSubConnAvailable as no SubConn was picked.") - } - return balancer.PickResult{}, balancer.ErrNoSubConnAvailable - } - - callStarted := time.Now() - // define callback for post process once call is done - callback := func(info balancer.DoneInfo) { - scRef.streamsDecr() - p.detectUnresponsive(ctx, scRef, callStarted, info.Err) - if info.Err != nil { - return - } - - switch cmd { - case grpc_gcp.AffinityConfig_BIND: - bindKeys, err := getAffinityKeysFromMessage(locator, gcpCtx.replyMsg) - if err == nil { - for _, bk := range bindKeys { - p.gb.bindSubConn(bk, scRef.subConn) - } - } - case grpc_gcp.AffinityConfig_UNBIND: - p.gb.unbindSubConn(boundKey) - } - } - - if p.log.V(FINEST) { - p.log.Infof("picked SubConn: %p", scRef.subConn) - } - return balancer.PickResult{SubConn: scRef.subConn, Done: callback}, nil -} - -// unresponsiveWindow returns channel pool's unresponsiveDetectionMs multiplied -// by 2^(refresh count since last response) as a time.Duration. This provides -// exponential backoff when RPCs keep deadline exceeded after consecutive reconnections. -func (p *gcpPicker) unresponsiveWindow(scRef *subConnRef) time.Duration { - factor := uint32(1 << scRef.refreshCnt) - return time.Millisecond * time.Duration(factor*p.gb.cfg.GetChannelPool().GetUnresponsiveDetectionMs()) -} - -func (p *gcpPicker) detectUnresponsive(ctx context.Context, scRef *subConnRef, callStarted time.Time, rpcErr error) { - if !p.gb.unresponsiveDetection { - return - } - - // Treat as a response from the server if deadline exceeded was not caused by client side context reached deadline. - if dl, ok := ctx.Deadline(); rpcErr == nil || status.Code(rpcErr) != codes.DeadlineExceeded || - rpcErr.Error() != deErr.Error() || !ok || dl.After(time.Now()) { - scRef.gotResp() - return - } - - if callStarted.Before(scRef.lastResp) { - return - } - - // Increment deadline exceeded calls and check if there were enough deadline - // exceeded calls and enough time passed since last response to trigger refresh. - if scRef.deCallsInc() >= p.gb.cfg.GetChannelPool().GetUnresponsiveCalls() && - scRef.lastResp.Before(time.Now().Add(-p.unresponsiveWindow(scRef))) { - p.gb.refresh(scRef) - } -} - -func (p *gcpPicker) getAndIncrementSubConnRef(ctx context.Context, boundKey string, cmd grpc_gcp.AffinityConfig_Command) (*subConnRef, error) { - if cmd == grpc_gcp.AffinityConfig_BIND && p.gb.cfg.GetChannelPool().GetBindPickStrategy() == grpc_gcp.ChannelPoolConfig_ROUND_ROBIN { - scRef := p.gb.getSubConnRoundRobin(ctx) - if p.log.V(FINEST) { - p.log.Infof("picking SubConn for round-robin bind: %p", scRef.subConn) - } - scRef.streamsIncr() - return scRef, nil - } - - p.mu.Lock() - defer p.mu.Unlock() - scRef, err := p.getSubConnRef(boundKey) - if err != nil { - return nil, err - } - if scRef != nil { - scRef.streamsIncr() - } - return scRef, nil -} - -// getSubConnRef returns the subConnRef object that contains the subconn -// ready to be used by picker. -// Must be called holding the picker mutex lock. -func (p *gcpPicker) getSubConnRef(boundKey string) (*subConnRef, error) { - if boundKey != "" { - if ref, ok := p.gb.getReadySubConnRef(boundKey); ok { - return ref, nil - } - } - - return p.getLeastBusySubConnRef() -} - -// Must be called holding the picker mutex lock. -func (p *gcpPicker) getLeastBusySubConnRef() (*subConnRef, error) { - minScRef := p.scRefs[0] - minStreamsCnt := minScRef.getStreamsCnt() - for _, scRef := range p.scRefs { - if scRef.getStreamsCnt() < minStreamsCnt { - minStreamsCnt = scRef.getStreamsCnt() - minScRef = scRef - } - } - - // If the least busy connection still has capacity, use it - if minStreamsCnt < int32(p.gb.cfg.GetChannelPool().GetMaxConcurrentStreamsLowWatermark()) { - return minScRef, nil - } - - if p.gb.cfg.GetChannelPool().GetMaxSize() == 0 || p.gb.getConnectionPoolSize() < int(p.gb.cfg.GetChannelPool().GetMaxSize()) { - // Ask balancer to create new subconn when all current subconns are busy and - // the connection pool still has capacity (either unlimited or maxSize is not reached). - p.gb.newSubConn() - - // Let this picker return ErrNoSubConnAvailable because it needs some time - // for the subconn to be READY. - return nil, balancer.ErrNoSubConnAvailable - } - - // If no capacity for the pool size and every connection reachs the soft limit, - // Then picks the least busy one anyway. - return minScRef, nil -} - -func keysFromMessage(val reflect.Value, path []string, start int) ([]string, error) { - if val.Kind() == reflect.Pointer || val.Kind() == reflect.Interface { - val = val.Elem() - } - - if len(path) == start { - if val.Kind() != reflect.String { - return nil, fmt.Errorf("cannot get string value from %q which is %q", strings.Join(path, "."), val.Kind()) - } - return []string{val.String()}, nil - } - - if val.Kind() != reflect.Struct { - return nil, fmt.Errorf("path %q traversal error: cannot lookup field %q (index %d in the path) in a %q value", strings.Join(path, "."), path[start], start, val.Kind()) - } - valField := val.FieldByName(strings.Title(path[start])) - - if valField.Kind() != reflect.Slice { - return keysFromMessage(valField, path, start+1) - } - - keys := []string{} - for i := 0; i < valField.Len(); i++ { - kk, err := keysFromMessage(valField.Index(i), path, start+1) - if err != nil { - return keys, err - } - keys = append(keys, kk...) - } - return keys, nil -} - -// getAffinityKeysFromMessage retrieves the affinity key(s) from proto message using -// the key locator defined in the affinity config. -func getAffinityKeysFromMessage( - locator string, - msg interface{}, -) (affinityKeys []string, err error) { - names := strings.Split(locator, ".") - if len(names) == 0 { - return nil, fmt.Errorf("empty affinityKey locator") - } - - return keysFromMessage(reflect.ValueOf(msg), names, 0) -} - -// NewErrPicker returns a picker that always returns err on Pick(). -func newErrPicker(err error) balancer.Picker { - return &errPicker{err: err} -} - -type errPicker struct { - err error // Pick() always returns this err. -} - -func (p *errPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { - return balancer.PickResult{}, p.err -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/codegen.sh b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/codegen.sh deleted file mode 100644 index 334a718cc7..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/codegen.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -cd "$(dirname "$0")" - -rm grpc_gcp.pb.go -protoc --plugin=$(go env GOPATH)/bin/protoc-gen-go --proto_path=./ --go_out=.. ./grpc_gcp.proto - diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/grpc_gcp.pb.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/grpc_gcp.pb.go deleted file mode 100644 index 51dd4b27ae..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/grpc_gcp.pb.go +++ /dev/null @@ -1,638 +0,0 @@ -// Copyright 2018 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.12.4 -// source: grpc_gcp.proto - -package grpc_gcp - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A selection of strategies for picking a channel for a call with BIND command. -type ChannelPoolConfig_BindPickStrategy int32 - -const ( - // No preference -- picking a channel for a BIND call will be no different - // than for any other calls. - ChannelPoolConfig_UNSPECIFIED ChannelPoolConfig_BindPickStrategy = 0 - // A channel with the least active streams at the moment of a BIND call - // initiation will be picked. - ChannelPoolConfig_LEAST_ACTIVE_STREAMS ChannelPoolConfig_BindPickStrategy = 1 - // Cycle through channels created by the BIND call initiation. I. e. pick - // a channel in a round-robin manner. Note that some channels may be - // skipped during channel pool resize. - ChannelPoolConfig_ROUND_ROBIN ChannelPoolConfig_BindPickStrategy = 2 -) - -// Enum value maps for ChannelPoolConfig_BindPickStrategy. -var ( - ChannelPoolConfig_BindPickStrategy_name = map[int32]string{ - 0: "UNSPECIFIED", - 1: "LEAST_ACTIVE_STREAMS", - 2: "ROUND_ROBIN", - } - ChannelPoolConfig_BindPickStrategy_value = map[string]int32{ - "UNSPECIFIED": 0, - "LEAST_ACTIVE_STREAMS": 1, - "ROUND_ROBIN": 2, - } -) - -func (x ChannelPoolConfig_BindPickStrategy) Enum() *ChannelPoolConfig_BindPickStrategy { - p := new(ChannelPoolConfig_BindPickStrategy) - *p = x - return p -} - -func (x ChannelPoolConfig_BindPickStrategy) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ChannelPoolConfig_BindPickStrategy) Descriptor() protoreflect.EnumDescriptor { - return file_grpc_gcp_proto_enumTypes[0].Descriptor() -} - -func (ChannelPoolConfig_BindPickStrategy) Type() protoreflect.EnumType { - return &file_grpc_gcp_proto_enumTypes[0] -} - -func (x ChannelPoolConfig_BindPickStrategy) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ChannelPoolConfig_BindPickStrategy.Descriptor instead. -func (ChannelPoolConfig_BindPickStrategy) EnumDescriptor() ([]byte, []int) { - return file_grpc_gcp_proto_rawDescGZIP(), []int{1, 0} -} - -type AffinityConfig_Command int32 - -const ( - // The annotated method will be required to be bound to an existing session - // to execute the RPC. The corresponding will be - // used to find the affinity key from the request message. - AffinityConfig_BOUND AffinityConfig_Command = 0 - // The annotated method will establish the channel affinity with the - // channel which is used to execute the RPC. The corresponding - // will be used to find the affinity key from the - // response message. - AffinityConfig_BIND AffinityConfig_Command = 1 - // The annotated method will remove the channel affinity with the - // channel which is used to execute the RPC. The corresponding - // will be used to find the affinity key from the - // request message. - AffinityConfig_UNBIND AffinityConfig_Command = 2 -) - -// Enum value maps for AffinityConfig_Command. -var ( - AffinityConfig_Command_name = map[int32]string{ - 0: "BOUND", - 1: "BIND", - 2: "UNBIND", - } - AffinityConfig_Command_value = map[string]int32{ - "BOUND": 0, - "BIND": 1, - "UNBIND": 2, - } -) - -func (x AffinityConfig_Command) Enum() *AffinityConfig_Command { - p := new(AffinityConfig_Command) - *p = x - return p -} - -func (x AffinityConfig_Command) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (AffinityConfig_Command) Descriptor() protoreflect.EnumDescriptor { - return file_grpc_gcp_proto_enumTypes[1].Descriptor() -} - -func (AffinityConfig_Command) Type() protoreflect.EnumType { - return &file_grpc_gcp_proto_enumTypes[1] -} - -func (x AffinityConfig_Command) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AffinityConfig_Command.Descriptor instead. -func (AffinityConfig_Command) EnumDescriptor() ([]byte, []int) { - return file_grpc_gcp_proto_rawDescGZIP(), []int{3, 0} -} - -type ApiConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The channel pool configurations. - ChannelPool *ChannelPoolConfig `protobuf:"bytes,2,opt,name=channel_pool,json=channelPool,proto3" json:"channel_pool,omitempty"` - // The method configurations. - Method []*MethodConfig `protobuf:"bytes,1001,rep,name=method,proto3" json:"method,omitempty"` -} - -func (x *ApiConfig) Reset() { - *x = ApiConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ApiConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ApiConfig) ProtoMessage() {} - -func (x *ApiConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_gcp_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ApiConfig.ProtoReflect.Descriptor instead. -func (*ApiConfig) Descriptor() ([]byte, []int) { - return file_grpc_gcp_proto_rawDescGZIP(), []int{0} -} - -func (x *ApiConfig) GetChannelPool() *ChannelPoolConfig { - if x != nil { - return x.ChannelPool - } - return nil -} - -func (x *ApiConfig) GetMethod() []*MethodConfig { - if x != nil { - return x.Method - } - return nil -} - -// ChannelPoolConfig are options for configuring the channel pool. -// RPCs will be scheduled onto existing channels in the pool until all channels -// have number of streams. At this point -// a new channel is spun out. Once channels have been spun out and -// each has streams, subsequent RPCs will -// hang until any of the in-flight RPCs is finished, freeing up a channel. -type ChannelPoolConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The max number of channels in the pool. - // Default value is 0, meaning 'unlimited' size. - MaxSize uint32 `protobuf:"varint,1,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` - // The idle timeout (seconds) of channels without bound affinity sessions. - IdleTimeout uint64 `protobuf:"varint,2,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"` - // The low watermark of max number of concurrent streams in a channel. - // New channel will be created once it get hit, until we reach the max size of the channel pool. - // Default value is 100. The valid range is [1, 100]. Any value outside the range will be ignored and the default value will be used. - // Note: It is not recommended that users adjust this value, since a single channel should generally have no trouble managing the default (maximum) number of streams. - MaxConcurrentStreamsLowWatermark uint32 `protobuf:"varint,3,opt,name=max_concurrent_streams_low_watermark,json=maxConcurrentStreamsLowWatermark,proto3" json:"max_concurrent_streams_low_watermark,omitempty"` - // The minimum number of channels in the pool. - MinSize uint32 `protobuf:"varint,4,opt,name=min_size,json=minSize,proto3" json:"min_size,omitempty"` - // If a channel mapped to an affinity key is not ready, temporarily fallback - // to another ready channel. - // Enabling this fallback is beneficial in scenarios with short RPC timeouts - // and rather slow connection establishing or during incidents when new - // connections fail but existing connections still operate. - FallbackToReady bool `protobuf:"varint,5,opt,name=fallback_to_ready,json=fallbackToReady,proto3" json:"fallback_to_ready,omitempty"` - // Enables per channel unresponsive connection detection if > 0 and unresponsive_calls > 0. - // If enabled and more than unresponsive_detection_ms passed since the last response from the server, - // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, - // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for - // that channel and after the new connection is ready it will replace the old connection. The calls on the old - // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh - // if no response from the server is received. - UnresponsiveDetectionMs uint32 `protobuf:"varint,6,opt,name=unresponsive_detection_ms,json=unresponsiveDetectionMs,proto3" json:"unresponsive_detection_ms,omitempty"` - // Enables per channel unresponsive connection detection if > 0 and unresponsive_detection_ms > 0. - // If enabled and more than unresponsive_detection_ms passed since the last response from the server, - // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, - // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for - // that channel and after the new connection is ready it will replace the old connection. The calls on the old - // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh - // if no response from the server is received. - UnresponsiveCalls uint32 `protobuf:"varint,7,opt,name=unresponsive_calls,json=unresponsiveCalls,proto3" json:"unresponsive_calls,omitempty"` - // The strategy for picking a channel for a call with BIND command. - BindPickStrategy ChannelPoolConfig_BindPickStrategy `protobuf:"varint,8,opt,name=bind_pick_strategy,json=bindPickStrategy,proto3,enum=grpc.gcp.ChannelPoolConfig_BindPickStrategy" json:"bind_pick_strategy,omitempty"` -} - -func (x *ChannelPoolConfig) Reset() { - *x = ChannelPoolConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChannelPoolConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChannelPoolConfig) ProtoMessage() {} - -func (x *ChannelPoolConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_gcp_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChannelPoolConfig.ProtoReflect.Descriptor instead. -func (*ChannelPoolConfig) Descriptor() ([]byte, []int) { - return file_grpc_gcp_proto_rawDescGZIP(), []int{1} -} - -func (x *ChannelPoolConfig) GetMaxSize() uint32 { - if x != nil { - return x.MaxSize - } - return 0 -} - -func (x *ChannelPoolConfig) GetIdleTimeout() uint64 { - if x != nil { - return x.IdleTimeout - } - return 0 -} - -func (x *ChannelPoolConfig) GetMaxConcurrentStreamsLowWatermark() uint32 { - if x != nil { - return x.MaxConcurrentStreamsLowWatermark - } - return 0 -} - -func (x *ChannelPoolConfig) GetMinSize() uint32 { - if x != nil { - return x.MinSize - } - return 0 -} - -func (x *ChannelPoolConfig) GetFallbackToReady() bool { - if x != nil { - return x.FallbackToReady - } - return false -} - -func (x *ChannelPoolConfig) GetUnresponsiveDetectionMs() uint32 { - if x != nil { - return x.UnresponsiveDetectionMs - } - return 0 -} - -func (x *ChannelPoolConfig) GetUnresponsiveCalls() uint32 { - if x != nil { - return x.UnresponsiveCalls - } - return 0 -} - -func (x *ChannelPoolConfig) GetBindPickStrategy() ChannelPoolConfig_BindPickStrategy { - if x != nil { - return x.BindPickStrategy - } - return ChannelPoolConfig_UNSPECIFIED -} - -type MethodConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A fully qualified name of a gRPC method, or a wildcard pattern ending - // with .*, such as foo.bar.A, foo.bar.*. Method configs are evaluated - // sequentially, and the first one takes precedence. - Name []string `protobuf:"bytes,1,rep,name=name,proto3" json:"name,omitempty"` - // The channel affinity configurations. - Affinity *AffinityConfig `protobuf:"bytes,1001,opt,name=affinity,proto3" json:"affinity,omitempty"` -} - -func (x *MethodConfig) Reset() { - *x = MethodConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MethodConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MethodConfig) ProtoMessage() {} - -func (x *MethodConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_gcp_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MethodConfig.ProtoReflect.Descriptor instead. -func (*MethodConfig) Descriptor() ([]byte, []int) { - return file_grpc_gcp_proto_rawDescGZIP(), []int{2} -} - -func (x *MethodConfig) GetName() []string { - if x != nil { - return x.Name - } - return nil -} - -func (x *MethodConfig) GetAffinity() *AffinityConfig { - if x != nil { - return x.Affinity - } - return nil -} - -type AffinityConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The affinity command applies on the selected gRPC methods. - Command AffinityConfig_Command `protobuf:"varint,2,opt,name=command,proto3,enum=grpc.gcp.AffinityConfig_Command" json:"command,omitempty"` - // The field path of the affinity key in the request/response message. - // For example: "f.a", "f.b.d", etc. - AffinityKey string `protobuf:"bytes,3,opt,name=affinity_key,json=affinityKey,proto3" json:"affinity_key,omitempty"` -} - -func (x *AffinityConfig) Reset() { - *x = AffinityConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AffinityConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AffinityConfig) ProtoMessage() {} - -func (x *AffinityConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_gcp_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AffinityConfig.ProtoReflect.Descriptor instead. -func (*AffinityConfig) Descriptor() ([]byte, []int) { - return file_grpc_gcp_proto_rawDescGZIP(), []int{3} -} - -func (x *AffinityConfig) GetCommand() AffinityConfig_Command { - if x != nil { - return x.Command - } - return AffinityConfig_BOUND -} - -func (x *AffinityConfig) GetAffinityKey() string { - if x != nil { - return x.AffinityKey - } - return "" -} - -var File_grpc_gcp_proto protoreflect.FileDescriptor - -var file_grpc_gcp_proto_rawDesc = []byte{ - 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x08, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x22, 0x7c, 0x0a, 0x09, 0x41, 0x70, - 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x67, 0x63, 0x70, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0xff, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x64, 0x6c, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4e, 0x0a, 0x24, - 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, - 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x20, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, - 0x4c, 0x6f, 0x77, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x08, - 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x6d, 0x69, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x61, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x54, 0x6f, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x75, 0x6e, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x5a, - 0x0a, 0x12, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x70, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, - 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x69, 0x63, 0x6b, - 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x10, 0x62, 0x69, 0x6e, 0x64, 0x50, 0x69, - 0x63, 0x6b, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x4e, 0x0a, 0x10, 0x42, 0x69, - 0x6e, 0x64, 0x50, 0x69, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x0f, - 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x18, 0x0a, 0x14, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, - 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x4f, 0x55, - 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x10, 0x02, 0x22, 0x59, 0x0a, 0x0c, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x41, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x61, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x22, 0x9b, 0x01, 0x0a, 0x0e, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x66, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x2a, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x42, 0x49, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x4e, 0x42, 0x49, 0x4e, - 0x44, 0x10, 0x02, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, - 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_grpc_gcp_proto_rawDescOnce sync.Once - file_grpc_gcp_proto_rawDescData = file_grpc_gcp_proto_rawDesc -) - -func file_grpc_gcp_proto_rawDescGZIP() []byte { - file_grpc_gcp_proto_rawDescOnce.Do(func() { - file_grpc_gcp_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_proto_rawDescData) - }) - return file_grpc_gcp_proto_rawDescData -} - -var file_grpc_gcp_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_grpc_gcp_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_grpc_gcp_proto_goTypes = []interface{}{ - (ChannelPoolConfig_BindPickStrategy)(0), // 0: grpc.gcp.ChannelPoolConfig.BindPickStrategy - (AffinityConfig_Command)(0), // 1: grpc.gcp.AffinityConfig.Command - (*ApiConfig)(nil), // 2: grpc.gcp.ApiConfig - (*ChannelPoolConfig)(nil), // 3: grpc.gcp.ChannelPoolConfig - (*MethodConfig)(nil), // 4: grpc.gcp.MethodConfig - (*AffinityConfig)(nil), // 5: grpc.gcp.AffinityConfig -} -var file_grpc_gcp_proto_depIdxs = []int32{ - 3, // 0: grpc.gcp.ApiConfig.channel_pool:type_name -> grpc.gcp.ChannelPoolConfig - 4, // 1: grpc.gcp.ApiConfig.method:type_name -> grpc.gcp.MethodConfig - 0, // 2: grpc.gcp.ChannelPoolConfig.bind_pick_strategy:type_name -> grpc.gcp.ChannelPoolConfig.BindPickStrategy - 5, // 3: grpc.gcp.MethodConfig.affinity:type_name -> grpc.gcp.AffinityConfig - 1, // 4: grpc.gcp.AffinityConfig.command:type_name -> grpc.gcp.AffinityConfig.Command - 5, // [5:5] is the sub-list for method output_type - 5, // [5:5] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name -} - -func init() { file_grpc_gcp_proto_init() } -func file_grpc_gcp_proto_init() { - if File_grpc_gcp_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelPoolConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MethodConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AffinityConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_gcp_proto_rawDesc, - NumEnums: 2, - NumMessages: 4, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_grpc_gcp_proto_goTypes, - DependencyIndexes: file_grpc_gcp_proto_depIdxs, - EnumInfos: file_grpc_gcp_proto_enumTypes, - MessageInfos: file_grpc_gcp_proto_msgTypes, - }.Build() - File_grpc_gcp_proto = out.File - file_grpc_gcp_proto_rawDesc = nil - file_grpc_gcp_proto_goTypes = nil - file_grpc_gcp_proto_depIdxs = nil -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/grpc_gcp.proto b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/grpc_gcp.proto deleted file mode 100644 index c1060e8bc2..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp/grpc_gcp.proto +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2018 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -option go_package = "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp"; - -package grpc.gcp; - -message ApiConfig { - // The channel pool configurations. - ChannelPoolConfig channel_pool = 2; - - // The method configurations. - repeated MethodConfig method = 1001; -} - -// ChannelPoolConfig are options for configuring the channel pool. -// RPCs will be scheduled onto existing channels in the pool until all channels -// have number of streams. At this point -// a new channel is spun out. Once channels have been spun out and -// each has streams, subsequent RPCs will -// hang until any of the in-flight RPCs is finished, freeing up a channel. -message ChannelPoolConfig { - // The max number of channels in the pool. - // Default value is 0, meaning 'unlimited' size. - uint32 max_size = 1; - - // The idle timeout (seconds) of channels without bound affinity sessions. - uint64 idle_timeout = 2; - - // The low watermark of max number of concurrent streams in a channel. - // New channel will be created once it get hit, until we reach the max size of the channel pool. - // Default value is 100. The valid range is [1, 100]. Any value outside the range will be ignored and the default value will be used. - // Note: It is not recommended that users adjust this value, since a single channel should generally have no trouble managing the default (maximum) number of streams. - uint32 max_concurrent_streams_low_watermark = 3; - - // The minimum number of channels in the pool. - uint32 min_size = 4; - - // If a channel mapped to an affinity key is not ready, temporarily fallback - // to another ready channel. - // Enabling this fallback is beneficial in scenarios with short RPC timeouts - // and rather slow connection establishing or during incidents when new - // connections fail but existing connections still operate. - bool fallback_to_ready = 5; - - // Enables per channel unresponsive connection detection if > 0 and unresponsive_calls > 0. - // If enabled and more than unresponsive_detection_ms passed since the last response from the server, - // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, - // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for - // that channel and after the new connection is ready it will replace the old connection. The calls on the old - // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh - // if no response from the server is received. - uint32 unresponsive_detection_ms = 6; - - // Enables per channel unresponsive connection detection if > 0 and unresponsive_detection_ms > 0. - // If enabled and more than unresponsive_detection_ms passed since the last response from the server, - // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, - // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for - // that channel and after the new connection is ready it will replace the old connection. The calls on the old - // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh - // if no response from the server is received. - uint32 unresponsive_calls = 7; - - // A selection of strategies for picking a channel for a call with BIND command. - enum BindPickStrategy { - // No preference -- picking a channel for a BIND call will be no different - // than for any other calls. - UNSPECIFIED = 0; - - // A channel with the least active streams at the moment of a BIND call - // initiation will be picked. - LEAST_ACTIVE_STREAMS = 1; - - // Cycle through channels created by the BIND call initiation. I. e. pick - // a channel in a round-robin manner. Note that some channels may be - // skipped during channel pool resize. - ROUND_ROBIN = 2; - } - - // The strategy for picking a channel for a call with BIND command. - BindPickStrategy bind_pick_strategy = 8; -} - -message MethodConfig { - // A fully qualified name of a gRPC method, or a wildcard pattern ending - // with .*, such as foo.bar.A, foo.bar.*. Method configs are evaluated - // sequentially, and the first one takes precedence. - repeated string name = 1; - - // The channel affinity configurations. - AffinityConfig affinity = 1001; -} - -message AffinityConfig { - enum Command { - // The annotated method will be required to be bound to an existing session - // to execute the RPC. The corresponding will be - // used to find the affinity key from the request message. - BOUND = 0; - // The annotated method will establish the channel affinity with the - // channel which is used to execute the RPC. The corresponding - // will be used to find the affinity key from the - // response message. - BIND = 1; - // The annotated method will remove the channel affinity with the - // channel which is used to execute the RPC. The corresponding - // will be used to find the affinity key from the - // request message. - UNBIND = 2; - } - // The affinity command applies on the selected gRPC methods. - Command command = 2; - // The field path of the affinity key in the request/response message. - // For example: "f.a", "f.b.d", etc. - string affinity_key = 3; -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/mockgen.sh b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/mockgen.sh deleted file mode 100644 index ff4de33904..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/mockgen.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -cd "$(dirname "$0")" -mockgen -destination=mocks/mock_balancer.go -package=mocks google.golang.org/grpc/balancer ClientConn,SubConn -mockgen -destination=mocks/mock_stream.go -package=mocks google.golang.org/grpc ClientStream diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint/endpoint.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint/endpoint.go deleted file mode 100644 index 2a9c52eba8..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint/endpoint.go +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2023 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package multiendpoint - -import ( - "fmt" - "time" -) - -type status int - -// Status of an endpoint. -const ( - unavailable status = iota - available - recovering -) - -func (s status) String() string { - switch s { - case unavailable: - return "Unavailable" - case available: - return "Available" - case recovering: - return "Recovering" - default: - return fmt.Sprintf("%d", s) - } -} - -type endpoint struct { - id string - priority int - status status - lastChange time.Time - futureChange timerAlike -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint/multiendpoint.go b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint/multiendpoint.go deleted file mode 100644 index 7e70a6ea5f..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint/multiendpoint.go +++ /dev/null @@ -1,306 +0,0 @@ -/* - * - * Copyright 2023 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package multiendpoint implements multiendpoint feature. See [MultiEndpoint] -package multiendpoint - -import ( - "errors" - "fmt" - "sync" - "time" -) - -type timerAlike interface { - Reset(time.Duration) bool - Stop() bool -} - -// To be redefined in tests. -var ( - timeNow = func() time.Time { - return time.Now() - } - timeAfterFunc = func(d time.Duration, f func()) timerAlike { - return time.AfterFunc(d, f) - } -) - -// MultiEndpoint holds a list of endpoints, tracks their availability and defines the current -// endpoint. An endpoint has a priority defined by its position in the list (first item has top -// priority). -// -// The current endpoint is the highest available endpoint in the list. If no endpoint is available, -// MultiEndpoint sticks to the previously current endpoint. -// -// Sometimes switching between endpoints can be costly, and it is worth waiting for some time -// after current endpoint becomes unavailable. For this case, use -// [MultiEndpointOptions.RecoveryTimeout] to set the recovery timeout. MultiEndpoint will keep the -// current endpoint for up to recovery timeout after it became unavailable to give it some time to -// recover. -// -// The list of endpoints can be changed at any time with [MultiEndpoint.SetEndpoints] function. -// MultiEndpoint will: -// - remove obsolete endpoints; -// - preserve remaining endpoints and their states; -// - add new endpoints; -// - update all endpoints priority according to the new order; -// - change current endpoint if necessary. -// -// After updating the list of endpoints, MultiEndpoint will switch the current endpoint to the -// highest available endpoint in the list. If you have many processes using MultiEndpoint, this may -// lead to immediate shift of all traffic which may be undesired. To smooth this transfer, use -// [MultiEndpointOptions.SwitchingDelay] with randomized value to introduce a jitter. Each -// MultiEndpoint will delay switching from an available endpoint to another endpoint for this amount -// of time. This delay is only applicable when switching from a lower priority available endpoint to -// a higher priority available endpoint. -type MultiEndpoint interface { - // Current returns current endpoint. - // - // Note that the read is not synchronized and in case of a race condition there is a chance of - // getting an outdated current endpoint. - Current() string - - // SetEndpointAvailability informs MultiEndpoint when an endpoint becomes available or unavailable. - // This may change the current endpoint. - SetEndpointAvailability(e string, avail bool) - - // SetEndpoints updates a list of endpoints: - // - remove obsolete endpoints - // - preserve remaining endpoints and their states - // - add new endpoints - // - update all endpoints priority according to the new order - // This may change the current endpoint. - SetEndpoints(endpoints []string) error -} - -// MultiEndpointOptions is used for configuring [MultiEndpoint]. -type MultiEndpointOptions struct { - // A list of endpoints ordered by priority (first endpoint has top priority). - Endpoints []string - // RecoveryTimeout sets the amount of time MultiEndpoint keeps endpoint as current after it - // became unavailable. - RecoveryTimeout time.Duration - // When switching from a lower priority available endpoint to a higher priority available - // endpoint the MultiEndpoint will delay the switch for this duration. - SwitchingDelay time.Duration -} - -// NewMultiEndpoint validates options and creates a new [MultiEndpoint]. -func NewMultiEndpoint(b *MultiEndpointOptions) (MultiEndpoint, error) { - if len(b.Endpoints) == 0 { - return nil, fmt.Errorf("endpoints list cannot be empty") - } - - me := &multiEndpoint{ - recoveryTimeout: b.RecoveryTimeout, - switchingDelay: b.SwitchingDelay, - current: b.Endpoints[0], - } - eMap := make(map[string]*endpoint) - for i, e := range b.Endpoints { - eMap[e] = me.newEndpoint(e, i) - } - me.endpoints = eMap - return me, nil -} - -type multiEndpoint struct { - sync.RWMutex - - endpoints map[string]*endpoint - recoveryTimeout time.Duration - switchingDelay time.Duration - current string - future string -} - -// Current returns current endpoint. -func (me *multiEndpoint) Current() string { - me.RLock() - defer me.RUnlock() - return me.current -} - -// SetEndpoints updates endpoints list: -// - remove obsolete endpoints; -// - preserve remaining endpoints and their states; -// - add new endpoints; -// - update all endpoints priority according to the new order; -// - change current endpoint if necessary. -func (me *multiEndpoint) SetEndpoints(endpoints []string) error { - me.Lock() - defer me.Unlock() - if len(endpoints) == 0 { - return errors.New("endpoints list cannot be empty") - } - newEndpoints := make(map[string]struct{}) - for _, v := range endpoints { - newEndpoints[v] = struct{}{} - } - // Remove obsolete endpoints. - for e := range me.endpoints { - if _, ok := newEndpoints[e]; !ok { - delete(me.endpoints, e) - } - } - // Add new endpoints and update priority. - for i, e := range endpoints { - if _, ok := me.endpoints[e]; !ok { - me.endpoints[e] = me.newEndpoint(e, i) - } else { - me.endpoints[e].priority = i - } - } - - me.maybeUpdateCurrent() - return nil -} - -// Updates current to the top-priority available endpoint unless the current endpoint is -// recovering. -// -// Must be run under me.Lock. -func (me *multiEndpoint) maybeUpdateCurrent() { - c, exists := me.endpoints[me.current] - var topA *endpoint - var top *endpoint - for _, e := range me.endpoints { - if e.status == available && (topA == nil || topA.priority > e.priority) { - topA = e - } - if top == nil || top.priority > e.priority { - top = e - } - } - - if exists && c.status == recovering && (topA == nil || topA.priority > c.priority) { - // Let current endpoint recover while no higher priority endpoints available. - return - } - - // Always prefer top available endpoint. - if topA != nil { - me.switchFromTo(c, topA) - return - } - - // If no current endpoint exists, resort to the top priority endpoint immediately. - if !exists { - me.current = top.id - } -} - -func (me *multiEndpoint) newEndpoint(id string, priority int) *endpoint { - s := unavailable - if me.recoveryTimeout > 0 { - s = recovering - } - e := &endpoint{ - id: id, - priority: priority, - status: s, - } - if e.status == recovering { - me.scheduleUnavailable(e) - } - return e -} - -// Changes or schedules a change of current to the endpoint t. -// -// Must be run under me.Lock. -func (me *multiEndpoint) switchFromTo(f, t *endpoint) { - if me.current == t.id { - return - } - - if me.switchingDelay == 0 || f == nil || f.status == unavailable { - // Switching immediately if no delay or no current or current is unavailable. - me.current = t.id - return - } - - me.future = t.id - timeAfterFunc(me.switchingDelay, func() { - me.Lock() - defer me.Unlock() - if e, ok := me.endpoints[me.future]; ok && e.status == available { - me.current = e.id - } - }) -} - -// SetEndpointAvailability updates the state of an endpoint. -func (me *multiEndpoint) SetEndpointAvailability(e string, avail bool) { - me.Lock() - defer me.Unlock() - me.setEndpointAvailability(e, avail) - me.maybeUpdateCurrent() -} - -// Must be run under me.Lock. -func (me *multiEndpoint) setEndpointAvailability(e string, avail bool) { - ee, ok := me.endpoints[e] - if !ok { - return - } - - if avail { - setState(ee, available) - return - } - - if ee.status != available { - return - } - - if me.recoveryTimeout == 0 { - setState(ee, unavailable) - return - } - - setState(ee, recovering) - me.scheduleUnavailable(ee) -} - -// Change the state of endpoint e to state s. -// -// Must be run under me.Lock. -func setState(e *endpoint, s status) { - if e.futureChange != nil { - e.futureChange.Stop() - } - e.status = s - e.lastChange = timeNow() -} - -// Schedule endpoint e to become unavailable after recoveryTimeout. -func (me *multiEndpoint) scheduleUnavailable(e *endpoint) { - stateChange := e.lastChange - e.futureChange = timeAfterFunc(me.recoveryTimeout, func() { - me.Lock() - defer me.Unlock() - if e.lastChange != stateChange { - // This timer is outdated. - return - } - setState(e, unavailable) - me.maybeUpdateCurrent() - }) -} diff --git a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/test_config.json b/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/test_config.json deleted file mode 100644 index 6291ae9cb0..0000000000 --- a/vendor/github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/test_config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "channelPool": { - "maxSize": 10, - "maxConcurrentStreamsLowWatermark": 10 - }, - "method": [ - { - "name": [ "method1" ], - "affinity": { - "command": "BIND", - "affinityKey": "key1" - } - }, - { - "name": [ "method2" ], - "affinity": { - "command": "BOUND", - "affinityKey": "key2" - } - }, - { - "name": [ "method3" ], - "affinity": { - "command": "UNBIND", - "affinityKey": "key3" - } - } - ] -} \ No newline at end of file diff --git a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/metric.go b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/metric.go index c69f43dbae..6c4e8143eb 100644 --- a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/metric.go +++ b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/metric.go @@ -595,10 +595,11 @@ func gaugeToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics return nil, err } return &monitoringpb.TimeSeries{ - Resource: mr, - Unit: string(metrics.Unit), - MetricKind: googlemetricpb.MetricDescriptor_GAUGE, - ValueType: valueType, + Resource: mr, + Unit: metrics.Unit, + Description: metrics.Description, + MetricKind: googlemetricpb.MetricDescriptor_GAUGE, + ValueType: valueType, Points: []*monitoringpb.Point{{ Interval: &monitoringpb.TimeInterval{ EndTime: timestamp, @@ -615,10 +616,11 @@ func sumToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics m } value, valueType := numberDataPointToValue[N](point) return &monitoringpb.TimeSeries{ - Resource: mr, - Unit: string(metrics.Unit), - MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, - ValueType: valueType, + Resource: mr, + Unit: metrics.Unit, + Description: metrics.Description, + MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, + ValueType: valueType, Points: []*monitoringpb.Point{{ Interval: interval, Value: value, @@ -639,10 +641,11 @@ func histogramToTimeSeries[N int64 | float64](point metricdata.HistogramDataPoin setSumOfSquaredDeviation(point, distributionValue) } return &monitoringpb.TimeSeries{ - Resource: mr, - Unit: string(metrics.Unit), - MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, - ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, + Resource: mr, + Unit: metrics.Unit, + Description: metrics.Description, + MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, + ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, Points: []*monitoringpb.Point{{ Interval: interval, Value: &monitoringpb.TypedValue{ @@ -662,10 +665,11 @@ func expHistogramToTimeSeries[N int64 | float64](point metricdata.ExponentialHis distributionValue := expHistToDistribution(point, projectID) // TODO: Implement "setSumOfSquaredDeviationExpHist" for parameter "enableSOSD" functionality. return &monitoringpb.TimeSeries{ - Resource: mr, - Unit: string(metrics.Unit), - MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, - ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, + Resource: mr, + Unit: metrics.Unit, + Description: metrics.Description, + MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, + ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, Points: []*monitoringpb.Point{{ Interval: interval, Value: &monitoringpb.TypedValue{ diff --git a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/option.go b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/option.go index 8f2927b110..8aeb981c11 100644 --- a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/option.go +++ b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/option.go @@ -23,7 +23,7 @@ import ( "go.opentelemetry.io/otel/sdk/metric/metricdata" monitoring "cloud.google.com/go/monitoring/apiv3/v2" - semconv "go.opentelemetry.io/otel/semconv/v1.24.0" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" apioption "google.golang.org/api/option" ) diff --git a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/version.go b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/version.go index bee9d33328..4f525295ec 100644 --- a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/version.go +++ b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/version.go @@ -17,5 +17,5 @@ package metric // Version is the current release version of the OpenTelemetry // Operations Metric Exporter in use. func Version() string { - return "0.53.0" + return "0.54.0" } diff --git a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/resourcemapping.go b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/resourcemapping.go index 510391b824..65bd8f5545 100644 --- a/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/resourcemapping.go +++ b/vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/resourcemapping.go @@ -17,7 +17,7 @@ package resourcemapping import ( "strings" - semconv "go.opentelemetry.io/otel/semconv/v1.24.0" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" ) diff --git a/vendor/github.com/go-openapi/analysis/.golangci.yml b/vendor/github.com/go-openapi/analysis/.golangci.yml index 22f8d21cca..06190ac055 100644 --- a/vendor/github.com/go-openapi/analysis/.golangci.yml +++ b/vendor/github.com/go-openapi/analysis/.golangci.yml @@ -1,61 +1,75 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gosmopolitan + - inamedparam + - intrange + - ireturn + - lll + - musttag + - nestif + - nlreturn + - noinlineerr + - nonamedreturns - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go index c17aee1b61..4870ad07be 100644 --- a/vendor/github.com/go-openapi/analysis/analyzer.go +++ b/vendor/github.com/go-openapi/analysis/analyzer.go @@ -1,28 +1,24 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis import ( "fmt" + "maps" slashpath "path" "strconv" "strings" "github.com/go-openapi/jsonpointer" "github.com/go-openapi/spec" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/mangling" +) + +const ( + allocLargeMap = 150 + allocMediumMap = 64 + allocSmallMap = 10 ) type referenceAnalysis struct { @@ -105,54 +101,37 @@ func (p *patternAnalysis) addSchemaPattern(key, pattern string) { } type enumAnalysis struct { - parameters map[string][]interface{} - headers map[string][]interface{} - items map[string][]interface{} - schemas map[string][]interface{} - allEnums map[string][]interface{} + parameters map[string][]any + headers map[string][]any + items map[string][]any + schemas map[string][]any + allEnums map[string][]any } -func (p *enumAnalysis) addEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addEnum(key string, enum []any) { p.allEnums["#"+key] = enum } -func (p *enumAnalysis) addParameterEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addParameterEnum(key string, enum []any) { p.parameters["#"+key] = enum p.addEnum(key, enum) } -func (p *enumAnalysis) addHeaderEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addHeaderEnum(key string, enum []any) { p.headers["#"+key] = enum p.addEnum(key, enum) } -func (p *enumAnalysis) addItemsEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addItemsEnum(key string, enum []any) { p.items["#"+key] = enum p.addEnum(key, enum) } -func (p *enumAnalysis) addSchemaEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addSchemaEnum(key string, enum []any) { p.schemas["#"+key] = enum p.addEnum(key, enum) } -// New takes a swagger spec object and returns an analyzed spec document. -// The analyzed document contains a number of indices that make it easier to -// reason about semantics of a swagger specification for use in code generation -// or validation etc. -func New(doc *spec.Swagger) *Spec { - a := &Spec{ - spec: doc, - references: referenceAnalysis{}, - patterns: patternAnalysis{}, - enums: enumAnalysis{}, - } - a.reset() - a.initialize() - - return a -} - // Spec is an analyzed specification object. It takes a swagger spec object and turns it into a registry // with a bunch of utility methods to act on the information in the spec. type Spec struct { @@ -168,494 +147,522 @@ type Spec struct { allOfs map[string]SchemaRef } -func (s *Spec) reset() { - s.consumes = make(map[string]struct{}, 150) - s.produces = make(map[string]struct{}, 150) - s.authSchemes = make(map[string]struct{}, 150) - s.operations = make(map[string]map[string]*spec.Operation, 150) - s.allSchemas = make(map[string]SchemaRef, 150) - s.allOfs = make(map[string]SchemaRef, 150) - s.references.schemas = make(map[string]spec.Ref, 150) - s.references.pathItems = make(map[string]spec.Ref, 150) - s.references.responses = make(map[string]spec.Ref, 150) - s.references.parameters = make(map[string]spec.Ref, 150) - s.references.items = make(map[string]spec.Ref, 150) - s.references.headerItems = make(map[string]spec.Ref, 150) - s.references.parameterItems = make(map[string]spec.Ref, 150) - s.references.allRefs = make(map[string]spec.Ref, 150) - s.patterns.parameters = make(map[string]string, 150) - s.patterns.headers = make(map[string]string, 150) - s.patterns.items = make(map[string]string, 150) - s.patterns.schemas = make(map[string]string, 150) - s.patterns.allPatterns = make(map[string]string, 150) - s.enums.parameters = make(map[string][]interface{}, 150) - s.enums.headers = make(map[string][]interface{}, 150) - s.enums.items = make(map[string][]interface{}, 150) - s.enums.schemas = make(map[string][]interface{}, 150) - s.enums.allEnums = make(map[string][]interface{}, 150) +// New takes a swagger spec object and returns an analyzed spec document. +// The analyzed document contains a number of indices that make it easier to +// reason about semantics of a swagger specification for use in code generation +// or validation etc. +func New(doc *spec.Swagger) *Spec { + a := &Spec{ + spec: doc, + references: referenceAnalysis{}, + patterns: patternAnalysis{}, + enums: enumAnalysis{}, + } + a.reset() + a.initialize() + + return a } -func (s *Spec) reload() { - s.reset() - s.initialize() +// SecurityRequirement is a representation of a security requirement for an operation +type SecurityRequirement struct { + Name string + Scopes []string } -func (s *Spec) initialize() { - for _, c := range s.spec.Consumes { - s.consumes[c] = struct{}{} - } - for _, c := range s.spec.Produces { - s.produces[c] = struct{}{} - } - for _, ss := range s.spec.Security { - for k := range ss { - s.authSchemes[k] = struct{}{} - } +// SecurityRequirementsFor gets the security requirements for the operation +func (s *Spec) SecurityRequirementsFor(operation *spec.Operation) [][]SecurityRequirement { + if s.spec.Security == nil && operation.Security == nil { + return nil } - for path, pathItem := range s.AllPaths() { - s.analyzeOperations(path, &pathItem) //#nosec + + schemes := s.spec.Security + if operation.Security != nil { + schemes = operation.Security } - for name, parameter := range s.spec.Parameters { - refPref := slashpath.Join("/parameters", jsonpointer.Escape(name)) - if parameter.Items != nil { - s.analyzeItems("items", parameter.Items, refPref, "parameter") - } - if parameter.In == "body" && parameter.Schema != nil { - s.analyzeSchema("schema", parameter.Schema, refPref) - } - if parameter.Pattern != "" { - s.patterns.addParameterPattern(refPref, parameter.Pattern) - } - if len(parameter.Enum) > 0 { - s.enums.addParameterEnum(refPref, parameter.Enum) + result := [][]SecurityRequirement{} + for _, scheme := range schemes { + if len(scheme) == 0 { + // append a zero object for anonymous + result = append(result, []SecurityRequirement{{}}) + + continue } - } - for name, response := range s.spec.Responses { - refPref := slashpath.Join("/responses", jsonpointer.Escape(name)) - for k, v := range response.Headers { - hRefPref := slashpath.Join(refPref, "headers", k) - if v.Items != nil { - s.analyzeItems("items", v.Items, hRefPref, "header") - } - if v.Pattern != "" { - s.patterns.addHeaderPattern(hRefPref, v.Pattern) - } - if len(v.Enum) > 0 { - s.enums.addHeaderEnum(hRefPref, v.Enum) + var reqs []SecurityRequirement + for k, v := range scheme { + if v == nil { + v = []string{} } + reqs = append(reqs, SecurityRequirement{Name: k, Scopes: v}) } - if response.Schema != nil { - s.analyzeSchema("schema", response.Schema, refPref) - } - } - for name := range s.spec.Definitions { - schema := s.spec.Definitions[name] - s.analyzeSchema(name, &schema, "/definitions") + result = append(result, reqs) } - // TODO: after analyzing all things and flattening schemas etc - // resolve all the collected references to their final representations - // best put in a separate method because this could get expensive + + return result } -func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) { - // TODO: resolve refs here? - // Currently, operations declared via pathItem $ref are known only after expansion - op := pi - if pi.Ref.String() != "" { - key := slashpath.Join("/paths", jsonpointer.Escape(path)) - s.references.addPathItemRef(key, pi) - } - s.analyzeOperation("GET", path, op.Get) - s.analyzeOperation("PUT", path, op.Put) - s.analyzeOperation("POST", path, op.Post) - s.analyzeOperation("PATCH", path, op.Patch) - s.analyzeOperation("DELETE", path, op.Delete) - s.analyzeOperation("HEAD", path, op.Head) - s.analyzeOperation("OPTIONS", path, op.Options) - for i, param := range op.Parameters { - refPref := slashpath.Join("/paths", jsonpointer.Escape(path), "parameters", strconv.Itoa(i)) - if param.Ref.String() != "" { - s.references.addParamRef(refPref, ¶m) //#nosec - } - if param.Pattern != "" { - s.patterns.addParameterPattern(refPref, param.Pattern) - } - if len(param.Enum) > 0 { - s.enums.addParameterEnum(refPref, param.Enum) - } - if param.Items != nil { - s.analyzeItems("items", param.Items, refPref, "parameter") - } - if param.Schema != nil { - s.analyzeSchema("schema", param.Schema, refPref) +// SecurityDefinitionsForRequirements gets the matching security definitions for a set of requirements +func (s *Spec) SecurityDefinitionsForRequirements(requirements []SecurityRequirement) map[string]spec.SecurityScheme { + result := make(map[string]spec.SecurityScheme) + + for _, v := range requirements { + if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok { + if definition != nil { + result[v.Name] = *definition + } } } -} -func (s *Spec) analyzeItems(name string, items *spec.Items, prefix, location string) { - if items == nil { - return - } - refPref := slashpath.Join(prefix, name) - s.analyzeItems(name, items.Items, refPref, location) - if items.Ref.String() != "" { - s.references.addItemsRef(refPref, items, location) - } - if items.Pattern != "" { - s.patterns.addItemsPattern(refPref, items.Pattern) - } - if len(items.Enum) > 0 { - s.enums.addItemsEnum(refPref, items.Enum) - } + return result } -func (s *Spec) analyzeParameter(prefix string, i int, param spec.Parameter) { - refPref := slashpath.Join(prefix, "parameters", strconv.Itoa(i)) - if param.Ref.String() != "" { - s.references.addParamRef(refPref, ¶m) //#nosec +// SecurityDefinitionsFor gets the matching security definitions for a set of requirements +func (s *Spec) SecurityDefinitionsFor(operation *spec.Operation) map[string]spec.SecurityScheme { + requirements := s.SecurityRequirementsFor(operation) + if len(requirements) == 0 { + return nil } - if param.Pattern != "" { - s.patterns.addParameterPattern(refPref, param.Pattern) - } + result := make(map[string]spec.SecurityScheme) + for _, reqs := range requirements { + for _, v := range reqs { + if v.Name == "" { + // optional requirement + continue + } - if len(param.Enum) > 0 { - s.enums.addParameterEnum(refPref, param.Enum) - } + if _, ok := result[v.Name]; ok { + // duplicate requirement + continue + } - s.analyzeItems("items", param.Items, refPref, "parameter") - if param.In == "body" && param.Schema != nil { - s.analyzeSchema("schema", param.Schema, refPref) + if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok { + if definition != nil { + result[v.Name] = *definition + } + } + } } + + return result } -func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { - if op == nil { - return - } +// ConsumesFor gets the mediatypes for the operation +func (s *Spec) ConsumesFor(operation *spec.Operation) []string { + if len(operation.Consumes) == 0 { + cons := make(map[string]struct{}, len(s.spec.Consumes)) + for _, k := range s.spec.Consumes { + cons[k] = struct{}{} + } - for _, c := range op.Consumes { - s.consumes[c] = struct{}{} + return s.structMapKeys(cons) } - for _, c := range op.Produces { - s.produces[c] = struct{}{} + cons := make(map[string]struct{}, len(operation.Consumes)) + for _, c := range operation.Consumes { + cons[c] = struct{}{} } - for _, ss := range op.Security { - for k := range ss { - s.authSchemes[k] = struct{}{} + return s.structMapKeys(cons) +} + +// ProducesFor gets the mediatypes for the operation +func (s *Spec) ProducesFor(operation *spec.Operation) []string { + if len(operation.Produces) == 0 { + prod := make(map[string]struct{}, len(s.spec.Produces)) + for _, k := range s.spec.Produces { + prod[k] = struct{}{} } - } - if _, ok := s.operations[method]; !ok { - s.operations[method] = make(map[string]*spec.Operation) + return s.structMapKeys(prod) } - s.operations[method][path] = op - prefix := slashpath.Join("/paths", jsonpointer.Escape(path), strings.ToLower(method)) - for i, param := range op.Parameters { - s.analyzeParameter(prefix, i, param) + prod := make(map[string]struct{}, len(operation.Produces)) + for _, c := range operation.Produces { + prod[c] = struct{}{} } - if op.Responses == nil { - return - } + return s.structMapKeys(prod) +} - if op.Responses.Default != nil { - s.analyzeDefaultResponse(prefix, op.Responses.Default) - } +func mapKeyFromParam(param *spec.Parameter) string { + return fmt.Sprintf("%s#%s", param.In, fieldNameFromParam(param)) +} - for k, res := range op.Responses.StatusCodeResponses { - s.analyzeResponse(prefix, k, res) +func fieldNameFromParam(param *spec.Parameter) string { + // TODO: this should be x-go-name + if nm, ok := param.Extensions.GetString("go-name"); ok { + return nm } + mangler := mangling.NewNameMangler() + + return mangler.ToGoName(param.Name) } -func (s *Spec) analyzeDefaultResponse(prefix string, res *spec.Response) { - refPref := slashpath.Join(prefix, "responses", "default") - if res.Ref.String() != "" { - s.references.addResponseRef(refPref, res) - } +// ErrorOnParamFunc is a callback function to be invoked +// whenever an error is encountered while resolving references +// on parameters. +// +// This function takes as input the spec.Parameter which triggered the +// error and the error itself. +// +// If the callback function returns false, the calling function should bail. +// +// If it returns true, the calling function should continue evaluating parameters. +// A nil ErrorOnParamFunc must be evaluated as equivalent to panic(). +type ErrorOnParamFunc func(spec.Parameter, error) bool - for k, v := range res.Headers { - hRefPref := slashpath.Join(refPref, "headers", k) - s.analyzeItems("items", v.Items, hRefPref, "header") - if v.Pattern != "" { - s.patterns.addHeaderPattern(hRefPref, v.Pattern) +// ParametersFor the specified operation id. +// +// Assumes parameters properly resolve references if any and that +// such references actually resolve to a parameter object. +// Otherwise, panics. +func (s *Spec) ParametersFor(operationID string) []spec.Parameter { + return s.SafeParametersFor(operationID, nil) +} + +// SafeParametersFor the specified operation id. +// +// Does not assume parameters properly resolve references or that +// such references actually resolve to a parameter object. +// +// Upon error, invoke a ErrorOnParamFunc callback with the erroneous +// parameters. If the callback is set to nil, panics upon errors. +func (s *Spec) SafeParametersFor(operationID string, callmeOnError ErrorOnParamFunc) []spec.Parameter { + gatherParams := func(pi *spec.PathItem, op *spec.Operation) []spec.Parameter { + bag := make(map[string]spec.Parameter) + s.paramsAsMap(pi.Parameters, bag, callmeOnError) + s.paramsAsMap(op.Parameters, bag, callmeOnError) + + var res []spec.Parameter + for _, v := range bag { + res = append(res, v) } + + return res } - if res.Schema != nil { - s.analyzeSchema("schema", res.Schema, refPref) + for _, pi := range s.spec.Paths.Paths { + if pi.Get != nil && pi.Get.ID == operationID { + return gatherParams(&pi, pi.Get) //#nosec + } + if pi.Head != nil && pi.Head.ID == operationID { + return gatherParams(&pi, pi.Head) //#nosec + } + if pi.Options != nil && pi.Options.ID == operationID { + return gatherParams(&pi, pi.Options) //#nosec + } + if pi.Post != nil && pi.Post.ID == operationID { + return gatherParams(&pi, pi.Post) //#nosec + } + if pi.Patch != nil && pi.Patch.ID == operationID { + return gatherParams(&pi, pi.Patch) //#nosec + } + if pi.Put != nil && pi.Put.ID == operationID { + return gatherParams(&pi, pi.Put) //#nosec + } + if pi.Delete != nil && pi.Delete.ID == operationID { + return gatherParams(&pi, pi.Delete) //#nosec + } } + + return nil } -func (s *Spec) analyzeResponse(prefix string, k int, res spec.Response) { - refPref := slashpath.Join(prefix, "responses", strconv.Itoa(k)) - if res.Ref.String() != "" { - s.references.addResponseRef(refPref, &res) //#nosec +// ParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that +// apply for the method and path. +// +// Assumes parameters properly resolve references if any and that +// such references actually resolve to a parameter object. +// Otherwise, panics. +func (s *Spec) ParamsFor(method, path string) map[string]spec.Parameter { + return s.SafeParamsFor(method, path, nil) +} + +// SafeParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that +// apply for the method and path. +// +// Does not assume parameters properly resolve references or that +// such references actually resolve to a parameter object. +// +// Upon error, invoke a ErrorOnParamFunc callback with the erroneous +// parameters. If the callback is set to nil, panics upon errors. +func (s *Spec) SafeParamsFor(method, path string, callmeOnError ErrorOnParamFunc) map[string]spec.Parameter { + res := make(map[string]spec.Parameter) + if pi, ok := s.spec.Paths.Paths[path]; ok { + s.paramsAsMap(pi.Parameters, res, callmeOnError) + s.paramsAsMap(s.operations[strings.ToUpper(method)][path].Parameters, res, callmeOnError) } - for k, v := range res.Headers { - hRefPref := slashpath.Join(refPref, "headers", k) - s.analyzeItems("items", v.Items, hRefPref, "header") - if v.Pattern != "" { - s.patterns.addHeaderPattern(hRefPref, v.Pattern) - } + return res +} - if len(v.Enum) > 0 { - s.enums.addHeaderEnum(hRefPref, v.Enum) +// OperationForName gets the operation for the given id +func (s *Spec) OperationForName(operationID string) (string, string, *spec.Operation, bool) { + for method, pathItem := range s.operations { + for path, op := range pathItem { + if operationID == op.ID { + return method, path, op, true + } } } - if res.Schema != nil { - s.analyzeSchema("schema", res.Schema, refPref) - } + return "", "", nil, false } -func (s *Spec) analyzeSchema(name string, schema *spec.Schema, prefix string) { - refURI := slashpath.Join(prefix, jsonpointer.Escape(name)) - schRef := SchemaRef{ - Name: name, - Schema: schema, - Ref: spec.MustCreateRef("#" + refURI), - TopLevel: prefix == "/definitions", +// OperationFor the given method and path +func (s *Spec) OperationFor(method, path string) (*spec.Operation, bool) { + if mp, ok := s.operations[strings.ToUpper(method)]; ok { + op, fn := mp[path] + + return op, fn } - s.allSchemas["#"+refURI] = schRef + return nil, false +} - if schema.Ref.String() != "" { - s.references.addSchemaRef(refURI, schRef) - } +// Operations gathers all the operations specified in the spec document +func (s *Spec) Operations() map[string]map[string]*spec.Operation { + return s.operations +} - if schema.Pattern != "" { - s.patterns.addSchemaPattern(refURI, schema.Pattern) +// AllPaths returns all the paths in the swagger spec +func (s *Spec) AllPaths() map[string]spec.PathItem { + if s.spec == nil || s.spec.Paths == nil { + return nil } - if len(schema.Enum) > 0 { - s.enums.addSchemaEnum(refURI, schema.Enum) - } + return s.spec.Paths.Paths +} - for k, v := range schema.Definitions { - v := v - s.analyzeSchema(k, &v, slashpath.Join(refURI, "definitions")) +// OperationIDs gets all the operation ids based on method an dpath +func (s *Spec) OperationIDs() []string { + if len(s.operations) == 0 { + return nil } - for k, v := range schema.Properties { - v := v - s.analyzeSchema(k, &v, slashpath.Join(refURI, "properties")) + result := make([]string, 0, len(s.operations)) + for method, v := range s.operations { + for p, o := range v { + if o.ID != "" { + result = append(result, o.ID) + } else { + result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p)) + } + } } - for k, v := range schema.PatternProperties { - v := v - // NOTE: swagger 2.0 does not support PatternProperties. - // However it is possible to analyze this in a schema - s.analyzeSchema(k, &v, slashpath.Join(refURI, "patternProperties")) - } + return result +} - for i := range schema.AllOf { - v := &schema.AllOf[i] - s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf")) +// OperationMethodPaths gets all the operation ids based on method an dpath +func (s *Spec) OperationMethodPaths() []string { + if len(s.operations) == 0 { + return nil } - if len(schema.AllOf) > 0 { - s.allOfs["#"+refURI] = schRef + result := make([]string, 0, len(s.operations)) + for method, v := range s.operations { + for p := range v { + result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p)) + } } - for i := range schema.AnyOf { - v := &schema.AnyOf[i] - // NOTE: swagger 2.0 does not support anyOf constructs. - // However it is possible to analyze this in a schema - s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf")) - } + return result +} - for i := range schema.OneOf { - v := &schema.OneOf[i] - // NOTE: swagger 2.0 does not support oneOf constructs. - // However it is possible to analyze this in a schema - s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf")) - } +// RequiredConsumes gets all the distinct consumes that are specified in the specification document +func (s *Spec) RequiredConsumes() []string { + return s.structMapKeys(s.consumes) +} - if schema.Not != nil { - // NOTE: swagger 2.0 does not support "not" constructs. - // However it is possible to analyze this in a schema - s.analyzeSchema("not", schema.Not, refURI) - } +// RequiredProduces gets all the distinct produces that are specified in the specification document +func (s *Spec) RequiredProduces() []string { + return s.structMapKeys(s.produces) +} - if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { - s.analyzeSchema("additionalProperties", schema.AdditionalProperties.Schema, refURI) - } +// RequiredSecuritySchemes gets all the distinct security schemes that are specified in the swagger spec +func (s *Spec) RequiredSecuritySchemes() []string { + return s.structMapKeys(s.authSchemes) +} - if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { - // NOTE: swagger 2.0 does not support AdditionalItems. - // However it is possible to analyze this in a schema - s.analyzeSchema("additionalItems", schema.AdditionalItems.Schema, refURI) +// SchemaRef is a reference to a schema +type SchemaRef struct { + Name string + Ref spec.Ref + Schema *spec.Schema + TopLevel bool +} + +// SchemasWithAllOf returns schema references to all schemas that are defined +// with an allOf key +func (s *Spec) SchemasWithAllOf() (result []SchemaRef) { + for _, v := range s.allOfs { + result = append(result, v) } - if schema.Items != nil { - if schema.Items.Schema != nil { - s.analyzeSchema("items", schema.Items.Schema, refURI) - } + return +} - for i := range schema.Items.Schemas { - sch := &schema.Items.Schemas[i] - s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items")) - } +// AllDefinitions returns schema references for all the definitions that were discovered +func (s *Spec) AllDefinitions() (result []SchemaRef) { + for _, v := range s.allSchemas { + result = append(result, v) } -} -// SecurityRequirement is a representation of a security requirement for an operation -type SecurityRequirement struct { - Name string - Scopes []string + return } -// SecurityRequirementsFor gets the security requirements for the operation -func (s *Spec) SecurityRequirementsFor(operation *spec.Operation) [][]SecurityRequirement { - if s.spec.Security == nil && operation.Security == nil { - return nil +// AllDefinitionReferences returns json refs for all the discovered schemas +func (s *Spec) AllDefinitionReferences() (result []string) { + for _, v := range s.references.schemas { + result = append(result, v.String()) } - schemes := s.spec.Security - if operation.Security != nil { - schemes = operation.Security + return +} + +// AllParameterReferences returns json refs for all the discovered parameters +func (s *Spec) AllParameterReferences() (result []string) { + for _, v := range s.references.parameters { + result = append(result, v.String()) } - result := [][]SecurityRequirement{} - for _, scheme := range schemes { - if len(scheme) == 0 { - // append a zero object for anonymous - result = append(result, []SecurityRequirement{{}}) + return +} - continue - } +// AllResponseReferences returns json refs for all the discovered responses +func (s *Spec) AllResponseReferences() (result []string) { + for _, v := range s.references.responses { + result = append(result, v.String()) + } - var reqs []SecurityRequirement - for k, v := range scheme { - if v == nil { - v = []string{} - } - reqs = append(reqs, SecurityRequirement{Name: k, Scopes: v}) - } + return +} - result = append(result, reqs) +// AllPathItemReferences returns the references for all the items +func (s *Spec) AllPathItemReferences() (result []string) { + for _, v := range s.references.pathItems { + result = append(result, v.String()) } - return result + return } -// SecurityDefinitionsForRequirements gets the matching security definitions for a set of requirements -func (s *Spec) SecurityDefinitionsForRequirements(requirements []SecurityRequirement) map[string]spec.SecurityScheme { - result := make(map[string]spec.SecurityScheme) - - for _, v := range requirements { - if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok { - if definition != nil { - result[v.Name] = *definition - } - } +// AllItemsReferences returns the references for all the items in simple schemas (parameters or headers). +// +// NOTE: since Swagger 2.0 forbids $ref in simple params, this should always yield an empty slice for a valid +// Swagger 2.0 spec. +func (s *Spec) AllItemsReferences() (result []string) { + for _, v := range s.references.items { + result = append(result, v.String()) } - return result + return } -// SecurityDefinitionsFor gets the matching security definitions for a set of requirements -func (s *Spec) SecurityDefinitionsFor(operation *spec.Operation) map[string]spec.SecurityScheme { - requirements := s.SecurityRequirementsFor(operation) - if len(requirements) == 0 { - return nil +// AllReferences returns all the references found in the document, with possible duplicates +func (s *Spec) AllReferences() (result []string) { + for _, v := range s.references.allRefs { + result = append(result, v.String()) } - result := make(map[string]spec.SecurityScheme) - for _, reqs := range requirements { - for _, v := range reqs { - if v.Name == "" { - // optional requirement - continue - } + return +} - if _, ok := result[v.Name]; ok { - // duplicate requirement - continue - } +// AllRefs returns all the unique references found in the document +func (s *Spec) AllRefs() (result []spec.Ref) { + set := make(map[string]struct{}) + for _, v := range s.references.allRefs { + a := v.String() + if a == "" { + continue + } - if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok { - if definition != nil { - result[v.Name] = *definition - } - } + if _, ok := set[a]; !ok { + set[a] = struct{}{} + result = append(result, v) } } - return result + return } -// ConsumesFor gets the mediatypes for the operation -func (s *Spec) ConsumesFor(operation *spec.Operation) []string { - if len(operation.Consumes) == 0 { - cons := make(map[string]struct{}, len(s.spec.Consumes)) - for _, k := range s.spec.Consumes { - cons[k] = struct{}{} - } +// ParameterPatterns returns all the patterns found in parameters +// the map is cloned to avoid accidental changes +func (s *Spec) ParameterPatterns() map[string]string { + return cloneStringMap(s.patterns.parameters) +} - return s.structMapKeys(cons) - } +// HeaderPatterns returns all the patterns found in response headers +// the map is cloned to avoid accidental changes +func (s *Spec) HeaderPatterns() map[string]string { + return cloneStringMap(s.patterns.headers) +} - cons := make(map[string]struct{}, len(operation.Consumes)) - for _, c := range operation.Consumes { - cons[c] = struct{}{} - } +// ItemsPatterns returns all the patterns found in simple array items +// the map is cloned to avoid accidental changes +func (s *Spec) ItemsPatterns() map[string]string { + return cloneStringMap(s.patterns.items) +} - return s.structMapKeys(cons) +// SchemaPatterns returns all the patterns found in schemas +// the map is cloned to avoid accidental changes +func (s *Spec) SchemaPatterns() map[string]string { + return cloneStringMap(s.patterns.schemas) } -// ProducesFor gets the mediatypes for the operation -func (s *Spec) ProducesFor(operation *spec.Operation) []string { - if len(operation.Produces) == 0 { - prod := make(map[string]struct{}, len(s.spec.Produces)) - for _, k := range s.spec.Produces { - prod[k] = struct{}{} - } +// AllPatterns returns all the patterns found in the spec +// the map is cloned to avoid accidental changes +func (s *Spec) AllPatterns() map[string]string { + return cloneStringMap(s.patterns.allPatterns) +} - return s.structMapKeys(prod) - } +// ParameterEnums returns all the enums found in parameters +// the map is cloned to avoid accidental changes +func (s *Spec) ParameterEnums() map[string][]any { + return cloneEnumMap(s.enums.parameters) +} - prod := make(map[string]struct{}, len(operation.Produces)) - for _, c := range operation.Produces { - prod[c] = struct{}{} - } +// HeaderEnums returns all the enums found in response headers +// the map is cloned to avoid accidental changes +func (s *Spec) HeaderEnums() map[string][]any { + return cloneEnumMap(s.enums.headers) +} - return s.structMapKeys(prod) +// ItemsEnums returns all the enums found in simple array items +// the map is cloned to avoid accidental changes +func (s *Spec) ItemsEnums() map[string][]any { + return cloneEnumMap(s.enums.items) } -func mapKeyFromParam(param *spec.Parameter) string { - return fmt.Sprintf("%s#%s", param.In, fieldNameFromParam(param)) +// SchemaEnums returns all the enums found in schemas +// the map is cloned to avoid accidental changes +func (s *Spec) SchemaEnums() map[string][]any { + return cloneEnumMap(s.enums.schemas) } -func fieldNameFromParam(param *spec.Parameter) string { - // TODO: this should be x-go-name - if nm, ok := param.Extensions.GetString("go-name"); ok { - return nm +// AllEnums returns all the enums found in the spec +// the map is cloned to avoid accidental changes +func (s *Spec) AllEnums() map[string][]any { + return cloneEnumMap(s.enums.allEnums) +} + +func (s *Spec) structMapKeys(mp map[string]struct{}) []string { + if len(mp) == 0 { + return nil } - return swag.ToGoName(param.Name) -} + result := make([]string, 0, len(mp)) + for k := range mp { + result = append(result, k) + } -// ErrorOnParamFunc is a callback function to be invoked -// whenever an error is encountered while resolving references -// on parameters. -// -// This function takes as input the spec.Parameter which triggered the -// error and the error itself. -// -// If the callback function returns false, the calling function should bail. -// -// If it returns true, the calling function should continue evaluating parameters. -// A nil ErrorOnParamFunc must be evaluated as equivalent to panic(). -type ErrorOnParamFunc func(spec.Parameter, error) bool + return result +} func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Parameter, callmeOnError ErrorOnParamFunc) { for _, param := range parameters { @@ -675,7 +682,7 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para obj, _, err := pr.Ref.GetPointer().Get(s.spec) if err != nil { - if callmeOnError(param, fmt.Errorf("invalid reference: %q", pr.Ref.String())) { + if callmeOnError(param, ErrInvalidRef(pr.Ref.String())) { continue } @@ -684,7 +691,7 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para objAsParam, ok := obj.(spec.Parameter) if !ok { - if callmeOnError(param, fmt.Errorf("resolved reference is not a parameter: %q", pr.Ref.String())) { + if callmeOnError(param, ErrInvalidParameterRef(pr.Ref.String())) { continue } @@ -696,369 +703,352 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para } } -// ParametersFor the specified operation id. -// -// Assumes parameters properly resolve references if any and that -// such references actually resolve to a parameter object. -// Otherwise, panics. -func (s *Spec) ParametersFor(operationID string) []spec.Parameter { - return s.SafeParametersFor(operationID, nil) +func (s *Spec) reset() { + s.consumes = make(map[string]struct{}, allocLargeMap) + s.produces = make(map[string]struct{}, allocLargeMap) + s.authSchemes = make(map[string]struct{}, allocLargeMap) + s.operations = make(map[string]map[string]*spec.Operation, allocLargeMap) + s.allSchemas = make(map[string]SchemaRef, allocLargeMap) + s.allOfs = make(map[string]SchemaRef, allocLargeMap) + s.references.schemas = make(map[string]spec.Ref, allocLargeMap) + s.references.pathItems = make(map[string]spec.Ref, allocLargeMap) + s.references.responses = make(map[string]spec.Ref, allocLargeMap) + s.references.parameters = make(map[string]spec.Ref, allocLargeMap) + s.references.items = make(map[string]spec.Ref, allocLargeMap) + s.references.headerItems = make(map[string]spec.Ref, allocLargeMap) + s.references.parameterItems = make(map[string]spec.Ref, allocLargeMap) + s.references.allRefs = make(map[string]spec.Ref, allocLargeMap) + s.patterns.parameters = make(map[string]string, allocLargeMap) + s.patterns.headers = make(map[string]string, allocLargeMap) + s.patterns.items = make(map[string]string, allocLargeMap) + s.patterns.schemas = make(map[string]string, allocLargeMap) + s.patterns.allPatterns = make(map[string]string, allocLargeMap) + s.enums.parameters = make(map[string][]any, allocLargeMap) + s.enums.headers = make(map[string][]any, allocLargeMap) + s.enums.items = make(map[string][]any, allocLargeMap) + s.enums.schemas = make(map[string][]any, allocLargeMap) + s.enums.allEnums = make(map[string][]any, allocLargeMap) } -// SafeParametersFor the specified operation id. -// -// Does not assume parameters properly resolve references or that -// such references actually resolve to a parameter object. -// -// Upon error, invoke a ErrorOnParamFunc callback with the erroneous -// parameters. If the callback is set to nil, panics upon errors. -func (s *Spec) SafeParametersFor(operationID string, callmeOnError ErrorOnParamFunc) []spec.Parameter { - gatherParams := func(pi *spec.PathItem, op *spec.Operation) []spec.Parameter { - bag := make(map[string]spec.Parameter) - s.paramsAsMap(pi.Parameters, bag, callmeOnError) - s.paramsAsMap(op.Parameters, bag, callmeOnError) +func (s *Spec) reload() { + s.reset() + s.initialize() +} - var res []spec.Parameter - for _, v := range bag { - res = append(res, v) +func (s *Spec) initialize() { + for _, c := range s.spec.Consumes { + s.consumes[c] = struct{}{} + } + for _, c := range s.spec.Produces { + s.produces[c] = struct{}{} + } + for _, ss := range s.spec.Security { + for k := range ss { + s.authSchemes[k] = struct{}{} } - - return res + } + for path, pathItem := range s.AllPaths() { + s.analyzeOperations(path, &pathItem) //#nosec } - for _, pi := range s.spec.Paths.Paths { - if pi.Get != nil && pi.Get.ID == operationID { - return gatherParams(&pi, pi.Get) //#nosec - } - if pi.Head != nil && pi.Head.ID == operationID { - return gatherParams(&pi, pi.Head) //#nosec + for name, parameter := range s.spec.Parameters { + refPref := slashpath.Join("/parameters", jsonpointer.Escape(name)) + if parameter.Items != nil { + s.analyzeItems("items", parameter.Items, refPref, "parameter") } - if pi.Options != nil && pi.Options.ID == operationID { - return gatherParams(&pi, pi.Options) //#nosec + if parameter.In == "body" && parameter.Schema != nil { + s.analyzeSchema("schema", parameter.Schema, refPref) } - if pi.Post != nil && pi.Post.ID == operationID { - return gatherParams(&pi, pi.Post) //#nosec + if parameter.Pattern != "" { + s.patterns.addParameterPattern(refPref, parameter.Pattern) } - if pi.Patch != nil && pi.Patch.ID == operationID { - return gatherParams(&pi, pi.Patch) //#nosec + if len(parameter.Enum) > 0 { + s.enums.addParameterEnum(refPref, parameter.Enum) } - if pi.Put != nil && pi.Put.ID == operationID { - return gatherParams(&pi, pi.Put) //#nosec + } + + for name, response := range s.spec.Responses { + refPref := slashpath.Join("/responses", jsonpointer.Escape(name)) + for k, v := range response.Headers { + hRefPref := slashpath.Join(refPref, "headers", k) + if v.Items != nil { + s.analyzeItems("items", v.Items, hRefPref, "header") + } + if v.Pattern != "" { + s.patterns.addHeaderPattern(hRefPref, v.Pattern) + } + if len(v.Enum) > 0 { + s.enums.addHeaderEnum(hRefPref, v.Enum) + } } - if pi.Delete != nil && pi.Delete.ID == operationID { - return gatherParams(&pi, pi.Delete) //#nosec + if response.Schema != nil { + s.analyzeSchema("schema", response.Schema, refPref) } } - return nil -} - -// ParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that -// apply for the method and path. -// -// Assumes parameters properly resolve references if any and that -// such references actually resolve to a parameter object. -// Otherwise, panics. -func (s *Spec) ParamsFor(method, path string) map[string]spec.Parameter { - return s.SafeParamsFor(method, path, nil) -} - -// SafeParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that -// apply for the method and path. -// -// Does not assume parameters properly resolve references or that -// such references actually resolve to a parameter object. -// -// Upon error, invoke a ErrorOnParamFunc callback with the erroneous -// parameters. If the callback is set to nil, panics upon errors. -func (s *Spec) SafeParamsFor(method, path string, callmeOnError ErrorOnParamFunc) map[string]spec.Parameter { - res := make(map[string]spec.Parameter) - if pi, ok := s.spec.Paths.Paths[path]; ok { - s.paramsAsMap(pi.Parameters, res, callmeOnError) - s.paramsAsMap(s.operations[strings.ToUpper(method)][path].Parameters, res, callmeOnError) + for name := range s.spec.Definitions { + schema := s.spec.Definitions[name] + s.analyzeSchema(name, &schema, "/definitions") } - - return res + // TODO: after analyzing all things and flattening schemas etc + // resolve all the collected references to their final representations + // best put in a separate method because this could get expensive } -// OperationForName gets the operation for the given id -func (s *Spec) OperationForName(operationID string) (string, string, *spec.Operation, bool) { - for method, pathItem := range s.operations { - for path, op := range pathItem { - if operationID == op.ID { - return method, path, op, true - } +func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) { + // TODO: resolve refs here? + // Currently, operations declared via pathItem $ref are known only after expansion + op := pi + if pi.Ref.String() != "" { + key := slashpath.Join("/paths", jsonpointer.Escape(path)) + s.references.addPathItemRef(key, pi) + } + s.analyzeOperation("GET", path, op.Get) + s.analyzeOperation("PUT", path, op.Put) + s.analyzeOperation("POST", path, op.Post) + s.analyzeOperation("PATCH", path, op.Patch) + s.analyzeOperation("DELETE", path, op.Delete) + s.analyzeOperation("HEAD", path, op.Head) + s.analyzeOperation("OPTIONS", path, op.Options) + for i, param := range op.Parameters { + refPref := slashpath.Join("/paths", jsonpointer.Escape(path), "parameters", strconv.Itoa(i)) + if param.Ref.String() != "" { + s.references.addParamRef(refPref, ¶m) //#nosec + } + if param.Pattern != "" { + s.patterns.addParameterPattern(refPref, param.Pattern) + } + if len(param.Enum) > 0 { + s.enums.addParameterEnum(refPref, param.Enum) + } + if param.Items != nil { + s.analyzeItems("items", param.Items, refPref, "parameter") + } + if param.Schema != nil { + s.analyzeSchema("schema", param.Schema, refPref) } } +} - return "", "", nil, false +func (s *Spec) analyzeItems(name string, items *spec.Items, prefix, location string) { + if items == nil { + return + } + refPref := slashpath.Join(prefix, name) + s.analyzeItems(name, items.Items, refPref, location) + if items.Ref.String() != "" { + s.references.addItemsRef(refPref, items, location) + } + if items.Pattern != "" { + s.patterns.addItemsPattern(refPref, items.Pattern) + } + if len(items.Enum) > 0 { + s.enums.addItemsEnum(refPref, items.Enum) + } } -// OperationFor the given method and path -func (s *Spec) OperationFor(method, path string) (*spec.Operation, bool) { - if mp, ok := s.operations[strings.ToUpper(method)]; ok { - op, fn := mp[path] +func (s *Spec) analyzeParameter(prefix string, i int, param spec.Parameter) { + refPref := slashpath.Join(prefix, "parameters", strconv.Itoa(i)) + if param.Ref.String() != "" { + s.references.addParamRef(refPref, ¶m) //#nosec + } - return op, fn + if param.Pattern != "" { + s.patterns.addParameterPattern(refPref, param.Pattern) } - return nil, false -} + if len(param.Enum) > 0 { + s.enums.addParameterEnum(refPref, param.Enum) + } -// Operations gathers all the operations specified in the spec document -func (s *Spec) Operations() map[string]map[string]*spec.Operation { - return s.operations + s.analyzeItems("items", param.Items, refPref, "parameter") + if param.In == "body" && param.Schema != nil { + s.analyzeSchema("schema", param.Schema, refPref) + } } -func (s *Spec) structMapKeys(mp map[string]struct{}) []string { - if len(mp) == 0 { - return nil +func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { + if op == nil { + return } - result := make([]string, 0, len(mp)) - for k := range mp { - result = append(result, k) + for _, c := range op.Consumes { + s.consumes[c] = struct{}{} } - return result -} + for _, c := range op.Produces { + s.produces[c] = struct{}{} + } -// AllPaths returns all the paths in the swagger spec -func (s *Spec) AllPaths() map[string]spec.PathItem { - if s.spec == nil || s.spec.Paths == nil { - return nil + for _, ss := range op.Security { + for k := range ss { + s.authSchemes[k] = struct{}{} + } } - return s.spec.Paths.Paths -} + if _, ok := s.operations[method]; !ok { + s.operations[method] = make(map[string]*spec.Operation) + } -// OperationIDs gets all the operation ids based on method an dpath -func (s *Spec) OperationIDs() []string { - if len(s.operations) == 0 { - return nil + s.operations[method][path] = op + prefix := slashpath.Join("/paths", jsonpointer.Escape(path), strings.ToLower(method)) + for i, param := range op.Parameters { + s.analyzeParameter(prefix, i, param) + } + + if op.Responses == nil { + return } - result := make([]string, 0, len(s.operations)) - for method, v := range s.operations { - for p, o := range v { - if o.ID != "" { - result = append(result, o.ID) - } else { - result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p)) - } - } + if op.Responses.Default != nil { + s.analyzeDefaultResponse(prefix, op.Responses.Default) } - return result + for k, res := range op.Responses.StatusCodeResponses { + s.analyzeResponse(prefix, k, res) + } } -// OperationMethodPaths gets all the operation ids based on method an dpath -func (s *Spec) OperationMethodPaths() []string { - if len(s.operations) == 0 { - return nil +func (s *Spec) analyzeDefaultResponse(prefix string, res *spec.Response) { + refPref := slashpath.Join(prefix, "responses", "default") + if res.Ref.String() != "" { + s.references.addResponseRef(refPref, res) } - result := make([]string, 0, len(s.operations)) - for method, v := range s.operations { - for p := range v { - result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p)) + for k, v := range res.Headers { + hRefPref := slashpath.Join(refPref, "headers", k) + s.analyzeItems("items", v.Items, hRefPref, "header") + if v.Pattern != "" { + s.patterns.addHeaderPattern(hRefPref, v.Pattern) } } - return result + if res.Schema != nil { + s.analyzeSchema("schema", res.Schema, refPref) + } } -// RequiredConsumes gets all the distinct consumes that are specified in the specification document -func (s *Spec) RequiredConsumes() []string { - return s.structMapKeys(s.consumes) -} +func (s *Spec) analyzeResponse(prefix string, k int, res spec.Response) { + refPref := slashpath.Join(prefix, "responses", strconv.Itoa(k)) + if res.Ref.String() != "" { + s.references.addResponseRef(refPref, &res) //#nosec + } -// RequiredProduces gets all the distinct produces that are specified in the specification document -func (s *Spec) RequiredProduces() []string { - return s.structMapKeys(s.produces) -} + for k, v := range res.Headers { + hRefPref := slashpath.Join(refPref, "headers", k) + s.analyzeItems("items", v.Items, hRefPref, "header") + if v.Pattern != "" { + s.patterns.addHeaderPattern(hRefPref, v.Pattern) + } -// RequiredSecuritySchemes gets all the distinct security schemes that are specified in the swagger spec -func (s *Spec) RequiredSecuritySchemes() []string { - return s.structMapKeys(s.authSchemes) -} + if len(v.Enum) > 0 { + s.enums.addHeaderEnum(hRefPref, v.Enum) + } + } -// SchemaRef is a reference to a schema -type SchemaRef struct { - Name string - Ref spec.Ref - Schema *spec.Schema - TopLevel bool + if res.Schema != nil { + s.analyzeSchema("schema", res.Schema, refPref) + } } -// SchemasWithAllOf returns schema references to all schemas that are defined -// with an allOf key -func (s *Spec) SchemasWithAllOf() (result []SchemaRef) { - for _, v := range s.allOfs { - result = append(result, v) +func (s *Spec) analyzeSchema(name string, schema *spec.Schema, prefix string) { + refURI := slashpath.Join(prefix, jsonpointer.Escape(name)) + schRef := SchemaRef{ + Name: name, + Schema: schema, + Ref: spec.MustCreateRef("#" + refURI), + TopLevel: prefix == "/definitions", } - return -} + s.allSchemas["#"+refURI] = schRef -// AllDefinitions returns schema references for all the definitions that were discovered -func (s *Spec) AllDefinitions() (result []SchemaRef) { - for _, v := range s.allSchemas { - result = append(result, v) + if schema.Ref.String() != "" { + s.references.addSchemaRef(refURI, schRef) } - return -} - -// AllDefinitionReferences returns json refs for all the discovered schemas -func (s *Spec) AllDefinitionReferences() (result []string) { - for _, v := range s.references.schemas { - result = append(result, v.String()) + if schema.Pattern != "" { + s.patterns.addSchemaPattern(refURI, schema.Pattern) } - return -} + if len(schema.Enum) > 0 { + s.enums.addSchemaEnum(refURI, schema.Enum) + } -// AllParameterReferences returns json refs for all the discovered parameters -func (s *Spec) AllParameterReferences() (result []string) { - for _, v := range s.references.parameters { - result = append(result, v.String()) + for k, v := range schema.Definitions { + s.analyzeSchema(k, &v, slashpath.Join(refURI, "definitions")) } - return -} + for k, v := range schema.Properties { + s.analyzeSchema(k, &v, slashpath.Join(refURI, "properties")) + } -// AllResponseReferences returns json refs for all the discovered responses -func (s *Spec) AllResponseReferences() (result []string) { - for _, v := range s.references.responses { - result = append(result, v.String()) + for k, v := range schema.PatternProperties { + // NOTE: swagger 2.0 does not support PatternProperties. + // However it is possible to analyze this in a schema + s.analyzeSchema(k, &v, slashpath.Join(refURI, "patternProperties")) } - return -} + for i := range schema.AllOf { + v := &schema.AllOf[i] + s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf")) + } -// AllPathItemReferences returns the references for all the items -func (s *Spec) AllPathItemReferences() (result []string) { - for _, v := range s.references.pathItems { - result = append(result, v.String()) + if len(schema.AllOf) > 0 { + s.allOfs["#"+refURI] = schRef } - return -} + for i := range schema.AnyOf { + v := &schema.AnyOf[i] + // NOTE: swagger 2.0 does not support anyOf constructs. + // However it is possible to analyze this in a schema + s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf")) + } -// AllItemsReferences returns the references for all the items in simple schemas (parameters or headers). -// -// NOTE: since Swagger 2.0 forbids $ref in simple params, this should always yield an empty slice for a valid -// Swagger 2.0 spec. -func (s *Spec) AllItemsReferences() (result []string) { - for _, v := range s.references.items { - result = append(result, v.String()) + for i := range schema.OneOf { + v := &schema.OneOf[i] + // NOTE: swagger 2.0 does not support oneOf constructs. + // However it is possible to analyze this in a schema + s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf")) } - return -} + if schema.Not != nil { + // NOTE: swagger 2.0 does not support "not" constructs. + // However it is possible to analyze this in a schema + s.analyzeSchema("not", schema.Not, refURI) + } -// AllReferences returns all the references found in the document, with possible duplicates -func (s *Spec) AllReferences() (result []string) { - for _, v := range s.references.allRefs { - result = append(result, v.String()) + if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { + s.analyzeSchema("additionalProperties", schema.AdditionalProperties.Schema, refURI) } - return -} + if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { + // NOTE: swagger 2.0 does not support AdditionalItems. + // However it is possible to analyze this in a schema + s.analyzeSchema("additionalItems", schema.AdditionalItems.Schema, refURI) + } -// AllRefs returns all the unique references found in the document -func (s *Spec) AllRefs() (result []spec.Ref) { - set := make(map[string]struct{}) - for _, v := range s.references.allRefs { - a := v.String() - if a == "" { - continue + if schema.Items != nil { + if schema.Items.Schema != nil { + s.analyzeSchema("items", schema.Items.Schema, refURI) } - if _, ok := set[a]; !ok { - set[a] = struct{}{} - result = append(result, v) + for i := range schema.Items.Schemas { + sch := &schema.Items.Schemas[i] + s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items")) } } - - return } func cloneStringMap(source map[string]string) map[string]string { res := make(map[string]string, len(source)) - for k, v := range source { - res[k] = v - } + maps.Copy(res, source) return res } -func cloneEnumMap(source map[string][]interface{}) map[string][]interface{} { - res := make(map[string][]interface{}, len(source)) - for k, v := range source { - res[k] = v - } +func cloneEnumMap(source map[string][]any) map[string][]any { + res := make(map[string][]any, len(source)) + maps.Copy(res, source) return res } - -// ParameterPatterns returns all the patterns found in parameters -// the map is cloned to avoid accidental changes -func (s *Spec) ParameterPatterns() map[string]string { - return cloneStringMap(s.patterns.parameters) -} - -// HeaderPatterns returns all the patterns found in response headers -// the map is cloned to avoid accidental changes -func (s *Spec) HeaderPatterns() map[string]string { - return cloneStringMap(s.patterns.headers) -} - -// ItemsPatterns returns all the patterns found in simple array items -// the map is cloned to avoid accidental changes -func (s *Spec) ItemsPatterns() map[string]string { - return cloneStringMap(s.patterns.items) -} - -// SchemaPatterns returns all the patterns found in schemas -// the map is cloned to avoid accidental changes -func (s *Spec) SchemaPatterns() map[string]string { - return cloneStringMap(s.patterns.schemas) -} - -// AllPatterns returns all the patterns found in the spec -// the map is cloned to avoid accidental changes -func (s *Spec) AllPatterns() map[string]string { - return cloneStringMap(s.patterns.allPatterns) -} - -// ParameterEnums returns all the enums found in parameters -// the map is cloned to avoid accidental changes -func (s *Spec) ParameterEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.parameters) -} - -// HeaderEnums returns all the enums found in response headers -// the map is cloned to avoid accidental changes -func (s *Spec) HeaderEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.headers) -} - -// ItemsEnums returns all the enums found in simple array items -// the map is cloned to avoid accidental changes -func (s *Spec) ItemsEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.items) -} - -// SchemaEnums returns all the enums found in schemas -// the map is cloned to avoid accidental changes -func (s *Spec) SchemaEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.schemas) -} - -// AllEnums returns all the enums found in the spec -// the map is cloned to avoid accidental changes -func (s *Spec) AllEnums() map[string][]interface{} { - return cloneEnumMap(s.enums.allEnums) -} diff --git a/vendor/github.com/go-openapi/analysis/debug.go b/vendor/github.com/go-openapi/analysis/debug.go index 33c15704ec..d490eab606 100644 --- a/vendor/github.com/go-openapi/analysis/debug.go +++ b/vendor/github.com/go-openapi/analysis/debug.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis diff --git a/vendor/github.com/go-openapi/analysis/doc.go b/vendor/github.com/go-openapi/analysis/doc.go index e8d9f9b131..9d41371a9f 100644 --- a/vendor/github.com/go-openapi/analysis/doc.go +++ b/vendor/github.com/go-openapi/analysis/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package analysis provides methods to work with a Swagger specification document from diff --git a/vendor/github.com/go-openapi/analysis/errors.go b/vendor/github.com/go-openapi/analysis/errors.go new file mode 100644 index 0000000000..540e159a23 --- /dev/null +++ b/vendor/github.com/go-openapi/analysis/errors.go @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package analysis + +import ( + "errors" + "fmt" +) + +type analysisError string + +const ( + ErrAnalysis analysisError = "analysis error" + ErrNoSchema analysisError = "no schema to analyze" +) + +func (e analysisError) Error() string { + return string(e) +} + +func ErrAtKey(key string, err error) error { + return errors.Join( + fmt.Errorf("key %s: %w", key, err), + ErrAnalysis, + ) +} + +func ErrInvalidRef(key string) error { + return fmt.Errorf("invalid reference: %q: %w", key, ErrAnalysis) +} + +func ErrInvalidParameterRef(key string) error { + return fmt.Errorf("resolved reference is not a parameter: %q: %w", key, ErrAnalysis) +} + +func ErrResolveSchema(err error) error { + return errors.Join( + fmt.Errorf("could not resolve schema: %w", err), + ErrAnalysis, + ) +} + +func ErrRewriteRef(key string, target any, err error) error { + return errors.Join( + fmt.Errorf("failed to rewrite ref for key %q at %v: %w", key, target, err), + ErrAnalysis, + ) +} + +func ErrInlineDefinition(key string, err error) error { + return errors.Join( + fmt.Errorf("error while creating definition %q from inline schema: %w", key, err), + ErrAnalysis, + ) +} diff --git a/vendor/github.com/go-openapi/analysis/fixer.go b/vendor/github.com/go-openapi/analysis/fixer.go index 7c2ca08416..74becbbe49 100644 --- a/vendor/github.com/go-openapi/analysis/fixer.go +++ b/vendor/github.com/go-openapi/analysis/fixer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis @@ -72,7 +61,7 @@ func FixEmptyDescs(rs *spec.Responses) { // Response object if it doesn't already have one and isn't a // ref. No-op on nil input. func FixEmptyDesc(rs *spec.Response) { - if rs == nil || rs.Description != "" || rs.Ref.Ref.GetURL() != nil { + if rs == nil || rs.Description != "" || rs.Ref.GetURL() != nil { return } rs.Description = "(empty)" diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go index ebedcc9df3..1c7a49c034 100644 --- a/vendor/github.com/go-openapi/analysis/flatten.go +++ b/vendor/github.com/go-openapi/analysis/flatten.go @@ -1,23 +1,12 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis import ( - "fmt" "log" "path" + "slices" "sort" "strings" @@ -52,9 +41,9 @@ type context struct { func newContext() *context { return &context{ - newRefs: make(map[string]*newRef, 150), + newRefs: make(map[string]*newRef, allocMediumMap), warnings: make([]string, 0), - resolved: make(map[string]string, 50), + resolved: make(map[string]string, allocMediumMap), } } @@ -251,7 +240,7 @@ func nameInlinedSchemas(opts *FlattenOpts) error { asch, err := Schema(SchemaOpts{Schema: sch.Schema, Root: opts.Swagger(), BasePath: opts.BasePath}) if err != nil { - return fmt.Errorf("schema analysis [%s]: %w", key, err) + return ErrAtKey(key, err) } if asch.isAnalyzedAsComplex() { // move complex schemas to definitions @@ -320,7 +309,7 @@ func importNewRef(entry sortref.RefRevIdx, refStr string, opts *FlattenOpts) err sch, err := spec.ResolveRefWithBase(opts.Swagger(), &entry.Ref, opts.ExpandOpts(false)) if err != nil { - return fmt.Errorf("could not resolve schema: %w", err) + return ErrResolveSchema(err) } // at this stage only $ref analysis matters @@ -335,7 +324,7 @@ func importNewRef(entry sortref.RefRevIdx, refStr string, opts *FlattenOpts) err // now rewrite those refs with rebase for key, ref := range partialAnalyzer.references.allRefs { if err := replace.UpdateRef(sch, key, spec.MustCreateRef(normalize.RebaseRef(entry.Ref.String(), ref.String()))); err != nil { - return fmt.Errorf("failed to rewrite ref for key %q at %s: %w", key, entry.Ref.String(), err) + return ErrRewriteRef(key, entry.Ref.String(), err) } } @@ -429,7 +418,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { ref := spec.MustCreateRef(r.path) sch, err := spec.ResolveRefWithBase(opts.Swagger(), &ref, opts.ExpandOpts(false)) if err != nil { - return false, fmt.Errorf("could not resolve schema: %w", err) + return false, ErrResolveSchema(err) } r.schema = sch @@ -542,14 +531,7 @@ func updateRefParents(allRefs map[string]spec.Ref, r *newRef) { continue } - found := false - for _, p := range r.parents { - if p == k { - found = true - - break - } - } + found := slices.Contains(r.parents, k) if !found { r.parents = append(r.parents, k) } @@ -643,7 +625,7 @@ func stripOAIGenForRef(opts *FlattenOpts, k string, r *newRef) (bool, error) { } debugLog("re-inlined schema: parent: %s, %t", pr[0], asch.isAnalyzedAsComplex()) - replacedWithComplex = replacedWithComplex || !(path.Dir(pr[0]) == definitionsPath) && asch.isAnalyzedAsComplex() + replacedWithComplex = replacedWithComplex || path.Dir(pr[0]) != definitionsPath && asch.isAnalyzedAsComplex() } return replacedWithComplex, nil @@ -666,7 +648,7 @@ func namePointers(opts *FlattenOpts) error { result, err := replace.DeepestRef(opts.Swagger(), opts.ExpandOpts(false), ref) if err != nil { - return fmt.Errorf("at %s, %w", k, err) + return ErrAtKey(k, err) } replacingRef := result.Ref @@ -697,7 +679,7 @@ func namePointers(opts *FlattenOpts) error { // update current replacement, which may have been updated by previous changes of deeper elements result, erd := replace.DeepestRef(opts.Swagger(), opts.ExpandOpts(false), v.Ref) if erd != nil { - return fmt.Errorf("at %s, %w", key, erd) + return ErrAtKey(key, erd) } if opts.flattenContext != nil { @@ -743,9 +725,9 @@ func flattenAnonPointer(key string, v SchemaRef, refsToReplace map[string]Schema // qualify the expanded schema asch, ers := Schema(SchemaOpts{Schema: v.Schema, Root: opts.Swagger(), BasePath: opts.BasePath}) if ers != nil { - return fmt.Errorf("schema analysis [%s]: %w", key, ers) + return ErrAtKey(key, ers) } - callers := make([]string, 0, 64) + callers := make([]string, 0, allocMediumMap) debugLog("looking for callers") @@ -753,7 +735,7 @@ func flattenAnonPointer(key string, v SchemaRef, refsToReplace map[string]Schema for k, w := range an.references.allRefs { r, err := replace.DeepestRef(opts.Swagger(), opts.ExpandOpts(false), w) if err != nil { - return fmt.Errorf("at %s, %w", key, err) + return ErrAtKey(key, err) } if opts.flattenContext != nil { diff --git a/vendor/github.com/go-openapi/analysis/flatten_name.go b/vendor/github.com/go-openapi/analysis/flatten_name.go index c7d7938ebe..475b33c413 100644 --- a/vendor/github.com/go-openapi/analysis/flatten_name.go +++ b/vendor/github.com/go-openapi/analysis/flatten_name.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( @@ -11,7 +14,7 @@ import ( "github.com/go-openapi/analysis/internal/flatten/schutils" "github.com/go-openapi/analysis/internal/flatten/sortref" "github.com/go-openapi/spec" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/mangling" ) // InlineSchemaNamer finds a new name for an inlined type @@ -43,7 +46,7 @@ func (isn *InlineSchemaNamer) Name(key string, schema *spec.Schema, aschema *Ana debugLog("rewriting schema to ref: key=%s with new name: %s", key, newName) if err := replace.RewriteSchemaToRef(isn.Spec, key, spec.MustCreateRef(path.Join(definitionsPath, newName))); err != nil { - return fmt.Errorf("error while creating definition %q from inline schema: %w", newName, err) + return ErrInlineDefinition(newName, err) } // rewrite any dependent $ref pointing to this place, @@ -54,7 +57,7 @@ func (isn *InlineSchemaNamer) Name(key string, schema *spec.Schema, aschema *Ana for k, v := range an.references.allRefs { r, erd := replace.DeepestRef(isn.opts.Swagger(), isn.opts.ExpandOpts(false), v) if erd != nil { - return fmt.Errorf("at %s, %w", k, erd) + return ErrAtKey(k, erd) } if isn.opts.flattenContext != nil { @@ -227,10 +230,15 @@ func namesForOperation(parts sortref.SplitKey, operations map[string]operations. return baseNames, startIndex } +const ( + minStartIndex = 2 + minSegments = 2 +) + func namesForDefinition(parts sortref.SplitKey) ([][]string, int) { nm := parts.DefinitionName() if nm != "" { - return [][]string{{parts.DefinitionName()}}, 2 + return [][]string{{parts.DefinitionName()}}, minStartIndex } return [][]string{}, 0 @@ -239,7 +247,7 @@ func namesForDefinition(parts sortref.SplitKey) ([][]string, int) { // partAdder knows how to interpret a schema when it comes to build a name from parts func partAdder(aschema *AnalyzedSchema) sortref.PartAdder { return func(part string) []string { - segments := make([]string, 0, 2) + segments := make([]string, 0, minSegments) if part == "items" || part == "additionalItems" { if aschema.IsTuple || aschema.IsTupleWithExtra { @@ -265,8 +273,9 @@ func mangler(o *FlattenOpts) func(string) string { if o.KeepNames { return func(in string) string { return in } } + mangler := mangling.NewNameMangler() - return swag.ToJSONName + return mangler.ToJSONName } func nameFromRef(ref spec.Ref, o *FlattenOpts) string { diff --git a/vendor/github.com/go-openapi/analysis/flatten_options.go b/vendor/github.com/go-openapi/analysis/flatten_options.go index c943fe1e84..d8fc25cf58 100644 --- a/vendor/github.com/go-openapi/analysis/flatten_options.go +++ b/vendor/github.com/go-openapi/analysis/flatten_options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( diff --git a/vendor/github.com/go-openapi/analysis/internal/debug/debug.go b/vendor/github.com/go-openapi/analysis/internal/debug/debug.go index 39f55a97bf..03e0d32e9e 100644 --- a/vendor/github.com/go-openapi/analysis/internal/debug/debug.go +++ b/vendor/github.com/go-openapi/analysis/internal/debug/debug.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package debug @@ -27,15 +16,15 @@ var ( ) // GetLogger provides a prefix debug logger -func GetLogger(prefix string, debug bool) func(string, ...interface{}) { +func GetLogger(prefix string, debug bool) func(string, ...any) { if debug { logger := log.New(output, prefix+":", log.LstdFlags) - return func(msg string, args ...interface{}) { + return func(msg string, args ...any) { _, file1, pos1, _ := runtime.Caller(1) logger.Printf("%s:%d: %s", filepath.Base(file1), pos1, fmt.Sprintf(msg, args...)) } } - return func(_ string, _ ...interface{}) {} + return func(_ string, _ ...any) {} } diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go b/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go index 8c9df0580d..320a50bff8 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package normalize import ( diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go b/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go index 7f3a2b8717..940c46a925 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go @@ -1,13 +1,17 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package operations import ( "path" + "slices" "sort" "strings" "github.com/go-openapi/jsonpointer" "github.com/go-openapi/spec" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/mangling" ) // AllOpRefsByRef returns an index of sortable operations @@ -50,12 +54,13 @@ type Provider interface { // GatherOperations builds a map of sorted operations from a spec func GatherOperations(specDoc Provider, operationIDs []string) map[string]OpRef { var oprefs OpRefs + mangler := mangling.NewNameMangler() for method, pathItem := range specDoc.Operations() { for pth, operation := range pathItem { vv := *operation oprefs = append(oprefs, OpRef{ - Key: swag.ToGoName(strings.ToLower(method) + " " + pth), + Key: mangler.ToGoName(strings.ToLower(method) + " " + pth), Method: method, Path: pth, ID: vv.ID, @@ -79,7 +84,7 @@ func GatherOperations(specDoc Provider, operationIDs []string) map[string]OpRef nm = opr.Key } - if len(operationIDs) == 0 || swag.ContainsStrings(operationIDs, opr.ID) || swag.ContainsStrings(operationIDs, nm) { + if len(operationIDs) == 0 || slices.Contains(operationIDs, opr.ID) || slices.Contains(operationIDs, nm) { opr.ID = nm opr.Op.ID = nm operations[nm] = opr diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go new file mode 100644 index 0000000000..d7c28b8857 --- /dev/null +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package replace + +import ( + "errors" + "fmt" +) + +type replaceError string + +const ( + ErrReplace replaceError = "flatten replace error" + ErrUnexpectedType replaceError = "unexpected type used in getPointerFromKey" +) + +func (e replaceError) Error() string { + return string(e) +} + +func ErrNoSchemaWithRef(key string, value any) error { + return fmt.Errorf("no schema with ref found at %s for %T: %w", key, value, ErrReplace) +} + +func ErrNoSchema(key string) error { + return fmt.Errorf("no schema found at %s: %w", key, ErrReplace) +} + +func ErrNotANumber(key string, err error) error { + return errors.Join( + ErrReplace, + fmt.Errorf("%s not a number: %w", key, err), + ) +} + +func ErrUnhandledParentRewrite(key string, value any) error { + return fmt.Errorf("unhandled parent schema rewrite %s: %T: %w", key, value, ErrReplace) +} + +func ErrUnhandledParentType(key string, value any) error { + return fmt.Errorf("unhandled type for parent of %s: %T: %w", key, value, ErrReplace) +} + +func ErrNoParent(key string, err error) error { + return errors.Join( + fmt.Errorf("can't get parent for %s: %w", key, err), + ErrReplace, + ) +} + +func ErrUnhandledContainerType(key string, value any) error { + return fmt.Errorf("unhandled container type at %s: %T: %w", key, value, ErrReplace) +} + +func ErrCyclicChain(key string) error { + return fmt.Errorf("cannot resolve cyclic chain of pointers under %s: %w", key, ErrReplace) +} + +func ErrInvalidPointerType(key string, value any, err error) error { + return fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T (%v): %w", + key, value, err, ErrReplace, + ) +} diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go index c0f43e728a..61c13f7eba 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go @@ -1,7 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package replace import ( "encoding/json" + "errors" "fmt" "net/url" "os" @@ -13,7 +17,10 @@ import ( "github.com/go-openapi/spec" ) -const definitionsPath = "#/definitions" +const ( + definitionsPath = "#/definitions" + allocMediumMap = 64 +) var debugLog = debug.GetLogger("analysis/flatten/replace", os.Getenv("SWAGGER_DEBUG") != "") @@ -41,10 +48,10 @@ func RewriteSchemaToRef(sp *spec.Swagger, key string, ref spec.Ref) error { if refable.Schema != nil { refable.Schema = &spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} } - case map[string]interface{}: // this happens e.g. if a schema points to an extension unmarshaled as map[string]interface{} + case map[string]any: // this happens e.g. if a schema points to an extension unmarshaled as map[string]interface{} return rewriteParentRef(sp, key, ref) default: - return fmt.Errorf("no schema with ref found at %s for %T", key, value) + return ErrNoSchemaWithRef(key, value) } return nil @@ -69,7 +76,7 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { case *spec.Responses: statusCode, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", key[1:], err) + return ErrNotANumber(key[1:], err) } resp := container.StatusCodeResponses[statusCode] resp.Schema = &spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} @@ -93,7 +100,7 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { case []spec.Parameter: idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", key[1:], err) + return ErrNotANumber(key[1:], err) } param := container[idx] param.Schema = &spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} @@ -108,7 +115,7 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { case []spec.Schema: idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", key[1:], err) + return ErrNotANumber(key[1:], err) } container[idx] = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} @@ -116,32 +123,32 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { // NOTE: this is necessarily an array - otherwise, the parent would be *Schema idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", key[1:], err) + return ErrNotANumber(key[1:], err) } container.Schemas[idx] = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} case spec.SchemaProperties: container[entry] = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} - case *interface{}: + case *any: *container = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} // NOTE: can't have case *spec.SchemaOrBool = parent in this case is *Schema default: - return fmt.Errorf("unhandled parent schema rewrite %s (%T)", key, pvalue) + return ErrUnhandledParentRewrite(key, pvalue) } return nil } // getPointerFromKey retrieves the content of the JSON pointer "key" -func getPointerFromKey(sp interface{}, key string) (string, interface{}, error) { +func getPointerFromKey(sp any, key string) (string, any, error) { switch sp.(type) { case *spec.Schema: case *spec.Swagger: default: - panic("unexpected type used in getPointerFromKey") + panic(ErrUnexpectedType) } if key == "#/" { return "", sp, nil @@ -150,26 +157,26 @@ func getPointerFromKey(sp interface{}, key string) (string, interface{}, error) pth, _ := url.PathUnescape(key[1:]) ptr, err := jsonpointer.New(pth) if err != nil { - return "", nil, err + return "", nil, errors.Join(err, ErrReplace) } value, _, err := ptr.Get(sp) if err != nil { debugLog("error when getting key: %s with path: %s", key, pth) - return "", nil, err + return "", nil, errors.Join(err, ErrReplace) } return pth, value, nil } // getParentFromKey retrieves the container of the JSON pointer "key" -func getParentFromKey(sp interface{}, key string) (string, string, interface{}, error) { +func getParentFromKey(sp any, key string) (string, string, any, error) { switch sp.(type) { case *spec.Schema: case *spec.Swagger: default: - panic("unexpected type used in getPointerFromKey") + panic(ErrUnexpectedType) } // unescape chars in key, e.g. "{}" from path params pth, _ := url.PathUnescape(key[1:]) @@ -179,23 +186,23 @@ func getParentFromKey(sp interface{}, key string) (string, string, interface{}, pptr, err := jsonpointer.New(parent) if err != nil { - return "", "", nil, err + return "", "", nil, errors.Join(err, ErrReplace) } pvalue, _, err := pptr.Get(sp) if err != nil { - return "", "", nil, fmt.Errorf("can't get parent for %s: %w", parent, err) + return "", "", nil, ErrNoParent(parent, err) } return parent, entry, pvalue, nil } // UpdateRef replaces a ref by another one -func UpdateRef(sp interface{}, key string, ref spec.Ref) error { +func UpdateRef(sp any, key string, ref spec.Ref) error { switch sp.(type) { case *spec.Schema: case *spec.Swagger: default: - panic("unexpected type used in getPointerFromKey") + panic(ErrUnexpectedType) } debugLog("updating ref for %s with %s", key, ref.String()) pth, value, err := getPointerFromKey(sp, key) @@ -218,7 +225,7 @@ func UpdateRef(sp interface{}, key string, ref spec.Ref) error { debugLog("rewriting holder for %T", refable) _, entry, pvalue, erp := getParentFromKey(sp, key) if erp != nil { - return err + return erp } switch container := pvalue.(type) { case spec.Definitions: @@ -230,7 +237,7 @@ func UpdateRef(sp interface{}, key string, ref spec.Ref) error { case []spec.Schema: idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", pth, err) + return ErrNotANumber(pth, err) } container[idx] = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} @@ -238,7 +245,7 @@ func UpdateRef(sp interface{}, key string, ref spec.Ref) error { // NOTE: this is necessarily an array - otherwise, the parent would be *Schema idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", pth, err) + return ErrNotANumber(pth, err) } container.Schemas[idx] = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} @@ -248,11 +255,11 @@ func UpdateRef(sp interface{}, key string, ref spec.Ref) error { // NOTE: can't have case *spec.SchemaOrBool = parent in this case is *Schema default: - return fmt.Errorf("unhandled container type at %s: %T", key, value) + return ErrUnhandledContainerType(key, value) } default: - return fmt.Errorf("no schema with ref found at %s for %T", key, value) + return ErrNoSchemaWithRef(key, value) } return nil @@ -272,8 +279,9 @@ func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { case spec.Schema: _, entry, pvalue, erp := getParentFromKey(sp, key) if erp != nil { - return err + return erp } + switch container := pvalue.(type) { case spec.Definitions: container[entry] = *sch @@ -284,7 +292,7 @@ func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { case []spec.Schema: idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", pth, err) + return ErrNotANumber(pth, err) } container[idx] = *sch @@ -292,7 +300,7 @@ func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { // NOTE: this is necessarily an array - otherwise, the parent would be *Schema idx, err := strconv.Atoi(entry) if err != nil { - return fmt.Errorf("%s not a number: %w", pth, err) + return ErrNotANumber(pth, err) } container.Schemas[idx] = *sch @@ -302,7 +310,7 @@ func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { // NOTE: can't have case *spec.SchemaOrBool = parent in this case is *Schema default: - return fmt.Errorf("unhandled type for parent of [%s]: %T", key, value) + return ErrUnhandledParentType(key, value) } case *spec.SchemaOrArray: *refable.Schema = *sch @@ -310,7 +318,7 @@ func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { case *spec.SchemaOrBool: *refable.Schema = *sch default: - return fmt.Errorf("no schema with ref found at %s for %T", key, value) + return ErrNoSchemaWithRef(key, value) } return nil @@ -336,8 +344,8 @@ func DeepestRef(sp *spec.Swagger, opts *spec.ExpandOptions, ref spec.Ref) (*Deep } currentRef := ref - visited := make(map[string]bool, 64) - warnings := make([]string, 0, 2) + visited := make(map[string]bool, allocMediumMap) + warnings := make([]string, 0) DOWNREF: for currentRef.String() != "" { @@ -347,8 +355,7 @@ DOWNREF: } if _, beenThere := visited[currentRef.String()]; beenThere { - return nil, - fmt.Errorf("cannot resolve cyclic chain of pointers under %s", currentRef.String()) + return nil, ErrCyclicChain(currentRef.String()) } visited[currentRef.String()] = true @@ -390,10 +397,7 @@ DOWNREF: err := asSchema.UnmarshalJSON(asJSON) if err != nil { - return nil, - fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T (%v)", - currentRef.String(), value, err, - ) + return nil, ErrInvalidPointerType(currentRef.String(), value, err) } warnings = append(warnings, fmt.Sprintf("found $ref %q (response) interpreted as schema", currentRef.String())) @@ -408,10 +412,7 @@ DOWNREF: asJSON, _ := refable.MarshalJSON() var asSchema spec.Schema if err := asSchema.UnmarshalJSON(asJSON); err != nil { - return nil, - fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T (%v)", - currentRef.String(), value, err, - ) + return nil, ErrInvalidPointerType(currentRef.String(), value, err) } warnings = append(warnings, fmt.Sprintf("found $ref %q (parameter) interpreted as schema", currentRef.String())) @@ -430,10 +431,7 @@ DOWNREF: asJSON, _ := json.Marshal(refable) var asSchema spec.Schema if err := asSchema.UnmarshalJSON(asJSON); err != nil { - return nil, - fmt.Errorf("unhandled type to resolve JSON pointer %s. Expected a Schema, got: %T (%v)", - currentRef.String(), value, err, - ) + return nil, ErrInvalidPointerType(currentRef.String(), value, err) } warnings = append(warnings, fmt.Sprintf("found $ref %q (%T) interpreted as schema", currentRef.String(), refable)) @@ -451,7 +449,7 @@ DOWNREF: } if sch == nil { - return nil, fmt.Errorf("no schema found at %s", currentRef.String()) + return nil, ErrNoSchema(currentRef.String()) } return &DeepestRefResult{Ref: currentRef, Schema: sch, Warnings: warnings}, nil diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go b/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go index 4590236e68..7e9fb9f0a5 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go @@ -1,12 +1,17 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Package schutils provides tools to save or clone a schema // when flattening a spec. package schutils import ( "github.com/go-openapi/spec" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) +const allocLargeMap = 150 + // Save registers a schema as an entry in spec #/definitions func Save(sp *spec.Swagger, name string, schema *spec.Schema) { if schema == nil { @@ -14,7 +19,7 @@ func Save(sp *spec.Swagger, name string, schema *spec.Schema) { } if sp.Definitions == nil { - sp.Definitions = make(map[string]spec.Schema, 150) + sp.Definitions = make(map[string]spec.Schema, allocLargeMap) } sp.Definitions[name] = *schema @@ -23,7 +28,7 @@ func Save(sp *spec.Swagger, name string, schema *spec.Schema) { // Clone deep-clones a schema func Clone(schema *spec.Schema) *spec.Schema { var sch spec.Schema - _ = swag.FromDynamicJSON(schema, &sch) + _ = jsonutils.FromDynamicJSON(schema, &sch) return &sch } diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go index ac80fc2e83..a5db0249ec 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package sortref import ( @@ -60,7 +63,7 @@ func (k Keys) Less(i, j int) bool { // KeyParts construct a SplitKey with all its /-separated segments decomposed. It is sortable. func KeyParts(key string) SplitKey { var res []string - for _, part := range strings.Split(key[1:], "/") { + for part := range strings.SplitSeq(key[1:], "/") { if part != "" { res = append(res, jsonpointer.Unescape(part)) } @@ -86,22 +89,6 @@ func (s SplitKey) DefinitionName() string { return s[1] } -func (s SplitKey) isKeyName(i int) bool { - if i <= 0 { - return false - } - - count := 0 - for idx := i - 1; idx > 0; idx-- { - if s[idx] != "properties" { - break - } - count++ - } - - return count%2 != 0 -} - // PartAdder know how to construct the components of a new name type PartAdder func(string) []string @@ -179,7 +166,8 @@ func (s SplitKey) ResponseName() string { // PathItemRef constructs a $ref object from a split key of the form /{path}/{method} func (s SplitKey) PathItemRef() spec.Ref { - if len(s) < 3 { + const minValidPathItems = 3 + if len(s) < minValidPathItems { return spec.Ref{} } @@ -199,3 +187,19 @@ func (s SplitKey) PathRef() spec.Ref { return spec.MustCreateRef("#" + path.Join("/", paths, jsonpointer.Escape(s[1]))) } + +func (s SplitKey) isKeyName(i int) bool { + if i <= 0 { + return false + } + + count := 0 + for idx := i - 1; idx > 0; idx-- { + if s[idx] != "properties" { + break + } + count++ + } + + return count%2 != 0 +} diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go index 73243df87f..ceac713772 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package sortref import ( @@ -30,7 +33,7 @@ func (i *mapIterator) Key() string { return i.mapIter.Key().String() } -func mustMapIterator(anyMap interface{}) *mapIterator { +func mustMapIterator(anyMap any) *mapIterator { val := reflect.ValueOf(anyMap) return &mapIterator{mapIter: val.MapRange(), len: val.Len()} @@ -40,7 +43,7 @@ func mustMapIterator(anyMap interface{}) *mapIterator { // (shared params, op param, statuscode response, default response, definitions) // sort groups internally by number of parts in the key and lexical names // flatten groups into a single list of keys -func DepthFirst(in interface{}) []string { +func DepthFirst(in any) []string { iterator := mustMapIterator(in) sorted := make([]string, 0, iterator.Len()) grouped := make(map[string]Keys, iterator.Len()) diff --git a/vendor/github.com/go-openapi/analysis/mixin.go b/vendor/github.com/go-openapi/analysis/mixin.go index 7785a29b27..cc5c392334 100644 --- a/vendor/github.com/go-openapi/analysis/mixin.go +++ b/vendor/github.com/go-openapi/analysis/mixin.go @@ -1,22 +1,12 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis import ( "fmt" "reflect" + "slices" "github.com/go-openapi/spec" ) @@ -248,14 +238,7 @@ func mergeResponses(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { func mergeConsumes(primary *spec.Swagger, m *spec.Swagger) []string { for _, v := range m.Consumes { - found := false - for _, vv := range primary.Consumes { - if v == vv { - found = true - - break - } - } + found := slices.Contains(primary.Consumes, v) if found { // no warning here: we just skip it @@ -269,14 +252,7 @@ func mergeConsumes(primary *spec.Swagger, m *spec.Swagger) []string { func mergeProduces(primary *spec.Swagger, m *spec.Swagger) []string { for _, v := range m.Produces { - found := false - for _, vv := range primary.Produces { - if v == vv { - found = true - - break - } - } + found := slices.Contains(primary.Produces, v) if found { // no warning here: we just skip it @@ -317,14 +293,7 @@ func mergeTags(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { func mergeSchemes(primary *spec.Swagger, m *spec.Swagger) []string { for _, v := range m.Schemes { - found := false - for _, vv := range primary.Schemes { - if v == vv { - found = true - - break - } - } + found := slices.Contains(primary.Schemes, v) if found { // no warning here: we just skip it @@ -391,7 +360,7 @@ func mergeInfo(primary *spec.Info, m *spec.Info) []string { } if primary.Title == "" { - primary.Description = m.Description + primary.Title = m.Title } if primary.TermsOfService == "" { @@ -474,23 +443,23 @@ func initPrimary(primary *spec.Swagger) { } if primary.Security == nil { - primary.Security = make([]map[string][]string, 0, 10) + primary.Security = make([]map[string][]string, 0, allocSmallMap) } if primary.Produces == nil { - primary.Produces = make([]string, 0, 10) + primary.Produces = make([]string, 0, allocSmallMap) } if primary.Consumes == nil { - primary.Consumes = make([]string, 0, 10) + primary.Consumes = make([]string, 0, allocSmallMap) } if primary.Tags == nil { - primary.Tags = make([]spec.Tag, 0, 10) + primary.Tags = make([]spec.Tag, 0, allocSmallMap) } if primary.Schemes == nil { - primary.Schemes = make([]string, 0, 10) + primary.Schemes = make([]string, 0, allocSmallMap) } if primary.Paths == nil { diff --git a/vendor/github.com/go-openapi/analysis/schema.go b/vendor/github.com/go-openapi/analysis/schema.go index ab190db5b7..039dac1566 100644 --- a/vendor/github.com/go-openapi/analysis/schema.go +++ b/vendor/github.com/go-openapi/analysis/schema.go @@ -1,8 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( - "errors" - "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" ) @@ -10,7 +11,7 @@ import ( // SchemaOpts configures the schema analyzer type SchemaOpts struct { Schema *spec.Schema - Root interface{} + Root any BasePath string _ struct{} } @@ -19,7 +20,7 @@ type SchemaOpts struct { // patterns. func Schema(opts SchemaOpts) (*AnalyzedSchema, error) { if opts.Schema == nil { - return nil, errors.New("no schema to analyze") + return nil, ErrNoSchema } a := &AnalyzedSchema{ @@ -54,7 +55,7 @@ func Schema(opts SchemaOpts) (*AnalyzedSchema, error) { // AnalyzedSchema indicates what the schema represents type AnalyzedSchema struct { schema *spec.Schema - root interface{} + root any basePath string hasProps bool diff --git a/vendor/github.com/go-openapi/errors/.golangci.yml b/vendor/github.com/go-openapi/errors/.golangci.yml index 60798c2112..5609b4fea9 100644 --- a/vendor/github.com/go-openapi/errors/.golangci.yml +++ b/vendor/github.com/go-openapi/errors/.golangci.yml @@ -16,7 +16,7 @@ linters: - godox - gosmopolitan - inamedparam - - intrange # disabled while < go1.22 + #- intrange # disabled while < go1.22 - ireturn - lll - musttag diff --git a/vendor/github.com/go-openapi/errors/README.md b/vendor/github.com/go-openapi/errors/README.md index 6d57ea55c7..d7e3a18bcf 100644 --- a/vendor/github.com/go-openapi/errors/README.md +++ b/vendor/github.com/go-openapi/errors/README.md @@ -6,3 +6,7 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/errors)](https://goreportcard.com/report/github.com/go-openapi/errors) Shared errors and error interface used throughout the various libraries found in the go-openapi toolkit. + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/errors/api.go b/vendor/github.com/go-openapi/errors/api.go index d6f507f42d..d39233bafe 100644 --- a/vendor/github.com/go-openapi/errors/api.go +++ b/vendor/github.com/go-openapi/errors/api.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -46,14 +35,14 @@ func (a *apiError) Code() int32 { // MarshalJSON implements the JSON encoding interface func (a apiError) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": a.code, "message": a.message, }) } // New creates a new API error with a code and a message -func New(code int32, message string, args ...interface{}) Error { +func New(code int32, message string, args ...any) Error { if len(args) > 0 { return &apiError{ code: code, @@ -67,16 +56,16 @@ func New(code int32, message string, args ...interface{}) Error { } // NotFound creates a new not found error -func NotFound(message string, args ...interface{}) Error { +func NotFound(message string, args ...any) Error { if message == "" { message = "Not found" } - return New(http.StatusNotFound, fmt.Sprintf(message, args...)) + return New(http.StatusNotFound, message, args...) } // NotImplemented creates a new not implemented error func NotImplemented(message string) Error { - return New(http.StatusNotImplemented, message) + return New(http.StatusNotImplemented, "%s", message) } // MethodNotAllowedError represents an error for when the path matches but the method doesn't @@ -97,7 +86,7 @@ func (m *MethodNotAllowedError) Code() int32 { // MarshalJSON implements the JSON encoding interface func (m MethodNotAllowedError) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": m.code, "message": m.message, "allowed": m.Allowed, @@ -179,7 +168,7 @@ func ServeError(rw http.ResponseWriter, r *http.Request, err error) { default: rw.WriteHeader(http.StatusInternalServerError) if r == nil || r.Method != http.MethodHead { - _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, err.Error()))) + _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "%v", err))) } } } diff --git a/vendor/github.com/go-openapi/errors/auth.go b/vendor/github.com/go-openapi/errors/auth.go index 0545b501bd..08de582e5d 100644 --- a/vendor/github.com/go-openapi/errors/auth.go +++ b/vendor/github.com/go-openapi/errors/auth.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors diff --git a/vendor/github.com/go-openapi/errors/doc.go b/vendor/github.com/go-openapi/errors/doc.go index af01190ce6..b4627f30f4 100644 --- a/vendor/github.com/go-openapi/errors/doc.go +++ b/vendor/github.com/go-openapi/errors/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package errors provides an Error interface and several concrete types diff --git a/vendor/github.com/go-openapi/errors/headers.go b/vendor/github.com/go-openapi/errors/headers.go index 6ea1151f41..2d837c34ac 100644 --- a/vendor/github.com/go-openapi/errors/headers.go +++ b/vendor/github.com/go-openapi/errors/headers.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -25,9 +14,9 @@ type Validation struct { //nolint: errname code int32 Name string In string - Value interface{} + Value any message string - Values []interface{} + Values []any } func (e *Validation) Error() string { @@ -41,7 +30,7 @@ func (e *Validation) Code() int32 { // MarshalJSON implements the JSON encoding interface func (e Validation) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": e.code, "message": e.message, "in": e.In, @@ -72,7 +61,7 @@ const ( // InvalidContentType error for an invalid content type func InvalidContentType(value string, allowed []string) *Validation { - values := make([]interface{}, 0, len(allowed)) + values := make([]any, 0, len(allowed)) for _, v := range allowed { values = append(values, v) } @@ -88,7 +77,7 @@ func InvalidContentType(value string, allowed []string) *Validation { // InvalidResponseFormat error for an unacceptable response format request func InvalidResponseFormat(value string, allowed []string) *Validation { - values := make([]interface{}, 0, len(allowed)) + values := make([]any, 0, len(allowed)) for _, v := range allowed { values = append(values, v) } diff --git a/vendor/github.com/go-openapi/errors/middleware.go b/vendor/github.com/go-openapi/errors/middleware.go index 1b9f3a9301..c434e59a6f 100644 --- a/vendor/github.com/go-openapi/errors/middleware.go +++ b/vendor/github.com/go-openapi/errors/middleware.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors diff --git a/vendor/github.com/go-openapi/errors/parsing.go b/vendor/github.com/go-openapi/errors/parsing.go index 34930c087a..ea2a7c6037 100644 --- a/vendor/github.com/go-openapi/errors/parsing.go +++ b/vendor/github.com/go-openapi/errors/parsing.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -63,7 +52,7 @@ func (e ParseError) MarshalJSON() ([]byte, error) { if e.Reason != nil { reason = e.Reason.Error() } - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": e.code, "message": e.message, "in": e.In, diff --git a/vendor/github.com/go-openapi/errors/schema.go b/vendor/github.com/go-openapi/errors/schema.go index 8f3239dfd9..e59ca4f863 100644 --- a/vendor/github.com/go-openapi/errors/schema.go +++ b/vendor/github.com/go-openapi/errors/schema.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -130,7 +119,7 @@ func (c *CompositeError) Unwrap() []error { // MarshalJSON implements the JSON encoding interface func (c CompositeError) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": c.code, "message": c.message, "errors": c.Errors, @@ -254,7 +243,7 @@ func InvalidTypeName(typeName string) *Validation { } // InvalidType creates an error for when the type is invalid -func InvalidType(name, in, typeName string, value interface{}) *Validation { +func InvalidType(name, in, typeName string, value any) *Validation { var message string if in != "" { @@ -302,7 +291,7 @@ func DuplicateItems(name, in string) *Validation { } // TooManyItems error for when an array contains too many items -func TooManyItems(name, in string, maximum int64, value interface{}) *Validation { +func TooManyItems(name, in string, maximum int64, value any) *Validation { msg := fmt.Sprintf(maximumItemsFail, name, in, maximum) if in == "" { msg = fmt.Sprintf(maximumItemsFailNoIn, name, maximum) @@ -318,7 +307,7 @@ func TooManyItems(name, in string, maximum int64, value interface{}) *Validation } // TooFewItems error for when an array contains too few items -func TooFewItems(name, in string, minimum int64, value interface{}) *Validation { +func TooFewItems(name, in string, minimum int64, value any) *Validation { msg := fmt.Sprintf(minItemsFail, name, in, minimum) if in == "" { msg = fmt.Sprintf(minItemsFailNoIn, name, minimum) @@ -333,7 +322,7 @@ func TooFewItems(name, in string, minimum int64, value interface{}) *Validation } // ExceedsMaximumInt error for when maximumimum validation fails -func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value interface{}) *Validation { +func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value any) *Validation { var message string if in == "" { m := maximumIncFailNoIn @@ -358,7 +347,7 @@ func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value int } // ExceedsMaximumUint error for when maximumimum validation fails -func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value interface{}) *Validation { +func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value any) *Validation { var message string if in == "" { m := maximumIncFailNoIn @@ -383,7 +372,7 @@ func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value i } // ExceedsMaximum error for when maximumimum validation fails -func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value interface{}) *Validation { +func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value any) *Validation { var message string if in == "" { m := maximumIncFailNoIn @@ -408,7 +397,7 @@ func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value inte } // ExceedsMinimumInt error for when minimum validation fails -func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value interface{}) *Validation { +func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value any) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -433,7 +422,7 @@ func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value int } // ExceedsMinimumUint error for when minimum validation fails -func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value interface{}) *Validation { +func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value any) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -458,7 +447,7 @@ func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value i } // ExceedsMinimum error for when minimum validation fails -func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value interface{}) *Validation { +func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value any) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -483,7 +472,7 @@ func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value inte } // NotMultipleOf error for when multiple of validation fails -func NotMultipleOf(name, in string, multiple, value interface{}) *Validation { +func NotMultipleOf(name, in string, multiple, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple) @@ -500,7 +489,7 @@ func NotMultipleOf(name, in string, multiple, value interface{}) *Validation { } // EnumFail error for when an enum validation fails -func EnumFail(name, in string, value interface{}, values []interface{}) *Validation { +func EnumFail(name, in string, value any, values []any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(enumFailNoIn, name, values) @@ -519,7 +508,7 @@ func EnumFail(name, in string, value interface{}, values []interface{}) *Validat } // Required error for when a value is missing -func Required(name, in string, value interface{}) *Validation { +func Required(name, in string, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(requiredFailNoIn, name) @@ -536,7 +525,7 @@ func Required(name, in string, value interface{}) *Validation { } // ReadOnly error for when a value is present in request -func ReadOnly(name, in string, value interface{}) *Validation { +func ReadOnly(name, in string, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(readOnlyFailNoIn, name) @@ -553,7 +542,7 @@ func ReadOnly(name, in string, value interface{}) *Validation { } // TooLong error for when a string is too long -func TooLong(name, in string, maximum int64, value interface{}) *Validation { +func TooLong(name, in string, maximum int64, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(tooLongMessageNoIn, name, maximum) @@ -570,7 +559,7 @@ func TooLong(name, in string, maximum int64, value interface{}) *Validation { } // TooShort error for when a string is too short -func TooShort(name, in string, minimum int64, value interface{}) *Validation { +func TooShort(name, in string, minimum int64, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(tooShortMessageNoIn, name, minimum) @@ -589,7 +578,7 @@ func TooShort(name, in string, minimum int64, value interface{}) *Validation { // FailedPattern error for when a string fails a regex pattern match // the pattern that is returned is the ECMA syntax version of the pattern not the golang version. -func FailedPattern(name, in, pattern string, value interface{}) *Validation { +func FailedPattern(name, in, pattern string, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(patternFailNoIn, name, pattern) @@ -608,7 +597,7 @@ func FailedPattern(name, in, pattern string, value interface{}) *Validation { // MultipleOfMustBePositive error for when a // multipleOf factor is negative -func MultipleOfMustBePositive(name, in string, factor interface{}) *Validation { +func MultipleOfMustBePositive(name, in string, factor any) *Validation { return &Validation{ code: MultipleOfMustBePositiveCode, Name: name, diff --git a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml index 22f8d21cca..7cea1af8b5 100644 --- a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml +++ b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml @@ -1,61 +1,75 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gosmopolitan + - inamedparam + #- intrange # disabled while < go1.22 + - ireturn + - lll + - musttag + - nestif + - nlreturn + - nonamedreturns + - noinlineerr - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md index 0108f1d572..45bd31b14f 100644 --- a/vendor/github.com/go-openapi/jsonpointer/README.md +++ b/vendor/github.com/go-openapi/jsonpointer/README.md @@ -13,7 +13,14 @@ Completed YES Tested YES ## References -http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 + + + +also known as [RFC6901](https://www.rfc-editor.org/rfc/rfc6901) ### Note + The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented. + +That is because our implementation of the JSON pointer only supports explicit references to array elements: the provision in the spec +to resolve non-existent members as "the last element in the array", using the special trailing character "-". diff --git a/vendor/github.com/go-openapi/jsonpointer/errors.go b/vendor/github.com/go-openapi/jsonpointer/errors.go new file mode 100644 index 0000000000..b84343d9d7 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/errors.go @@ -0,0 +1,18 @@ +package jsonpointer + +type pointerError string + +func (e pointerError) Error() string { + return string(e) +} + +const ( + // ErrPointer is an error raised by the jsonpointer package + ErrPointer pointerError = "JSON pointer error" + + // ErrInvalidStart states that a JSON pointer must start with a separator ("/") + ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator + + // ErrUnsupportedValueType indicates that a value of the wrong type is being set + ErrUnsupportedValueType pointerError = "only structs, pointers, maps and slices are supported for setting values" +) diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go index d970c7cf44..7513c4763b 100644 --- a/vendor/github.com/go-openapi/jsonpointer/pointer.go +++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -33,19 +33,18 @@ import ( "strconv" "strings" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonname" ) const ( emptyPointer = `` pointerSeparator = `/` - - invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator - notFound = `Can't find the pointer in the document` ) -var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem() -var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem() +var ( + jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem() + jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem() +) // JSONPointable is an interface for structs to implement when they need to customize the // json pointer process @@ -59,181 +58,104 @@ type JSONSetable interface { JSONSet(string, any) error } -// New creates a new json pointer for the given string -func New(jsonPointerString string) (Pointer, error) { - - var p Pointer - err := p.parse(jsonPointerString) - return p, err - -} - -// Pointer the json pointer reprsentation +// Pointer is a representation of a json pointer type Pointer struct { referenceTokens []string } -// "Constructor", parses the given string JSON pointer -func (p *Pointer) parse(jsonPointerString string) error { - - var err error - - if jsonPointerString != emptyPointer { - if !strings.HasPrefix(jsonPointerString, pointerSeparator) { - err = errors.New(invalidStart) - } else { - referenceTokens := strings.Split(jsonPointerString, pointerSeparator) - p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...) - } - } +// New creates a new json pointer for the given string +func New(jsonPointerString string) (Pointer, error) { + var p Pointer + err := p.parse(jsonPointerString) - return err + return p, err } // Get uses the pointer to retrieve a value from a JSON document func (p *Pointer) Get(document any) (any, reflect.Kind, error) { - return p.get(document, swag.DefaultJSONNameProvider) + return p.get(document, jsonname.DefaultJSONNameProvider) } // Set uses the pointer to set a value from a JSON document func (p *Pointer) Set(document any, value any) (any, error) { - return document, p.set(document, value, swag.DefaultJSONNameProvider) -} - -// GetForToken gets a value for a json pointer token 1 level deep -func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) { - return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider) -} - -// SetForToken gets a value for a json pointer token 1 level deep -func SetForToken(document any, decodedToken string, value any) (any, error) { - return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider) + return document, p.set(document, value, jsonname.DefaultJSONNameProvider) } -func isNil(input any) bool { - if input == nil { - return true +// DecodedTokens returns the decoded tokens of this JSON pointer +func (p *Pointer) DecodedTokens() []string { + result := make([]string, 0, len(p.referenceTokens)) + for _, t := range p.referenceTokens { + result = append(result, Unescape(t)) } + return result +} - kind := reflect.TypeOf(input).Kind() - switch kind { //nolint:exhaustive - case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Chan: - return reflect.ValueOf(input).IsNil() - default: - return false - } +// IsEmpty returns true if this is an empty json pointer +// this indicates that it points to the root document +func (p *Pointer) IsEmpty() bool { + return len(p.referenceTokens) == 0 } -func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvider) (any, reflect.Kind, error) { - rValue := reflect.Indirect(reflect.ValueOf(node)) - kind := rValue.Kind() - if isNil(node) { - return nil, kind, fmt.Errorf("nil value has not field %q", decodedToken) - } +// Pointer to string representation function +func (p *Pointer) String() string { - switch typed := node.(type) { - case JSONPointable: - r, err := typed.JSONLookup(decodedToken) - if err != nil { - return nil, kind, err - } - return r, kind, nil - case *any: // case of a pointer to interface, that is not resolved by reflect.Indirect - return getSingleImpl(*typed, decodedToken, nameProvider) + if len(p.referenceTokens) == 0 { + return emptyPointer } - switch kind { //nolint:exhaustive - case reflect.Struct: - nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) - if !ok { - return nil, kind, fmt.Errorf("object has no field %q", decodedToken) - } - fld := rValue.FieldByName(nm) - return fld.Interface(), kind, nil - - case reflect.Map: - kv := reflect.ValueOf(decodedToken) - mv := rValue.MapIndex(kv) - - if mv.IsValid() { - return mv.Interface(), kind, nil - } - return nil, kind, fmt.Errorf("object has no key %q", decodedToken) + return pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator) +} - case reflect.Slice: - tokenIndex, err := strconv.Atoi(decodedToken) +func (p *Pointer) Offset(document string) (int64, error) { + dec := json.NewDecoder(strings.NewReader(document)) + var offset int64 + for _, ttk := range p.DecodedTokens() { + tk, err := dec.Token() if err != nil { - return nil, kind, err + return 0, err } - sLength := rValue.Len() - if tokenIndex < 0 || tokenIndex >= sLength { - return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex) + switch tk := tk.(type) { + case json.Delim: + switch tk { + case '{': + offset, err = offsetSingleObject(dec, ttk) + if err != nil { + return 0, err + } + case '[': + offset, err = offsetSingleArray(dec, ttk) + if err != nil { + return 0, err + } + default: + return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer) + } + default: + return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer) } - - elem := rValue.Index(tokenIndex) - return elem.Interface(), kind, nil - - default: - return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken) } - + return offset, nil } -func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameProvider) error { - rValue := reflect.Indirect(reflect.ValueOf(node)) - - if ns, ok := node.(JSONSetable); ok { // pointer impl - return ns.JSONSet(decodedToken, data) - } - - if rValue.Type().Implements(jsonSetableType) { - return node.(JSONSetable).JSONSet(decodedToken, data) - } - - switch rValue.Kind() { //nolint:exhaustive - case reflect.Struct: - nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) - if !ok { - return fmt.Errorf("object has no field %q", decodedToken) - } - fld := rValue.FieldByName(nm) - if fld.IsValid() { - fld.Set(reflect.ValueOf(data)) - } - return nil - - case reflect.Map: - kv := reflect.ValueOf(decodedToken) - rValue.SetMapIndex(kv, reflect.ValueOf(data)) - return nil - - case reflect.Slice: - tokenIndex, err := strconv.Atoi(decodedToken) - if err != nil { - return err - } - sLength := rValue.Len() - if tokenIndex < 0 || tokenIndex >= sLength { - return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) - } +// "Constructor", parses the given string JSON pointer +func (p *Pointer) parse(jsonPointerString string) error { + var err error - elem := rValue.Index(tokenIndex) - if !elem.CanSet() { - return fmt.Errorf("can't set slice index %s to %v", decodedToken, data) + if jsonPointerString != emptyPointer { + if !strings.HasPrefix(jsonPointerString, pointerSeparator) { + err = errors.Join(ErrInvalidStart, ErrPointer) + } else { + referenceTokens := strings.Split(jsonPointerString, pointerSeparator) + p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...) } - elem.Set(reflect.ValueOf(data)) - return nil - - default: - return fmt.Errorf("invalid token reference %q", decodedToken) } + return err } -func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.Kind, error) { - +func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) { if nameProvider == nil { - nameProvider = swag.DefaultJSONNameProvider + nameProvider = jsonname.DefaultJSONNameProvider } kind := reflect.Invalid @@ -244,7 +166,6 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K } for _, token := range p.referenceTokens { - decodedToken := Unescape(token) r, knd, err := getSingleImpl(node, decodedToken, nameProvider) @@ -260,15 +181,18 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K return node, kind, nil } -func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { +func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error { knd := reflect.ValueOf(node).Kind() - if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { - return errors.New("only structs, pointers, maps and slices are supported for setting values") + if knd != reflect.Pointer && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { + return errors.Join( + ErrUnsupportedValueType, + ErrPointer, + ) } if nameProvider == nil { - nameProvider = swag.DefaultJSONNameProvider + nameProvider = jsonname.DefaultJSONNameProvider } // Full document when empty @@ -286,6 +210,11 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { return setSingleImpl(node, data, decodedToken, nameProvider) } + // Check for nil during traversal + if isNil(node) { + return fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer) + } + rValue := reflect.Indirect(reflect.ValueOf(node)) kind := rValue.Kind() @@ -295,7 +224,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { return err } fld := reflect.ValueOf(r) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer { node = fld.Addr().Interface() continue } @@ -307,10 +236,10 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { - return fmt.Errorf("object has no field %q", decodedToken) + return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) } fld := rValue.FieldByName(nm) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer { node = fld.Addr().Interface() continue } @@ -321,9 +250,9 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { mv := rValue.MapIndex(kv) if !mv.IsValid() { - return fmt.Errorf("object has no key %q", decodedToken) + return fmt.Errorf("object has no key %q: %w", decodedToken, ErrPointer) } - if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr { + if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Pointer { node = mv.Addr().Interface() continue } @@ -336,81 +265,155 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { } sLength := rValue.Len() if tokenIndex < 0 || tokenIndex >= sLength { - return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) + return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength, tokenIndex, ErrPointer) } elem := rValue.Index(tokenIndex) - if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr { + if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Pointer { node = elem.Addr().Interface() continue } node = elem.Interface() default: - return fmt.Errorf("invalid token reference %q", decodedToken) + return fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer) } - } return nil } -// DecodedTokens returns the decoded tokens -func (p *Pointer) DecodedTokens() []string { - result := make([]string, 0, len(p.referenceTokens)) - for _, t := range p.referenceTokens { - result = append(result, Unescape(t)) +func isNil(input any) bool { + if input == nil { + return true + } + + kind := reflect.TypeOf(input).Kind() + switch kind { //nolint:exhaustive + case reflect.Pointer, reflect.Map, reflect.Slice, reflect.Chan: + return reflect.ValueOf(input).IsNil() + default: + return false } - return result } -// IsEmpty returns true if this is an empty json pointer -// this indicates that it points to the root document -func (p *Pointer) IsEmpty() bool { - return len(p.referenceTokens) == 0 +// GetForToken gets a value for a json pointer token 1 level deep +func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) { + return getSingleImpl(document, decodedToken, jsonname.DefaultJSONNameProvider) } -// Pointer to string representation function -func (p *Pointer) String() string { +// SetForToken gets a value for a json pointer token 1 level deep +func SetForToken(document any, decodedToken string, value any) (any, error) { + return document, setSingleImpl(document, value, decodedToken, jsonname.DefaultJSONNameProvider) +} - if len(p.referenceTokens) == 0 { - return emptyPointer +func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) { + rValue := reflect.Indirect(reflect.ValueOf(node)) + kind := rValue.Kind() + if isNil(node) { + return nil, kind, fmt.Errorf("nil value has no field %q: %w", decodedToken, ErrPointer) } - pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator) + switch typed := node.(type) { + case JSONPointable: + r, err := typed.JSONLookup(decodedToken) + if err != nil { + return nil, kind, err + } + return r, kind, nil + case *any: // case of a pointer to interface, that is not resolved by reflect.Indirect + return getSingleImpl(*typed, decodedToken, nameProvider) + } - return pointerString + switch kind { //nolint:exhaustive + case reflect.Struct: + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return nil, kind, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) + } + fld := rValue.FieldByName(nm) + return fld.Interface(), kind, nil + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + mv := rValue.MapIndex(kv) + + if mv.IsValid() { + return mv.Interface(), kind, nil + } + return nil, kind, fmt.Errorf("object has no key %q: %w", decodedToken, ErrPointer) + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return nil, kind, err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength-1, tokenIndex, ErrPointer) + } + + elem := rValue.Index(tokenIndex) + return elem.Interface(), kind, nil + + default: + return nil, kind, fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer) + } } -func (p *Pointer) Offset(document string) (int64, error) { - dec := json.NewDecoder(strings.NewReader(document)) - var offset int64 - for _, ttk := range p.DecodedTokens() { - tk, err := dec.Token() +func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.NameProvider) error { + rValue := reflect.Indirect(reflect.ValueOf(node)) + + // Check for nil to prevent panic when calling rValue.Type() + if isNil(node) { + return fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer) + } + + if ns, ok := node.(JSONSetable); ok { // pointer impl + return ns.JSONSet(decodedToken, data) + } + + if rValue.Type().Implements(jsonSetableType) { + return node.(JSONSetable).JSONSet(decodedToken, data) + } + + switch rValue.Kind() { //nolint:exhaustive + case reflect.Struct: + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) + } + fld := rValue.FieldByName(nm) + if fld.IsValid() { + fld.Set(reflect.ValueOf(data)) + } + return nil + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + rValue.SetMapIndex(kv, reflect.ValueOf(data)) + return nil + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) if err != nil { - return 0, err + return err } - switch tk := tk.(type) { - case json.Delim: - switch tk { - case '{': - offset, err = offsetSingleObject(dec, ttk) - if err != nil { - return 0, err - } - case '[': - offset, err = offsetSingleArray(dec, ttk) - if err != nil { - return 0, err - } - default: - return 0, fmt.Errorf("invalid token %#v", tk) - } - default: - return 0, fmt.Errorf("invalid token %#v", tk) + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength, tokenIndex, ErrPointer) } + + elem := rValue.Index(tokenIndex) + if !elem.CanSet() { + return fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer) + } + elem.Set(reflect.ValueOf(data)) + return nil + + default: + return fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer) } - return offset, nil } func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) { @@ -437,16 +440,16 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) { return offset, nil } default: - return 0, fmt.Errorf("invalid token %#v", tk) + return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer) } } - return 0, fmt.Errorf("token reference %q not found", decodedToken) + return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer) } func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) { idx, err := strconv.Atoi(decodedToken) if err != nil { - return 0, fmt.Errorf("token reference %q is not a number: %v", decodedToken, err) + return 0, fmt.Errorf("token reference %q is not a number: %v: %w", decodedToken, err, ErrPointer) } var i int for i = 0; i < idx && dec.More(); i++ { @@ -470,7 +473,7 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) { } if !dec.More() { - return 0, fmt.Errorf("token reference %q not found", decodedToken) + return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer) } return dec.InputOffset(), nil } @@ -516,16 +519,17 @@ const ( decRefTok1 = `/` ) +var ( + encRefTokReplacer = strings.NewReplacer(encRefTok1, decRefTok1, encRefTok0, decRefTok0) + decRefTokReplacer = strings.NewReplacer(decRefTok1, encRefTok1, decRefTok0, encRefTok0) +) + // Unescape unescapes a json pointer reference token string to the original representation func Unescape(token string) string { - step1 := strings.ReplaceAll(token, encRefTok1, decRefTok1) - step2 := strings.ReplaceAll(step1, encRefTok0, decRefTok0) - return step2 + return encRefTokReplacer.Replace(token) } // Escape escapes a pointer reference token string func Escape(token string) string { - step1 := strings.ReplaceAll(token, decRefTok0, encRefTok0) - step2 := strings.ReplaceAll(step1, decRefTok1, encRefTok1) - return step2 + return decRefTokReplacer.Replace(token) } diff --git a/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/vendor/github.com/go-openapi/jsonreference/.golangci.yml index 22f8d21cca..7cea1af8b5 100644 --- a/vendor/github.com/go-openapi/jsonreference/.golangci.yml +++ b/vendor/github.com/go-openapi/jsonreference/.golangci.yml @@ -1,61 +1,75 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gosmopolitan + - inamedparam + #- intrange # disabled while < go1.22 + - ireturn + - lll + - musttag + - nestif + - nlreturn + - nonamedreturns + - noinlineerr - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/jsonreference/NOTICE b/vendor/github.com/go-openapi/jsonreference/NOTICE new file mode 100644 index 0000000000..f9ad7e0f7a --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/NOTICE @@ -0,0 +1,36 @@ +Copyright 2015-2025 go-swagger maintainers + +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +This software library, github.com/go-openapi/jsonpointer, includes software developed +by the go-swagger and go-openapi maintainers ("go-swagger maintainers"). + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this software except in compliance with the License. +You may obtain a copy of the License at + +This software is copied from, derived from, and inspired by other original software products. +It ships with copies of other software which license terms are recalled below. + +The original sofware was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com). + +github.com/sigh-399/jsonpointer +=========================== + +// SPDX-FileCopyrightText: Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// SPDX-License-Identifier: Apache-2.0 + +Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index c7fc2049c1..2274a4b78f 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -17,3 +17,10 @@ Feature complete. Stable API * http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 * http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + +See the license [NOTICE](./NOTICE), which recalls the licensing terms of all the pieces of software +on top of which it has been built. diff --git a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go index f0610cf1e5..ca79391dcf 100644 --- a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go +++ b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package internal import ( diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go index cfdef03e5d..33d4798cad 100644 --- a/vendor/github.com/go-openapi/jsonreference/reference.go +++ b/vendor/github.com/go-openapi/jsonreference/reference.go @@ -1,27 +1,5 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonreference -// repository-desc An implementation of JSON Reference - Go language -// -// description Main and unique file. -// -// created 26-02-2013 +// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package jsonreference @@ -38,13 +16,25 @@ const ( fragmentRune = `#` ) +var ErrChildURL = errors.New("child url is nil") + +// Ref represents a json reference object +type Ref struct { + referenceURL *url.URL + referencePointer jsonpointer.Pointer + + HasFullURL bool + HasURLPathOnly bool + HasFragmentOnly bool + HasFileScheme bool + HasFullFilePath bool +} + // New creates a new reference for the given string func New(jsonReferenceString string) (Ref, error) { - var r Ref err := r.parse(jsonReferenceString) return r, err - } // MustCreateRef parses the ref string and panics when it's invalid. @@ -54,19 +44,8 @@ func MustCreateRef(ref string) Ref { if err != nil { panic(err) } - return r -} -// Ref represents a json reference object -type Ref struct { - referenceURL *url.URL - referencePointer jsonpointer.Pointer - - HasFullURL bool - HasURLPathOnly bool - HasFragmentOnly bool - HasFileScheme bool - HasFullFilePath bool + return r } // GetURL gets the URL for this reference @@ -81,7 +60,6 @@ func (r *Ref) GetPointer() *jsonpointer.Pointer { // String returns the best version of the url for this reference func (r *Ref) String() string { - if r.referenceURL != nil { return r.referenceURL.String() } @@ -106,9 +84,27 @@ func (r *Ref) IsCanonical() bool { return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL) } +// Inherits creates a new reference from a parent and a child +// If the child cannot inherit from the parent, an error is returned +func (r *Ref) Inherits(child Ref) (*Ref, error) { + childURL := child.GetURL() + parentURL := r.GetURL() + if childURL == nil { + return nil, ErrChildURL + } + if parentURL == nil { + return &child, nil + } + + ref, err := New(parentURL.ResolveReference(childURL).String()) + if err != nil { + return nil, err + } + return &ref, nil +} + // "Constructor", parses the given string JSON reference func (r *Ref) parse(jsonReferenceString string) error { - parsed, err := url.Parse(jsonReferenceString) if err != nil { return err @@ -137,22 +133,3 @@ func (r *Ref) parse(jsonReferenceString string) error { return nil } - -// Inherits creates a new reference from a parent and a child -// If the child cannot inherit from the parent, an error is returned -func (r *Ref) Inherits(child Ref) (*Ref, error) { - childURL := child.GetURL() - parentURL := r.GetURL() - if childURL == nil { - return nil, errors.New("child url is nil") - } - if parentURL == nil { - return &child, nil - } - - ref, err := New(parentURL.ResolveReference(childURL).String()) - if err != nil { - return nil, err - } - return &ref, nil -} diff --git a/vendor/github.com/go-openapi/loads/.golangci.yml b/vendor/github.com/go-openapi/loads/.golangci.yml index 22f8d21cca..1ad5adf47e 100644 --- a/vendor/github.com/go-openapi/loads/.golangci.yml +++ b/vendor/github.com/go-openapi/loads/.golangci.yml @@ -1,61 +1,75 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gosmopolitan + - inamedparam + - intrange + - ireturn + - lll + - musttag + - nestif + - nlreturn + - nonamedreturns + - noinlineerr - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/loads/README.md b/vendor/github.com/go-openapi/loads/README.md index f8bd440dfc..1f0174f2d9 100644 --- a/vendor/github.com/go-openapi/loads/README.md +++ b/vendor/github.com/go-openapi/loads/README.md @@ -3,4 +3,30 @@ [![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/loads/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/loads?status.svg)](http://godoc.org/github.com/go-openapi/loads) [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/loads)](https://goreportcard.com/report/github.com/go-openapi/loads) -Loading of OAI specification documents from local or remote locations. Supports JSON and YAML documents. +Loading of OAI v2 API specification documents from local or remote locations. Supports JSON and YAML documents. + +Primary usage: + +```go + import ( + "github.com/go-openapi/loads" + ) + + ... + + // loads a YAML spec from a http file + doc, err := loads.Spec(ts.URL) + + ... + + // retrieves the object model for the API specification + spec := doc.Spec() + + ... +``` + +See also the provided [examples](https://pkg.go.dev/github.com/go-openapi/loads#pkg-examples). + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/loads/doc.go b/vendor/github.com/go-openapi/loads/doc.go index 5bcaef5dbc..7981e70e9f 100644 --- a/vendor/github.com/go-openapi/loads/doc.go +++ b/vendor/github.com/go-openapi/loads/doc.go @@ -1,18 +1,7 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 -// Package loads provides document loading methods for swagger (OAI) specifications. +// Package loads provides document loading methods for swagger (OAI v2) API specifications. // // It is used by other go-openapi packages to load and run analysis on local or remote spec documents. package loads diff --git a/vendor/github.com/go-openapi/loads/errors.go b/vendor/github.com/go-openapi/loads/errors.go new file mode 100644 index 0000000000..8f2d602f5c --- /dev/null +++ b/vendor/github.com/go-openapi/loads/errors.go @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package loads + +type loaderError string + +func (e loaderError) Error() string { + return string(e) +} + +const ( + // ErrLoads is an error returned by the loads package + ErrLoads loaderError = "loaderrs error" + + // ErrNoLoader indicates that no configured loader matched the input + ErrNoLoader loaderError = "no loader matched" +) diff --git a/vendor/github.com/go-openapi/loads/loaders.go b/vendor/github.com/go-openapi/loads/loaders.go index b2d1e034c5..25b157302e 100644 --- a/vendor/github.com/go-openapi/loads/loaders.go +++ b/vendor/github.com/go-openapi/loads/loaders.go @@ -1,12 +1,16 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package loads import ( "encoding/json" "errors" "net/url" + "slices" "github.com/go-openapi/spec" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/loading" ) var ( @@ -30,8 +34,8 @@ func init() { loaders = jsonLoader.WithHead(&loader{ DocLoaderWithMatch: DocLoaderWithMatch{ - Match: swag.YAMLMatcher, - Fn: swag.YAMLDoc, + Match: loading.YAMLMatcher, + Fn: loading.YAMLDoc, }, }) @@ -40,7 +44,7 @@ func init() { } // DocLoader represents a doc loader type -type DocLoader func(string) (json.RawMessage, error) +type DocLoader func(string, ...loading.Option) (json.RawMessage, error) // DocMatcher represents a predicate to check if a loader matches type DocMatcher func(string) bool @@ -61,6 +65,9 @@ func NewDocLoaderWithMatch(fn DocLoader, matcher DocMatcher) DocLoaderWithMatch type loader struct { DocLoaderWithMatch + + loadingOptions []loading.Option + Next *loader } @@ -83,17 +90,17 @@ func (l *loader) WithNext(next *loader) *loader { func (l *loader) Load(path string) (json.RawMessage, error) { _, erp := url.Parse(path) if erp != nil { - return nil, erp + return nil, errors.Join(erp, ErrLoads) } - lastErr := errors.New("no loader matched") // default error if no match was found + var lastErr error = ErrNoLoader // default error if no match was found for ldr := l; ldr != nil; ldr = ldr.Next { if ldr.Match != nil && !ldr.Match(path) { continue } // try then move to next one if there is an error - b, err := ldr.Fn(path) + b, err := ldr.Fn(path, l.loadingOptions...) if err == nil { return b, nil } @@ -101,14 +108,29 @@ func (l *loader) Load(path string) (json.RawMessage, error) { lastErr = err } - return nil, lastErr + return nil, errors.Join(lastErr, ErrLoads) } -// JSONDoc loads a json document from either a file or a remote url -func JSONDoc(path string) (json.RawMessage, error) { - data, err := swag.LoadFromFileOrHTTP(path) +func (l *loader) clone() *loader { + if l == nil { + return nil + } + + return &loader{ + DocLoaderWithMatch: l.DocLoaderWithMatch, + loadingOptions: slices.Clone(l.loadingOptions), + Next: l.Next.clone(), + } +} + +// JSONDoc loads a json document from either a file or a remote url. +// +// See [loading.Option] for available options (e.g. configuring authentifaction, +// headers or using embedded file system resources). +func JSONDoc(path string, opts ...loading.Option) (json.RawMessage, error) { + data, err := loading.LoadFromFileOrHTTP(path, opts...) if err != nil { - return nil, err + return nil, errors.Join(err, ErrLoads) } return json.RawMessage(data), nil } diff --git a/vendor/github.com/go-openapi/loads/options.go b/vendor/github.com/go-openapi/loads/options.go index f8305d5607..adb5e6d15b 100644 --- a/vendor/github.com/go-openapi/loads/options.go +++ b/vendor/github.com/go-openapi/loads/options.go @@ -1,7 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package loads +import "github.com/go-openapi/swag/loading" + type options struct { - loader *loader + loader *loader + loadingOptions []loading.Option } func defaultOptions() *options { @@ -16,7 +22,10 @@ func loaderFromOptions(options []LoaderOption) *loader { apply(opts) } - return opts.loader + l := opts.loader.clone() + l.loadingOptions = opts.loadingOptions + + return l } // LoaderOption allows to fine-tune the spec loader behavior @@ -59,3 +68,10 @@ func WithDocLoaderMatches(l ...DocLoaderWithMatch) LoaderOption { opt.loader = final } } + +// WithLoadingOptions adds some [loading.Option] to be added when calling a registered loader. +func WithLoadingOptions(loadingOptions ...loading.Option) LoaderOption { + return func(opt *options) { + opt.loadingOptions = loadingOptions + } +} diff --git a/vendor/github.com/go-openapi/loads/spec.go b/vendor/github.com/go-openapi/loads/spec.go index c9039cd5d7..213c40c657 100644 --- a/vendor/github.com/go-openapi/loads/spec.go +++ b/vendor/github.com/go-openapi/loads/spec.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package loads @@ -18,16 +7,18 @@ import ( "bytes" "encoding/gob" "encoding/json" + "errors" "fmt" + "maps" "github.com/go-openapi/analysis" "github.com/go-openapi/spec" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/yamlutils" ) func init() { - gob.Register(map[string]interface{}{}) - gob.Register([]interface{}{}) + gob.Register(map[string]any{}) + gob.Register([]any{}) } // Document represents a swagger spec document @@ -42,14 +33,21 @@ type Document struct { raw json.RawMessage } -// JSONSpec loads a spec from a json document -func JSONSpec(path string, options ...LoaderOption) (*Document, error) { - data, err := JSONDoc(path) +// JSONSpec loads a spec from a json document, using the [JSONDoc] loader. +// +// A set of [loading.Option] may be passed to this loader using [WithLoadingOptions]. +func JSONSpec(path string, opts ...LoaderOption) (*Document, error) { + var o options + for _, apply := range opts { + apply(&o) + } + + data, err := JSONDoc(path, o.loadingOptions...) if err != nil { return nil, err } // convert to json - doc, err := Analyzed(data, "", options...) + doc, err := Analyzed(data, "", opts...) if err != nil { return nil, err } @@ -59,8 +57,8 @@ func JSONSpec(path string, options ...LoaderOption) (*Document, error) { return doc, nil } -// Embedded returns a Document based on embedded specs. No analysis is required -func Embedded(orig, flat json.RawMessage, options ...LoaderOption) (*Document, error) { +// Embedded returns a Document based on embedded specs (i.e. as a raw [json.RawMessage]). No analysis is required +func Embedded(orig, flat json.RawMessage, opts ...LoaderOption) (*Document, error) { var origSpec, flatSpec spec.Swagger if err := json.Unmarshal(orig, &origSpec); err != nil { return nil, err @@ -72,20 +70,22 @@ func Embedded(orig, flat json.RawMessage, options ...LoaderOption) (*Document, e raw: orig, origSpec: &origSpec, spec: &flatSpec, - pathLoader: loaderFromOptions(options), + pathLoader: loaderFromOptions(opts), }, nil } -// Spec loads a new spec document from a local or remote path -func Spec(path string, options ...LoaderOption) (*Document, error) { - ldr := loaderFromOptions(options) +// Spec loads a new spec document from a local or remote path. +// +// By default it uses a JSON or YAML loader, with auto-detection based on the resource extension. +func Spec(path string, opts ...LoaderOption) (*Document, error) { + ldr := loaderFromOptions(opts) b, err := ldr.Load(path) if err != nil { return nil, err } - document, err := Analyzed(b, "", options...) + document, err := Analyzed(b, "", opts...) if err != nil { return nil, err } @@ -102,7 +102,7 @@ func Analyzed(data json.RawMessage, version string, options ...LoaderOption) (*D version = "2.0" } if version != "2.0" { - return nil, fmt.Errorf("spec version %q is not supported", version) + return nil, fmt.Errorf("spec version %q is not supported: %w", version, ErrLoads) } raw, err := trimData(data) // trim blanks, then convert yaml docs into json @@ -112,12 +112,12 @@ func Analyzed(data json.RawMessage, version string, options ...LoaderOption) (*D swspec := new(spec.Swagger) if err = json.Unmarshal(raw, swspec); err != nil { - return nil, err + return nil, errors.Join(err, ErrLoads) } origsqspec, err := cloneSpec(swspec) if err != nil { - return nil, err + return nil, errors.Join(err, ErrLoads) } d := &Document{ @@ -143,20 +143,20 @@ func trimData(in json.RawMessage) (json.RawMessage, error) { } // assume yaml doc: convert it to json - yml, err := swag.BytesToYAMLDoc(trimmed) + yml, err := yamlutils.BytesToYAMLDoc(trimmed) if err != nil { - return nil, fmt.Errorf("analyzed: %v", err) + return nil, fmt.Errorf("analyzed: %v: %w", err, ErrLoads) } - d, err := swag.YAMLToJSON(yml) + d, err := yamlutils.YAMLToJSON(yml) if err != nil { - return nil, fmt.Errorf("analyzed: %v", err) + return nil, fmt.Errorf("analyzed: %v: %w", err, ErrLoads) } return d, nil } -// Expanded expands the $ref fields in the spec document and returns a new spec document +// Expanded expands the $ref fields in the spec [Document] and returns a new expanded [Document] func (d *Document) Expanded(options ...*spec.ExpandOptions) (*Document, error) { swspec := new(spec.Swagger) if err := json.Unmarshal(d.raw, swspec); err != nil { @@ -202,20 +202,23 @@ func (d *Document) Expanded(options ...*spec.ExpandOptions) (*Document, error) { // BasePath the base path for the API specified by this spec func (d *Document) BasePath() string { + if d.spec == nil { + return "" + } return d.spec.BasePath } -// Version returns the version of this spec +// Version returns the OpenAPI version of this spec (e.g. 2.0) func (d *Document) Version() string { return d.spec.Swagger } -// Schema returns the swagger 2.0 schema +// Schema returns the swagger 2.0 meta-schema func (d *Document) Schema() *spec.Schema { return d.schema } -// Spec returns the swagger spec object model +// Spec returns the swagger object model for this API specification func (d *Document) Spec() *spec.Swagger { return d.spec } @@ -235,14 +238,11 @@ func (d *Document) OrigSpec() *spec.Swagger { return d.origSpec } -// ResetDefinitions gives a shallow copy with the models reset to the original spec +// ResetDefinitions yields a shallow copy with the models reset to the original spec func (d *Document) ResetDefinitions() *Document { - defs := make(map[string]spec.Schema, len(d.origSpec.Definitions)) - for k, v := range d.origSpec.Definitions { - defs[k] = v - } + d.spec.Definitions = make(map[string]spec.Schema, len(d.origSpec.Definitions)) + maps.Copy(d.spec.Definitions, d.origSpec.Definitions) - d.spec.Definitions = defs return d } @@ -271,5 +271,6 @@ func cloneSpec(src *spec.Swagger) (*spec.Swagger, error) { if err := gob.NewDecoder(&b).Decode(&dst); err != nil { return nil, err } + return &dst, nil } diff --git a/vendor/github.com/go-openapi/runtime/.golangci.yml b/vendor/github.com/go-openapi/runtime/.golangci.yml index 1c75557bac..0087ed3113 100644 --- a/vendor/github.com/go-openapi/runtime/.golangci.yml +++ b/vendor/github.com/go-openapi/runtime/.golangci.yml @@ -1,62 +1,77 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - nilerr # nilerr crashes on this repo - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - err113 # disabled temporarily: there are just too many issues to address + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gomoddirectives # moved to mono-repo, multi-modules, so replace directives are needed + - gosmopolitan + - inamedparam + - ireturn + - lll + - musttag + - nestif + - nilerr # nilerr crashes on this repo + - nlreturn + - noinlineerr + - nonamedreturns - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/runtime/README.md b/vendor/github.com/go-openapi/runtime/README.md index b07e0ad9d6..9e15b1adb5 100644 --- a/vendor/github.com/go-openapi/runtime/README.md +++ b/vendor/github.com/go-openapi/runtime/README.md @@ -8,3 +8,36 @@ # go OpenAPI toolkit runtime The runtime component for use in code generation or as untyped usage. + +## Release notes + +### v0.29.0 + +**New with this release**: + +* upgraded to `go1.24` and modernized the code base accordingly +* updated all dependencies, and removed an noticable indirect dependency (e.g. `mailru/easyjson`) +* **breaking change** no longer imports `opentracing-go` (#365). + * the `WithOpentracing()` method now returns an opentelemetry transport + * for users who can't transition to opentelemetry, the previous behavior + of `WithOpentracing` delivering an opentracing transport is provided by a separate + module `github.com/go-openapi/runtime/client-middleware/opentracing`. +* removed direct dependency to `gopkg.in/yaml.v3`, in favor of `go.yaml.in/yaml/v3` (an indirect + test dependency to the older package is still around) +* technically, the repo has evolved to a mono-repo, multiple modules structures (2 go modules + published), with CI adapted accordingly + +**What coming next?** + +Moving forward, we want to : + +* [ ] continue narrowing down the scope of dependencies: + * yaml support in an independent module + * introduce more up-to-date support for opentelemetry as a separate module that evolves + independently from the main package (to avoid breaking changes, the existing API + will remain maintained, but evolve at a slower pace than opentelemetry). +* [ ] fix a few known issues with some file upload requests (e.g. #286) + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/runtime/bytestream.go b/vendor/github.com/go-openapi/runtime/bytestream.go index f8fb482232..eb649742e8 100644 --- a/vendor/github.com/go-openapi/runtime/bytestream.go +++ b/vendor/github.com/go-openapi/runtime/bytestream.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -22,7 +11,7 @@ import ( "io" "reflect" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) func defaultCloser() error { return nil } @@ -54,7 +43,7 @@ func ByteStreamConsumer(opts ...byteStreamOpt) Consumer { opt(&vals) } - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { if reader == nil { return errors.New("ByteStreamConsumer requires a reader") // early exit } @@ -148,7 +137,7 @@ func ByteStreamProducer(opts ...byteStreamOpt) Producer { opt(&vals) } - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { if writer == nil { return errors.New("ByteStreamProducer requires a writer") // early exit } @@ -206,7 +195,7 @@ func ByteStreamProducer(opts ...byteStreamOpt) Producer { return err case t.Kind() == reflect.Struct || t.Kind() == reflect.Slice: - b, err := swag.WriteJSON(data) + b, err := jsonutils.WriteJSON(data) if err != nil { return err } diff --git a/vendor/github.com/go-openapi/runtime/client/auth_info.go b/vendor/github.com/go-openapi/runtime/client/auth_info.go index 4f26e92347..a98690c4d6 100644 --- a/vendor/github.com/go-openapi/runtime/client/auth_info.go +++ b/vendor/github.com/go-openapi/runtime/client/auth_info.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client diff --git a/vendor/github.com/go-openapi/runtime/client/keepalive.go b/vendor/github.com/go-openapi/runtime/client/keepalive.go index 7dd6b51c4d..831d23b511 100644 --- a/vendor/github.com/go-openapi/runtime/client/keepalive.go +++ b/vendor/github.com/go-openapi/runtime/client/keepalive.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package client import ( diff --git a/vendor/github.com/go-openapi/runtime/client/opentelemetry.go b/vendor/github.com/go-openapi/runtime/client/opentelemetry.go index 256cd1b4fd..e77941293f 100644 --- a/vendor/github.com/go-openapi/runtime/client/opentelemetry.go +++ b/vendor/github.com/go-openapi/runtime/client/opentelemetry.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package client import ( @@ -11,8 +14,7 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/propagation" - semconv "go.opentelemetry.io/otel/semconv/v1.17.0" - "go.opentelemetry.io/otel/semconv/v1.17.0/httpconv" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" "go.opentelemetry.io/otel/trace" ) @@ -109,7 +111,7 @@ func newOpenTelemetryTransport(transport runtime.ClientTransport, host string, o return tr } -func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (interface{}, error) { +func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (any, error) { if op.Context == nil { return t.transport.Submit(op) } @@ -129,14 +131,17 @@ func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (interface{ return params.WriteToRequest(req, reg) }) - op.Reader = runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + op.Reader = runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (any, error) { if span != nil { statusCode := response.Code() // NOTE: this is replaced by semconv.HTTPResponseStatusCode in semconv v1.21 - span.SetAttributes(semconv.HTTPStatusCode(statusCode)) + span.SetAttributes(semconv.HTTPResponseStatusCode(statusCode)) // NOTE: the conversion from HTTP status code to trace code is no longer available with // semconv v1.21 - span.SetStatus(httpconv.ServerStatus(statusCode)) + const minHTTPStatusIsError = 400 + if statusCode >= minHTTPStatusIsError { + span.SetStatus(codes.Error, http.StatusText(statusCode)) + } } return reader.ReadResponse(response, consumer) @@ -173,7 +178,7 @@ func (t *openTelemetryTransport) newOpenTelemetrySpan(op *runtime.ClientOperatio span.SetAttributes( attribute.String("net.peer.name", t.host), attribute.String(string(semconv.HTTPRouteKey), op.PathPattern), - attribute.String(string(semconv.HTTPMethodKey), op.Method), + attribute.String(string(semconv.HTTPRequestMethodKey), op.Method), attribute.String("span.kind", trace.SpanKindClient.String()), attribute.String("http.scheme", scheme), ) diff --git a/vendor/github.com/go-openapi/runtime/client/opentracing.go b/vendor/github.com/go-openapi/runtime/client/opentracing.go deleted file mode 100644 index 627286d12f..0000000000 --- a/vendor/github.com/go-openapi/runtime/client/opentracing.go +++ /dev/null @@ -1,99 +0,0 @@ -package client - -import ( - "fmt" - "net/http" - - "github.com/go-openapi/strfmt" - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "github.com/opentracing/opentracing-go/log" - - "github.com/go-openapi/runtime" -) - -type tracingTransport struct { - transport runtime.ClientTransport - host string - opts []opentracing.StartSpanOption -} - -func newOpenTracingTransport(transport runtime.ClientTransport, host string, opts []opentracing.StartSpanOption, -) runtime.ClientTransport { - return &tracingTransport{ - transport: transport, - host: host, - opts: opts, - } -} - -func (t *tracingTransport) Submit(op *runtime.ClientOperation) (interface{}, error) { - if op.Context == nil { - return t.transport.Submit(op) - } - - params := op.Params - reader := op.Reader - - var span opentracing.Span - defer func() { - if span != nil { - span.Finish() - } - }() - - op.Params = runtime.ClientRequestWriterFunc(func(req runtime.ClientRequest, reg strfmt.Registry) error { - span = createClientSpan(op, req.GetHeaderParams(), t.host, t.opts) - return params.WriteToRequest(req, reg) - }) - - op.Reader = runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - if span != nil { - code := response.Code() - ext.HTTPStatusCode.Set(span, uint16(code)) - if code >= 400 { - ext.Error.Set(span, true) - } - } - return reader.ReadResponse(response, consumer) - }) - - submit, err := t.transport.Submit(op) - if err != nil && span != nil { - ext.Error.Set(span, true) - span.LogFields(log.Error(err)) - } - return submit, err -} - -func createClientSpan(op *runtime.ClientOperation, header http.Header, host string, - opts []opentracing.StartSpanOption) opentracing.Span { - ctx := op.Context - span := opentracing.SpanFromContext(ctx) - - if span != nil { - opts = append(opts, ext.SpanKindRPCClient) - span, _ = opentracing.StartSpanFromContextWithTracer( - ctx, span.Tracer(), operationName(op), opts...) - - ext.Component.Set(span, "go-openapi") - ext.PeerHostname.Set(span, host) - span.SetTag("http.path", op.PathPattern) - ext.HTTPMethod.Set(span, op.Method) - - _ = span.Tracer().Inject( - span.Context(), - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(header)) - - return span - } - return nil -} - -func operationName(op *runtime.ClientOperation) string { - if op.ID != "" { - return op.ID - } - return fmt.Sprintf("%s_%s", op.Method, op.PathPattern) -} diff --git a/vendor/github.com/go-openapi/runtime/client/request.go b/vendor/github.com/go-openapi/runtime/client/request.go index c4a891d0bc..6d9b25912e 100644 --- a/vendor/github.com/go-openapi/runtime/client/request.go +++ b/vendor/github.com/go-openapi/runtime/client/request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client @@ -30,23 +19,11 @@ import ( "strings" "time" - "github.com/go-openapi/strfmt" - "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" ) -// NewRequest creates a new swagger http client request -func newRequest(method, pathPattern string, writer runtime.ClientRequestWriter) *request { - return &request{ - pathPattern: pathPattern, - method: method, - writer: writer, - header: make(http.Header), - query: make(url.Values), - timeout: DefaultTimeout, - getBody: getRequestBuffer, - } -} +var _ runtime.ClientRequest = new(request) // ensure compliance to the interface // Request represents a swagger client request. // @@ -67,40 +44,156 @@ type request struct { query url.Values formFields url.Values fileFields map[string][]runtime.NamedReadCloser - payload interface{} + payload any timeout time.Duration buf *bytes.Buffer getBody func(r *request) []byte } -var ( - // ensure interface compliance - _ runtime.ClientRequest = new(request) -) - -func (r *request) isMultipart(mediaType string) bool { - if len(r.fileFields) > 0 { - return true +// NewRequest creates a new swagger http client request +func newRequest(method, pathPattern string, writer runtime.ClientRequestWriter) *request { + return &request{ + pathPattern: pathPattern, + method: method, + writer: writer, + header: make(http.Header), + query: make(url.Values), + timeout: DefaultTimeout, + getBody: getRequestBuffer, } - - return runtime.MultipartFormMime == mediaType } // BuildHTTP creates a new http request based on the data from the params func (r *request) BuildHTTP(mediaType, basePath string, producers map[string]runtime.Producer, registry strfmt.Registry) (*http.Request, error) { return r.buildHTTP(mediaType, basePath, producers, registry, nil) } -func escapeQuotes(s string) string { - return strings.NewReplacer("\\", "\\\\", `"`, "\\\"").Replace(s) + +func (r *request) GetMethod() string { + return r.method } -func logClose(err error, pw *io.PipeWriter) { - log.Println(err) - closeErr := pw.CloseWithError(err) - if closeErr != nil { - log.Println(closeErr) +func (r *request) GetPath() string { + path := r.pathPattern + for k, v := range r.pathParams { + path = strings.ReplaceAll(path, "{"+k+"}", v) + } + return path +} + +func (r *request) GetBody() []byte { + return r.getBody(r) +} + +// SetHeaderParam adds a header param to the request +// when there is only 1 value provided for the varargs, it will set it. +// when there are several values provided for the varargs it will add it (no overriding) +func (r *request) SetHeaderParam(name string, values ...string) error { + if r.header == nil { + r.header = make(http.Header) + } + r.header[http.CanonicalHeaderKey(name)] = values + return nil +} + +// GetHeaderParams returns the all headers currently set for the request +func (r *request) GetHeaderParams() http.Header { + return r.header +} + +// SetQueryParam adds a query param to the request +// when there is only 1 value provided for the varargs, it will set it. +// when there are several values provided for the varargs it will add it (no overriding) +func (r *request) SetQueryParam(name string, values ...string) error { + if r.query == nil { + r.query = make(url.Values) + } + r.query[name] = values + return nil +} + +// GetQueryParams returns a copy of all query params currently set for the request +func (r *request) GetQueryParams() url.Values { + var result = make(url.Values) + for key, value := range r.query { + result[key] = append([]string{}, value...) + } + return result +} + +// SetFormParam adds a forn param to the request +// when there is only 1 value provided for the varargs, it will set it. +// when there are several values provided for the varargs it will add it (no overriding) +func (r *request) SetFormParam(name string, values ...string) error { + if r.formFields == nil { + r.formFields = make(url.Values) + } + r.formFields[name] = values + return nil +} + +// SetPathParam adds a path param to the request +func (r *request) SetPathParam(name string, value string) error { + if r.pathParams == nil { + r.pathParams = make(map[string]string) + } + + r.pathParams[name] = value + return nil +} + +// SetFileParam adds a file param to the request +func (r *request) SetFileParam(name string, files ...runtime.NamedReadCloser) error { + for _, file := range files { + if actualFile, ok := file.(*os.File); ok { + fi, err := os.Stat(actualFile.Name()) + if err != nil { + return err + } + if fi.IsDir() { + return fmt.Errorf("%q is a directory, only files are supported", file.Name()) + } + } + } + + if r.fileFields == nil { + r.fileFields = make(map[string][]runtime.NamedReadCloser) + } + if r.formFields == nil { + r.formFields = make(url.Values) + } + + r.fileFields[name] = files + return nil +} + +func (r *request) GetFileParam() map[string][]runtime.NamedReadCloser { + return r.fileFields +} + +// SetBodyParam sets a body parameter on the request. +// This does not yet serialze the object, this happens as late as possible. +func (r *request) SetBodyParam(payload any) error { + r.payload = payload + return nil +} + +func (r *request) GetBodyParam() any { + return r.payload +} + +// SetTimeout sets the timeout for a request +func (r *request) SetTimeout(timeout time.Duration) error { + r.timeout = timeout + return nil +} + +func (r *request) isMultipart(mediaType string) bool { + if len(r.fileFields) > 0 { + return true } + + return runtime.MultipartFormMime == mediaType } func (r *request) buildHTTP(mediaType, basePath string, producers map[string]runtime.Producer, registry strfmt.Registry, auth runtime.ClientAuthInfoWriter) (*http.Request, error) { //nolint:gocyclo,maintidx @@ -169,7 +262,8 @@ func (r *request) buildHTTP(mediaType, basePath string, producers map[string]run fileContentType = p.ContentType() } else { // Need to read the data so that we can detect the content type - buf := make([]byte, 512) + const contentTypeBufferSize = 512 + buf := make([]byte, contentTypeBufferSize) size, err := fi.Read(buf) if err != nil && err != io.EOF { logClose(err, pw) @@ -348,27 +442,8 @@ DoneChoosingBodySource: return req, nil } -func mangleContentType(mediaType, boundary string) string { - if strings.ToLower(mediaType) == runtime.URLencodedFormMime { - return fmt.Sprintf("%s; boundary=%s", mediaType, boundary) - } - return "multipart/form-data; boundary=" + boundary -} - -func (r *request) GetMethod() string { - return r.method -} - -func (r *request) GetPath() string { - path := r.pathPattern - for k, v := range r.pathParams { - path = strings.ReplaceAll(path, "{"+k+"}", v) - } - return path -} - -func (r *request) GetBody() []byte { - return r.getBody(r) +func escapeQuotes(s string) string { + return strings.NewReplacer("\\", "\\\\", `"`, "\\\"").Replace(s) } func getRequestBuffer(r *request) []byte { @@ -378,105 +453,17 @@ func getRequestBuffer(r *request) []byte { return r.buf.Bytes() } -// SetHeaderParam adds a header param to the request -// when there is only 1 value provided for the varargs, it will set it. -// when there are several values provided for the varargs it will add it (no overriding) -func (r *request) SetHeaderParam(name string, values ...string) error { - if r.header == nil { - r.header = make(http.Header) - } - r.header[http.CanonicalHeaderKey(name)] = values - return nil -} - -// GetHeaderParams returns the all headers currently set for the request -func (r *request) GetHeaderParams() http.Header { - return r.header -} - -// SetQueryParam adds a query param to the request -// when there is only 1 value provided for the varargs, it will set it. -// when there are several values provided for the varargs it will add it (no overriding) -func (r *request) SetQueryParam(name string, values ...string) error { - if r.query == nil { - r.query = make(url.Values) - } - r.query[name] = values - return nil -} - -// GetQueryParams returns a copy of all query params currently set for the request -func (r *request) GetQueryParams() url.Values { - var result = make(url.Values) - for key, value := range r.query { - result[key] = append([]string{}, value...) - } - return result -} - -// SetFormParam adds a forn param to the request -// when there is only 1 value provided for the varargs, it will set it. -// when there are several values provided for the varargs it will add it (no overriding) -func (r *request) SetFormParam(name string, values ...string) error { - if r.formFields == nil { - r.formFields = make(url.Values) - } - r.formFields[name] = values - return nil -} - -// SetPathParam adds a path param to the request -func (r *request) SetPathParam(name string, value string) error { - if r.pathParams == nil { - r.pathParams = make(map[string]string) +func logClose(err error, pw *io.PipeWriter) { + log.Println(err) + closeErr := pw.CloseWithError(err) + if closeErr != nil { + log.Println(closeErr) } - - r.pathParams[name] = value - return nil } -// SetFileParam adds a file param to the request -func (r *request) SetFileParam(name string, files ...runtime.NamedReadCloser) error { - for _, file := range files { - if actualFile, ok := file.(*os.File); ok { - fi, err := os.Stat(actualFile.Name()) - if err != nil { - return err - } - if fi.IsDir() { - return fmt.Errorf("%q is a directory, only files are supported", file.Name()) - } - } - } - - if r.fileFields == nil { - r.fileFields = make(map[string][]runtime.NamedReadCloser) - } - if r.formFields == nil { - r.formFields = make(url.Values) +func mangleContentType(mediaType, boundary string) string { + if strings.ToLower(mediaType) == runtime.URLencodedFormMime { + return fmt.Sprintf("%s; boundary=%s", mediaType, boundary) } - - r.fileFields[name] = files - return nil -} - -func (r *request) GetFileParam() map[string][]runtime.NamedReadCloser { - return r.fileFields -} - -// SetBodyParam sets a body parameter on the request. -// This does not yet serialze the object, this happens as late as possible. -func (r *request) SetBodyParam(payload interface{}) error { - r.payload = payload - return nil -} - -func (r *request) GetBodyParam() interface{} { - return r.payload -} - -// SetTimeout sets the timeout for a request -func (r *request) SetTimeout(timeout time.Duration) error { - r.timeout = timeout - return nil + return "multipart/form-data; boundary=" + boundary } diff --git a/vendor/github.com/go-openapi/runtime/client/response.go b/vendor/github.com/go-openapi/runtime/client/response.go index 0bbd388bc8..59abc3b549 100644 --- a/vendor/github.com/go-openapi/runtime/client/response.go +++ b/vendor/github.com/go-openapi/runtime/client/response.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client diff --git a/vendor/github.com/go-openapi/runtime/client/runtime.go b/vendor/github.com/go-openapi/runtime/client/runtime.go index 5bd4d75d90..203c74e49d 100644 --- a/vendor/github.com/go-openapi/runtime/client/runtime.go +++ b/vendor/github.com/go-openapi/runtime/client/runtime.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client @@ -32,13 +21,11 @@ import ( "sync" "time" - "github.com/go-openapi/strfmt" - "github.com/opentracing/opentracing-go" - "github.com/go-openapi/runtime" "github.com/go-openapi/runtime/logger" "github.com/go-openapi/runtime/middleware" "github.com/go-openapi/runtime/yamlpc" + "github.com/go-openapi/strfmt" ) const ( @@ -46,6 +33,9 @@ const ( schemeHTTPS = "https" ) +// DefaultTimeout the default request timeout +var DefaultTimeout = 30 * time.Second + // TLSClientOptions to configure client authentication with mutual TLS type TLSClientOptions struct { // Certificate is the path to a PEM-encoded certificate to be used for @@ -193,13 +183,6 @@ func TLSClientAuth(opts TLSClientOptions) (*tls.Config, error) { return cfg, nil } -func basePool(pool *x509.CertPool) *x509.CertPool { - if pool == nil { - return x509.NewCertPool() - } - return pool -} - // TLSTransport creates a http client transport suitable for mutual tls auth func TLSTransport(opts TLSClientOptions) (http.RoundTripper, error) { cfg, err := TLSClientAuth(opts) @@ -219,9 +202,6 @@ func TLSClient(opts TLSClientOptions) (*http.Client, error) { return &http.Client{Transport: transport}, nil } -// DefaultTimeout the default request timeout -var DefaultTimeout = 30 * time.Second - // Runtime represents an API client that uses the transport // to make http requests based on a swagger specification. type Runtime struct { @@ -306,8 +286,33 @@ func NewWithClient(host, basePath string, schemes []string, client *http.Client) // A new client span is created for each request. // If the context of the client operation does not contain an active span, no span is created. // The provided opts are applied to each spans - for example to add global tags. -func (r *Runtime) WithOpenTracing(opts ...opentracing.StartSpanOption) runtime.ClientTransport { - return newOpenTracingTransport(r, r.Host, opts) +// +// Deprecated: use [WithOpenTelemetry] instead, as opentracing is now archived and superseded by opentelemetry. +// +// # Deprecation notice +// +// The [Runtime.WithOpenTracing] method has been deprecated in favor of [Runtime.WithOpenTelemetry]. +// +// The method is still around so programs calling it will still build. However, it will return +// an opentelemetry transport. +// +// If you have a strict requirement on using opentracing, you may still do so by importing +// module [github.com/go-openapi/runtime/client-middleware/opentracing] and using +// [github.com/go-openapi/runtime/client-middleware/opentracing.WithOpenTracing] with your +// usual opentracing options and opentracing-enabled transport. +// +// Passed options are ignored unless they are of type [OpenTelemetryOpt]. +func (r *Runtime) WithOpenTracing(opts ...any) runtime.ClientTransport { + otelOpts := make([]OpenTelemetryOpt, 0, len(opts)) + for _, o := range opts { + otelOpt, ok := o.(OpenTelemetryOpt) + if !ok { + continue + } + otelOpts = append(otelOpts, otelOpt) + } + + return r.WithOpenTelemetry(otelOpts...) } // WithOpenTelemetry adds opentelemetry support to the provided runtime. @@ -318,42 +323,6 @@ func (r *Runtime) WithOpenTelemetry(opts ...OpenTelemetryOpt) runtime.ClientTran return newOpenTelemetryTransport(r, r.Host, opts) } -func (r *Runtime) pickScheme(schemes []string) string { - if v := r.selectScheme(r.schemes); v != "" { - return v - } - if v := r.selectScheme(schemes); v != "" { - return v - } - return schemeHTTP -} - -func (r *Runtime) selectScheme(schemes []string) string { - schLen := len(schemes) - if schLen == 0 { - return "" - } - - scheme := schemes[0] - // prefer https, but skip when not possible - if scheme != schemeHTTPS && schLen > 1 { - for _, sch := range schemes { - if sch == schemeHTTPS { - scheme = sch - break - } - } - } - return scheme -} - -func transportOrDefault(left, right http.RoundTripper) http.RoundTripper { - if left == nil { - return right - } - return left -} - // EnableConnectionReuse drains the remaining body from a response // so that go will reuse the TCP connections. // @@ -376,64 +345,14 @@ func (r *Runtime) EnableConnectionReuse() { ) } -// takes a client operation and creates equivalent http.Request -func (r *Runtime) createHttpRequest(operation *runtime.ClientOperation) (*request, *http.Request, error) { //nolint:revive,stylecheck - params, _, auth := operation.Params, operation.Reader, operation.AuthInfo - - request := newRequest(operation.Method, operation.PathPattern, params) - - var accept []string - accept = append(accept, operation.ProducesMediaTypes...) - if err := request.SetHeaderParam(runtime.HeaderAccept, accept...); err != nil { - return nil, nil, err - } - - if auth == nil && r.DefaultAuthentication != nil { - auth = runtime.ClientAuthInfoWriterFunc(func(req runtime.ClientRequest, reg strfmt.Registry) error { - if req.GetHeaderParams().Get(runtime.HeaderAuthorization) != "" { - return nil - } - return r.DefaultAuthentication.AuthenticateRequest(req, reg) - }) - } - // if auth != nil { - // if err := auth.AuthenticateRequest(request, r.Formats); err != nil { - // return nil, err - // } - //} - - // TODO: pick appropriate media type - cmt := r.DefaultMediaType - for _, mediaType := range operation.ConsumesMediaTypes { - // Pick first non-empty media type - if mediaType != "" { - cmt = mediaType - break - } - } - - if _, ok := r.Producers[cmt]; !ok && cmt != runtime.MultipartFormMime && cmt != runtime.URLencodedFormMime { - return nil, nil, fmt.Errorf("none of producers: %v registered. try %s", r.Producers, cmt) - } - - req, err := request.buildHTTP(cmt, r.BasePath, r.Producers, r.Formats, auth) - if err != nil { - return nil, nil, err - } - req.URL.Scheme = r.pickScheme(operation.Schemes) - req.URL.Host = r.Host - req.Host = r.Host - return request, req, nil -} - -func (r *Runtime) CreateHttpRequest(operation *runtime.ClientOperation) (req *http.Request, err error) { //nolint:revive,stylecheck +func (r *Runtime) CreateHttpRequest(operation *runtime.ClientOperation) (req *http.Request, err error) { //nolint:revive _, req, err = r.createHttpRequest(operation) return } // Submit a request and when there is a body on success it will turn that into the result // all other things are turned into an api error for swagger which retains the status code -func (r *Runtime) Submit(operation *runtime.ClientOperation) (interface{}, error) { +func (r *Runtime) Submit(operation *runtime.ClientOperation) (any, error) { _, readResponse, _ := operation.Params, operation.Reader, operation.AuthInfo request, req, err := r.createHttpRequest(operation) @@ -550,3 +469,96 @@ func (r *Runtime) SetResponseReader(f ClientResponseFunc) { } r.response = f } + +func (r *Runtime) pickScheme(schemes []string) string { + if v := r.selectScheme(r.schemes); v != "" { + return v + } + if v := r.selectScheme(schemes); v != "" { + return v + } + return schemeHTTP +} + +func (r *Runtime) selectScheme(schemes []string) string { + schLen := len(schemes) + if schLen == 0 { + return "" + } + + scheme := schemes[0] + // prefer https, but skip when not possible + if scheme != schemeHTTPS && schLen > 1 { + for _, sch := range schemes { + if sch == schemeHTTPS { + scheme = sch + break + } + } + } + return scheme +} + +func transportOrDefault(left, right http.RoundTripper) http.RoundTripper { + if left == nil { + return right + } + return left +} + +// takes a client operation and creates equivalent http.Request +func (r *Runtime) createHttpRequest(operation *runtime.ClientOperation) (*request, *http.Request, error) { //nolint:revive + params, _, auth := operation.Params, operation.Reader, operation.AuthInfo + + request := newRequest(operation.Method, operation.PathPattern, params) + + var accept []string + accept = append(accept, operation.ProducesMediaTypes...) + if err := request.SetHeaderParam(runtime.HeaderAccept, accept...); err != nil { + return nil, nil, err + } + + if auth == nil && r.DefaultAuthentication != nil { + auth = runtime.ClientAuthInfoWriterFunc(func(req runtime.ClientRequest, reg strfmt.Registry) error { + if req.GetHeaderParams().Get(runtime.HeaderAuthorization) != "" { + return nil + } + return r.DefaultAuthentication.AuthenticateRequest(req, reg) + }) + } + // if auth != nil { + // if err := auth.AuthenticateRequest(request, r.Formats); err != nil { + // return nil, err + // } + //} + + // TODO: pick appropriate media type + cmt := r.DefaultMediaType + for _, mediaType := range operation.ConsumesMediaTypes { + // Pick first non-empty media type + if mediaType != "" { + cmt = mediaType + break + } + } + + if _, ok := r.Producers[cmt]; !ok && cmt != runtime.MultipartFormMime && cmt != runtime.URLencodedFormMime { + return nil, nil, fmt.Errorf("none of producers: %v registered. try %s", r.Producers, cmt) + } + + req, err := request.buildHTTP(cmt, r.BasePath, r.Producers, r.Formats, auth) + if err != nil { + return nil, nil, err + } + req.URL.Scheme = r.pickScheme(operation.Schemes) + req.URL.Host = r.Host + req.Host = r.Host + return request, req, nil +} + +func basePool(pool *x509.CertPool) *x509.CertPool { + if pool == nil { + return x509.NewCertPool() + } + return pool +} diff --git a/vendor/github.com/go-openapi/runtime/client_auth_info.go b/vendor/github.com/go-openapi/runtime/client_auth_info.go index c6c97d9a7c..581e64451a 100644 --- a/vendor/github.com/go-openapi/runtime/client_auth_info.go +++ b/vendor/github.com/go-openapi/runtime/client_auth_info.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/client_operation.go b/vendor/github.com/go-openapi/runtime/client_operation.go index 5a5d63563a..b0bb0977db 100644 --- a/vendor/github.com/go-openapi/runtime/client_operation.go +++ b/vendor/github.com/go-openapi/runtime/client_operation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -37,5 +26,5 @@ type ClientOperation struct { // A ClientTransport implementor knows how to submit Request objects to some destination type ClientTransport interface { // Submit(string, RequestWriter, ResponseReader, AuthInfoWriter) (interface{}, error) - Submit(*ClientOperation) (interface{}, error) + Submit(*ClientOperation) (any, error) } diff --git a/vendor/github.com/go-openapi/runtime/client_request.go b/vendor/github.com/go-openapi/runtime/client_request.go index 4ebb2deabe..6e335b36f3 100644 --- a/vendor/github.com/go-openapi/runtime/client_request.go +++ b/vendor/github.com/go-openapi/runtime/client_request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -53,7 +42,7 @@ type ClientRequest interface { //nolint:interfacebloat // a swagger-capable requ SetFileParam(string, ...NamedReadCloser) error - SetBodyParam(interface{}) error + SetBodyParam(any) error SetTimeout(time.Duration) error @@ -63,7 +52,7 @@ type ClientRequest interface { //nolint:interfacebloat // a swagger-capable requ GetBody() []byte - GetBodyParam() interface{} + GetBodyParam() any GetFileParam() map[string][]NamedReadCloser } @@ -103,7 +92,7 @@ func (n *namedReadCloser) Name() string { type TestClientRequest struct { Headers http.Header - Body interface{} + Body any } func (t *TestClientRequest) SetHeaderParam(name string, values ...string) error { @@ -122,7 +111,7 @@ func (t *TestClientRequest) SetPathParam(_ string, _ string) error { return nil func (t *TestClientRequest) SetFileParam(_ string, _ ...NamedReadCloser) error { return nil } -func (t *TestClientRequest) SetBodyParam(body interface{}) error { +func (t *TestClientRequest) SetBodyParam(body any) error { t.Body = body return nil } @@ -139,7 +128,7 @@ func (t *TestClientRequest) GetPath() string { return "" } func (t *TestClientRequest) GetBody() []byte { return nil } -func (t *TestClientRequest) GetBodyParam() interface{} { +func (t *TestClientRequest) GetBodyParam() any { return t.Body } diff --git a/vendor/github.com/go-openapi/runtime/client_response.go b/vendor/github.com/go-openapi/runtime/client_response.go index 0d1691149d..f2cf942ab3 100644 --- a/vendor/github.com/go-openapi/runtime/client_response.go +++ b/vendor/github.com/go-openapi/runtime/client_response.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -18,9 +7,11 @@ import ( "encoding/json" "fmt" "io" + "strings" ) -// A ClientResponse represents a client response +// A ClientResponse represents a client response. +// // This bridges between responses obtained from different transports type ClientResponse interface { Code() int @@ -31,21 +22,28 @@ type ClientResponse interface { } // A ClientResponseReaderFunc turns a function into a ClientResponseReader interface implementation -type ClientResponseReaderFunc func(ClientResponse, Consumer) (interface{}, error) +type ClientResponseReaderFunc func(ClientResponse, Consumer) (any, error) // ReadResponse reads the response -func (read ClientResponseReaderFunc) ReadResponse(resp ClientResponse, consumer Consumer) (interface{}, error) { +func (read ClientResponseReaderFunc) ReadResponse(resp ClientResponse, consumer Consumer) (any, error) { return read(resp, consumer) } // A ClientResponseReader is an interface for things want to read a response. // An application of this is to create structs from response values type ClientResponseReader interface { - ReadResponse(ClientResponse, Consumer) (interface{}, error) + ReadResponse(ClientResponse, Consumer) (any, error) +} + +// APIError wraps an error model and captures the status code +type APIError struct { + OperationName string + Response any + Code int } // NewAPIError creates a new API error -func NewAPIError(opName string, payload interface{}, code int) *APIError { +func NewAPIError(opName string, payload any, code int) *APIError { return &APIError{ OperationName: opName, Response: payload, @@ -53,20 +51,17 @@ func NewAPIError(opName string, payload interface{}, code int) *APIError { } } -// APIError wraps an error model and captures the status code -type APIError struct { - OperationName string - Response interface{} - Code int -} +// sanitizer ensures that single quotes are escaped +var sanitizer = strings.NewReplacer(`\`, `\\`, `'`, `\'`) func (o *APIError) Error() string { var resp []byte if err, ok := o.Response.(error); ok { - resp = []byte("'" + err.Error() + "'") + resp = []byte("'" + sanitizer.Replace(err.Error()) + "'") } else { resp, _ = json.Marshal(o.Response) } + return fmt.Sprintf("%s (status %d): %s", o.OperationName, o.Code, resp) } @@ -74,27 +69,31 @@ func (o *APIError) String() string { return o.Error() } -// IsSuccess returns true when this elapse o k response returns a 2xx status code +// IsSuccess returns true when this API response returns a 2xx status code func (o *APIError) IsSuccess() bool { - return o.Code/100 == 2 + const statusOK = 2 + return o.Code/100 == statusOK } -// IsRedirect returns true when this elapse o k response returns a 3xx status code +// IsRedirect returns true when this API response returns a 3xx status code func (o *APIError) IsRedirect() bool { - return o.Code/100 == 3 + const statusRedirect = 3 + return o.Code/100 == statusRedirect } -// IsClientError returns true when this elapse o k response returns a 4xx status code +// IsClientError returns true when this API response returns a 4xx status code func (o *APIError) IsClientError() bool { - return o.Code/100 == 4 + const statusClientError = 4 + return o.Code/100 == statusClientError } -// IsServerError returns true when this elapse o k response returns a 5xx status code +// IsServerError returns true when this API response returns a 5xx status code func (o *APIError) IsServerError() bool { - return o.Code/100 == 5 + const statusServerError = 5 + return o.Code/100 == statusServerError } -// IsCode returns true when this elapse o k response returns a 4xx status code +// IsCode returns true when this API response returns a given status code func (o *APIError) IsCode(code int) bool { return o.Code == code } diff --git a/vendor/github.com/go-openapi/runtime/constants.go b/vendor/github.com/go-openapi/runtime/constants.go index 515969242c..62ae9eec0c 100644 --- a/vendor/github.com/go-openapi/runtime/constants.go +++ b/vendor/github.com/go-openapi/runtime/constants.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/csv.go b/vendor/github.com/go-openapi/runtime/csv.go index c9597bcd6e..567e3d9db2 100644 --- a/vendor/github.com/go-openapi/runtime/csv.go +++ b/vendor/github.com/go-openapi/runtime/csv.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -48,7 +37,7 @@ import ( func CSVConsumer(opts ...CSVOpt) Consumer { o := csvOptsWithDefaults(opts) - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { if reader == nil { return errors.New("CSVConsumer requires a reader") } @@ -181,7 +170,7 @@ func CSVConsumer(opts ...CSVOpt) Consumer { func CSVProducer(opts ...CSVOpt) Producer { o := csvOptsWithDefaults(opts) - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { if writer == nil { return errors.New("CSVProducer requires a writer") } diff --git a/vendor/github.com/go-openapi/runtime/csv_options.go b/vendor/github.com/go-openapi/runtime/csv_options.go index c16464c578..4cc0439001 100644 --- a/vendor/github.com/go-openapi/runtime/csv_options.go +++ b/vendor/github.com/go-openapi/runtime/csv_options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package runtime import ( @@ -5,7 +8,7 @@ import ( "io" ) -// CSVOpts alter the behavior of the CSV consumer or producer. +// CSVOpt alter the behavior of the CSV consumer or producer. type CSVOpt func(*csvOpts) type csvOpts struct { diff --git a/vendor/github.com/go-openapi/runtime/discard.go b/vendor/github.com/go-openapi/runtime/discard.go index 0d390cfd64..b05678becd 100644 --- a/vendor/github.com/go-openapi/runtime/discard.go +++ b/vendor/github.com/go-openapi/runtime/discard.go @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package runtime import "io" // DiscardConsumer does absolutely nothing, it's a black hole. -var DiscardConsumer = ConsumerFunc(func(_ io.Reader, _ interface{}) error { return nil }) +var DiscardConsumer = ConsumerFunc(func(_ io.Reader, _ any) error { return nil }) // DiscardProducer does absolutely nothing, it's a black hole. -var DiscardProducer = ProducerFunc(func(_ io.Writer, _ interface{}) error { return nil }) +var DiscardProducer = ProducerFunc(func(_ io.Writer, _ any) error { return nil }) diff --git a/vendor/github.com/go-openapi/runtime/file.go b/vendor/github.com/go-openapi/runtime/file.go index 397d8a4593..2a85379a74 100644 --- a/vendor/github.com/go-openapi/runtime/file.go +++ b/vendor/github.com/go-openapi/runtime/file.go @@ -1,19 +1,8 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime -import "github.com/go-openapi/swag" +import "github.com/go-openapi/swag/fileutils" -type File = swag.File +type File = fileutils.File diff --git a/vendor/github.com/go-openapi/runtime/go.work b/vendor/github.com/go-openapi/runtime/go.work new file mode 100644 index 0000000000..b4cd9e01e8 --- /dev/null +++ b/vendor/github.com/go-openapi/runtime/go.work @@ -0,0 +1,6 @@ +use ( + . + ./client-middleware/opentracing +) + +go 1.24.0 diff --git a/vendor/github.com/go-openapi/runtime/go.work.sum b/vendor/github.com/go-openapi/runtime/go.work.sum new file mode 100644 index 0000000000..b0c2c9a63d --- /dev/null +++ b/vendor/github.com/go-openapi/runtime/go.work.sum @@ -0,0 +1,93 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/go-openapi/errors v0.22.2/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0= +github.com/go-openapi/jsonpointer v0.22.0/go.mod h1:xt3jV88UtExdIkkL7NloURjRQjbeUgcxFblMjq2iaiU= +github.com/go-openapi/jsonreference v0.21.1/go.mod h1:PWs8rO4xxTUqKGu+lEvvCxD5k2X7QYkKAepJyCmSTT8= +github.com/go-openapi/swag v0.24.1/go.mod h1:sm8I3lCPlspsBBwUm1t5oZeWZS0s7m/A+Psg0ooRU0A= +github.com/go-openapi/swag/cmdutils v0.24.0/go.mod h1:uxib2FAeQMByyHomTlsP8h1TtPd54Msu2ZDU/H5Vuf8= +github.com/go-openapi/swag/conv v0.24.0/go.mod h1:jbn140mZd7EW2g8a8Y5bwm8/Wy1slLySQQ0ND6DPc2c= +github.com/go-openapi/swag/fileutils v0.24.0/go.mod h1:3SCrCSBHyP1/N+3oErQ1gP+OX1GV2QYFSnrTbzwli90= +github.com/go-openapi/swag/jsonname v0.24.0/go.mod h1:GXqrPzGJe611P7LG4QB9JKPtUZ7flE4DOVechNaDd7Q= +github.com/go-openapi/swag/jsonutils v0.24.0/go.mod h1:vBowZtF5Z4DDApIoxcIVfR8v0l9oq5PpYRUuteVu6f0= +github.com/go-openapi/swag/loading v0.24.0/go.mod h1:gShCN4woKZYIxPxbfbyHgjXAhO61m88tmjy0lp/LkJk= +github.com/go-openapi/swag/mangling v0.24.0/go.mod h1:Jm5Go9LHkycsz0wfoaBDkdc4CkpuSnIEf62brzyCbhc= +github.com/go-openapi/swag/netutils v0.24.0/go.mod h1:WRgiHcYTnx+IqfMCtu0hy9oOaPR0HnPbmArSRN1SkZM= +github.com/go-openapi/swag/stringutils v0.24.0/go.mod h1:5nUXB4xA0kw2df5PRipZDslPJgJut+NjL7D25zPZ/4w= +github.com/go-openapi/swag/typeutils v0.24.0/go.mod h1:q8C3Kmk/vh2VhpCLaoR2MVWOGP8y7Jc8l82qCTd1DYI= +github.com/go-openapi/swag/yamlutils v0.24.0/go.mod h1:DpKv5aYuaGm/sULePoeiG8uwMpZSfReo1HR3Ik0yaG8= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488/go.mod h1:fGb/2+tgXXjhjHsTNdVEEMZNWA0quBnfrO+AfoDSAKw= +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.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/go-openapi/runtime/headers.go b/vendor/github.com/go-openapi/runtime/headers.go index 4d111db4fe..510e396ca7 100644 --- a/vendor/github.com/go-openapi/runtime/headers.go +++ b/vendor/github.com/go-openapi/runtime/headers.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/interfaces.go b/vendor/github.com/go-openapi/runtime/interfaces.go index e334128683..90046bf367 100644 --- a/vendor/github.com/go-openapi/runtime/interfaces.go +++ b/vendor/github.com/go-openapi/runtime/interfaces.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -23,23 +12,23 @@ import ( ) // OperationHandlerFunc an adapter for a function to the OperationHandler interface -type OperationHandlerFunc func(interface{}) (interface{}, error) +type OperationHandlerFunc func(any) (any, error) // Handle implements the operation handler interface -func (s OperationHandlerFunc) Handle(data interface{}) (interface{}, error) { +func (s OperationHandlerFunc) Handle(data any) (any, error) { return s(data) } // OperationHandler a handler for a swagger operation type OperationHandler interface { - Handle(interface{}) (interface{}, error) + Handle(any) (any, error) } // ConsumerFunc represents a function that can be used as a consumer -type ConsumerFunc func(io.Reader, interface{}) error +type ConsumerFunc func(io.Reader, any) error // Consume consumes the reader into the data parameter -func (fn ConsumerFunc) Consume(reader io.Reader, data interface{}) error { +func (fn ConsumerFunc) Consume(reader io.Reader, data any) error { return fn(reader, data) } @@ -47,14 +36,14 @@ func (fn ConsumerFunc) Consume(reader io.Reader, data interface{}) error { // data provided by the request body type Consumer interface { // Consume performs the binding of request values - Consume(io.Reader, interface{}) error + Consume(io.Reader, any) error } // ProducerFunc represents a function that can be used as a producer -type ProducerFunc func(io.Writer, interface{}) error +type ProducerFunc func(io.Writer, any) error // Produce produces the response for the provided data -func (f ProducerFunc) Produce(writer io.Writer, data interface{}) error { +func (f ProducerFunc) Produce(writer io.Writer, data any) error { return f(writer, data) } @@ -62,14 +51,14 @@ func (f ProducerFunc) Produce(writer io.Writer, data interface{}) error { // HTTP response type Producer interface { // Produce writes to the http response - Produce(io.Writer, interface{}) error + Produce(io.Writer, any) error } // AuthenticatorFunc turns a function into an authenticator -type AuthenticatorFunc func(interface{}) (bool, interface{}, error) +type AuthenticatorFunc func(any) (bool, any, error) // Authenticate authenticates the request with the provided data -func (f AuthenticatorFunc) Authenticate(params interface{}) (bool, interface{}, error) { +func (f AuthenticatorFunc) Authenticate(params any) (bool, any, error) { return f(params) } @@ -77,14 +66,14 @@ func (f AuthenticatorFunc) Authenticate(params interface{}) (bool, interface{}, // implementations of Authenticator know how to authenticate the // request data and translate that into a valid principal object or an error type Authenticator interface { - Authenticate(interface{}) (bool, interface{}, error) + Authenticate(any) (bool, any, error) } // AuthorizerFunc turns a function into an authorizer -type AuthorizerFunc func(*http.Request, interface{}) error +type AuthorizerFunc func(*http.Request, any) error // Authorize authorizes the processing of the request for the principal -func (f AuthorizerFunc) Authorize(r *http.Request, principal interface{}) error { +func (f AuthorizerFunc) Authorize(r *http.Request, principal any) error { return f(r, principal) } @@ -92,7 +81,7 @@ func (f AuthorizerFunc) Authorize(r *http.Request, principal interface{}) error // implementations of Authorizer know how to authorize the principal object // using the request data and returns error if unauthorized type Authorizer interface { - Authorize(*http.Request, interface{}) error + Authorize(*http.Request, any) error } // Validatable types implementing this interface allow customizing their validation diff --git a/vendor/github.com/go-openapi/runtime/json.go b/vendor/github.com/go-openapi/runtime/json.go index 5a690559cc..8f93eebfaa 100644 --- a/vendor/github.com/go-openapi/runtime/json.go +++ b/vendor/github.com/go-openapi/runtime/json.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -21,7 +10,7 @@ import ( // JSONConsumer creates a new JSON consumer func JSONConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { dec := json.NewDecoder(reader) dec.UseNumber() // preserve number formats return dec.Decode(data) @@ -30,7 +19,7 @@ func JSONConsumer() Consumer { // JSONProducer creates a new JSON producer func JSONProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { enc := json.NewEncoder(writer) enc.SetEscapeHTML(false) return enc.Encode(data) diff --git a/vendor/github.com/go-openapi/runtime/logger/logger.go b/vendor/github.com/go-openapi/runtime/logger/logger.go index 6f4debcc14..45484deb59 100644 --- a/vendor/github.com/go-openapi/runtime/logger/logger.go +++ b/vendor/github.com/go-openapi/runtime/logger/logger.go @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package logger import "os" type Logger interface { - Printf(format string, args ...interface{}) - Debugf(format string, args ...interface{}) + Printf(format string, args ...any) + Debugf(format string, args ...any) } func DebugEnabled() bool { diff --git a/vendor/github.com/go-openapi/runtime/logger/standard.go b/vendor/github.com/go-openapi/runtime/logger/standard.go index 30035a7777..48ba27f4a3 100644 --- a/vendor/github.com/go-openapi/runtime/logger/standard.go +++ b/vendor/github.com/go-openapi/runtime/logger/standard.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package logger import ( @@ -9,14 +12,14 @@ var _ Logger = StandardLogger{} type StandardLogger struct{} -func (StandardLogger) Printf(format string, args ...interface{}) { +func (StandardLogger) Printf(format string, args ...any) { if len(format) == 0 || format[len(format)-1] != '\n' { format += "\n" } fmt.Fprintf(os.Stderr, format, args...) } -func (StandardLogger) Debugf(format string, args ...interface{}) { +func (StandardLogger) Debugf(format string, args ...any) { if len(format) == 0 || format[len(format)-1] != '\n' { format += "\n" } diff --git a/vendor/github.com/go-openapi/runtime/middleware/context.go b/vendor/github.com/go-openapi/runtime/middleware/context.go index 44cecf1181..bb00b93b89 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/context.go +++ b/vendor/github.com/go-openapi/runtime/middleware/context.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -126,7 +115,7 @@ func newRoutableUntypedAPI(spec *loads.Document, api *untyped.API, context *Cont } // bind and validate the request using reflection - var bound interface{} + var bound any var validation error bound, r, validation = context.BindAndValidate(r, route) if validation != nil { @@ -218,8 +207,8 @@ func NewRoutableContext(spec *loads.Document, routableAPI RoutableAPI, routes Ro // If a nil Router is provided, the DefaultRouter (denco-based) will be used. func NewRoutableContextWithAnalyzedSpec(spec *loads.Document, an *analysis.Spec, routableAPI RoutableAPI, routes Router) *Context { // Either there are no spec doc and analysis, or both of them. - if !((spec == nil && an == nil) || (spec != nil && an != nil)) { - panic(errors.New(http.StatusInternalServerError, "routable context requires either both spec doc and analysis, or none of them")) + if (spec != nil || an != nil) && (spec == nil || an == nil) { + panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, "routable context requires either both spec doc and analysis, or none of them")) } return &Context{ @@ -287,7 +276,7 @@ func MatchedRouteFrom(req *http.Request) *MatchedRoute { } // SecurityPrincipalFrom request context value. -func SecurityPrincipalFrom(req *http.Request) interface{} { +func SecurityPrincipalFrom(req *http.Request) any { return req.Context().Value(ctxSecurityPrincipal) } @@ -307,6 +296,9 @@ type contentTypeValue struct { // BasePath returns the base path for this API func (c *Context) BasePath() string { + if c.spec == nil { + return "" + } return c.spec.BasePath() } @@ -341,7 +333,7 @@ func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, b if len(res) == 0 { cons, ok := route.Consumers[ct] if !ok { - res = append(res, errors.New(500, "no consumer registered for %s", ct)) + res = append(res, errors.New(http.StatusInternalServerError, "no consumer registered for %s", ct)) } else { route.Consumer = cons requestContentType = ct @@ -463,7 +455,7 @@ func (c *Context) ResetAuth(request *http.Request) *http.Request { // Returns the principal object and a shallow copy of the request when its // context doesn't contain the principal, otherwise the same request or an error // (the last) if one of the authenticators returns one or an Unauthenticated error -func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interface{}, *http.Request, error) { +func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (any, *http.Request, error) { if route == nil || !route.HasAuth() { return nil, nil, nil } @@ -486,7 +478,7 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa return nil, nil, err } - return nil, nil, errors.New(http.StatusForbidden, err.Error()) + return nil, nil, errors.New(http.StatusForbidden, "%v", err) } } @@ -501,7 +493,7 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa // Returns the validation map and a shallow copy of the request when its context // doesn't contain the validation, otherwise it returns the same request or an // CompositeValidationError error -func (c *Context) BindAndValidate(request *http.Request, matched *MatchedRoute) (interface{}, *http.Request, error) { +func (c *Context) BindAndValidate(request *http.Request, matched *MatchedRoute) (any, *http.Request, error) { var rCtx = request.Context() if v, ok := rCtx.Value(ctxBoundParams).(*validation); ok { @@ -527,7 +519,7 @@ func (c *Context) NotFound(rw http.ResponseWriter, r *http.Request) { } // Respond renders the response after doing some content negotiation -func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []string, route *MatchedRoute, data interface{}) { +func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []string, route *MatchedRoute, data any) { c.debugLogf("responding to %s %s with produces: %v", r.Method, r.URL.Path, produces) offers := []string{} for _, mt := range produces { @@ -552,7 +544,7 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st prods := c.api.ProducersFor(normalizeOffers([]string{c.api.DefaultProduces()})) pr, ok := prods[c.api.DefaultProduces()] if !ok { - panic(errors.New(http.StatusInternalServerError, cantFindProducer(format))) + panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format))) } prod = pr } @@ -585,7 +577,7 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st producers := c.api.ProducersFor(normalizeOffers(offers)) prod, ok := producers[format] if !ok { - panic(errors.New(http.StatusInternalServerError, cantFindProducer(format))) + panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format))) } if err := prod.Produce(rw, data); err != nil { panic(err) // let the recovery middleware deal with this @@ -606,7 +598,7 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st prods := c.api.ProducersFor(normalizeOffers([]string{c.api.DefaultProduces()})) pr, ok := prods[c.api.DefaultProduces()] if !ok { - panic(errors.New(http.StatusInternalServerError, cantFindProducer(format))) + panic(fmt.Errorf("%d: %s", http.StatusInternalServerError, cantFindProducer(format))) } prod = pr } @@ -617,7 +609,7 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st return } - c.api.ServeErrorFor(route.Operation.ID)(rw, r, errors.New(http.StatusInternalServerError, "can't produce response")) + c.api.ServeErrorFor(route.Operation.ID)(rw, r, fmt.Errorf("%d: %s", http.StatusInternalServerError, "can't produce response")) } // APIHandlerSwaggerUI returns a handler to serve the API. @@ -677,6 +669,15 @@ func (c *Context) APIHandler(builder Builder, opts ...UIOption) http.Handler { return Spec(specPath, c.spec.Raw(), Redoc(redocOpts, c.RoutesHandler(b)), specOpts...) } +// RoutesHandler returns a handler to serve the API, just the routes and the contract defined in the swagger spec +func (c *Context) RoutesHandler(builder Builder) http.Handler { + b := builder + if b == nil { + b = PassthroughBuilder + } + return NewRouter(c, b(NewOperationExecutor(c))) +} + func (c Context) uiOptionsForHandler(opts []UIOption) (string, uiOptions, []SpecOption) { var title string sp := c.spec.Spec() @@ -708,15 +709,6 @@ func (c Context) uiOptionsForHandler(opts []UIOption) (string, uiOptions, []Spec return pth, uiOpts, []SpecOption{WithSpecDocument(doc)} } -// RoutesHandler returns a handler to serve the API, just the routes and the contract defined in the swagger spec -func (c *Context) RoutesHandler(builder Builder) http.Handler { - b := builder - if b == nil { - b = PassthroughBuilder - } - return NewRouter(c, b(NewOperationExecutor(c))) -} - func cantFindProducer(format string) string { return "can't find a producer for " + format } diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go index 4377f77a46..b371a2cf84 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Package denco provides fast URL router. package denco @@ -25,7 +28,7 @@ const ( PathParamCharacter = '=' // MaxSize is max size of records and internal slice. - MaxSize = (1 << 22) - 1 + MaxSize = (1 << 22) - 1 //nolint:mnd ) // Router represents a URL router. @@ -36,14 +39,14 @@ type Router struct { // By default, SizeHint will be determined from given records to Build. SizeHint int - static map[string]interface{} + static map[string]any } // New returns a new Router. func New() *Router { return &Router{ SizeHint: -1, - static: make(map[string]interface{}), + static: make(map[string]any), param: newDoubleArray(), } } @@ -51,7 +54,7 @@ func New() *Router { // Lookup returns data and path parameters that associated with path. // params is a slice of the Param that arranged in the order in which parameters appeared. // e.g. when built routing path is "/path/to/:id/:name" and given path is "/path/to/1/alice". params order is [{"id": "1"}, {"name": "alice"}], not [{"name": "alice"}, {"id": "1"}]. -func (rt *Router) Lookup(path string) (data interface{}, params Params, found bool) { +func (rt *Router) Lookup(path string) (data any, params Params, found bool) { if data, found = rt.static[path]; found { return data, nil, true } @@ -62,7 +65,7 @@ func (rt *Router) Lookup(path string) (data interface{}, params Params, found bo if !found { return nil, nil, false } - for i := 0; i < len(params); i++ { + for i := range params { params[i].Name = nd.paramNames[i] } return nd.data, params, true @@ -138,12 +141,17 @@ func newDoubleArray() *doubleArray { // 32 10 8 0 type baseCheck uint32 +const ( + flagsBits = 10 + checkBits = 8 +) + func (bc baseCheck) Base() int { - return int(bc >> 10) + return int(bc >> flagsBits) } func (bc *baseCheck) SetBase(base int) { - *bc |= baseCheck(base) << 10 + *bc |= baseCheck(base) << flagsBits //nolint:gosec // integer conversion is ok } func (bc baseCheck) Check() byte { @@ -171,24 +179,27 @@ func (bc baseCheck) IsAnyParam() bool { } func (bc *baseCheck) SetSingleParam() { - *bc |= (1 << 8) + *bc |= (1 << checkBits) } func (bc *baseCheck) SetWildcardParam() { - *bc |= (1 << 9) + *bc |= (1 << (checkBits + 1)) } const ( paramTypeSingle = 0x0100 paramTypeWildcard = 0x0200 paramTypeAny = 0x0300 + + indexOffset = 32 + indexMask = uint64(0xffffffff) ) func (da *doubleArray) lookup(path string, params []Param, idx int) (*node, []Param, bool) { indices := make([]uint64, 0, 1) - for i := 0; i < len(path); i++ { + for i := range len(path) { if da.bc[idx].IsAnyParam() { - indices = append(indices, (uint64(i)<<32)|(uint64(idx)&0xffffffff)) + indices = append(indices, (uint64(i)<= len(da.bc) || da.bc[idx].Check() != c { @@ -201,7 +212,7 @@ func (da *doubleArray) lookup(path string, params []Param, idx int) (*node, []Pa BACKTRACKING: for j := len(indices) - 1; j >= 0; j-- { - i, idx := int(indices[j]>>32), int(indices[j]&0xffffffff) + i, idx := int(indices[j]>>indexOffset), int(indices[j]&indexMask) //nolint:gosec // integer conversion is okay if da.bc[idx].IsSingleParam() { nextIdx := nextIndex(da.bc[idx].Base(), ParamCharacter) if nextIdx >= len(da.bc) { @@ -340,7 +351,7 @@ func (da *doubleArray) arrange(records []*record, idx, depth int, usedBase map[i // node represents a node of Double-Array. type node struct { - data interface{} + data any // Names of path parameters. paramNames []string @@ -414,11 +425,11 @@ type Record struct { Key string // Result value for Key. - Value interface{} + Value any } // NewRecord returns a new Record. -func NewRecord(key string, value interface{}) Record { +func NewRecord(key string, value any) Record { return Record{ Key: key, Value: value, @@ -428,6 +439,7 @@ func NewRecord(key string, value interface{}) Record { // record represents a record that use to build the Double-Array. type record struct { Record + paramNames []string } diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/server.go b/vendor/github.com/go-openapi/runtime/middleware/denco/server.go index 0886713c18..8f04d93dba 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/server.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/server.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package denco import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/util.go b/vendor/github.com/go-openapi/runtime/middleware/denco/util.go index edc1f6ab80..f002bc4693 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/util.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/util.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package denco // NextSeparator returns an index of next separator in path. diff --git a/vendor/github.com/go-openapi/runtime/middleware/doc.go b/vendor/github.com/go-openapi/runtime/middleware/doc.go index 836a98850d..04b8322363 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/doc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package middleware provides the library with helper functions for serving swagger APIs. diff --git a/vendor/github.com/go-openapi/runtime/middleware/header/header.go b/vendor/github.com/go-openapi/runtime/middleware/header/header.go index df073c87d9..6ce870d893 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/header/header.go +++ b/vendor/github.com/go-openapi/runtime/middleware/header/header.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Copyright 2013 The Go Authors. All rights reserved. // // Use of this source code is governed by a BSD-style @@ -10,6 +13,7 @@ package header import ( + "maps" "net/http" "strings" "time" @@ -25,6 +29,11 @@ const ( isSpace ) +const ( + asciiMaxControlChar = 31 + asciiMaxChar = 127 +) + func init() { // OCTET = // CHAR = @@ -42,10 +51,10 @@ func init() { // token = 1* // qdtext = > - for c := 0; c < 256; c++ { + for c := range 256 { var t octetType - isCtl := c <= 31 || c == 127 - isChar := 0 <= c && c <= 127 + isCtl := c <= asciiMaxControlChar || c == asciiMaxChar + isChar := 0 <= c && c <= asciiMaxChar isSeparator := strings.ContainsRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) if strings.ContainsRune(" \t\r\n", rune(c)) { t |= isSpace @@ -60,9 +69,7 @@ func init() { // Copy returns a shallow copy of the header. func Copy(header http.Header) http.Header { h := make(http.Header) - for k, vs := range header { - h[k] = vs - } + maps.Copy(h, header) return h } @@ -92,7 +99,7 @@ func ParseList(header http.Header, key string) []string { end := 0 escape := false quote := false - for i := 0; i < len(s); i++ { + for i := range len(s) { b := s[i] switch { case escape: diff --git a/vendor/github.com/go-openapi/runtime/middleware/negotiate.go b/vendor/github.com/go-openapi/runtime/middleware/negotiate.go index a9b6f27d3d..cb0a85283c 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/negotiate.go +++ b/vendor/github.com/go-openapi/runtime/middleware/negotiate.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Copyright 2013 The Go Authors. All rights reserved. // // Use of this source code is governed by a BSD-style @@ -94,5 +97,6 @@ func normalizeOffers(orig []string) (norm []string) { } func normalizeOffer(orig string) string { - return strings.SplitN(orig, ";", 2)[0] + const maxParts = 2 + return strings.SplitN(orig, ";", maxParts)[0] } diff --git a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go index bc6942a0f1..2e63780c70 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go +++ b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -22,7 +11,7 @@ import ( type errorResp struct { code int - response interface{} + response any headers http.Header } @@ -49,7 +38,7 @@ func NotImplemented(message string) Responder { // Error creates a generic responder for returning errors, the data will be serialized // with the matching producer for the request -func Error(code int, data interface{}, headers ...http.Header) Responder { +func Error(code int, data any, headers ...http.Header) Responder { var hdr http.Header for _, h := range headers { for k, v := range h { diff --git a/vendor/github.com/go-openapi/runtime/middleware/operation.go b/vendor/github.com/go-openapi/runtime/middleware/operation.go index 1175a63cf2..2a7ab1fada 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/operation.go +++ b/vendor/github.com/go-openapi/runtime/middleware/operation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/middleware/parameter.go b/vendor/github.com/go-openapi/runtime/middleware/parameter.go index 9c3353a95c..7d630d6cce 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/parameter.go +++ b/vendor/github.com/go-openapi/runtime/middleware/parameter.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -24,12 +13,12 @@ import ( "strconv" "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/conv" + "github.com/go-openapi/swag/stringutils" "github.com/go-openapi/validate" - - "github.com/go-openapi/runtime" ) const defaultMaxMemory = 32 << 20 @@ -66,85 +55,6 @@ func (p *untypedParamBinder) Type() reflect.Type { return p.typeForSchema(p.parameter.Type, p.parameter.Format, p.parameter.Items) } -func (p *untypedParamBinder) typeForSchema(tpe, format string, items *spec.Items) reflect.Type { - switch tpe { - case "boolean": - return reflect.TypeOf(true) - - case typeString: - if tt, ok := p.formats.GetType(format); ok { - return tt - } - return reflect.TypeOf("") - - case "integer": - switch format { - case "int8": - return reflect.TypeOf(int8(0)) - case "int16": - return reflect.TypeOf(int16(0)) - case "int32": - return reflect.TypeOf(int32(0)) - case "int64": - return reflect.TypeOf(int64(0)) - default: - return reflect.TypeOf(int64(0)) - } - - case "number": - switch format { - case "float": - return reflect.TypeOf(float32(0)) - case "double": - return reflect.TypeOf(float64(0)) - } - - case typeArray: - if items == nil { - return nil - } - itemsType := p.typeForSchema(items.Type, items.Format, items.Items) - if itemsType == nil { - return nil - } - return reflect.MakeSlice(reflect.SliceOf(itemsType), 0, 0).Type() - - case "file": - return reflect.TypeOf(&runtime.File{}).Elem() - - case "object": - return reflect.TypeOf(map[string]interface{}{}) - } - return nil -} - -func (p *untypedParamBinder) allowsMulti() bool { - return p.parameter.In == "query" || p.parameter.In == "formData" -} - -func (p *untypedParamBinder) readValue(values runtime.Gettable, target reflect.Value) ([]string, bool, bool, error) { - name, in, cf, tpe := p.parameter.Name, p.parameter.In, p.parameter.CollectionFormat, p.parameter.Type - if tpe == typeArray { - if cf == "multi" { - if !p.allowsMulti() { - return nil, false, false, errors.InvalidCollectionFormat(name, in, cf) - } - vv, hasKey, _ := values.GetOK(name) - return vv, false, hasKey, nil - } - - v, hk, hv := values.GetOK(name) - if !hv { - return nil, false, hk, nil - } - d, c, e := p.readFormattedSliceFieldValue(v[len(v)-1], target) - return d, c, hk, e - } - - vv, hk, _ := values.GetOK(name) - return vv, false, hk, nil -} - func (p *untypedParamBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, target reflect.Value) error { // fmt.Println("binding", p.name, "as", p.Type()) switch p.parameter.In { @@ -264,10 +174,89 @@ func (p *untypedParamBinder) Bind(request *http.Request, routeParams RouteParams target.Set(reflect.Indirect(newValue)) return nil default: - return errors.New(500, fmt.Sprintf("invalid parameter location %q", p.parameter.In)) + return fmt.Errorf("%d: invalid parameter location %q", http.StatusInternalServerError, p.parameter.In) } } +func (p *untypedParamBinder) typeForSchema(tpe, format string, items *spec.Items) reflect.Type { + switch tpe { + case "boolean": + return reflect.TypeFor[bool]() + + case typeString: + if tt, ok := p.formats.GetType(format); ok { + return tt + } + return reflect.TypeFor[string]() + + case "integer": + switch format { + case "int8": + return reflect.TypeFor[int8]() + case "int16": + return reflect.TypeFor[int16]() + case "int32": + return reflect.TypeFor[int32]() + case "int64": + return reflect.TypeFor[int64]() + default: + return reflect.TypeFor[int64]() + } + + case "number": + switch format { + case "float": + return reflect.TypeFor[float32]() + case "double": + return reflect.TypeFor[float64]() + } + + case typeArray: + if items == nil { + return nil + } + itemsType := p.typeForSchema(items.Type, items.Format, items.Items) + if itemsType == nil { + return nil + } + return reflect.MakeSlice(reflect.SliceOf(itemsType), 0, 0).Type() + + case "file": + return reflect.TypeFor[runtime.File]() + + case "object": + return reflect.TypeFor[map[string]any]() + } + return nil +} + +func (p *untypedParamBinder) allowsMulti() bool { + return p.parameter.In == "query" || p.parameter.In == "formData" +} + +func (p *untypedParamBinder) readValue(values runtime.Gettable, target reflect.Value) ([]string, bool, bool, error) { + name, in, cf, tpe := p.parameter.Name, p.parameter.In, p.parameter.CollectionFormat, p.parameter.Type + if tpe == typeArray { + if cf == "multi" { + if !p.allowsMulti() { + return nil, false, false, errors.InvalidCollectionFormat(name, in, cf) + } + vv, hasKey, _ := values.GetOK(name) + return vv, false, hasKey, nil + } + + v, hk, hv := values.GetOK(name) + if !hv { + return nil, false, hk, nil + } + d, c, e := p.readFormattedSliceFieldValue(v[len(v)-1], target) + return d, c, hk, e + } + + vv, hk, _ := values.GetOK(name) + return vv, false, hk, nil +} + func (p *untypedParamBinder) bindValue(data []string, hasKey bool, target reflect.Value) error { if p.parameter.Type == typeArray { return p.setSliceFieldValue(target, p.parameter.Default, data, hasKey) @@ -279,7 +268,7 @@ func (p *untypedParamBinder) bindValue(data []string, hasKey bool, target reflec return p.setFieldValue(target, p.parameter.Default, d, hasKey) } -func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue interface{}, data string, hasKey bool) error { //nolint:gocyclo +func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue any, data string, hasKey bool) error { //nolint:gocyclo tpe := p.parameter.Type if p.parameter.Format != "" { tpe = p.parameter.Format @@ -331,7 +320,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in } return nil } - b, err := swag.ConvertBool(data) + b, err := conv.ConvertBool(data) if err != nil { return err } @@ -341,7 +330,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if data == "" { if target.CanSet() { - rd := defVal.Convert(reflect.TypeOf(int64(0))) + rd := defVal.Convert(reflect.TypeFor[int64]()) target.SetInt(rd.Int()) } return nil @@ -360,7 +349,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if data == "" { if target.CanSet() { - rd := defVal.Convert(reflect.TypeOf(uint64(0))) + rd := defVal.Convert(reflect.TypeFor[uint64]()) target.SetUint(rd.Uint()) } return nil @@ -379,7 +368,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in case reflect.Float32, reflect.Float64: if data == "" { if target.CanSet() { - rd := defVal.Convert(reflect.TypeOf(float64(0))) + rd := defVal.Convert(reflect.TypeFor[float64]()) target.SetFloat(rd.Float()) } return nil @@ -426,12 +415,12 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in return nil } -func (p *untypedParamBinder) tryUnmarshaler(target reflect.Value, defaultValue interface{}, data string) (bool, error) { +func (p *untypedParamBinder) tryUnmarshaler(target reflect.Value, defaultValue any, data string) (bool, error) { if !target.CanSet() { return false, nil } // When a type implements encoding.TextUnmarshaler we'll use that instead of reflecting some more - if reflect.PtrTo(target.Type()).Implements(textUnmarshalType) { + if reflect.PointerTo(target.Type()).Implements(textUnmarshalType) { if defaultValue != nil && len(data) == 0 { target.Set(reflect.ValueOf(defaultValue)) return true, nil @@ -455,10 +444,10 @@ func (p *untypedParamBinder) readFormattedSliceFieldValue(data string, target re return nil, true, nil } - return swag.SplitByFormat(data, p.parameter.CollectionFormat), false, nil + return stringutils.SplitByFormat(data, p.parameter.CollectionFormat), false, nil } -func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue interface{}, data []string, hasKey bool) error { +func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue any, data []string, hasKey bool) error { sz := len(data) if (!hasKey || (!p.parameter.AllowEmptyValue && (sz == 0 || (sz == 1 && data[0] == "")))) && p.parameter.Required && defaultValue == nil { return errors.Required(p.Name, p.parameter.In, data) @@ -479,7 +468,7 @@ func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultVal value := reflect.MakeSlice(reflect.SliceOf(target.Type().Elem()), sz, sz) - for i := 0; i < sz; i++ { + for i := range sz { if err := p.setFieldValue(value.Index(i), nil, data[i], hasKey); err != nil { return err } diff --git a/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go b/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go index ef75e7441f..6039a26f33 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/redoc.go b/vendor/github.com/go-openapi/runtime/middleware/redoc.go index b96b01e7f3..cbaec73c43 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/redoc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/redoc.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/request.go b/vendor/github.com/go-openapi/runtime/middleware/request.go index 82e1436652..52facfefcd 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/request.go +++ b/vendor/github.com/go-openapi/runtime/middleware/request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -50,7 +39,7 @@ func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw } // Bind perform the databinding and validation -func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error { +func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data any) error { val := reflect.Indirect(reflect.ValueOf(data)) isMap := val.Kind() == reflect.Map var result []error @@ -68,16 +57,16 @@ func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RoutePara tpe := binder.Type() if tpe == nil { if param.Schema.Type.Contains(typeArray) { - tpe = reflect.TypeOf([]interface{}{}) + tpe = reflect.TypeFor[[]any]() } else { - tpe = reflect.TypeOf(map[string]interface{}{}) + tpe = reflect.TypeFor[map[string]any]() } } target = reflect.Indirect(reflect.New(tpe)) } if !target.IsValid() { - result = append(result, errors.New(500, "parameter name %q is an unknown field", binder.Name)) + result = append(result, errors.New(http.StatusInternalServerError, "parameter name %q is an unknown field", binder.Name)) continue } diff --git a/vendor/github.com/go-openapi/runtime/middleware/router.go b/vendor/github.com/go-openapi/runtime/middleware/router.go index 3a6aee90e5..16816580da 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/router.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -22,18 +11,16 @@ import ( "regexp" "strings" - "github.com/go-openapi/runtime/logger" - "github.com/go-openapi/runtime/security" - "github.com/go-openapi/swag" - "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "github.com/go-openapi/loads" - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" - "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/logger" "github.com/go-openapi/runtime/middleware/denco" + "github.com/go-openapi/runtime/security" + "github.com/go-openapi/spec" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag/stringutils" ) // RouteParam is a object to capture route params in a framework agnostic way. @@ -210,13 +197,13 @@ func (ra *RouteAuthenticator) CommonScopes() []string { } // Authenticate Authenticator interface implementation -func (ra *RouteAuthenticator) Authenticate(req *http.Request, route *MatchedRoute) (bool, interface{}, error) { +func (ra *RouteAuthenticator) Authenticate(req *http.Request, route *MatchedRoute) (bool, any, error) { if ra.allowAnonymous { route.Authenticator = ra return true, nil, nil } // iterate in proper order - var lastResult interface{} + var lastResult any for _, scheme := range ra.Schemes { if authenticator, ok := ra.Authenticator[scheme]; ok { applies, princ, err := authenticator.Authenticate(&security.ScopedAuthRequest{ @@ -289,7 +276,7 @@ func (ras RouteAuthenticators) AllowsAnonymous() bool { } // Authenticate method implemention so this collection can be used as authenticator -func (ras RouteAuthenticators) Authenticate(req *http.Request, route *MatchedRoute) (bool, interface{}, error) { +func (ras RouteAuthenticators) Authenticate(req *http.Request, route *MatchedRoute) (bool, any, error) { var lastError error var allowsAnon bool var anonAuth RouteAuthenticator @@ -336,6 +323,7 @@ type routeEntry struct { // MatchedRoute represents the route that was matched in this request type MatchedRoute struct { routeEntry + Params RouteParams Consumer runtime.Consumer Producer runtime.Producer @@ -377,7 +365,8 @@ func (d *defaultRouter) Lookup(method, path string) (*MatchedRoute, bool) { } // a workaround to handle fragment/composing parameters until they are supported in denco router // check if this parameter is a fragment within a path segment - if xpos := strings.Index(entry.PathPattern, fmt.Sprintf("{%s}", p.Name)) + len(p.Name) + 2; xpos < len(entry.PathPattern) && entry.PathPattern[xpos] != '/' { + const enclosureSize = 2 + if xpos := strings.Index(entry.PathPattern, fmt.Sprintf("{%s}", p.Name)) + len(p.Name) + enclosureSize; xpos < len(entry.PathPattern) && entry.PathPattern[xpos] != '/' { // extract fragment parameters ep := strings.Split(entry.PathPattern[xpos:], "/")[0] pnames, pvalues := decodeCompositParams(p.Name, v, ep, nil, nil) @@ -460,11 +449,11 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper parameters := d.analyzer.ParamsFor(method, strings.TrimPrefix(path, bp)) // add API defaults if not part of the spec - if defConsumes := d.api.DefaultConsumes(); defConsumes != "" && !swag.ContainsStringsCI(consumes, defConsumes) { + if defConsumes := d.api.DefaultConsumes(); defConsumes != "" && !stringutils.ContainsStringsCI(consumes, defConsumes) { consumes = append(consumes, defConsumes) } - if defProduces := d.api.DefaultProduces(); defProduces != "" && !swag.ContainsStringsCI(produces, defProduces) { + if defProduces := d.api.DefaultProduces(); defProduces != "" && !stringutils.ContainsStringsCI(produces, defProduces) { produces = append(produces, defProduces) } @@ -489,6 +478,20 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper } } +func (d *defaultRouteBuilder) Build() *defaultRouter { + routers := make(map[string]*denco.Router) + for method, records := range d.records { + router := denco.New() + _ = router.Build(records) + routers[method] = router + } + return &defaultRouter{ + spec: d.spec, + routers: routers, + debugLogf: d.debugLogf, + } +} + func (d *defaultRouteBuilder) buildAuthenticators(operation *spec.Operation) RouteAuthenticators { requirements := d.analyzer.SecurityRequirementsFor(operation) auths := make([]RouteAuthenticator, 0, len(requirements)) @@ -515,17 +518,3 @@ func (d *defaultRouteBuilder) buildAuthenticators(operation *spec.Operation) Rou } return auths } - -func (d *defaultRouteBuilder) Build() *defaultRouter { - routers := make(map[string]*denco.Router) - for method, records := range d.records { - router := denco.New() - _ = router.Build(records) - routers[method] = router - } - return &defaultRouter{ - spec: d.spec, - routers: routers, - debugLogf: d.debugLogf, - } -} diff --git a/vendor/github.com/go-openapi/runtime/middleware/security.go b/vendor/github.com/go-openapi/runtime/middleware/security.go index 2b061caefc..37ecfa6fd4 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/security.go +++ b/vendor/github.com/go-openapi/runtime/middleware/security.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/middleware/spec.go b/vendor/github.com/go-openapi/runtime/middleware/spec.go index 87e17e3424..9cc9940aaa 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/spec.go +++ b/vendor/github.com/go-openapi/runtime/middleware/spec.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go index ec3c10cbaf..b25a3a2cff 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go +++ b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go index e81212f71c..879bdbaade 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go +++ b/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/ui_options.go b/vendor/github.com/go-openapi/runtime/middleware/ui_options.go index b86efa0089..cf2f673d3c 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/ui_options.go +++ b/vendor/github.com/go-openapi/runtime/middleware/ui_options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( @@ -39,7 +42,7 @@ type uiOptions struct { // toCommonUIOptions converts any UI option type to retain the common options. // // This uses gob encoding/decoding to convert common fields from one struct to another. -func toCommonUIOptions(opts interface{}) uiOptions { +func toCommonUIOptions(opts any) uiOptions { var buf bytes.Buffer enc := gob.NewEncoder(&buf) dec := gob.NewDecoder(&buf) @@ -168,6 +171,6 @@ func serveUI(pth string, assets []byte, next http.Handler) http.Handler { rw.Header().Set(contentTypeHeader, "text/plain") rw.WriteHeader(http.StatusNotFound) - _, _ = rw.Write([]byte(fmt.Sprintf("%q not found", pth))) + _, _ = fmt.Fprintf(rw, "%q not found", pth) }) } diff --git a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go index 7b7269bd19..774da0ba0c 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go +++ b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package untyped @@ -29,6 +18,27 @@ import ( "github.com/go-openapi/runtime" ) +const ( + smallPreallocatedSlots = 10 + mediumPreallocatedSlots = 30 +) + +// API represents an untyped mux for a swagger spec +type API struct { + spec *loads.Document + analyzer *analysis.Spec + DefaultProduces string + DefaultConsumes string + consumers map[string]runtime.Consumer + producers map[string]runtime.Producer + authenticators map[string]runtime.Authenticator + authorizer runtime.Authorizer + operations map[string]map[string]runtime.OperationHandler + ServeError func(http.ResponseWriter, *http.Request, error) + Models map[string]func() any + formats strfmt.Registry +} + // NewAPI creates the default untyped API func NewAPI(spec *loads.Document) *API { var an *analysis.Spec @@ -38,31 +48,16 @@ func NewAPI(spec *loads.Document) *API { api := &API{ spec: spec, analyzer: an, - consumers: make(map[string]runtime.Consumer, 10), - producers: make(map[string]runtime.Producer, 10), + consumers: make(map[string]runtime.Consumer, smallPreallocatedSlots), + producers: make(map[string]runtime.Producer, smallPreallocatedSlots), authenticators: make(map[string]runtime.Authenticator), operations: make(map[string]map[string]runtime.OperationHandler), ServeError: errors.ServeError, - Models: make(map[string]func() interface{}), + Models: make(map[string]func() any), formats: strfmt.NewFormats(), } - return api.WithJSONDefaults() -} -// API represents an untyped mux for a swagger spec -type API struct { - spec *loads.Document - analyzer *analysis.Spec - DefaultProduces string - DefaultConsumes string - consumers map[string]runtime.Consumer - producers map[string]runtime.Producer - authenticators map[string]runtime.Authenticator - authorizer runtime.Authorizer - operations map[string]map[string]runtime.OperationHandler - ServeError func(http.ResponseWriter, *http.Request, error) - Models map[string]func() interface{} - formats strfmt.Registry + return api.WithJSONDefaults() } // WithJSONDefaults loads the json defaults for this api @@ -115,7 +110,7 @@ func (d *API) RegisterAuthorizer(handler runtime.Authorizer) { // RegisterConsumer registers a consumer for a media type. func (d *API) RegisterConsumer(mediaType string, handler runtime.Consumer) { if d.consumers == nil { - d.consumers = make(map[string]runtime.Consumer, 10) + d.consumers = make(map[string]runtime.Consumer, smallPreallocatedSlots) } d.consumers[strings.ToLower(mediaType)] = handler } @@ -123,7 +118,7 @@ func (d *API) RegisterConsumer(mediaType string, handler runtime.Consumer) { // RegisterProducer registers a producer for a media type func (d *API) RegisterProducer(mediaType string, handler runtime.Producer) { if d.producers == nil { - d.producers = make(map[string]runtime.Producer, 10) + d.producers = make(map[string]runtime.Producer, smallPreallocatedSlots) } d.producers[strings.ToLower(mediaType)] = handler } @@ -131,7 +126,7 @@ func (d *API) RegisterProducer(mediaType string, handler runtime.Producer) { // RegisterOperation registers an operation handler for an operation name func (d *API) RegisterOperation(method, path string, handler runtime.OperationHandler) { if d.operations == nil { - d.operations = make(map[string]map[string]runtime.OperationHandler, 30) + d.operations = make(map[string]map[string]runtime.OperationHandler, mediumPreallocatedSlots) } um := strings.ToUpper(method) if b, ok := d.operations[um]; !ok || b == nil { diff --git a/vendor/github.com/go-openapi/runtime/middleware/validation.go b/vendor/github.com/go-openapi/runtime/middleware/validation.go index 0a5356c607..ed026d626b 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/validation.go +++ b/vendor/github.com/go-openapi/runtime/middleware/validation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -20,9 +9,8 @@ import ( "strings" "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/runtime" + "github.com/go-openapi/swag/stringutils" ) type validation struct { @@ -30,7 +18,7 @@ type validation struct { result []error request *http.Request route *MatchedRoute - bound map[string]interface{} + bound map[string]any } // ContentType validates the content type of a request @@ -42,14 +30,14 @@ func validateContentType(allowed []string, actual string) error { if err != nil { return errors.InvalidContentType(actual, allowed) } - if swag.ContainsStringsCI(allowed, mt) { + if stringutils.ContainsStringsCI(allowed, mt) { return nil } - if swag.ContainsStringsCI(allowed, "*/*") { + if stringutils.ContainsStringsCI(allowed, "*/*") { return nil } parts := strings.Split(actual, "/") - if len(parts) == 2 && swag.ContainsStringsCI(allowed, parts[0]+"/*") { + if len(parts) == 2 && stringutils.ContainsStringsCI(allowed, parts[0]+"/*") { return nil } return errors.InvalidContentType(actual, allowed) @@ -60,7 +48,7 @@ func validateRequest(ctx *Context, request *http.Request, route *MatchedRoute) * context: ctx, request: request, route: route, - bound: make(map[string]interface{}), + bound: make(map[string]any), } validate.debugLogf("validating request %s %s", request.Method, request.URL.EscapedPath()) @@ -83,7 +71,7 @@ func (v *validation) parameters() { v.debugLogf("validating request parameters for %s %s", v.request.Method, v.request.URL.EscapedPath()) if result := v.route.Binder.Bind(v.request, v.route.Params, v.route.Consumer, v.bound); result != nil { if result.Error() == "validation failure list" { - for _, e := range result.(*errors.Validation).Value.([]interface{}) { + for _, e := range result.(*errors.Validation).Value.([]any) { v.result = append(v.result, e.(error)) } return @@ -111,7 +99,7 @@ func (v *validation) contentType() { if ct != "" && v.route.Consumer == nil { cons, ok := v.route.Consumers[ct] if !ok { - v.result = append(v.result, errors.New(500, "no consumer registered for %s", ct)) + v.result = append(v.result, errors.New(http.StatusInternalServerError, "no consumer registered for %s", ct)) } else { v.route.Consumer = cons } diff --git a/vendor/github.com/go-openapi/runtime/request.go b/vendor/github.com/go-openapi/runtime/request.go index 9e3e1ecb14..aab7b8c055 100644 --- a/vendor/github.com/go-openapi/runtime/request.go +++ b/vendor/github.com/go-openapi/runtime/request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -22,7 +11,7 @@ import ( "net/http" "strings" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/stringutils" ) // CanHaveBody returns true if this method can have a body @@ -50,7 +39,7 @@ func HasBody(r *http.Request) bool { return true } - if r.Header.Get("content-length") != "" { + if r.Header.Get("Content-Length") != "" { // in this case, no Transfer-Encoding should be present // we have a header set but it was explicitly set to 0, so we assume no body return false @@ -145,5 +134,5 @@ func ReadSingleValue(values Gettable, name string) string { // ReadCollectionValue reads a collection value from a string data source func ReadCollectionValue(values Gettable, name, collectionFormat string) []string { v := ReadSingleValue(values, name) - return swag.SplitByFormat(v, collectionFormat) + return stringutils.SplitByFormat(v, collectionFormat) } diff --git a/vendor/github.com/go-openapi/runtime/security/authenticator.go b/vendor/github.com/go-openapi/runtime/security/authenticator.go index bb30472bbe..b5b7904dc1 100644 --- a/vendor/github.com/go-openapi/runtime/security/authenticator.go +++ b/vendor/github.com/go-openapi/runtime/security/authenticator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package security @@ -31,8 +20,8 @@ const ( ) // HttpAuthenticator is a function that authenticates a HTTP request -func HttpAuthenticator(handler func(*http.Request) (bool, interface{}, error)) runtime.Authenticator { //nolint:revive,stylecheck - return runtime.AuthenticatorFunc(func(params interface{}) (bool, interface{}, error) { +func HttpAuthenticator(handler func(*http.Request) (bool, any, error)) runtime.Authenticator { //nolint:revive + return runtime.AuthenticatorFunc(func(params any) (bool, any, error) { if request, ok := params.(*http.Request); ok { return handler(request) } @@ -44,8 +33,8 @@ func HttpAuthenticator(handler func(*http.Request) (bool, interface{}, error)) r } // ScopedAuthenticator is a function that authenticates a HTTP request against a list of valid scopes -func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, interface{}, error)) runtime.Authenticator { - return runtime.AuthenticatorFunc(func(params interface{}) (bool, interface{}, error) { +func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, any, error)) runtime.Authenticator { + return runtime.AuthenticatorFunc(func(params any) (bool, any, error) { if request, ok := params.(*ScopedAuthRequest); ok { return handler(request) } @@ -54,22 +43,22 @@ func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, interface{}, er } // UserPassAuthentication authentication function -type UserPassAuthentication func(string, string) (interface{}, error) +type UserPassAuthentication func(string, string) (any, error) // UserPassAuthenticationCtx authentication function with context.Context -type UserPassAuthenticationCtx func(context.Context, string, string) (context.Context, interface{}, error) +type UserPassAuthenticationCtx func(context.Context, string, string) (context.Context, any, error) // TokenAuthentication authentication function -type TokenAuthentication func(string) (interface{}, error) +type TokenAuthentication func(string) (any, error) // TokenAuthenticationCtx authentication function with context.Context -type TokenAuthenticationCtx func(context.Context, string) (context.Context, interface{}, error) +type TokenAuthenticationCtx func(context.Context, string) (context.Context, any, error) // ScopedTokenAuthentication authentication function -type ScopedTokenAuthentication func(string, []string) (interface{}, error) +type ScopedTokenAuthentication func(string, []string) (any, error) // ScopedTokenAuthenticationCtx authentication function with context.Context -type ScopedTokenAuthenticationCtx func(context.Context, string, []string) (context.Context, interface{}, error) +type ScopedTokenAuthenticationCtx func(context.Context, string, []string) (context.Context, any, error) var DefaultRealmName = "API" @@ -115,7 +104,7 @@ func BasicAuthRealm(realm string, authenticate UserPassAuthentication) runtime.A realm = DefaultRealmName } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { if usr, pass, ok := r.BasicAuth(); ok { p, err := authenticate(usr, pass) if err != nil { @@ -139,7 +128,7 @@ func BasicAuthRealmCtx(realm string, authenticate UserPassAuthenticationCtx) run realm = DefaultRealmName } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { if usr, pass, ok := r.BasicAuth(); ok { ctx, p, err := authenticate(r.Context(), usr, pass) if err != nil { @@ -159,7 +148,7 @@ func APIKeyAuth(name, in string, authenticate TokenAuthentication) runtime.Authe inl := strings.ToLower(in) if inl != query && inl != header { // panic because this is most likely a typo - panic(errors.New(500, "api key auth: in value needs to be either \"query\" or \"header\"")) + panic(errors.New(http.StatusInternalServerError, "api key auth: in value needs to be either \"query\" or \"header\"")) } var getToken func(*http.Request) string @@ -170,7 +159,7 @@ func APIKeyAuth(name, in string, authenticate TokenAuthentication) runtime.Authe getToken = func(r *http.Request) string { return r.URL.Query().Get(name) } } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { token := getToken(r) if token == "" { return false, nil, nil @@ -187,7 +176,7 @@ func APIKeyAuthCtx(name, in string, authenticate TokenAuthenticationCtx) runtime inl := strings.ToLower(in) if inl != query && inl != header { // panic because this is most likely a typo - panic(errors.New(500, "api key auth: in value needs to be either \"query\" or \"header\"")) + panic(errors.New(http.StatusInternalServerError, "api key auth: in value needs to be either \"query\" or \"header\"")) } var getToken func(*http.Request) string @@ -198,7 +187,7 @@ func APIKeyAuthCtx(name, in string, authenticate TokenAuthenticationCtx) runtime getToken = func(r *http.Request) string { return r.URL.Query().Get(name) } } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { token := getToken(r) if token == "" { return false, nil, nil @@ -219,11 +208,11 @@ type ScopedAuthRequest struct { // BearerAuth for use with oauth2 flows func BearerAuth(name string, authenticate ScopedTokenAuthentication) runtime.Authenticator { const prefix = "Bearer " - return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, interface{}, error) { + return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, any, error) { var token string hdr := r.Request.Header.Get(runtime.HeaderAuthorization) - if strings.HasPrefix(hdr, prefix) { - token = strings.TrimPrefix(hdr, prefix) + if after, ok := strings.CutPrefix(hdr, prefix); ok { + token = after } if token == "" { qs := r.Request.URL.Query() @@ -249,11 +238,11 @@ func BearerAuth(name string, authenticate ScopedTokenAuthentication) runtime.Aut // BearerAuthCtx for use with oauth2 flows with support for context.Context. func BearerAuthCtx(name string, authenticate ScopedTokenAuthenticationCtx) runtime.Authenticator { const prefix = "Bearer " - return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, interface{}, error) { + return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, any, error) { var token string hdr := r.Request.Header.Get(runtime.HeaderAuthorization) - if strings.HasPrefix(hdr, prefix) { - token = strings.TrimPrefix(hdr, prefix) + if after, ok := strings.CutPrefix(hdr, prefix); ok { + token = after } if token == "" { qs := r.Request.URL.Query() diff --git a/vendor/github.com/go-openapi/runtime/security/authorizer.go b/vendor/github.com/go-openapi/runtime/security/authorizer.go index 00c1a4d6a4..69bd497a3c 100644 --- a/vendor/github.com/go-openapi/runtime/security/authorizer.go +++ b/vendor/github.com/go-openapi/runtime/security/authorizer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package security @@ -23,5 +12,5 @@ import ( // Authorized provides a default implementation of the Authorizer interface where all // requests are authorized (successful) func Authorized() runtime.Authorizer { - return runtime.AuthorizerFunc(func(_ *http.Request, _ interface{}) error { return nil }) + return runtime.AuthorizerFunc(func(_ *http.Request, _ any) error { return nil }) } diff --git a/vendor/github.com/go-openapi/runtime/statuses.go b/vendor/github.com/go-openapi/runtime/statuses.go index 3b011a0bff..7e10a5a56c 100644 --- a/vendor/github.com/go-openapi/runtime/statuses.go +++ b/vendor/github.com/go-openapi/runtime/statuses.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/text.go b/vendor/github.com/go-openapi/runtime/text.go index f33320b7dd..2b8e4ac09d 100644 --- a/vendor/github.com/go-openapi/runtime/text.go +++ b/vendor/github.com/go-openapi/runtime/text.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -22,12 +11,12 @@ import ( "io" "reflect" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // TextConsumer creates a new text consumer func TextConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { if reader == nil { return errors.New("TextConsumer requires a reader") // early exit } @@ -69,7 +58,7 @@ func TextConsumer() Consumer { // TextProducer creates a new text producer func TextProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { if writer == nil { return errors.New("TextProducer requires a writer") // early exit } @@ -99,7 +88,7 @@ func TextProducer() Producer { v := reflect.Indirect(reflect.ValueOf(data)) if t := v.Type(); t.Kind() == reflect.Struct || t.Kind() == reflect.Slice { - b, err := swag.WriteJSON(data) + b, err := jsonutils.WriteJSON(data) if err != nil { return err } diff --git a/vendor/github.com/go-openapi/runtime/values.go b/vendor/github.com/go-openapi/runtime/values.go index 11f5732af4..19894e7845 100644 --- a/vendor/github.com/go-openapi/runtime/values.go +++ b/vendor/github.com/go-openapi/runtime/values.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package runtime // Values typically represent parameters on a http request. diff --git a/vendor/github.com/go-openapi/runtime/xml.go b/vendor/github.com/go-openapi/runtime/xml.go index 821c7393df..5060b5c8e9 100644 --- a/vendor/github.com/go-openapi/runtime/xml.go +++ b/vendor/github.com/go-openapi/runtime/xml.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -21,7 +10,7 @@ import ( // XMLConsumer creates a new XML consumer func XMLConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { dec := xml.NewDecoder(reader) return dec.Decode(data) }) @@ -29,7 +18,7 @@ func XMLConsumer() Consumer { // XMLProducer creates a new XML producer func XMLProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { enc := xml.NewEncoder(writer) return enc.Encode(data) }) diff --git a/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go b/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go index a1a0a589df..ca63430e0b 100644 --- a/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go +++ b/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package yamlpc @@ -18,12 +7,12 @@ import ( "io" "github.com/go-openapi/runtime" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) // YAMLConsumer creates a consumer for yaml data func YAMLConsumer() runtime.Consumer { - return runtime.ConsumerFunc(func(r io.Reader, v interface{}) error { + return runtime.ConsumerFunc(func(r io.Reader, v any) error { dec := yaml.NewDecoder(r) return dec.Decode(v) }) @@ -31,7 +20,7 @@ func YAMLConsumer() runtime.Consumer { // YAMLProducer creates a producer for yaml data func YAMLProducer() runtime.Producer { - return runtime.ProducerFunc(func(w io.Writer, v interface{}) error { + return runtime.ProducerFunc(func(w io.Writer, v any) error { enc := yaml.NewEncoder(w) defer enc.Close() return enc.Encode(v) diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml index 22f8d21cca..1ad5adf47e 100644 --- a/vendor/github.com/go-openapi/spec/.golangci.yml +++ b/vendor/github.com/go-openapi/spec/.golangci.yml @@ -1,61 +1,75 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gosmopolitan + - inamedparam + - intrange + - ireturn + - lll + - musttag + - nestif + - nlreturn + - nonamedreturns + - noinlineerr - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/spec/README.md b/vendor/github.com/go-openapi/spec/README.md index 7fd2810c69..3203bd2556 100644 --- a/vendor/github.com/go-openapi/spec/README.md +++ b/vendor/github.com/go-openapi/spec/README.md @@ -7,6 +7,10 @@ The object model for OpenAPI specification documents. +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + ### FAQ * What does this do? diff --git a/vendor/github.com/go-openapi/spec/cache.go b/vendor/github.com/go-openapi/spec/cache.go index 122993b44b..10fba77a83 100644 --- a/vendor/github.com/go-openapi/spec/cache.go +++ b/vendor/github.com/go-openapi/spec/cache.go @@ -1,40 +1,28 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec import ( + "maps" "sync" ) // ResolutionCache a cache for resolving urls type ResolutionCache interface { - Get(string) (interface{}, bool) - Set(string, interface{}) + Get(string) (any, bool) + Set(string, any) } type simpleCache struct { lock sync.RWMutex - store map[string]interface{} + store map[string]any } func (s *simpleCache) ShallowClone() ResolutionCache { - store := make(map[string]interface{}, len(s.store)) + store := make(map[string]any, len(s.store)) s.lock.RLock() - for k, v := range s.store { - store[k] = v - } + maps.Copy(store, s.store) s.lock.RUnlock() return &simpleCache{ @@ -43,7 +31,7 @@ func (s *simpleCache) ShallowClone() ResolutionCache { } // Get retrieves a cached URI -func (s *simpleCache) Get(uri string) (interface{}, bool) { +func (s *simpleCache) Get(uri string) (any, bool) { s.lock.RLock() v, ok := s.store[uri] @@ -52,7 +40,7 @@ func (s *simpleCache) Get(uri string) (interface{}, bool) { } // Set caches a URI -func (s *simpleCache) Set(uri string, data interface{}) { +func (s *simpleCache) Set(uri string, data any) { s.lock.Lock() s.store[uri] = data s.lock.Unlock() @@ -80,7 +68,7 @@ func initResolutionCache() { } func defaultResolutionCache() *simpleCache { - return &simpleCache{store: map[string]interface{}{ + return &simpleCache{store: map[string]any{ "http://swagger.io/v2/schema.json": MustLoadSwagger20Schema(), "http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(), }} diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go index 2f7bb219b5..fafe639b45 100644 --- a/vendor/github.com/go-openapi/spec/contact_info.go +++ b/vendor/github.com/go-openapi/spec/contact_info.go @@ -1,23 +1,12 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec import ( "encoding/json" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // ContactInfo contact information for the exposed API. @@ -53,5 +42,5 @@ func (c ContactInfo) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2), nil + return jsonutils.ConcatJSON(b1, b2), nil } diff --git a/vendor/github.com/go-openapi/spec/debug.go b/vendor/github.com/go-openapi/spec/debug.go index fc889f6d0b..f4316c2633 100644 --- a/vendor/github.com/go-openapi/spec/debug.go +++ b/vendor/github.com/go-openapi/spec/debug.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -40,7 +29,7 @@ func debugOptions() { specLogger = log.New(os.Stdout, "spec:", log.LstdFlags) } -func debugLog(msg string, args ...interface{}) { +func debugLog(msg string, args ...any) { // A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog() if Debug { _, file1, pos1, _ := runtime.Caller(1) diff --git a/vendor/github.com/go-openapi/spec/embed.go b/vendor/github.com/go-openapi/spec/embed.go index 1f4284750a..0d0b69996c 100644 --- a/vendor/github.com/go-openapi/spec/embed.go +++ b/vendor/github.com/go-openapi/spec/embed.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package spec import ( diff --git a/vendor/github.com/go-openapi/spec/errors.go b/vendor/github.com/go-openapi/spec/errors.go index 6992c7ba73..e39ab8bf71 100644 --- a/vendor/github.com/go-openapi/spec/errors.go +++ b/vendor/github.com/go-openapi/spec/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package spec import "errors" @@ -16,4 +19,7 @@ var ( // ErrExpandUnsupportedType indicates that $ref expansion is attempted on some invalid type ErrExpandUnsupportedType = errors.New("expand: unsupported type. Input should be of type *Parameter or *Response") + + // ErrSpec is an error raised by the spec package + ErrSpec = errors.New("spec error") ) diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go index b81a5699a0..cc4bd1cba1 100644 --- a/vendor/github.com/go-openapi/spec/expander.go +++ b/vendor/github.com/go-openapi/spec/expander.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -19,6 +8,8 @@ import ( "fmt" ) +const smallPrealloc = 10 + // ExpandOptions provides options for the spec expander. // // RelativeBase is the path to the root document. This can be a remote URL or a path to a local file. @@ -56,7 +47,7 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { if !options.SkipSchemas { for key, definition := range spec.Definitions { - parentRefs := make([]string, 0, 10) + parentRefs := make([]string, 0, smallPrealloc) parentRefs = append(parentRefs, "#/definitions/"+key) def, err := expandSchema(definition, parentRefs, resolver, specBasePath) @@ -102,7 +93,7 @@ const rootBase = ".root" // baseForRoot loads in the cache the root document and produces a fake ".root" base path entry // for further $ref resolution -func baseForRoot(root interface{}, cache ResolutionCache) string { +func baseForRoot(root any, cache ResolutionCache) string { // cache the root document to resolve $ref's normalizedBase := normalizeBase(rootBase) @@ -114,7 +105,7 @@ func baseForRoot(root interface{}, cache ResolutionCache) string { return normalizedBase } - root = map[string]interface{}{} + root = map[string]any{} } cache.Set(normalizedBase, root) @@ -130,7 +121,7 @@ func baseForRoot(root interface{}, cache ResolutionCache) string { // (use ExpandSchemaWithBasePath to resolve external references). // // Setting the cache is optional and this parameter may safely be left to nil. -func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error { +func ExpandSchema(schema *Schema, root any, cache ResolutionCache) error { cache = cacheOrDefault(cache) if root == nil { root = schema @@ -160,7 +151,7 @@ func ExpandSchemaWithBasePath(schema *Schema, cache ResolutionCache, opts *Expan resolver := defaultSchemaLoader(nil, opts, cache, nil) - parentRefs := make([]string, 0, 10) + parentRefs := make([]string, 0, smallPrealloc) s, err := expandSchema(*schema, parentRefs, resolver, opts.RelativeBase) if err != nil { return err @@ -386,7 +377,7 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) return nil } - parentRefs := make([]string, 0, 10) + parentRefs := make([]string, 0, smallPrealloc) if err := resolver.deref(pathItem, parentRefs, basePath); resolver.shouldStopOnError(err) { return err } @@ -461,7 +452,7 @@ func expandOperation(op *Operation, resolver *schemaLoader, basePath string) err // (use ExpandResponse to resolve external references). // // Setting the cache is optional and this parameter may safely be left to nil. -func ExpandResponseWithRoot(response *Response, root interface{}, cache ResolutionCache) error { +func ExpandResponseWithRoot(response *Response, root any, cache ResolutionCache) error { cache = cacheOrDefault(cache) opts := &ExpandOptions{ RelativeBase: baseForRoot(root, cache), @@ -487,7 +478,7 @@ func ExpandResponse(response *Response, basePath string) error { // // Notice that it is impossible to reference a json schema in a different document other than root // (use ExpandParameter to resolve external references). -func ExpandParameterWithRoot(parameter *Parameter, root interface{}, cache ResolutionCache) error { +func ExpandParameterWithRoot(parameter *Parameter, root any, cache ResolutionCache) error { cache = cacheOrDefault(cache) opts := &ExpandOptions{ @@ -510,7 +501,7 @@ func ExpandParameter(parameter *Parameter, basePath string) error { return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) } -func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { +func getRefAndSchema(input any) (*Ref, *Schema, error) { var ( ref *Ref sch *Schema @@ -536,7 +527,7 @@ func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { return ref, sch, nil } -func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePath string) error { +func expandParameterOrResponse(input any, resolver *schemaLoader, basePath string) error { ref, sch, err := getRefAndSchema(input) if err != nil { return err @@ -546,7 +537,7 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa return nil } - parentRefs := make([]string, 0, 10) + parentRefs := make([]string, 0, smallPrealloc) if ref != nil { // dereference this $ref if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { diff --git a/vendor/github.com/go-openapi/spec/external_docs.go b/vendor/github.com/go-openapi/spec/external_docs.go index 88add91b2b..17b8efbf10 100644 --- a/vendor/github.com/go-openapi/spec/external_docs.go +++ b/vendor/github.com/go-openapi/spec/external_docs.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec diff --git a/vendor/github.com/go-openapi/spec/header.go b/vendor/github.com/go-openapi/spec/header.go index 9dfd17b185..ab251ef765 100644 --- a/vendor/github.com/go-openapi/spec/header.go +++ b/vendor/github.com/go-openapi/spec/header.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -19,7 +8,7 @@ import ( "strings" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) const ( @@ -68,20 +57,20 @@ func (h *Header) CollectionOf(items *Items, format string) *Header { } // WithDefault sets the default value on this item -func (h *Header) WithDefault(defaultValue interface{}) *Header { +func (h *Header) WithDefault(defaultValue any) *Header { h.Default = defaultValue return h } // WithMaxLength sets a max length value -func (h *Header) WithMaxLength(max int64) *Header { - h.MaxLength = &max +func (h *Header) WithMaxLength(maximum int64) *Header { + h.MaxLength = &maximum return h } // WithMinLength sets a min length value -func (h *Header) WithMinLength(min int64) *Header { - h.MinLength = &min +func (h *Header) WithMinLength(minimum int64) *Header { + h.MinLength = &minimum return h } @@ -98,22 +87,22 @@ func (h *Header) WithMultipleOf(number float64) *Header { } // WithMaximum sets a maximum number value -func (h *Header) WithMaximum(max float64, exclusive bool) *Header { - h.Maximum = &max +func (h *Header) WithMaximum(maximum float64, exclusive bool) *Header { + h.Maximum = &maximum h.ExclusiveMaximum = exclusive return h } // WithMinimum sets a minimum number value -func (h *Header) WithMinimum(min float64, exclusive bool) *Header { - h.Minimum = &min +func (h *Header) WithMinimum(minimum float64, exclusive bool) *Header { + h.Minimum = &minimum h.ExclusiveMinimum = exclusive return h } // WithEnum sets a the enum values (replace) -func (h *Header) WithEnum(values ...interface{}) *Header { - h.Enum = append([]interface{}{}, values...) +func (h *Header) WithEnum(values ...any) *Header { + h.Enum = append([]any{}, values...) return h } @@ -161,7 +150,7 @@ func (h Header) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2, b3), nil + return jsonutils.ConcatJSON(b1, b2, b3), nil } // UnmarshalJSON unmarshals this header from JSON @@ -179,7 +168,7 @@ func (h *Header) UnmarshalJSON(data []byte) error { } // JSONLookup look up a value by the json property name -func (h Header) JSONLookup(token string) (interface{}, error) { +func (h Header) JSONLookup(token string) (any, error) { if ex, ok := h.Extensions[token]; ok { return &ex, nil } diff --git a/vendor/github.com/go-openapi/spec/info.go b/vendor/github.com/go-openapi/spec/info.go index 582f0fd4c4..9401065bbd 100644 --- a/vendor/github.com/go-openapi/spec/info.go +++ b/vendor/github.com/go-openapi/spec/info.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -20,14 +9,14 @@ import ( "strings" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // Extensions vendor specific extensions -type Extensions map[string]interface{} +type Extensions map[string]any // Add adds a value to these extensions -func (e Extensions) Add(key string, value interface{}) { +func (e Extensions) Add(key string, value any) { realKey := strings.ToLower(key) e[realKey] = value } @@ -71,7 +60,7 @@ func (e Extensions) GetBool(key string) (bool, bool) { // GetStringSlice gets a string value from the extensions func (e Extensions) GetStringSlice(key string) ([]string, bool) { if v, ok := e[strings.ToLower(key)]; ok { - arr, isSlice := v.([]interface{}) + arr, isSlice := v.([]any) if !isSlice { return nil, false } @@ -94,19 +83,19 @@ type VendorExtensible struct { } // AddExtension adds an extension to this extensible object -func (v *VendorExtensible) AddExtension(key string, value interface{}) { +func (v *VendorExtensible) AddExtension(key string, value any) { if value == nil { return } if v.Extensions == nil { - v.Extensions = make(map[string]interface{}) + v.Extensions = make(map[string]any) } v.Extensions.Add(key, value) } // MarshalJSON marshals the extensions to json func (v VendorExtensible) MarshalJSON() ([]byte, error) { - toser := make(map[string]interface{}) + toser := make(map[string]any) for k, v := range v.Extensions { lk := strings.ToLower(k) if strings.HasPrefix(lk, "x-") { @@ -118,7 +107,7 @@ func (v VendorExtensible) MarshalJSON() ([]byte, error) { // UnmarshalJSON for this extensible object func (v *VendorExtensible) UnmarshalJSON(data []byte) error { - var d map[string]interface{} + var d map[string]any if err := json.Unmarshal(data, &d); err != nil { return err } @@ -126,7 +115,7 @@ func (v *VendorExtensible) UnmarshalJSON(data []byte) error { lk := strings.ToLower(k) if strings.HasPrefix(lk, "x-") { if v.Extensions == nil { - v.Extensions = map[string]interface{}{} + v.Extensions = map[string]any{} } v.Extensions[k] = vv } @@ -154,7 +143,7 @@ type Info struct { } // JSONLookup look up a value by the json property name -func (i Info) JSONLookup(token string) (interface{}, error) { +func (i Info) JSONLookup(token string) (any, error) { if ex, ok := i.Extensions[token]; ok { return &ex, nil } @@ -172,7 +161,7 @@ func (i Info) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2), nil + return jsonutils.ConcatJSON(b1, b2), nil } // UnmarshalJSON marshal this from JSON diff --git a/vendor/github.com/go-openapi/spec/items.go b/vendor/github.com/go-openapi/spec/items.go index e2afb2133b..d30ca3569b 100644 --- a/vendor/github.com/go-openapi/spec/items.go +++ b/vendor/github.com/go-openapi/spec/items.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -19,7 +8,7 @@ import ( "strings" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) const ( @@ -28,13 +17,13 @@ const ( // SimpleSchema describe swagger simple schemas for parameters and headers type SimpleSchema struct { - Type string `json:"type,omitempty"` - Nullable bool `json:"nullable,omitempty"` - Format string `json:"format,omitempty"` - Items *Items `json:"items,omitempty"` - CollectionFormat string `json:"collectionFormat,omitempty"` - Default interface{} `json:"default,omitempty"` - Example interface{} `json:"example,omitempty"` + Type string `json:"type,omitempty"` + Nullable bool `json:"nullable,omitempty"` + Format string `json:"format,omitempty"` + Items *Items `json:"items,omitempty"` + CollectionFormat string `json:"collectionFormat,omitempty"` + Default any `json:"default,omitempty"` + Example any `json:"example,omitempty"` } // TypeName return the type (or format) of a simple schema @@ -91,20 +80,20 @@ func (i *Items) CollectionOf(items *Items, format string) *Items { } // WithDefault sets the default value on this item -func (i *Items) WithDefault(defaultValue interface{}) *Items { +func (i *Items) WithDefault(defaultValue any) *Items { i.Default = defaultValue return i } // WithMaxLength sets a max length value -func (i *Items) WithMaxLength(max int64) *Items { - i.MaxLength = &max +func (i *Items) WithMaxLength(maximum int64) *Items { + i.MaxLength = &maximum return i } // WithMinLength sets a min length value -func (i *Items) WithMinLength(min int64) *Items { - i.MinLength = &min +func (i *Items) WithMinLength(minimum int64) *Items { + i.MinLength = &minimum return i } @@ -121,22 +110,22 @@ func (i *Items) WithMultipleOf(number float64) *Items { } // WithMaximum sets a maximum number value -func (i *Items) WithMaximum(max float64, exclusive bool) *Items { - i.Maximum = &max +func (i *Items) WithMaximum(maximum float64, exclusive bool) *Items { + i.Maximum = &maximum i.ExclusiveMaximum = exclusive return i } // WithMinimum sets a minimum number value -func (i *Items) WithMinimum(min float64, exclusive bool) *Items { - i.Minimum = &min +func (i *Items) WithMinimum(minimum float64, exclusive bool) *Items { + i.Minimum = &minimum i.ExclusiveMinimum = exclusive return i } // WithEnum sets a the enum values (replace) -func (i *Items) WithEnum(values ...interface{}) *Items { - i.Enum = append([]interface{}{}, values...) +func (i *Items) WithEnum(values ...any) *Items { + i.Enum = append([]any{}, values...) return i } @@ -213,11 +202,11 @@ func (i Items) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b4, b3, b1, b2), nil + return jsonutils.ConcatJSON(b4, b3, b1, b2), nil } // JSONLookup look up a value by the json property name -func (i Items) JSONLookup(token string) (interface{}, error) { +func (i Items) JSONLookup(token string) (any, error) { if token == jsonRef { return &i.Ref, nil } diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go index b42f80368e..286b237e2b 100644 --- a/vendor/github.com/go-openapi/spec/license.go +++ b/vendor/github.com/go-openapi/spec/license.go @@ -1,23 +1,12 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec import ( "encoding/json" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // License information for the exposed API. @@ -52,5 +41,5 @@ func (l License) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2), nil + return jsonutils.ConcatJSON(b1, b2), nil } diff --git a/vendor/github.com/go-openapi/spec/normalizer.go b/vendor/github.com/go-openapi/spec/normalizer.go index e8b6009945..c3ea810aaf 100644 --- a/vendor/github.com/go-openapi/spec/normalizer.go +++ b/vendor/github.com/go-openapi/spec/normalizer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -129,8 +118,8 @@ func rebase(ref *Ref, v *url.URL, notEqual bool) (Ref, bool) { newBase.Fragment = u.Fragment - if strings.HasPrefix(u.Path, docPath) { - newBase.Path = strings.TrimPrefix(u.Path, docPath) + if after, ok := strings.CutPrefix(u.Path, docPath); ok { + newBase.Path = after } else { newBase.Path = strings.TrimPrefix(u.Path, v.Path) } diff --git a/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go b/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go index f19f1a8fb6..0d55632349 100644 --- a/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go +++ b/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go @@ -1,19 +1,7 @@ //go:build !windows -// +build !windows -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec diff --git a/vendor/github.com/go-openapi/spec/normalizer_windows.go b/vendor/github.com/go-openapi/spec/normalizer_windows.go index a66c532dbc..61515c9a16 100644 --- a/vendor/github.com/go-openapi/spec/normalizer_windows.go +++ b/vendor/github.com/go-openapi/spec/normalizer_windows.go @@ -1,18 +1,7 @@ // -build windows -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec diff --git a/vendor/github.com/go-openapi/spec/operation.go b/vendor/github.com/go-openapi/spec/operation.go index a69cca8814..bbf8c75737 100644 --- a/vendor/github.com/go-openapi/spec/operation.go +++ b/vendor/github.com/go-openapi/spec/operation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -21,12 +10,12 @@ import ( "sort" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) func init() { - gob.Register(map[string]interface{}{}) - gob.Register([]interface{}{}) + gob.Register(map[string]any{}) + gob.Register([]any{}) } // OperationProps describes an operation @@ -58,19 +47,22 @@ func (op OperationProps) MarshalJSON() ([]byte, error) { type Alias OperationProps if op.Security == nil { return json.Marshal(&struct { - Security []map[string][]string `json:"security,omitempty"` *Alias + + Security []map[string][]string `json:"security,omitempty"` }{ - Security: op.Security, Alias: (*Alias)(&op), + Security: op.Security, }) } + return json.Marshal(&struct { - Security []map[string][]string `json:"security"` *Alias + + Security []map[string][]string `json:"security"` }{ - Security: op.Security, Alias: (*Alias)(&op), + Security: op.Security, }) } @@ -82,6 +74,14 @@ type Operation struct { OperationProps } +// NewOperation creates a new operation instance. +// It expects an ID as parameter but not passing an ID is also valid. +func NewOperation(id string) *Operation { + op := new(Operation) + op.ID = id + return op +} + // SuccessResponse gets a success response model func (o *Operation) SuccessResponse() (*Response, int, bool) { if o.Responses == nil { @@ -104,7 +104,7 @@ func (o *Operation) SuccessResponse() (*Response, int, bool) { } // JSONLookup look up a value by the json property name -func (o Operation) JSONLookup(token string) (interface{}, error) { +func (o Operation) JSONLookup(token string) (any, error) { if ex, ok := o.Extensions[token]; ok { return &ex, nil } @@ -130,18 +130,10 @@ func (o Operation) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - concated := swag.ConcatJSON(b1, b2) + concated := jsonutils.ConcatJSON(b1, b2) return concated, nil } -// NewOperation creates a new operation instance. -// It expects an ID as parameter but not passing an ID is also valid. -func NewOperation(id string) *Operation { - op := new(Operation) - op.ID = id - return op -} - // WithID sets the ID property on this operation, allows for chaining. func (o *Operation) WithID(id string) *Operation { o.ID = id diff --git a/vendor/github.com/go-openapi/spec/parameter.go b/vendor/github.com/go-openapi/spec/parameter.go index bd4f1cdb07..b94b7682ac 100644 --- a/vendor/github.com/go-openapi/spec/parameter.go +++ b/vendor/github.com/go-openapi/spec/parameter.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -19,7 +8,7 @@ import ( "strings" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // QueryParam creates a query parameter @@ -116,7 +105,7 @@ type Parameter struct { } // JSONLookup look up a value by the json property name -func (p Parameter) JSONLookup(token string) (interface{}, error) { +func (p Parameter) JSONLookup(token string) (any, error) { if ex, ok := p.Extensions[token]; ok { return &ex, nil } @@ -176,7 +165,7 @@ func (p *Parameter) CollectionOf(items *Items, format string) *Parameter { } // WithDefault sets the default value on this parameter -func (p *Parameter) WithDefault(defaultValue interface{}) *Parameter { +func (p *Parameter) WithDefault(defaultValue any) *Parameter { p.AsOptional() // with default implies optional p.Default = defaultValue return p @@ -210,14 +199,14 @@ func (p *Parameter) AsRequired() *Parameter { } // WithMaxLength sets a max length value -func (p *Parameter) WithMaxLength(max int64) *Parameter { - p.MaxLength = &max +func (p *Parameter) WithMaxLength(maximum int64) *Parameter { + p.MaxLength = &maximum return p } // WithMinLength sets a min length value -func (p *Parameter) WithMinLength(min int64) *Parameter { - p.MinLength = &min +func (p *Parameter) WithMinLength(minimum int64) *Parameter { + p.MinLength = &minimum return p } @@ -234,22 +223,22 @@ func (p *Parameter) WithMultipleOf(number float64) *Parameter { } // WithMaximum sets a maximum number value -func (p *Parameter) WithMaximum(max float64, exclusive bool) *Parameter { - p.Maximum = &max +func (p *Parameter) WithMaximum(maximum float64, exclusive bool) *Parameter { + p.Maximum = &maximum p.ExclusiveMaximum = exclusive return p } // WithMinimum sets a minimum number value -func (p *Parameter) WithMinimum(min float64, exclusive bool) *Parameter { - p.Minimum = &min +func (p *Parameter) WithMinimum(minimum float64, exclusive bool) *Parameter { + p.Minimum = &minimum p.ExclusiveMinimum = exclusive return p } // WithEnum sets a the enum values (replace) -func (p *Parameter) WithEnum(values ...interface{}) *Parameter { - p.Enum = append([]interface{}{}, values...) +func (p *Parameter) WithEnum(values ...any) *Parameter { + p.Enum = append([]any{}, values...) return p } @@ -322,5 +311,5 @@ func (p Parameter) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b3, b1, b2, b4, b5), nil + return jsonutils.ConcatJSON(b3, b1, b2, b4, b5), nil } diff --git a/vendor/github.com/go-openapi/spec/path_item.go b/vendor/github.com/go-openapi/spec/path_item.go index 68fc8e9014..c692b89e46 100644 --- a/vendor/github.com/go-openapi/spec/path_item.go +++ b/vendor/github.com/go-openapi/spec/path_item.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -18,7 +7,7 @@ import ( "encoding/json" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // PathItemProps the path item specific properties @@ -46,7 +35,7 @@ type PathItem struct { } // JSONLookup look up a value by the json property name -func (p PathItem) JSONLookup(token string) (interface{}, error) { +func (p PathItem) JSONLookup(token string) (any, error) { if ex, ok := p.Extensions[token]; ok { return &ex, nil } @@ -82,6 +71,6 @@ func (p PathItem) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - concated := swag.ConcatJSON(b3, b4, b5) + concated := jsonutils.ConcatJSON(b3, b4, b5) return concated, nil } diff --git a/vendor/github.com/go-openapi/spec/paths.go b/vendor/github.com/go-openapi/spec/paths.go index 9dc82a2901..b9e42184b1 100644 --- a/vendor/github.com/go-openapi/spec/paths.go +++ b/vendor/github.com/go-openapi/spec/paths.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -19,7 +8,7 @@ import ( "fmt" "strings" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // Paths holds the relative paths to the individual endpoints. @@ -30,18 +19,19 @@ import ( // For more information: http://goo.gl/8us55a#pathsObject type Paths struct { VendorExtensible + Paths map[string]PathItem `json:"-"` // custom serializer to flatten this, each entry must start with "/" } // JSONLookup look up a value by the json property name -func (p Paths) JSONLookup(token string) (interface{}, error) { +func (p Paths) JSONLookup(token string) (any, error) { if pi, ok := p.Paths[token]; ok { return &pi, nil } if ex, ok := p.Extensions[token]; ok { return &ex, nil } - return nil, fmt.Errorf("object has no field %q", token) + return nil, fmt.Errorf("object has no field %q: %w", token, ErrSpec) } // UnmarshalJSON hydrates this items instance with the data from JSON @@ -53,9 +43,9 @@ func (p *Paths) UnmarshalJSON(data []byte) error { for k, v := range res { if strings.HasPrefix(strings.ToLower(k), "x-") { if p.Extensions == nil { - p.Extensions = make(map[string]interface{}) + p.Extensions = make(map[string]any) } - var d interface{} + var d any if err := json.Unmarshal(v, &d); err != nil { return err } @@ -92,6 +82,6 @@ func (p Paths) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - concated := swag.ConcatJSON(b1, b2) + concated := jsonutils.ConcatJSON(b1, b2) return concated, nil } diff --git a/vendor/github.com/go-openapi/spec/properties.go b/vendor/github.com/go-openapi/spec/properties.go index 91d2435f01..4142308dd3 100644 --- a/vendor/github.com/go-openapi/spec/properties.go +++ b/vendor/github.com/go-openapi/spec/properties.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package spec import ( @@ -9,8 +12,9 @@ import ( // OrderSchemaItem holds a named schema (e.g. from a property of an object) type OrderSchemaItem struct { - Name string Schema + + Name string } // OrderSchemaItems is a sortable slice of named schemas. diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go index b0ef9bd9c9..c927926294 100644 --- a/vendor/github.com/go-openapi/spec/ref.go +++ b/vendor/github.com/go-openapi/spec/ref.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -45,6 +34,23 @@ type Ref struct { jsonreference.Ref } +// NewRef creates a new instance of a ref object +// returns an error when the reference uri is an invalid uri +func NewRef(refURI string) (Ref, error) { + ref, err := jsonreference.New(refURI) + if err != nil { + return Ref{}, err + } + + return Ref{Ref: ref}, nil +} + +// MustCreateRef creates a ref object but panics when refURI is invalid. +// Use the NewRef method for a version that returns an error. +func MustCreateRef(refURI string) Ref { + return Ref{Ref: jsonreference.MustCreateRef(refURI)} +} + // RemoteURI gets the remote uri part of the ref func (r *Ref) RemoteURI() string { if r.String() == "" { @@ -75,10 +81,11 @@ func (r *Ref) IsValidURI(basepaths ...string) bool { } defer rr.Body.Close() - return rr.StatusCode/100 == 2 + // true if the response is >= 200 and < 300 + return rr.StatusCode/100 == 2 //nolint:mnd } - if !(r.HasFileScheme || r.HasFullFilePath || r.HasURLPathOnly) { + if !r.HasFileScheme && !r.HasFullFilePath && !r.HasURLPathOnly { return false } @@ -114,22 +121,6 @@ func (r *Ref) Inherits(child Ref) (*Ref, error) { return &Ref{Ref: *ref}, nil } -// NewRef creates a new instance of a ref object -// returns an error when the reference uri is an invalid uri -func NewRef(refURI string) (Ref, error) { - ref, err := jsonreference.New(refURI) - if err != nil { - return Ref{}, err - } - return Ref{Ref: ref}, nil -} - -// MustCreateRef creates a ref object but panics when refURI is invalid. -// Use the NewRef method for a version that returns an error. -func MustCreateRef(refURI string) Ref { - return Ref{Ref: jsonreference.MustCreateRef(refURI)} -} - // MarshalJSON marshals this ref into a JSON object func (r Ref) MarshalJSON() ([]byte, error) { str := r.String() @@ -139,13 +130,13 @@ func (r Ref) MarshalJSON() ([]byte, error) { } return []byte("{}"), nil } - v := map[string]interface{}{"$ref": str} + v := map[string]any{"$ref": str} return json.Marshal(v) } // UnmarshalJSON unmarshals this ref from a JSON object func (r *Ref) UnmarshalJSON(d []byte) error { - var v map[string]interface{} + var v map[string]any if err := json.Unmarshal(d, &v); err != nil { return err } @@ -174,7 +165,7 @@ func (r *Ref) GobDecode(b []byte) error { return json.Unmarshal(raw, r) } -func (r *Ref) fromMap(v map[string]interface{}) error { +func (r *Ref) fromMap(v map[string]any) error { if v == nil { return nil } diff --git a/vendor/github.com/go-openapi/spec/resolver.go b/vendor/github.com/go-openapi/spec/resolver.go index 47d1ee13fc..b82c182133 100644 --- a/vendor/github.com/go-openapi/spec/resolver.go +++ b/vendor/github.com/go-openapi/spec/resolver.go @@ -1,12 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package spec import ( "fmt" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) -func resolveAnyWithBase(root interface{}, ref *Ref, result interface{}, options *ExpandOptions) error { +func resolveAnyWithBase(root any, ref *Ref, result any, options *ExpandOptions) error { options = optionsOrDefault(options) resolver := defaultSchemaLoader(root, options, nil, nil) @@ -18,7 +21,7 @@ func resolveAnyWithBase(root interface{}, ref *Ref, result interface{}, options } // ResolveRefWithBase resolves a reference against a context root with preservation of base path -func ResolveRefWithBase(root interface{}, ref *Ref, options *ExpandOptions) (*Schema, error) { +func ResolveRefWithBase(root any, ref *Ref, options *ExpandOptions) (*Schema, error) { result := new(Schema) if err := resolveAnyWithBase(root, ref, result, options); err != nil { @@ -32,7 +35,7 @@ func ResolveRefWithBase(root interface{}, ref *Ref, options *ExpandOptions) (*Sc // ref is guaranteed to be in root (no need to go to external files) // // ResolveRef is ONLY called from the code generation module -func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { +func ResolveRef(root any, ref *Ref) (*Schema, error) { res, _, err := ref.GetPointer().Get(root) if err != nil { return nil, err @@ -43,9 +46,9 @@ func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { return &sch, nil case *Schema: return sch, nil - case map[string]interface{}: + case map[string]any: newSch := new(Schema) - if err = swag.DynamicJSONToStruct(sch, newSch); err != nil { + if err = jsonutils.FromDynamicJSON(sch, newSch); err != nil { return nil, err } return newSch, nil @@ -55,7 +58,7 @@ func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { } // ResolveParameterWithBase resolves a parameter reference against a context root and base path -func ResolveParameterWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Parameter, error) { +func ResolveParameterWithBase(root any, ref Ref, options *ExpandOptions) (*Parameter, error) { result := new(Parameter) if err := resolveAnyWithBase(root, &ref, result, options); err != nil { @@ -66,12 +69,12 @@ func ResolveParameterWithBase(root interface{}, ref Ref, options *ExpandOptions) } // ResolveParameter resolves a parameter reference against a context root -func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { +func ResolveParameter(root any, ref Ref) (*Parameter, error) { return ResolveParameterWithBase(root, ref, nil) } // ResolveResponseWithBase resolves response a reference against a context root and base path -func ResolveResponseWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Response, error) { +func ResolveResponseWithBase(root any, ref Ref, options *ExpandOptions) (*Response, error) { result := new(Response) err := resolveAnyWithBase(root, &ref, result, options) @@ -83,12 +86,12 @@ func ResolveResponseWithBase(root interface{}, ref Ref, options *ExpandOptions) } // ResolveResponse resolves response a reference against a context root -func ResolveResponse(root interface{}, ref Ref) (*Response, error) { +func ResolveResponse(root any, ref Ref) (*Response, error) { return ResolveResponseWithBase(root, ref, nil) } // ResolvePathItemWithBase resolves response a path item against a context root and base path -func ResolvePathItemWithBase(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) { +func ResolvePathItemWithBase(root any, ref Ref, options *ExpandOptions) (*PathItem, error) { result := new(PathItem) if err := resolveAnyWithBase(root, &ref, result, options); err != nil { @@ -101,7 +104,7 @@ func ResolvePathItemWithBase(root interface{}, ref Ref, options *ExpandOptions) // ResolvePathItem resolves response a path item against a context root and base path // // Deprecated: use ResolvePathItemWithBase instead -func ResolvePathItem(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) { +func ResolvePathItem(root any, ref Ref, options *ExpandOptions) (*PathItem, error) { return ResolvePathItemWithBase(root, ref, options) } @@ -109,7 +112,7 @@ func ResolvePathItem(root interface{}, ref Ref, options *ExpandOptions) (*PathIt // // NOTE: stricly speaking, this construct is not supported by Swagger 2.0. // Similarly, $ref are forbidden in response headers. -func ResolveItemsWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) { +func ResolveItemsWithBase(root any, ref Ref, options *ExpandOptions) (*Items, error) { result := new(Items) if err := resolveAnyWithBase(root, &ref, result, options); err != nil { @@ -122,6 +125,6 @@ func ResolveItemsWithBase(root interface{}, ref Ref, options *ExpandOptions) (*I // ResolveItems resolves parameter items reference against a context root and base path. // // Deprecated: use ResolveItemsWithBase instead -func ResolveItems(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) { +func ResolveItems(root any, ref Ref, options *ExpandOptions) (*Items, error) { return ResolveItemsWithBase(root, ref, options) } diff --git a/vendor/github.com/go-openapi/spec/response.go b/vendor/github.com/go-openapi/spec/response.go index 0340b60d84..e5a7e5c40d 100644 --- a/vendor/github.com/go-openapi/spec/response.go +++ b/vendor/github.com/go-openapi/spec/response.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -18,15 +7,15 @@ import ( "encoding/json" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // ResponseProps properties specific to a response type ResponseProps struct { - Description string `json:"description"` - Schema *Schema `json:"schema,omitempty"` - Headers map[string]Header `json:"headers,omitempty"` - Examples map[string]interface{} `json:"examples,omitempty"` + Description string `json:"description"` + Schema *Schema `json:"schema,omitempty"` + Headers map[string]Header `json:"headers,omitempty"` + Examples map[string]any `json:"examples,omitempty"` } // Response describes a single response from an API Operation. @@ -38,8 +27,20 @@ type Response struct { VendorExtensible } +// NewResponse creates a new response instance +func NewResponse() *Response { + return new(Response) +} + +// ResponseRef creates a response as a json reference +func ResponseRef(url string) *Response { + resp := NewResponse() + resp.Ref = MustCreateRef(url) + return resp +} + // JSONLookup look up a value by the json property name -func (r Response) JSONLookup(token string) (interface{}, error) { +func (r Response) JSONLookup(token string) (any, error) { if ex, ok := r.Extensions[token]; ok { return &ex, nil } @@ -74,14 +75,14 @@ func (r Response) MarshalJSON() ([]byte, error) { } else { // when there is $ref inside the schema, description should be omitempty-ied b1, err = json.Marshal(struct { - Description string `json:"description,omitempty"` - Schema *Schema `json:"schema,omitempty"` - Headers map[string]Header `json:"headers,omitempty"` - Examples map[string]interface{} `json:"examples,omitempty"` + Description string `json:"description,omitempty"` + Schema *Schema `json:"schema,omitempty"` + Headers map[string]Header `json:"headers,omitempty"` + Examples map[string]any `json:"examples,omitempty"` }{ - Description: r.ResponseProps.Description, - Schema: r.ResponseProps.Schema, - Examples: r.ResponseProps.Examples, + Description: r.Description, + Schema: r.Schema, + Examples: r.Examples, }) } if err != nil { @@ -96,19 +97,7 @@ func (r Response) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2, b3), nil -} - -// NewResponse creates a new response instance -func NewResponse() *Response { - return new(Response) -} - -// ResponseRef creates a response as a json reference -func ResponseRef(url string) *Response { - resp := NewResponse() - resp.Ref = MustCreateRef(url) - return resp + return jsonutils.ConcatJSON(b1, b2, b3), nil } // WithDescription sets the description on this response, allows for chaining @@ -143,9 +132,9 @@ func (r *Response) RemoveHeader(name string) *Response { } // AddExample adds an example to this response -func (r *Response) AddExample(mediaType string, example interface{}) *Response { +func (r *Response) AddExample(mediaType string, example any) *Response { if r.Examples == nil { - r.Examples = make(map[string]interface{}) + r.Examples = make(map[string]any) } r.Examples[mediaType] = example return r diff --git a/vendor/github.com/go-openapi/spec/responses.go b/vendor/github.com/go-openapi/spec/responses.go index 16c3076fe8..733a1315d0 100644 --- a/vendor/github.com/go-openapi/spec/responses.go +++ b/vendor/github.com/go-openapi/spec/responses.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -21,7 +10,7 @@ import ( "strconv" "strings" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // Responses is a container for the expected responses of an operation. @@ -43,7 +32,7 @@ type Responses struct { } // JSONLookup implements an interface to customize json pointer lookup -func (r Responses) JSONLookup(token string) (interface{}, error) { +func (r Responses) JSONLookup(token string) (any, error) { if token == "default" { return r.Default, nil } @@ -55,7 +44,7 @@ func (r Responses) JSONLookup(token string) (interface{}, error) { return scr, nil } } - return nil, fmt.Errorf("object has no field %q", token) + return nil, fmt.Errorf("object has no field %q: %w", token, ErrSpec) } // UnmarshalJSON hydrates this items instance with the data from JSON @@ -83,7 +72,7 @@ func (r Responses) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - concated := swag.ConcatJSON(b1, b2) + concated := jsonutils.ConcatJSON(b1, b2) return concated, nil } diff --git a/vendor/github.com/go-openapi/spec/schema.go b/vendor/github.com/go-openapi/spec/schema.go index 4e9be8576b..6623728a41 100644 --- a/vendor/github.com/go-openapi/spec/schema.go +++ b/vendor/github.com/go-openapi/spec/schema.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -20,7 +9,8 @@ import ( "strings" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonname" + "github.com/go-openapi/swag/jsonutils" ) // BooleanProperty creates a boolean property @@ -125,20 +115,20 @@ func (r SchemaURL) MarshalJSON() ([]byte, error) { if r == "" { return []byte("{}"), nil } - v := map[string]interface{}{"$schema": string(r)} + v := map[string]any{"$schema": string(r)} return json.Marshal(v) } // UnmarshalJSON unmarshal this from JSON func (r *SchemaURL) UnmarshalJSON(data []byte) error { - var v map[string]interface{} + var v map[string]any if err := json.Unmarshal(data, &v); err != nil { return err } return r.fromMap(v) } -func (r *SchemaURL) fromMap(v map[string]interface{}) error { +func (r *SchemaURL) fromMap(v map[string]any) error { if v == nil { return nil } @@ -165,7 +155,7 @@ type SchemaProps struct { Nullable bool `json:"nullable,omitempty"` Format string `json:"format,omitempty"` Title string `json:"title,omitempty"` - Default interface{} `json:"default,omitempty"` + Default any `json:"default,omitempty"` Maximum *float64 `json:"maximum,omitempty"` ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` Minimum *float64 `json:"minimum,omitempty"` @@ -177,7 +167,7 @@ type SchemaProps struct { MinItems *int64 `json:"minItems,omitempty"` UniqueItems bool `json:"uniqueItems,omitempty"` MultipleOf *float64 `json:"multipleOf,omitempty"` - Enum []interface{} `json:"enum,omitempty"` + Enum []any `json:"enum,omitempty"` MaxProperties *int64 `json:"maxProperties,omitempty"` MinProperties *int64 `json:"minProperties,omitempty"` Required []string `json:"required,omitempty"` @@ -200,7 +190,7 @@ type SwaggerSchemaProps struct { ReadOnly bool `json:"readOnly,omitempty"` XML *XMLObject `json:"xml,omitempty"` ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` - Example interface{} `json:"example,omitempty"` + Example any `json:"example,omitempty"` } // Schema the schema object allows the definition of input and output data types. @@ -214,11 +204,12 @@ type Schema struct { VendorExtensible SchemaProps SwaggerSchemaProps - ExtraProps map[string]interface{} `json:"-"` + + ExtraProps map[string]any `json:"-"` } // JSONLookup implements an interface to customize json pointer lookup -func (s Schema) JSONLookup(token string) (interface{}, error) { +func (s Schema) JSONLookup(token string) (any, error) { if ex, ok := s.Extensions[token]; ok { return &ex, nil } @@ -275,14 +266,14 @@ func (s *Schema) WithAllOf(schemas ...Schema) *Schema { } // WithMaxProperties sets the max number of properties an object can have -func (s *Schema) WithMaxProperties(max int64) *Schema { - s.MaxProperties = &max +func (s *Schema) WithMaxProperties(maximum int64) *Schema { + s.MaxProperties = &maximum return s } // WithMinProperties sets the min number of properties an object must have -func (s *Schema) WithMinProperties(min int64) *Schema { - s.MinProperties = &min +func (s *Schema) WithMinProperties(minimum int64) *Schema { + s.MinProperties = &minimum return s } @@ -316,7 +307,7 @@ func (s *Schema) CollectionOf(items Schema) *Schema { } // WithDefault sets the default value on this parameter -func (s *Schema) WithDefault(defaultValue interface{}) *Schema { +func (s *Schema) WithDefault(defaultValue any) *Schema { s.Default = defaultValue return s } @@ -334,14 +325,14 @@ func (s *Schema) AddRequired(items ...string) *Schema { } // WithMaxLength sets a max length value -func (s *Schema) WithMaxLength(max int64) *Schema { - s.MaxLength = &max +func (s *Schema) WithMaxLength(maximum int64) *Schema { + s.MaxLength = &maximum return s } // WithMinLength sets a min length value -func (s *Schema) WithMinLength(min int64) *Schema { - s.MinLength = &min +func (s *Schema) WithMinLength(minimum int64) *Schema { + s.MinLength = &minimum return s } @@ -358,22 +349,22 @@ func (s *Schema) WithMultipleOf(number float64) *Schema { } // WithMaximum sets a maximum number value -func (s *Schema) WithMaximum(max float64, exclusive bool) *Schema { - s.Maximum = &max +func (s *Schema) WithMaximum(maximum float64, exclusive bool) *Schema { + s.Maximum = &maximum s.ExclusiveMaximum = exclusive return s } // WithMinimum sets a minimum number value -func (s *Schema) WithMinimum(min float64, exclusive bool) *Schema { - s.Minimum = &min +func (s *Schema) WithMinimum(minimum float64, exclusive bool) *Schema { + s.Minimum = &minimum s.ExclusiveMinimum = exclusive return s } // WithEnum sets a the enum values (replace) -func (s *Schema) WithEnum(values ...interface{}) *Schema { - s.Enum = append([]interface{}{}, values...) +func (s *Schema) WithEnum(values ...any) *Schema { + s.Enum = append([]any{}, values...) return s } @@ -426,7 +417,7 @@ func (s *Schema) AsWritable() *Schema { } // WithExample sets the example for this schema -func (s *Schema) WithExample(example interface{}) *Schema { +func (s *Schema) WithExample(example any) *Schema { s.Example = example return s } @@ -566,33 +557,33 @@ func (s Schema) Validations() SchemaValidations { func (s Schema) MarshalJSON() ([]byte, error) { b1, err := json.Marshal(s.SchemaProps) if err != nil { - return nil, fmt.Errorf("schema props %v", err) + return nil, fmt.Errorf("schema props %v: %w", err, ErrSpec) } b2, err := json.Marshal(s.VendorExtensible) if err != nil { - return nil, fmt.Errorf("vendor props %v", err) + return nil, fmt.Errorf("vendor props %v: %w", err, ErrSpec) } b3, err := s.Ref.MarshalJSON() if err != nil { - return nil, fmt.Errorf("ref prop %v", err) + return nil, fmt.Errorf("ref prop %v: %w", err, ErrSpec) } b4, err := s.Schema.MarshalJSON() if err != nil { - return nil, fmt.Errorf("schema prop %v", err) + return nil, fmt.Errorf("schema prop %v: %w", err, ErrSpec) } b5, err := json.Marshal(s.SwaggerSchemaProps) if err != nil { - return nil, fmt.Errorf("common validations %v", err) + return nil, fmt.Errorf("common validations %v: %w", err, ErrSpec) } var b6 []byte if s.ExtraProps != nil { jj, err := json.Marshal(s.ExtraProps) if err != nil { - return nil, fmt.Errorf("extra props %v", err) + return nil, fmt.Errorf("extra props %v: %w", err, ErrSpec) } b6 = jj } - return swag.ConcatJSON(b1, b2, b3, b4, b5, b6), nil + return jsonutils.ConcatJSON(b1, b2, b3, b4, b5, b6), nil } // UnmarshalJSON marshal this from JSON @@ -610,7 +601,7 @@ func (s *Schema) UnmarshalJSON(data []byte) error { SwaggerSchemaProps: props.SwaggerSchemaProps, } - var d map[string]interface{} + var d map[string]any if err := json.Unmarshal(data, &d); err != nil { return err } @@ -620,7 +611,7 @@ func (s *Schema) UnmarshalJSON(data []byte) error { delete(d, "$ref") delete(d, "$schema") - for _, pn := range swag.DefaultJSONNameProvider.GetJSONNames(s) { + for _, pn := range jsonname.DefaultJSONNameProvider.GetJSONNames(s) { delete(d, pn) } @@ -628,13 +619,13 @@ func (s *Schema) UnmarshalJSON(data []byte) error { lk := strings.ToLower(k) if strings.HasPrefix(lk, "x-") { if sch.Extensions == nil { - sch.Extensions = map[string]interface{}{} + sch.Extensions = map[string]any{} } sch.Extensions[k] = vv continue } if sch.ExtraProps == nil { - sch.ExtraProps = map[string]interface{}{} + sch.ExtraProps = map[string]any{} } sch.ExtraProps[k] = vv } diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go index 0059b99aed..8d4a985325 100644 --- a/vendor/github.com/go-openapi/spec/schema_loader.go +++ b/vendor/github.com/go-openapi/spec/schema_loader.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -22,7 +11,9 @@ import ( "reflect" "strings" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" + "github.com/go-openapi/swag/loading" + "github.com/go-openapi/swag/stringutils" ) // PathLoader is a function to use when loading remote refs. @@ -34,7 +25,7 @@ import ( // this value with its own default (a loader to retrieve YAML documents as // well as JSON ones). var PathLoader = func(pth string) (json.RawMessage, error) { - data, err := swag.LoadFromFileOrHTTP(pth) + data, err := loading.LoadFromFileOrHTTP(pth) if err != nil { return nil, err } @@ -73,12 +64,23 @@ func newResolverContext(options *ExpandOptions) *resolverContext { } type schemaLoader struct { - root interface{} + root any options *ExpandOptions cache ResolutionCache context *resolverContext } +// Resolve resolves a reference against basePath and stores the result in target. +// +// Resolve is not in charge of following references: it only resolves ref by following its URL. +// +// If the schema the ref is referring to holds nested refs, Resolve doesn't resolve them. +// +// If basePath is an empty string, ref is resolved against the root schema stored in the schemaLoader struct +func (r *schemaLoader) Resolve(ref *Ref, target any, basePath string) error { + return r.resolveRef(ref, target, basePath) +} + func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) *schemaLoader { if ref.IsRoot() || ref.HasFragmentOnly { return r @@ -113,7 +115,7 @@ func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) return basePath } -func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) error { +func (r *schemaLoader) resolveRef(ref *Ref, target any, basePath string) error { tgt := reflect.ValueOf(target) if tgt.Kind() != reflect.Ptr { return ErrResolveRefNeedsAPointer @@ -124,8 +126,8 @@ func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) } var ( - res interface{} - data interface{} + res any + data any err error ) @@ -155,10 +157,10 @@ func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) return err } } - return swag.DynamicJSONToStruct(res, target) + return jsonutils.FromDynamicJSON(res, target) } -func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) { +func (r *schemaLoader) load(refURL *url.URL) (any, url.URL, bool, error) { debugLog("loading schema from url: %s", refURL) toFetch := *refURL toFetch.Fragment = "" @@ -178,7 +180,7 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) return nil, url.URL{}, false, err } - var doc interface{} + var doc any if err := json.Unmarshal(b, &doc); err != nil { return nil, url.URL{}, false, err } @@ -197,25 +199,14 @@ func (r *schemaLoader) isCircular(ref *Ref, basePath string, parentRefs ...strin foundCycle = true return } - foundCycle = swag.ContainsStrings(parentRefs, normalizedRef) // normalized windows url's are lower cased + foundCycle = stringutils.ContainsStrings(parentRefs, normalizedRef) // normalized windows url's are lower cased if foundCycle { r.context.circulars[normalizedRef] = true } return } -// Resolve resolves a reference against basePath and stores the result in target. -// -// Resolve is not in charge of following references: it only resolves ref by following its URL. -// -// If the schema the ref is referring to holds nested refs, Resolve doesn't resolve them. -// -// If basePath is an empty string, ref is resolved against the root schema stored in the schemaLoader struct -func (r *schemaLoader) Resolve(ref *Ref, target interface{}, basePath string) error { - return r.resolveRef(ref, target, basePath) -} - -func (r *schemaLoader) deref(input interface{}, parentRefs []string, basePath string) error { +func (r *schemaLoader) deref(input any, parentRefs []string, basePath string) error { var ref *Ref switch refable := input.(type) { case *Schema: @@ -267,7 +258,7 @@ func (r *schemaLoader) shouldStopOnError(err error) bool { return false } -func (r *schemaLoader) setSchemaID(target interface{}, id, basePath string) (string, string) { +func (r *schemaLoader) setSchemaID(target any, id, basePath string) (string, string) { debugLog("schema has ID: %s", id) // handling the case when id is a folder @@ -299,7 +290,7 @@ func (r *schemaLoader) setSchemaID(target interface{}, id, basePath string) (str } func defaultSchemaLoader( - root interface{}, + root any, expandOptions *ExpandOptions, cache ResolutionCache, context *resolverContext) *schemaLoader { diff --git a/vendor/github.com/go-openapi/spec/security_scheme.go b/vendor/github.com/go-openapi/spec/security_scheme.go index 9d0bdae908..46a4a7e2f9 100644 --- a/vendor/github.com/go-openapi/spec/security_scheme.go +++ b/vendor/github.com/go-openapi/spec/security_scheme.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -18,7 +7,7 @@ import ( "encoding/json" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) const ( @@ -109,7 +98,7 @@ type SecurityScheme struct { } // JSONLookup implements an interface to customize json pointer lookup -func (s SecurityScheme) JSONLookup(token string) (interface{}, error) { +func (s SecurityScheme) JSONLookup(token string) (any, error) { if ex, ok := s.Extensions[token]; ok { return &ex, nil } @@ -158,7 +147,7 @@ func (s SecurityScheme) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2), nil + return jsonutils.ConcatJSON(b1, b2), nil } // UnmarshalJSON marshal this from JSON diff --git a/vendor/github.com/go-openapi/spec/spec.go b/vendor/github.com/go-openapi/spec/spec.go index 876aa12759..05c3fc775c 100644 --- a/vendor/github.com/go-openapi/spec/spec.go +++ b/vendor/github.com/go-openapi/spec/spec.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec diff --git a/vendor/github.com/go-openapi/spec/swagger.go b/vendor/github.com/go-openapi/spec/swagger.go index 1590fd1751..f7cd0f608c 100644 --- a/vendor/github.com/go-openapi/spec/swagger.go +++ b/vendor/github.com/go-openapi/spec/swagger.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -19,10 +8,11 @@ import ( "encoding/gob" "encoding/json" "fmt" + "slices" "strconv" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // Swagger this is the root document object for the API specification. @@ -36,7 +26,7 @@ type Swagger struct { } // JSONLookup look up a value by the json property name -func (s Swagger) JSONLookup(token string) (interface{}, error) { +func (s Swagger) JSONLookup(token string) (any, error) { if ex, ok := s.Extensions[token]; ok { return &ex, nil } @@ -54,7 +44,7 @@ func (s Swagger) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2), nil + return jsonutils.ConcatJSON(b1, b2), nil } // UnmarshalJSON unmarshals a swagger spec from json @@ -227,7 +217,7 @@ type SchemaOrBool struct { } // JSONLookup implements an interface to customize json pointer lookup -func (s SchemaOrBool) JSONLookup(token string) (interface{}, error) { +func (s SchemaOrBool) JSONLookup(token string) (any, error) { if token == "allows" { return s.Allows, nil } @@ -274,7 +264,7 @@ type SchemaOrStringArray struct { } // JSONLookup implements an interface to customize json pointer lookup -func (s SchemaOrStringArray) JSONLookup(token string) (interface{}, error) { +func (s SchemaOrStringArray) JSONLookup(token string) (any, error) { r, _, err := jsonpointer.GetForToken(s.Schema, token) return r, err } @@ -333,16 +323,11 @@ type StringOrArray []string // Contains returns true when the value is contained in the slice func (s StringOrArray) Contains(value string) bool { - for _, str := range s { - if str == value { - return true - } - } - return false + return slices.Contains(s, value) } // JSONLookup implements an interface to customize json pointer lookup -func (s SchemaOrArray) JSONLookup(token string) (interface{}, error) { +func (s SchemaOrArray) JSONLookup(token string) (any, error) { if _, err := strconv.Atoi(token); err == nil { r, _, err := jsonpointer.GetForToken(s.Schemas, token) return r, err @@ -367,7 +352,7 @@ func (s *StringOrArray) UnmarshalJSON(data []byte) error { return nil } - var single interface{} + var single any if err := json.Unmarshal(data, &single); err != nil { return err } @@ -379,7 +364,7 @@ func (s *StringOrArray) UnmarshalJSON(data []byte) error { *s = StringOrArray([]string{v}) return nil default: - return fmt.Errorf("only string or array is allowed, not %T", single) + return fmt.Errorf("only string or array is allowed, not %T: %w", single, ErrSpec) } } diff --git a/vendor/github.com/go-openapi/spec/tag.go b/vendor/github.com/go-openapi/spec/tag.go index faa3d3de1e..ae98fd985f 100644 --- a/vendor/github.com/go-openapi/spec/tag.go +++ b/vendor/github.com/go-openapi/spec/tag.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec @@ -18,7 +7,7 @@ import ( "encoding/json" "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" + "github.com/go-openapi/swag/jsonutils" ) // TagProps describe a tag entry in the top level tags section of a swagger spec @@ -28,11 +17,6 @@ type TagProps struct { ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` } -// NewTag creates a new tag -func NewTag(name, description string, externalDocs *ExternalDocumentation) Tag { - return Tag{TagProps: TagProps{Description: description, Name: name, ExternalDocs: externalDocs}} -} - // Tag allows adding meta data to a single tag that is used by the // [Operation Object](http://goo.gl/8us55a#operationObject). // It is not mandatory to have a Tag Object per tag used there. @@ -43,8 +27,13 @@ type Tag struct { TagProps } +// NewTag creates a new tag +func NewTag(name, description string, externalDocs *ExternalDocumentation) Tag { + return Tag{TagProps: TagProps{Description: description, Name: name, ExternalDocs: externalDocs}} +} + // JSONLookup implements an interface to customize json pointer lookup -func (t Tag) JSONLookup(token string) (interface{}, error) { +func (t Tag) JSONLookup(token string) (any, error) { if ex, ok := t.Extensions[token]; ok { return &ex, nil } @@ -63,7 +52,7 @@ func (t Tag) MarshalJSON() ([]byte, error) { if err != nil { return nil, err } - return swag.ConcatJSON(b1, b2), nil + return jsonutils.ConcatJSON(b1, b2), nil } // UnmarshalJSON marshal this from JSON diff --git a/vendor/github.com/go-openapi/spec/url_go19.go b/vendor/github.com/go-openapi/spec/url_go19.go index 5bdfe40bcc..8d0c81acd6 100644 --- a/vendor/github.com/go-openapi/spec/url_go19.go +++ b/vendor/github.com/go-openapi/spec/url_go19.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package spec import "net/url" diff --git a/vendor/github.com/go-openapi/spec/validations.go b/vendor/github.com/go-openapi/spec/validations.go index 6360a8ea77..4f70e30173 100644 --- a/vendor/github.com/go-openapi/spec/validations.go +++ b/vendor/github.com/go-openapi/spec/validations.go @@ -1,19 +1,22 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package spec // CommonValidations describe common JSON-schema validations type CommonValidations struct { - Maximum *float64 `json:"maximum,omitempty"` - ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` - Minimum *float64 `json:"minimum,omitempty"` - ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` - MaxLength *int64 `json:"maxLength,omitempty"` - MinLength *int64 `json:"minLength,omitempty"` - Pattern string `json:"pattern,omitempty"` - MaxItems *int64 `json:"maxItems,omitempty"` - MinItems *int64 `json:"minItems,omitempty"` - UniqueItems bool `json:"uniqueItems,omitempty"` - MultipleOf *float64 `json:"multipleOf,omitempty"` - Enum []interface{} `json:"enum,omitempty"` + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitempty"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []any `json:"enum,omitempty"` } // SetValidations defines all validations for a simple schema. @@ -37,12 +40,12 @@ func (v *CommonValidations) SetValidations(val SchemaValidations) { type clearedValidation struct { Validation string - Value interface{} + Value any } type clearedValidations []clearedValidation -func (c clearedValidations) apply(cbs []func(string, interface{})) { +func (c clearedValidations) apply(cbs []func(string, any)) { for _, cb := range cbs { for _, cleared := range c { cb(cleared.Validation, cleared.Value) @@ -53,8 +56,9 @@ func (c clearedValidations) apply(cbs []func(string, interface{})) { // ClearNumberValidations clears all number validations. // // Some callbacks may be set by the caller to capture changed values. -func (v *CommonValidations) ClearNumberValidations(cbs ...func(string, interface{})) { - done := make(clearedValidations, 0, 5) +func (v *CommonValidations) ClearNumberValidations(cbs ...func(string, any)) { + const maxNumberValidations = 5 + done := make(clearedValidations, 0, maxNumberValidations) defer func() { done.apply(cbs) }() @@ -84,8 +88,9 @@ func (v *CommonValidations) ClearNumberValidations(cbs ...func(string, interface // ClearStringValidations clears all string validations. // // Some callbacks may be set by the caller to capture changed values. -func (v *CommonValidations) ClearStringValidations(cbs ...func(string, interface{})) { - done := make(clearedValidations, 0, 3) +func (v *CommonValidations) ClearStringValidations(cbs ...func(string, any)) { + const maxStringValidations = 3 + done := make(clearedValidations, 0, maxStringValidations) defer func() { done.apply(cbs) }() @@ -107,8 +112,9 @@ func (v *CommonValidations) ClearStringValidations(cbs ...func(string, interface // ClearArrayValidations clears all array validations. // // Some callbacks may be set by the caller to capture changed values. -func (v *CommonValidations) ClearArrayValidations(cbs ...func(string, interface{})) { - done := make(clearedValidations, 0, 3) +func (v *CommonValidations) ClearArrayValidations(cbs ...func(string, any)) { + const maxArrayValidations = 3 + done := make(clearedValidations, 0, maxArrayValidations) defer func() { done.apply(cbs) }() @@ -194,8 +200,9 @@ func (v SchemaValidations) Validations() SchemaValidations { // ClearObjectValidations returns a clone of the validations with all object validations cleared. // // Some callbacks may be set by the caller to capture changed values. -func (v *SchemaValidations) ClearObjectValidations(cbs ...func(string, interface{})) { - done := make(clearedValidations, 0, 3) +func (v *SchemaValidations) ClearObjectValidations(cbs ...func(string, any)) { + const maxObjectValidations = 3 + done := make(clearedValidations, 0, maxObjectValidations) defer func() { done.apply(cbs) }() diff --git a/vendor/github.com/go-openapi/spec/xml_object.go b/vendor/github.com/go-openapi/spec/xml_object.go index 945a46703d..bf2f8f18b2 100644 --- a/vendor/github.com/go-openapi/spec/xml_object.go +++ b/vendor/github.com/go-openapi/spec/xml_object.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package spec diff --git a/vendor/github.com/go-openapi/strfmt/.golangci.yml b/vendor/github.com/go-openapi/strfmt/.golangci.yml index 22f8d21cca..1ad5adf47e 100644 --- a/vendor/github.com/go-openapi/strfmt/.golangci.yml +++ b/vendor/github.com/go-openapi/strfmt/.golangci.yml @@ -1,61 +1,75 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 45 - maligned: - suggest-new: true - dupl: - threshold: 200 - goconst: - min-len: 2 - min-occurrences: 3 - +version: "2" linters: - enable-all: true + default: all disable: - - maligned - - unparam - - lll - - gochecknoinits - - gochecknoglobals + - cyclop + - depguard + - errchkjson + - errorlint + - exhaustruct + - forcetypeassert - funlen - - godox + - gochecknoglobals + - gochecknoinits - gocognit - - whitespace - - wsl - - wrapcheck - - testpackage - - nlreturn - - gomnd - - exhaustivestruct - - goerr113 - - errorlint - - nestif - godot - - gofumpt + - godox + - gosmopolitan + - inamedparam + - intrange + - ireturn + - lll + - musttag + - nestif + - nlreturn + - nonamedreturns + - noinlineerr - paralleltest - - tparallel + - recvcheck + - testpackage - thelper - - ifshort - - exhaustruct + - tparallel + - unparam - varnamelen - - gci - - depguard - - errchkjson - - inamedparam - - nonamedreturns - - musttag - - ireturn - - forcetypeassert - - cyclop - # deprecated linters - - deadcode - - interfacer - - scopelint - - varcheck - - structcheck - - golint - - nosnakecase + - whitespace + - wrapcheck + - wsl + - wsl_v5 + settings: + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + gocyclo: + min-complexity: 45 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 diff --git a/vendor/github.com/go-openapi/strfmt/README.md b/vendor/github.com/go-openapi/strfmt/README.md index f6b39c6c56..de5afe1376 100644 --- a/vendor/github.com/go-openapi/strfmt/README.md +++ b/vendor/github.com/go-openapi/strfmt/README.md @@ -35,7 +35,7 @@ It also provides convenient extensions to go-openapi users. - mac (e.g "01:02:03:04:05:06") - rgbcolor (e.g. "rgb(100,100,100)") - ssn - - uuid, uuid3, uuid4, uuid5 + - uuid, uuid3, uuid4, uuid5, uuid7 - cidr (e.g. "192.0.2.1/24", "2001:db8:a0b:12f0::1/32") - ulid (e.g. "00000PP9HGSBSSDZ1JTEXBJ0PW", [spec](https://github.com/ulid/spec)) @@ -81,7 +81,12 @@ List of defined types: - SSN - URI - UUID -- UUID3 -- UUID4 -- UUID5 +- [UUID3](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-3) +- [UUID4](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-4) +- [UUID5](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-5) +- [UUID7](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-7) - [ULID](https://github.com/ulid/spec) + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/strfmt/bson.go b/vendor/github.com/go-openapi/strfmt/bson.go index cfa9a526fe..0eec8f6432 100644 --- a/vendor/github.com/go-openapi/strfmt/bson.go +++ b/vendor/github.com/go-openapi/strfmt/bson.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -18,9 +7,6 @@ import ( "database/sql/driver" "fmt" - "go.mongodb.org/mongo-driver/bson" - - "go.mongodb.org/mongo-driver/bson/bsontype" bsonprim "go.mongodb.org/mongo-driver/bson/primitive" ) @@ -39,10 +25,10 @@ func IsBSONObjectID(str string) bool { // ObjectId represents a BSON object ID (alias to go.mongodb.org/mongo-driver/bson/primitive.ObjectID) // // swagger:strfmt bsonobjectid -type ObjectId bsonprim.ObjectID //nolint:revive,stylecheck +type ObjectId bsonprim.ObjectID //nolint:revive // NewObjectId creates a ObjectId from a Hex String -func NewObjectId(hex string) ObjectId { //nolint:revive,stylecheck +func NewObjectId(hex string) ObjectId { //nolint:revive oid, err := bsonprim.ObjectIDFromHex(hex) if err != nil { panic(err) @@ -75,7 +61,7 @@ func (id *ObjectId) UnmarshalText(data []byte) error { // validation is performe } // Scan read a value from a database driver -func (id *ObjectId) Scan(raw interface{}) error { +func (id *ObjectId) Scan(raw any) error { var data []byte switch v := raw.(type) { case []byte: @@ -83,7 +69,7 @@ func (id *ObjectId) Scan(raw interface{}) error { case string: data = []byte(v) default: - return fmt.Errorf("cannot sql.Scan() strfmt.URI from: %#v", v) + return fmt.Errorf("cannot sql.Scan() strfmt.URI from: %#v: %w", v, ErrFormat) } return id.UnmarshalText(data) @@ -113,42 +99,6 @@ func (id *ObjectId) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON renders the object id as a BSON document -func (id ObjectId) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": bsonprim.ObjectID(id)}) -} - -// UnmarshalBSON reads the objectId from a BSON document -func (id *ObjectId) UnmarshalBSON(data []byte) error { - var obj struct { - Data bsonprim.ObjectID - } - if err := bson.Unmarshal(data, &obj); err != nil { - return err - } - *id = ObjectId(obj.Data) - return nil -} - -// MarshalBSONValue is an interface implemented by types that can marshal themselves -// into a BSON document represented as bytes. The bytes returned must be a valid -// BSON document if the error is nil. -func (id ObjectId) MarshalBSONValue() (bsontype.Type, []byte, error) { - oid := bsonprim.ObjectID(id) - return bson.TypeObjectID, oid[:], nil -} - -// UnmarshalBSONValue is an interface implemented by types that can unmarshal a -// BSON value representation of themselves. The BSON bytes and type can be -// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it -// wishes to retain the data after returning. -func (id *ObjectId) UnmarshalBSONValue(_ bsontype.Type, data []byte) error { - var oid bsonprim.ObjectID - copy(oid[:], data) - *id = ObjectId(oid) - return nil -} - // DeepCopyInto copies the receiver and writes its value into out. func (id *ObjectId) DeepCopyInto(out *ObjectId) { *out = *id diff --git a/vendor/github.com/go-openapi/strfmt/date.go b/vendor/github.com/go-openapi/strfmt/date.go index 3c93381c7c..8aa17b8ea5 100644 --- a/vendor/github.com/go-openapi/strfmt/date.go +++ b/vendor/github.com/go-openapi/strfmt/date.go @@ -1,27 +1,13 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt import ( "database/sql/driver" "encoding/json" - "errors" "fmt" "time" - - "go.mongodb.org/mongo-driver/bson" ) func init() { @@ -71,7 +57,7 @@ func (d Date) MarshalText() ([]byte, error) { } // Scan scans a Date value from database driver type. -func (d *Date) Scan(raw interface{}) error { +func (d *Date) Scan(raw any) error { switch v := raw.(type) { case []byte: return d.UnmarshalText(v) @@ -84,7 +70,7 @@ func (d *Date) Scan(raw interface{}) error { *d = Date{} return nil default: - return fmt.Errorf("cannot sql.Scan() strfmt.Date from: %#v", v) + return fmt.Errorf("cannot sql.Scan() strfmt.Date from: %#v: %w", v, ErrFormat) } } @@ -115,28 +101,6 @@ func (d *Date) UnmarshalJSON(data []byte) error { return nil } -func (d Date) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": d.String()}) -} - -func (d *Date) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if data, ok := m["data"].(string); ok { - rd, err := time.ParseInLocation(RFC3339FullDate, data, DefaultTimeLocation) - if err != nil { - return err - } - *d = Date(rd) - return nil - } - - return errors.New("couldn't unmarshal bson bytes value as Date") -} - // DeepCopyInto copies the receiver and writes its value into out. func (d *Date) DeepCopyInto(out *Date) { *out = *d diff --git a/vendor/github.com/go-openapi/strfmt/default.go b/vendor/github.com/go-openapi/strfmt/default.go index 2813714060..8a80cfbdb8 100644 --- a/vendor/github.com/go-openapi/strfmt/default.go +++ b/vendor/github.com/go-openapi/strfmt/default.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -18,46 +7,24 @@ import ( "database/sql/driver" "encoding/base64" "encoding/json" - "errors" "fmt" + "net" "net/mail" + "net/netip" + "net/url" "regexp" + "strconv" "strings" - "github.com/asaskevich/govalidator" "github.com/google/uuid" - "go.mongodb.org/mongo-driver/bson" + "golang.org/x/net/idna" ) const ( - // HostnamePattern http://json-schema.org/latest/json-schema-validation.html#anchor114 - // A string instance is valid against this attribute if it is a valid - // representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - // http://tools.ietf.org/html/rfc1034#section-3.5 - // ::= any one of the ten digits 0 through 9 - // var digit = /[0-9]/; - // ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case - // var letter = /[a-zA-Z]/; - // ::= | - // var letDig = /[0-9a-zA-Z]/; - // ::= | "-" - // var letDigHyp = /[-0-9a-zA-Z]/; - // ::= | - // var ldhStr = /[-0-9a-zA-Z]+/; - //