case *pgtype .JSON :
buf , err := arg .EncodeText (ci , nil )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return string (buf ), nil
case *pgtype .JSONB :
buf , err := arg .EncodeText (ci , nil )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return string (buf ), nil
case driver .Valuer :
return callValuerValue (arg )
case pgtype .TextEncoder :
buf , err := arg .EncodeText (ci , nil )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return string (buf ), nil
case float32 :
return float64 (arg ), nil
case float64 :
return arg , nil
case bool :
return arg , nil
case time .Time :
return arg , nil
case string :
return arg , nil
case []byte :
return arg , nil
case int8 :
return int64 (arg ), nil
case int16 :
return int64 (arg ), nil
case int32 :
return int64 (arg ), nil
case int64 :
return arg , nil
case int :
return int64 (arg ), nil
case uint8 :
return int64 (arg ), nil
case uint16 :
return int64 (arg ), nil
case uint32 :
return int64 (arg ), nil
case uint64 :
if arg > math .MaxInt64 {
return nil , fmt .Errorf ("arg too big for int64: %v" , arg )
}
return int64 (arg ), nil
case uint :
if uint64 (arg ) > math .MaxInt64 {
return nil , fmt .Errorf ("arg too big for int64: %v" , arg )
}
return int64 (arg ), nil
}
if dt , found := ci .DataTypeForValue (arg ); found {
v := dt .Value
err := v .Set (arg )
if err != nil {
return nil , err
}
buf , err := v .(pgtype .TextEncoder ).EncodeText (ci , nil )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return string (buf ), nil
}
if refVal .Kind () == reflect .Ptr {
arg = refVal .Elem ().Interface ()
return convertSimpleArgument (ci , arg )
}
if strippedArg , ok := stripNamedType (&refVal ); ok {
return convertSimpleArgument (ci , strippedArg )
}
return nil , SerializationError (fmt .Sprintf ("Cannot encode %T in simple protocol - %T must implement driver.Valuer, pgtype.TextEncoder, or be a native type" , arg , arg ))
}
func encodePreparedStatementArgument (ci *pgtype .ConnInfo , buf []byte , oid uint32 , arg interface {}) ([]byte , error ) {
if arg == nil {
return pgio .AppendInt32 (buf , -1 ), nil
}
switch arg := arg .(type ) {
case pgtype .BinaryEncoder :
sp := len (buf )
buf = pgio .AppendInt32 (buf , -1 )
argBuf , err := arg .EncodeBinary (ci , buf )
if err != nil {
return nil , err
}
if argBuf != nil {
buf = argBuf
pgio .SetInt32 (buf [sp :], int32 (len (buf [sp :])-4 ))
}
return buf , nil
case pgtype .TextEncoder :
sp := len (buf )
buf = pgio .AppendInt32 (buf , -1 )
argBuf , err := arg .EncodeText (ci , buf )
if err != nil {
return nil , err
}
if argBuf != nil {
buf = argBuf
pgio .SetInt32 (buf [sp :], int32 (len (buf [sp :])-4 ))
}
return buf , nil
case string :
buf = pgio .AppendInt32 (buf , int32 (len (arg )))
buf = append (buf , arg ...)
return buf , nil
}
refVal := reflect .ValueOf (arg )
if refVal .Kind () == reflect .Ptr {
if refVal .IsNil () {
return pgio .AppendInt32 (buf , -1 ), nil
}
arg = refVal .Elem ().Interface ()
return encodePreparedStatementArgument (ci , buf , oid , arg )
}
if dt , ok := ci .DataTypeForOID (oid ); ok {
value := dt .Value
err := value .Set (arg )
if err != nil {
{
if arg , ok := arg .(driver .Valuer ); ok {
v , err := callValuerValue (arg )
if err != nil {
return nil , err
}
return encodePreparedStatementArgument (ci , buf , oid , v )
}
}
return nil , err
}
sp := len (buf )
buf = pgio .AppendInt32 (buf , -1 )
argBuf , err := value .(pgtype .BinaryEncoder ).EncodeBinary (ci , buf )
if err != nil {
return nil , err
}
if argBuf != nil {
buf = argBuf
pgio .SetInt32 (buf [sp :], int32 (len (buf [sp :])-4 ))
}
return buf , nil
}
if strippedArg , ok := stripNamedType (&refVal ); ok {
return encodePreparedStatementArgument (ci , buf , oid , strippedArg )
}
return nil , SerializationError (fmt .Sprintf ("Cannot encode %T into oid %v - %T must implement Encoder or be converted to a string" , arg , oid , arg ))
}