| /* |
| 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" |
| "strconv" |
| "time" |
| |
| "cloud.google.com/go/civil" |
| proto3 "github.com/golang/protobuf/ptypes/struct" |
| sppb "google.golang.org/genproto/googleapis/spanner/v1" |
| ) |
| |
| // 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 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 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 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}} |
| } |