1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
{{/*
Copyright 2019-present Facebook Inc. All rights reserved.
This source code is licensed under the Apache 2.0 license found
in the LICENSE file in the root directory of this source tree.
*/}}
{{ define "dialect/sql/decode/one" }}
{{ $receiver := $.Receiver }}
{{ $idnulltype := $.ID.NullType }}{{ if not $.ID.UserDefined }}{{ $idnulltype = "sql.NullInt64" }}{{ end }}
{{ $ctypes := dict $idnulltype (list $.ID.Constant) }}
{{ range $f := $.Fields }}
{{ $names := list }}
{{ if hasKey $ctypes $f.NullType }}
{{ $names = get $ctypes $f.NullType }}
{{ end }}
{{ $names = append $names $f.Constant }}
{{ $ctypes = set $ctypes $f.NullType $names }}
{{ end }}
// scanValues returns the types for scanning values from sql.Rows.
func (*{{ $.Name }}) scanValues(columns []string) ([]interface{}, error) {
values := make([]interface{}, len(columns))
for i := range columns {
switch columns[i] {
{{- range $type, $columns := $ctypes }}
case {{ range $i, $c := $columns }}{{ if ne $i 0 }},{{ end }}{{ $.Package }}.{{ $c }}{{ end }}:
values[i] = &{{ $type }}{}
{{- end }}
{{- range $i, $fk := $.ForeignKeys }}
{{- $f := $fk.Field }}
case {{ $.Package }}.ForeignKeys[{{ $i }}]: // {{ $f.Name }}
values[i] = &{{ if not $f.UserDefined }}sql.NullInt64{{ else }}{{ $f.NullType }}{{ end }}{}
{{- end }}
default:
return nil, fmt.Errorf("unexpected column %q for type {{ $.Name }}", columns[i])
}
}
return values, nil
}
// assignValues assigns the values that were returned from sql.Rows (after scanning)
// to the {{ $.Name }} fields.
func ({{ $receiver }} *{{ $.Name }}) assignValues(columns []string, values []interface{}) error {
if m, n := len(values), len(columns); m < n {
return fmt.Errorf("mismatch number of scan values: %d != %d", m, n)
}
{{- $idx := "i" }}{{ if eq $idx $receiver }}{{ $idx = "j" }}{{ end }}
for {{ $idx }} := range columns {
switch columns[{{ $idx }}] {
case {{ $.Package }}.{{ $.ID.Constant }}:
{{- if and $.ID.UserDefined (or $.ID.IsString $.ID.IsUUID) }}
{{- with extend $ "Idx" $idx "Field" $.ID "Rec" $receiver }}
{{ template "dialect/sql/decode/field" . }}
{{- end }}
{{- else }}
value, ok := values[{{ $idx }}].(*sql.NullInt64)
if !ok {
return fmt.Errorf("unexpected type %T for field id", value)
}
{{ $receiver }}.ID = {{ $.ID.Type }}(value.Int64)
{{- end }}
{{- range $f := $.Fields }}
case {{ $.Package }}.{{ $f.Constant }}:
{{- with extend $ "Idx" $idx "Field" $f "Rec" $receiver }}
{{ template "dialect/sql/decode/field" . }}
{{- end }}
{{- end }}
{{- range $i, $fk := $.ForeignKeys }}
{{- $f := $fk.Field }}
case {{ $.Package }}.ForeignKeys[{{ $i }}]:
{{- if and $f.UserDefined (or $f.IsString $f.IsUUID) }}
{{- with extend $ "Idx" $idx "Field" $f "Rec" $receiver "StructField" $f.Name }}
{{ template "dialect/sql/decode/field" . }}
{{- end }}
{{- else }}
if value, ok := values[{{ $idx }}].(*sql.NullInt64); !ok {
return fmt.Errorf("unexpected type %T for edge-field {{ $f.Name}}", value)
} else if value.Valid {
{{ $receiver }}.{{ $f.Name }} = new({{ $f.Type }})
*{{ $receiver }}.{{ $f.Name }} = {{ $f.Type }}(value.Int64)
}
{{- end }}
{{- end }}
}
}
return nil
}
{{ end }}
{{ define "dialect/sql/decode/field" }}
{{- $i := $.Scope.Idx -}}
{{- $f := $.Scope.Field -}}
{{- $ret := $.Scope.Rec -}}
{{- $field := $f.StructField }}{{ with $.Scope.StructField }}{{ $field = . }}{{ end }}
{{- if $f.IsJSON }}
if value, ok := values[{{ $i }}].(*{{ $f.NullType }}); !ok {
return fmt.Errorf("unexpected type %T for field {{ $f.Name }}", values[{{ $i }}])
} else if value != nil && len(*value) > 0 {
if err := json.Unmarshal(*value, &{{ $ret }}.{{ $field }}); err != nil {
return fmt.Errorf("unmarshal field {{ $f.Name }}: %v", err)
}
}
{{- else }}
{{- $nulltype := $f.NullType -}}
if value, ok := values[{{ $i }}].(*{{ $nulltype }}); !ok {
return fmt.Errorf("unexpected type %T for field {{ $f.Name }}", values[{{ $i }}])
{{- if and (not $f.Type.ValueScanner) (hasPrefix $nulltype "sql") }}
} else if value.Valid {
{{- if $f.Nillable }}
{{ $ret }}.{{ $field }} = new({{ $f.Type }})
*{{ $ret }}.{{ $field }} = {{ $f.NullTypeField "value" }}
{{- else }}
{{ $ret }}.{{ $field }} = {{ $f.NullTypeField "value" }}
{{- end }}
{{- else }}
} else if value != nil {
{{ $ret }}.{{ $field }} = {{ if not $f.Nillable }}*{{ end }}value
{{- end }}
}
{{- end }}
{{- end }}
{{ define "dialect/sql/decode/many" }}
{{ end }}
{{/* Additional fields for the generated model for holding the foreign-keys */}}
{{ define "dialect/sql/model/fields" }}
{{- range $fk := $.ForeignKeys }}
{{- $f := $fk.Field }}
{{ $f.Name }} {{ if $f.Nillable }}*{{ end }}{{ $f.Type }}
{{- end }}
{{ end }}
|