vitess.io/vitess@v0.16.2/go/vt/vitessdriver/rows.go (about) 1 /* 2 Copyright 2019 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package vitessdriver 18 19 import ( 20 "database/sql" 21 "database/sql/driver" 22 "io" 23 "reflect" 24 "time" 25 26 "vitess.io/vitess/go/sqltypes" 27 "vitess.io/vitess/go/vt/proto/query" 28 ) 29 30 // rows creates a database/sql/driver compliant Row iterator 31 // for a non-streaming QueryResult. 32 type rows struct { 33 convert *converter 34 qr *sqltypes.Result 35 index int 36 } 37 38 // newRows creates a new rows from qr. 39 func newRows(qr *sqltypes.Result, c *converter) driver.Rows { 40 return &rows{qr: qr, convert: c} 41 } 42 43 func (ri *rows) Columns() []string { 44 cols := make([]string, 0, len(ri.qr.Fields)) 45 for _, field := range ri.qr.Fields { 46 cols = append(cols, field.Name) 47 } 48 return cols 49 } 50 51 func (ri *rows) Close() error { 52 return nil 53 } 54 55 func (ri *rows) Next(dest []driver.Value) error { 56 if ri.index == len(ri.qr.Rows) { 57 return io.EOF 58 } 59 if err := ri.convert.populateRow(dest, ri.qr.Rows[ri.index]); err != nil { 60 return err 61 } 62 ri.index++ 63 return nil 64 } 65 66 var ( 67 typeInt8 = reflect.TypeOf(int8(0)) 68 typeUint8 = reflect.TypeOf(uint8(0)) 69 typeInt16 = reflect.TypeOf(int16(0)) 70 typeUint16 = reflect.TypeOf(uint16(0)) 71 typeInt32 = reflect.TypeOf(int32(0)) 72 typeUint32 = reflect.TypeOf(uint32(0)) 73 typeInt64 = reflect.TypeOf(int64(0)) 74 typeUint64 = reflect.TypeOf(uint64(0)) 75 typeFloat32 = reflect.TypeOf(float32(0)) 76 typeFloat64 = reflect.TypeOf(float64(0)) 77 typeRawBytes = reflect.TypeOf(sql.RawBytes{}) 78 typeTime = reflect.TypeOf(time.Time{}) 79 typeUnknown = reflect.TypeOf(new(interface{})) 80 ) 81 82 // Implements the RowsColumnTypeScanType interface 83 func (ri *rows) ColumnTypeScanType(index int) reflect.Type { 84 field := ri.qr.Fields[index] 85 switch field.GetType() { 86 case query.Type_INT8: 87 return typeInt8 88 case query.Type_UINT8: 89 return typeUint8 90 case query.Type_INT16, query.Type_YEAR: 91 return typeInt16 92 case query.Type_UINT16: 93 return typeUint16 94 case query.Type_INT24: 95 return typeInt32 96 case query.Type_UINT24: // no 24 bit type, using 32 instead 97 return typeUint32 98 case query.Type_INT32: 99 return typeInt32 100 case query.Type_UINT32: 101 return typeUint32 102 case query.Type_INT64: 103 return typeInt64 104 case query.Type_UINT64: 105 return typeUint64 106 case query.Type_FLOAT32: 107 return typeFloat32 108 case query.Type_FLOAT64: 109 return typeFloat64 110 case query.Type_TIMESTAMP, query.Type_DECIMAL, query.Type_VARCHAR, query.Type_TEXT, 111 query.Type_BLOB, query.Type_VARBINARY, query.Type_CHAR, query.Type_BINARY, query.Type_BIT, 112 query.Type_ENUM, query.Type_SET, query.Type_TUPLE, query.Type_GEOMETRY, query.Type_JSON, 113 query.Type_HEXNUM, query.Type_HEXVAL, query.Type_BITNUM: 114 115 return typeRawBytes 116 case query.Type_DATE, query.Type_TIME, query.Type_DATETIME: 117 return typeTime 118 default: 119 return typeUnknown 120 } 121 }