func()

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
}