From 4bbbaf80afb15816e0b3c9dd09b5f518c55590df Mon Sep 17 00:00:00 2001 From: Phani Raj Date: Mon, 1 Aug 2022 15:22:55 -0500 Subject: [PATCH 1/2] Add support for generating ISO 8601 timestamp values --- cmd/internal/planetscale_edge_database.go | 14 +++++++++++++- cmd/internal/planetscale_edge_mysql.go | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cmd/internal/planetscale_edge_database.go b/cmd/internal/planetscale_edge_database.go index 500e3d3..56f5746 100644 --- a/cmd/internal/planetscale_edge_database.go +++ b/cmd/internal/planetscale_edge_database.go @@ -265,7 +265,11 @@ func (p PlanetScaleEdgeDatabase) printQueryResult(qr *sqltypes.Result, s Stream) for selectedProperty := range s.Schema.Properties { subset[selectedProperty] = datum[selectedProperty] if len(s.Schema.Properties[selectedProperty].CustomFormat) > 0 { - subset[selectedProperty] = datum[selectedProperty].(sqltypes.Value).ToString() + if s.Schema.Properties[selectedProperty].CustomFormat == "date-time" { + subset[selectedProperty] = getISOTimeStamp(datum[selectedProperty].(sqltypes.Value).ToString()) + } else { + subset[selectedProperty] = datum[selectedProperty].(sqltypes.Value).ToString() + } } } record := NewRecord() @@ -274,3 +278,11 @@ func (p PlanetScaleEdgeDatabase) printQueryResult(qr *sqltypes.Result, s Stream) p.Logger.Record(record, s) } } + +func getISOTimeStamp(value string) string { + p, err := time.Parse("2006-01-02 15:04:05", value) + if err != nil { + return "" + } + return p.Format(time.RFC3339) +} diff --git a/cmd/internal/planetscale_edge_mysql.go b/cmd/internal/planetscale_edge_mysql.go index 19cbf2c..4ac9bf3 100644 --- a/cmd/internal/planetscale_edge_mysql.go +++ b/cmd/internal/planetscale_edge_mysql.go @@ -214,6 +214,8 @@ func getJsonSchemaType(mysqlType string) StreamProperty { switch mysqlType { case "tinyint(1)": return StreamProperty{Types: []string{"null", "boolean"}} + case "double": + return StreamProperty{Types: []string{"null", "number"}} case "date": return StreamProperty{Types: []string{"null", "string"}} case "datetime", "timestamp": From 29eeaa3ad4d5504baebcd45981d7c5fdb7d77a11 Mon Sep 17 00:00:00 2001 From: Phani Raj Date: Mon, 1 Aug 2022 15:30:46 -0500 Subject: [PATCH 2/2] Add serialization test --- .../planetscale_edge_database_test.go | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/cmd/internal/planetscale_edge_database_test.go b/cmd/internal/planetscale_edge_database_test.go index ab8a2a9..3e49c84 100644 --- a/cmd/internal/planetscale_edge_database_test.go +++ b/cmd/internal/planetscale_edge_database_test.go @@ -4,10 +4,12 @@ import ( "bytes" "context" "fmt" + "testing" + "time" + psdbconnect "github.com/planetscale/airbyte-source/proto/psdbconnect/v1alpha1" "github.com/stretchr/testify/assert" "google.golang.org/grpc" - "testing" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/proto/query" ) @@ -446,10 +448,10 @@ func TestRead_CanLogResults(t *testing.T) { result := []*query.QueryResult{ sqltypes.ResultToProto3(sqltypes.MakeTestResult(sqltypes.MakeTestFields( - "pid|description", - "int64|varbinary"), - "1|keyboard", - "2|monitor", + "pid|description|timestamp", + "int64|varbinary|timestamp"), + "1|keyboard|2006-01-02 15:04:05", + "2|monitor|2006-01-02 15:04:05", )), } @@ -482,6 +484,10 @@ func TestRead_CanLogResults(t *testing.T) { "description": { Types: []string{"null", "string"}, }, + "timestamp": { + Types: []string{"null", "string"}, + CustomFormat: "date-time", + }, }, }, Metadata: MetadataCollection{ @@ -503,6 +509,12 @@ func TestRead_CanLogResults(t *testing.T) { BreadCrumb: []string{"properties", "description"}, }, }, + Metadata{ + Metadata: NodeMetadata{ + Selected: true, + BreadCrumb: []string{"properties", "timestamp"}, + }, + }, }, } sc, err := ped.Read(context.Background(), ps, cs, tc) @@ -515,6 +527,10 @@ func TestRead_CanLogResults(t *testing.T) { for _, r := range records { id, err := r.Data["pid"].(sqltypes.Value).ToInt64() assert.NoError(t, err) + + _, err = time.Parse(time.RFC3339, r.Data["timestamp"].(string)) + assert.NoError(t, err, "should print timestamp as ISO 8601/RFC3339 values") + if id == 1 { assert.False(t, keyboardFound, "should not find keyboard twice") keyboardFound = true