in rows.go [195:263]
func typedValueToNative(rep message.Rep, v *message.TypedValue, config *Config) interface{} {
if v.GetType() == message.Rep_NULL {
return nil
}
switch rep {
case message.Rep_BOOLEAN, message.Rep_PRIMITIVE_BOOLEAN:
return v.GetBoolValue()
case message.Rep_STRING, message.Rep_PRIMITIVE_CHAR, message.Rep_CHARACTER, message.Rep_BIG_DECIMAL:
return v.GetStringValue()
case message.Rep_FLOAT, message.Rep_PRIMITIVE_FLOAT:
return float32(v.GetDoubleValue())
case message.Rep_LONG,
message.Rep_PRIMITIVE_LONG,
message.Rep_INTEGER,
message.Rep_PRIMITIVE_INT,
message.Rep_BIG_INTEGER,
message.Rep_NUMBER,
message.Rep_BYTE,
message.Rep_PRIMITIVE_BYTE,
message.Rep_SHORT,
message.Rep_PRIMITIVE_SHORT:
return v.GetNumberValue()
case message.Rep_BYTE_STRING:
return v.GetBytesValue()
case message.Rep_DOUBLE, message.Rep_PRIMITIVE_DOUBLE:
return v.GetDoubleValue()
case message.Rep_JAVA_SQL_DATE, message.Rep_JAVA_UTIL_DATE:
// We receive the number of days since 1970/1/1 from the server
// Because a location can have multiple time zones due to daylight savings,
// we first do all our calculations in UTC and then force the timezone to
// the one the user has chosen.
t, _ := time.ParseInLocation("2006-Jan-02", "1970-Jan-01", time.UTC)
days := time.Hour * 24 * time.Duration(v.GetNumberValue())
t = t.Add(days)
return forceTimezone(t, config.location)
case message.Rep_JAVA_SQL_TIME:
// We receive the number of milliseconds since 00:00:00.000 from the server
// Because a location can have multiple time zones due to daylight savings,
// we first do all our calculations in UTC and then force the timezone to
// the one the user has chosen.
t, _ := time.ParseInLocation("15:04:05", "00:00:00", time.UTC)
ms := time.Millisecond * time.Duration(v.GetNumberValue())
t = t.Add(ms)
return forceTimezone(t, config.location)
case message.Rep_JAVA_SQL_TIMESTAMP:
// We receive the number of milliseconds since 1970-01-01 00:00:00.000 from the server
// Force to UTC for consistency because time.Unix uses the local timezone
t := time.Unix(0, v.GetNumberValue()*int64(time.Millisecond)).In(time.UTC)
return forceTimezone(t, config.location)
default:
return nil
}
}