169 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package column
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"reflect"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/kshvakov/clickhouse/lib/binary"
 | |
| )
 | |
| 
 | |
| type Column interface {
 | |
| 	Name() string
 | |
| 	CHType() string
 | |
| 	ScanType() reflect.Type
 | |
| 	Read(*binary.Decoder) (interface{}, error)
 | |
| 	Write(*binary.Encoder, interface{}) error
 | |
| 	defaultValue() interface{}
 | |
| }
 | |
| 
 | |
| func Factory(name, chType string, timezone *time.Location) (Column, error) {
 | |
| 	switch chType {
 | |
| 	case "Int8":
 | |
| 		return &Int8{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[int8(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "Int16":
 | |
| 		return &Int16{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[int16(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "Int32":
 | |
| 		return &Int32{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[int32(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "Int64":
 | |
| 		return &Int64{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[int64(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "UInt8":
 | |
| 		return &UInt8{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[uint8(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "UInt16":
 | |
| 		return &UInt16{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[uint16(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "UInt32":
 | |
| 		return &UInt32{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[uint32(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "UInt64":
 | |
| 		return &UInt64{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[uint64(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "Float32":
 | |
| 		return &Float32{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[float32(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "Float64":
 | |
| 		return &Float64{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[float64(0)],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "String":
 | |
| 		return &String{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[string("")],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "UUID":
 | |
| 		return &UUID{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[string("")],
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "Date":
 | |
| 		_, offset := time.Unix(0, 0).In(timezone).Zone()
 | |
| 		return &Date{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[time.Time{}],
 | |
| 			},
 | |
| 			Timezone: timezone,
 | |
| 			offset:   int64(offset),
 | |
| 		}, nil
 | |
| 	case "DateTime":
 | |
| 		return &DateTime{
 | |
| 			base: base{
 | |
| 				name:    name,
 | |
| 				chType:  chType,
 | |
| 				valueOf: baseTypes[time.Time{}],
 | |
| 			},
 | |
| 			Timezone: timezone,
 | |
| 		}, nil
 | |
| 	case "IPv4":
 | |
| 		return &IPv4{
 | |
| 			base: base{
 | |
| 				name:   name,
 | |
| 				chType: chType,
 | |
| 			},
 | |
| 		}, nil
 | |
| 	case "IPv6":
 | |
| 		return &IPv6{
 | |
| 			base: base{
 | |
| 				name:   name,
 | |
| 				chType: chType,
 | |
| 			},
 | |
| 		}, nil
 | |
| 	}
 | |
| 
 | |
| 	switch {
 | |
| 	case strings.HasPrefix(chType, "Array"):
 | |
| 		return parseArray(name, chType, timezone)
 | |
| 	case strings.HasPrefix(chType, "Nullable"):
 | |
| 		return parseNullable(name, chType, timezone)
 | |
| 	case strings.HasPrefix(chType, "FixedString"):
 | |
| 		return parseFixedString(name, chType)
 | |
| 	case strings.HasPrefix(chType, "Enum8"), strings.HasPrefix(chType, "Enum16"):
 | |
| 		return parseEnum(name, chType)
 | |
| 	case strings.HasPrefix(chType, "Decimal"):
 | |
| 		return parseDecimal(name, chType)
 | |
| 	}
 | |
| 	return nil, fmt.Errorf("column: unhandled type %v", chType)
 | |
| }
 |