in statement.go [179:256]
func (s *stmt) parametersToTypedValues(vals []namedValue) []*message.TypedValue {
var result []*message.TypedValue
for i, val := range vals {
typed := message.TypedValue{}
if val.Value == nil {
typed.Null = true
typed.Type = message.Rep_NULL
} else {
switch v := val.Value.(type) {
case int64:
typed.Type = message.Rep_LONG
typed.NumberValue = v
case float64:
typed.Type = message.Rep_DOUBLE
typed.DoubleValue = v
case bool:
typed.Type = message.Rep_BOOLEAN
typed.BoolValue = v
case []byte:
typed.Type = message.Rep_BYTE_STRING
typed.BytesValue = v
case string:
if s.parameters[i].TypeName == "DECIMAL" {
typed.Type = message.Rep_BIG_DECIMAL
} else {
typed.Type = message.Rep_STRING
}
typed.StringValue = v
case time.Time:
avaticaParameter := s.parameters[i]
switch avaticaParameter.TypeName {
case "TIME", "UNSIGNED_TIME":
typed.Type = message.Rep_JAVA_SQL_TIME
// Because a location can have multiple time zones due to daylight savings,
// we need to be explicit and get the offset
zone, offset := v.Zone()
// Calculate milliseconds since 00:00:00.000
base := time.Date(v.Year(), v.Month(), v.Day(), 0, 0, 0, 0, time.FixedZone(zone, offset))
typed.NumberValue = v.Sub(base).Nanoseconds() / int64(time.Millisecond)
case "DATE", "UNSIGNED_DATE":
typed.Type = message.Rep_JAVA_SQL_DATE
// Because a location can have multiple time zones due to daylight savings,
// we need to be explicit and get the offset
zone, offset := v.Zone()
// Calculate number of days since 1970/1/1
base := time.Date(1970, 1, 1, 0, 0, 0, 0, time.FixedZone(zone, offset))
typed.NumberValue = int64(v.Sub(base) / (24 * time.Hour))
case "TIMESTAMP", "UNSIGNED_TIMESTAMP":
typed.Type = message.Rep_JAVA_SQL_TIMESTAMP
// Because a location can have multiple time zones due to daylight savings,
// we need to be explicit and get the offset
zone, offset := v.Zone()
// Calculate number of milliseconds since 1970-01-01 00:00:00.000
base := time.Date(1970, 1, 1, 0, 0, 0, 0, time.FixedZone(zone, offset))
typed.NumberValue = v.Sub(base).Nanoseconds() / int64(time.Millisecond)
}
}
}
result = append(result, &typed)
}
return result
}