From ccd63b77aed8fb7c349c68dff6b83943f5ad7bd0 Mon Sep 17 00:00:00 2001 From: Hengfeng Li Date: Thu, 19 Mar 2020 11:14:14 +1100 Subject: [PATCH] spanner: fix the regex issue in manging backups. Change-Id: Iba445586c15b5499022c6df1e796c254acb9f4e9 Reviewed-on: https://code-review.googlesource.com/c/gocloud/+/53531 Reviewed-by: kokoro Reviewed-by: David Symonds --- spanner/admin/database/apiv1/backup.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/spanner/admin/database/apiv1/backup.go b/spanner/admin/database/apiv1/backup.go index 5b54969c4d32..89aa48aa0819 100644 --- a/spanner/admin/database/apiv1/backup.go +++ b/spanner/admin/database/apiv1/backup.go @@ -19,7 +19,6 @@ import ( "context" "fmt" "regexp" - "strings" "time" pbt "github.com/golang/protobuf/ptypes/timestamp" @@ -27,6 +26,10 @@ import ( databasepb "google.golang.org/genproto/googleapis/spanner/admin/database/v1" ) +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. @@ -39,17 +42,15 @@ import ( // 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) { - // Validate database path. - pattern := regexp.MustCompile("^projects/(?P[^/]+)/instances/(?P[^/]+)/databases/(?P[^/]+)$") - if matched := pattern.MatchString(databasePath); !matched { + m := validDBPattern.FindStringSubmatch(databasePath) + if m == nil { return nil, fmt.Errorf("database name %q should conform to pattern %q", - databasePath, pattern.String()) + databasePath, validDBPattern) } ts := &pbt.Timestamp{Seconds: expireTime.Unix(), Nanos: int32(expireTime.Nanosecond())} - parts := strings.Split(databasePath, "/") // Create request from parameters. req := &databasepb.CreateBackupRequest{ - Parent: fmt.Sprintf("projects/%s/instances/%s", parts[1], parts[3]), + Parent: fmt.Sprintf("projects/%s/instances/%s", m[1], m[2]), BackupId: backupID, Backup: &databasepb.Backup{ Database: databasePath,