ipv6.go 770 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package column
  2. import (
  3. "net"
  4. "github.com/ClickHouse/clickhouse-go/lib/binary"
  5. )
  6. type IPv6 struct {
  7. base
  8. }
  9. func (*IPv6) Read(decoder *binary.Decoder, isNull bool) (interface{}, error) {
  10. v, err := decoder.Fixed(16)
  11. if err != nil {
  12. return nil, err
  13. }
  14. return net.IP(v), nil
  15. }
  16. func (ip *IPv6) Write(encoder *binary.Encoder, v interface{}) error {
  17. var netIP net.IP
  18. switch v.(type) {
  19. case string:
  20. netIP = net.ParseIP(v.(string))
  21. case net.IP:
  22. netIP = v.(net.IP)
  23. case *net.IP:
  24. netIP = *(v.(*net.IP))
  25. default:
  26. return &ErrUnexpectedType{
  27. T: v,
  28. Column: ip,
  29. }
  30. }
  31. if netIP == nil {
  32. return &ErrUnexpectedType{
  33. T: v,
  34. Column: ip,
  35. }
  36. }
  37. if _, err := encoder.Write([]byte(netIP.To16())); err != nil {
  38. return err
  39. }
  40. return nil
  41. }