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.SetNull(true)
typed.SetType(message.Rep_NULL)
} else {
switch v := val.Value.(type) {
case int64:
typed.SetType(message.Rep_LONG)
typed.SetNumberValue(v)
case float64:
typed.SetType(message.Rep_DOUBLE)
typed.SetDoubleValue(v)
case bool:
typed.SetType(message.Rep_BOOLEAN)
typed.SetBoolValue(v)
case []byte:
typed.SetType(message.Rep_BYTE_STRING)
typed.SetBytesValue(v)
case string:
if s.parameters[i].GetTypeName() == "DECIMAL" {
typed.SetType(message.Rep_BIG_DECIMAL)
} else {
typed.SetType(message.Rep_STRING)
}
typed.SetStringValue(v)
case time.Time:
avaticaParameter := s.parameters[i]
switch avaticaParameter.GetTypeName() {
case "TIME", "UNSIGNED_TIME":
typed.SetType(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.SetNumberValue(v.Sub(base).Nanoseconds() / int64(time.Millisecond))
case "DATE", "UNSIGNED_DATE":
typed.SetType(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.SetNumberValue(int64(v.Sub(base) / (24 * time.Hour)))
case "TIMESTAMP", "UNSIGNED_TIMESTAMP":
typed.SetType(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.SetNumberValue(v.Sub(base).Nanoseconds() / int64(time.Millisecond))
}
}
}
result = append(result, &typed)
}
return result
}