2015-11-10 10:11:15 +03:00
|
|
|
// Copyright 2015, Google Inc. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package sqltypes
|
|
|
|
|
2015-11-12 11:13:54 +03:00
|
|
|
import querypb "github.com/youtube/vitess/go/vt/proto/query"
|
2015-11-10 10:11:15 +03:00
|
|
|
|
|
|
|
// This file contains the proto3 conversion functions for the structures
|
|
|
|
// defined here.
|
|
|
|
|
|
|
|
// RowsToProto3 converts [][]Value to proto3.
|
2015-11-12 11:13:54 +03:00
|
|
|
func RowsToProto3(rows [][]Value) []*querypb.Row {
|
2015-11-10 10:11:15 +03:00
|
|
|
if len(rows) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-11-12 11:13:54 +03:00
|
|
|
result := make([]*querypb.Row, len(rows))
|
2015-11-10 10:11:15 +03:00
|
|
|
for i, r := range rows {
|
2015-11-12 11:13:54 +03:00
|
|
|
row := &querypb.Row{}
|
2015-11-10 10:11:15 +03:00
|
|
|
result[i] = row
|
|
|
|
row.Lengths = make([]int64, 0, len(r))
|
|
|
|
total := 0
|
|
|
|
for _, c := range r {
|
|
|
|
if c.IsNull() {
|
|
|
|
row.Lengths = append(row.Lengths, -1)
|
|
|
|
continue
|
|
|
|
}
|
2015-11-17 23:59:45 +03:00
|
|
|
length := c.Len()
|
2015-11-10 10:11:15 +03:00
|
|
|
row.Lengths = append(row.Lengths, int64(length))
|
|
|
|
total += length
|
|
|
|
}
|
|
|
|
row.Values = make([]byte, 0, total)
|
|
|
|
for _, c := range r {
|
|
|
|
if c.IsNull() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
row.Values = append(row.Values, c.Raw()...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2015-11-17 23:59:45 +03:00
|
|
|
// proto3ToRows converts a proto3 rows to [][]Value. The function is private
|
|
|
|
// because it uses the trusted API.
|
|
|
|
func proto3ToRows(fields []*querypb.Field, rows []*querypb.Row) [][]Value {
|
2015-11-10 10:11:15 +03:00
|
|
|
if len(rows) == 0 {
|
2015-11-17 23:59:45 +03:00
|
|
|
return nil
|
2015-11-10 10:11:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
result := make([][]Value, len(rows))
|
|
|
|
for i, r := range rows {
|
2015-11-17 23:59:45 +03:00
|
|
|
result[i] = MakeRowTrusted(fields, r)
|
2015-11-10 10:11:15 +03:00
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
// ResultToProto3 converts Result to proto3.
|
2015-11-12 11:13:54 +03:00
|
|
|
func ResultToProto3(qr *Result) *querypb.QueryResult {
|
2015-11-10 10:11:15 +03:00
|
|
|
if qr == nil {
|
|
|
|
return nil
|
|
|
|
}
|
2015-11-12 11:13:54 +03:00
|
|
|
return &querypb.QueryResult{
|
2015-11-10 10:11:15 +03:00
|
|
|
Fields: qr.Fields,
|
|
|
|
RowsAffected: qr.RowsAffected,
|
|
|
|
InsertId: qr.InsertID,
|
|
|
|
Rows: RowsToProto3(qr.Rows),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-17 23:59:45 +03:00
|
|
|
// Proto3ToResult converts a proto3 Result to an internal data structure. This function
|
2015-11-18 02:15:10 +03:00
|
|
|
// should be used only if the field info is populated in qr.
|
|
|
|
func Proto3ToResult(qr *querypb.QueryResult) *Result {
|
|
|
|
if qr == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &Result{
|
|
|
|
Fields: qr.Fields,
|
|
|
|
RowsAffected: qr.RowsAffected,
|
|
|
|
InsertID: qr.InsertId,
|
|
|
|
Rows: proto3ToRows(qr.Fields, qr.Rows),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// CustomProto3ToResult converts a proto3 Result to an internal data structure. This function
|
2015-11-17 23:59:45 +03:00
|
|
|
// takes a separate fields input because not all QueryResults contain the field info.
|
|
|
|
// In particular, only the first packet of streaming queries contain the field info.
|
2015-11-18 02:15:10 +03:00
|
|
|
func CustomProto3ToResult(fields []*querypb.Field, qr *querypb.QueryResult) *Result {
|
2015-11-10 10:11:15 +03:00
|
|
|
if qr == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &Result{
|
|
|
|
Fields: qr.Fields,
|
|
|
|
RowsAffected: qr.RowsAffected,
|
|
|
|
InsertID: qr.InsertId,
|
2015-11-17 23:59:45 +03:00
|
|
|
Rows: proto3ToRows(fields, qr.Rows),
|
2015-11-10 10:11:15 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-17 23:59:45 +03:00
|
|
|
// ResultsToProto3 converts []Result to proto3.
|
|
|
|
func ResultsToProto3(qr []Result) []*querypb.QueryResult {
|
|
|
|
if len(qr) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
result := make([]*querypb.QueryResult, len(qr))
|
|
|
|
for i, q := range qr {
|
|
|
|
result[i] = ResultToProto3(&q)
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2015-11-10 10:11:15 +03:00
|
|
|
// Proto3ToResults converts proto3 results to []Result.
|
2015-11-12 11:13:54 +03:00
|
|
|
func Proto3ToResults(qr []*querypb.QueryResult) []Result {
|
2015-11-10 10:11:15 +03:00
|
|
|
if len(qr) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
result := make([]Result, len(qr))
|
|
|
|
for i, q := range qr {
|
2015-11-18 02:15:10 +03:00
|
|
|
result[i] = *Proto3ToResult(q)
|
2015-11-10 10:11:15 +03:00
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|