Refactor huge switch statement

This commit is contained in:
Jack Christensen 2017-02-16 19:41:28 -06:00
parent 4d56221868
commit 47eda78ea1
2 changed files with 36 additions and 6 deletions

View File

@ -964,12 +964,7 @@ func (c *Conn) sendPreparedQuery(ps *PreparedStatement, arguments ...interface{}
case string, *string:
wbuf.WriteInt16(TextFormatCode)
default:
switch oid {
case BoolOID, ByteaOID, Int2OID, Int4OID, Int8OID, Float4OID, Float8OID, TimestampTzOID, TimestampTzArrayOID, TimestampOID, TimestampArrayOID, DateOID, BoolArrayOID, ByteaArrayOID, Int2ArrayOID, Int4ArrayOID, Int8ArrayOID, Float4ArrayOID, Float8ArrayOID, TextArrayOID, VarcharArrayOID, OIDOID, InetOID, CidrOID, InetArrayOID, CidrArrayOID, RecordOID, JSONOID, JSONBOID:
wbuf.WriteInt16(BinaryFormatCode)
default:
wbuf.WriteInt16(TextFormatCode)
}
wbuf.WriteInt16(internalNativeGoTypeFormats[oid])
}
}

View File

@ -77,6 +77,9 @@ const minInt = -maxInt - 1
// set here.
var DefaultTypeFormats map[string]int16
// internalNativeGoTypeFormats lists the encoding type for native Go types (not handled with Encoder interface)
var internalNativeGoTypeFormats map[OID]int16
func init() {
DefaultTypeFormats = map[string]int16{
"_aclitem": TextFormatCode, // Pg's src/backend/utils/adt/acl.c has only in/out (text) not send/recv (bin)
@ -113,6 +116,38 @@ func init() {
"timestamptz": BinaryFormatCode,
"xid": BinaryFormatCode,
}
internalNativeGoTypeFormats = map[OID]int16{
BoolArrayOID: BinaryFormatCode,
BoolOID: BinaryFormatCode,
ByteaArrayOID: BinaryFormatCode,
ByteaOID: BinaryFormatCode,
CidrArrayOID: BinaryFormatCode,
CidrOID: BinaryFormatCode,
DateOID: BinaryFormatCode,
Float4ArrayOID: BinaryFormatCode,
Float4OID: BinaryFormatCode,
Float8ArrayOID: BinaryFormatCode,
Float8OID: BinaryFormatCode,
InetArrayOID: BinaryFormatCode,
InetOID: BinaryFormatCode,
Int2ArrayOID: BinaryFormatCode,
Int2OID: BinaryFormatCode,
Int4ArrayOID: BinaryFormatCode,
Int4OID: BinaryFormatCode,
Int8ArrayOID: BinaryFormatCode,
Int8OID: BinaryFormatCode,
JSONBOID: BinaryFormatCode,
JSONOID: BinaryFormatCode,
OIDOID: BinaryFormatCode,
RecordOID: BinaryFormatCode,
TextArrayOID: BinaryFormatCode,
TimestampArrayOID: BinaryFormatCode,
TimestampOID: BinaryFormatCode,
TimestampTzArrayOID: BinaryFormatCode,
TimestampTzOID: BinaryFormatCode,
VarcharArrayOID: BinaryFormatCode,
}
}
// SerializationError occurs on failure to encode or decode a value