55 lines
912 B
Go
55 lines
912 B
Go
package column
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/ClickHouse/clickhouse-go/lib/binary"
|
|
)
|
|
|
|
type IPv4 struct {
|
|
base
|
|
}
|
|
|
|
func (*IPv4) Read(decoder *binary.Decoder, isNull bool) (interface{}, error) {
|
|
v, err := decoder.Fixed(4)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return net.IPv4(v[3], v[2], v[1], v[0]), nil
|
|
}
|
|
|
|
func (ip *IPv4) Write(encoder *binary.Encoder, v interface{}) error {
|
|
var netIP net.IP
|
|
switch v.(type) {
|
|
case string:
|
|
netIP = net.ParseIP(v.(string))
|
|
case net.IP:
|
|
netIP = v.(net.IP)
|
|
case *net.IP:
|
|
netIP = *(v.(*net.IP))
|
|
default:
|
|
return &ErrUnexpectedType{
|
|
T: v,
|
|
Column: ip,
|
|
}
|
|
}
|
|
|
|
if netIP == nil {
|
|
return &ErrUnexpectedType{
|
|
T: v,
|
|
Column: ip,
|
|
}
|
|
}
|
|
ip4 := netIP.To4()
|
|
if ip4 == nil {
|
|
return &ErrUnexpectedType{
|
|
T: v,
|
|
Column: ip,
|
|
}
|
|
}
|
|
if _, err := encoder.Write([]byte{ip4[3], ip4[2], ip4[1], ip4[0]}); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|