mirror of
https://github.com/uptrace/go-clickhouse.git
synced 2025-06-08 23:26:11 +02:00
57 lines
992 B
Go
57 lines
992 B
Go
|
package ch
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
|
||
|
"github.com/uptrace/go-clickhouse/ch/chschema"
|
||
|
)
|
||
|
|
||
|
type columnarModel struct {
|
||
|
columnar bool
|
||
|
}
|
||
|
|
||
|
func (m *columnarModel) SetColumnar(on bool) {
|
||
|
m.columnar = on
|
||
|
}
|
||
|
|
||
|
type scanModel struct {
|
||
|
columnarModel
|
||
|
values []reflect.Value
|
||
|
}
|
||
|
|
||
|
var _ Model = (*scanModel)(nil)
|
||
|
|
||
|
func (m *scanModel) UseQueryRow() bool {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func (m *scanModel) ScanBlock(block *chschema.Block) error {
|
||
|
if block.NumRow == 0 {
|
||
|
return nil
|
||
|
}
|
||
|
if block.NumColumn != len(m.values) {
|
||
|
return fmt.Errorf("ch: got %d columns, but Scan has %d values",
|
||
|
block.NumColumn, len(m.values))
|
||
|
}
|
||
|
|
||
|
if m.columnar {
|
||
|
for i, col := range block.Columns {
|
||
|
v := m.values[i]
|
||
|
if v.Kind() == reflect.Interface {
|
||
|
v.Set(reflect.ValueOf(col.Value()))
|
||
|
} else {
|
||
|
v.Set(reflect.AppendSlice(v, reflect.ValueOf(col.Value())))
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
for i, col := range block.Columns {
|
||
|
if err := col.ConvertAssign(0, m.values[i]); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|