This is an automated email from the ASF dual-hosted git repository.

miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new 7fc4746  fix(pitr): fix pitr restore metadata failed
     new eb4dbf8  Merge pull request #365 from Xu-Wentao/pitr
7fc4746 is described below

commit 7fc4746fe445ae43c5c2371130edb202015c6d8c
Author: xuwentao <[email protected]>
AuthorDate: Tue May 16 18:40:20 2023 +0800

    fix(pitr): fix pitr restore metadata failed
---
 .gitignore                                         |  2 +
 pitr/cli/go.mod                                    |  1 +
 pitr/cli/go.sum                                    |  2 +
 pitr/cli/internal/pkg/shardingsphere-proxy.go      |  9 +++-
 pitr/cli/internal/pkg/shardingsphere-proxy_test.go | 62 ++++++++++++++++++++++
 5 files changed, 74 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
index b379e5e..2e6c123 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,3 +38,5 @@ pitr/agent/agent
 pitr/agent/vendor/
 pitr/cli/vendor/
 pitr/cli/gs_pitr
+pitr/agent/pitr-agent
+
diff --git a/pitr/cli/go.mod b/pitr/cli/go.mod
index 8d5a5f2..45b52cf 100644
--- a/pitr/cli/go.mod
+++ b/pitr/cli/go.mod
@@ -5,6 +5,7 @@ go 1.20
 require (
        bou.ke/monkey v1.0.2
        gitee.com/opengauss/openGauss-connector-go-pq v1.0.4
+       github.com/DATA-DOG/go-sqlmock v1.5.0
        github.com/golang/mock v1.6.0
        github.com/google/uuid v1.3.0
        github.com/jedib0t/go-pretty/v6 v6.4.6
diff --git a/pitr/cli/go.sum b/pitr/cli/go.sum
index c85685e..329499b 100644
--- a/pitr/cli/go.sum
+++ b/pitr/cli/go.sum
@@ -4,6 +4,8 @@ cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
 gitee.com/opengauss/openGauss-connector-go-pq v1.0.4 
h1:npfLM9/QpkmdK+XY9X2pcC2EX5gosyn/6dRDRd2sEJs=
 gitee.com/opengauss/openGauss-connector-go-pq v1.0.4/go.mod 
h1:2UEp+ug6ls6C0pLfZgBn7VBzBntFUzxJuy+6FlQ7qyI=
 github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DATA-DOG/go-sqlmock v1.5.0 
h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
+github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod 
h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/benbjohnson/clock v1.1.0 
h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/chzyer/logex v1.1.10/go.mod 
h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
diff --git a/pitr/cli/internal/pkg/shardingsphere-proxy.go 
b/pitr/cli/internal/pkg/shardingsphere-proxy.go
index d66a4de..a688da4 100644
--- a/pitr/cli/internal/pkg/shardingsphere-proxy.go
+++ b/pitr/cli/internal/pkg/shardingsphere-proxy.go
@@ -19,6 +19,7 @@ package pkg
 
 import (
        "database/sql"
+       "encoding/base64"
        "encoding/json"
        "fmt"
 
@@ -122,7 +123,11 @@ func (ss *shardingSphereProxy) ExportMetaData() 
(*model.ClusterInfo, error) {
        }
 
        var out model.ClusterInfo
-       if err = json.Unmarshal([]byte(data), &out); err != nil {
+       rawDecodedText, err := base64.StdEncoding.DecodeString(data)
+       if err != nil {
+               return nil, fmt.Errorf("base64 decode return err=%s", err)
+       }
+       if err = json.Unmarshal(rawDecodedText, &out); err != nil {
                return nil, fmt.Errorf("json unmarshal return err=%s", err)
        }
 
@@ -203,7 +208,7 @@ func (ss *shardingSphereProxy) ImportMetaData(in 
*model.ClusterInfo) error {
                return xerr.NewCliErr(fmt.Sprintf("json marshal,invalid 
data[in=%+v]", in))
        }
 
-       _, err = ss.db.Exec(fmt.Sprintf(`IMPORT METADATA '%s';`, marshal))
+       _, err = ss.db.Exec(fmt.Sprintf(`IMPORT METADATA '%s';`, 
base64.StdEncoding.EncodeToString(marshal)))
        if err != nil {
                return xerr.NewCliErr(fmt.Sprintf("import metadata 
failure,err=%s", err))
        }
diff --git a/pitr/cli/internal/pkg/shardingsphere-proxy_test.go 
b/pitr/cli/internal/pkg/shardingsphere-proxy_test.go
index d949161..a4e26fd 100644
--- a/pitr/cli/internal/pkg/shardingsphere-proxy_test.go
+++ b/pitr/cli/internal/pkg/shardingsphere-proxy_test.go
@@ -18,13 +18,75 @@
 package pkg
 
 import (
+       "bou.ke/monkey"
+       "database/sql"
+       "encoding/base64"
+       "encoding/json"
        "fmt"
+       "github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model"
+       "github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/gsutil"
+       "regexp"
        "time"
 
+       "github.com/DATA-DOG/go-sqlmock"
        . "github.com/onsi/ginkgo/v2"
        . "github.com/onsi/gomega"
 )
 
+var _ = Describe("Test ShardingSphere Proxy With Sqlmock", func() {
+       var (
+               db     *sql.DB
+               dbmock sqlmock.Sqlmock
+               err    error
+               proxy  IShardingSphereProxy
+
+               clusterInfo = &model.ClusterInfo{
+                       SnapshotInfo: &model.SnapshotInfo{
+                               Csn:        "100",
+                               CreateTime: "2023-05-16 18:12:20",
+                       },
+                       MetaData: model.MetaData{
+                               Databases: map[string]string{
+                                       "sharding_db": "sharding_db",
+                               },
+                       },
+               }
+       )
+       BeforeEach(func() {
+               db, dbmock, err = sqlmock.New()
+               Expect(err).ShouldNot(HaveOccurred())
+               Expect(db).ShouldNot(BeNil())
+               Expect(dbmock).ShouldNot(BeNil())
+               monkey.Patch(gsutil.Open, func(_, _, _, _ string, _ uint16) 
(*sql.DB, error) {
+                       return db, nil
+               })
+
+               proxy, err = NewShardingSphereProxy("root", "root", 
"opengauss", "localhost", 13308)
+               Expect(err).To(BeNil())
+       })
+       AfterEach(func() {
+               db.Close()
+       })
+
+       It("export metadata", func() {
+               data, err := json.Marshal(clusterInfo)
+               Expect(err).To(BeNil())
+               encodedData := base64.StdEncoding.EncodeToString(data)
+
+               dbmock.ExpectQuery(regexp.QuoteMeta("EXPORT 
METADATA;")).WillReturnRows(sqlmock.NewRows([]string{"id", "create_time", 
"data"}).AddRow("id", "2023-05-16", encodedData))
+               clusterInfo, err := proxy.ExportMetaData()
+               Expect(err).To(BeNil())
+               Expect(clusterInfo).NotTo(BeNil())
+               Expect(clusterInfo.SnapshotInfo.Csn).To(Equal("100"))
+       })
+
+       It("import metadata", func() {
+               dbmock.ExpectExec(regexp.QuoteMeta("IMPORT 
METADATA")).WillReturnResult(sqlmock.NewResult(1, 1))
+               Expect(proxy.ImportMetaData(clusterInfo)).To(BeNil())
+       })
+
+})
+
 var _ = Describe("IShardingSphereProxy", func() {
        Context("NewShardingSphereProxy", func() {
                var (

Reply via email to