ipv4.go 912 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package column
  2. import (
  3. "net"
  4. "github.com/ClickHouse/clickhouse-go/lib/binary"
  5. )
  6. type IPv4 struct {
  7. base
  8. }
  9. func (*IPv4) Read(decoder *binary.Decoder, isNull bool) (interface{}, error) {
  10. v, err := decoder.Fixed(4)
  11. if err != nil {
  12. return nil, err
  13. }
  14. return net.IPv4(v[3], v[2], v[1], v[0]), nil
  15. }
  16. func (ip *IPv4) 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. ip4 := netIP.To4()
  38. if ip4 == nil {
  39. return &ErrUnexpectedType{
  40. T: v,
  41. Column: ip,
  42. }
  43. }
  44. if _, err := encoder.Write([]byte{ip4[3], ip4[2], ip4[1], ip4[0]}); err != nil {
  45. return err
  46. }
  47. return nil
  48. }