mirror of
https://github.com/ent/ent.git
synced 2026-05-22 09:31:45 +03:00
128 lines
4.8 KiB
Cheetah
128 lines
4.8 KiB
Cheetah
{{/*
|
|
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.
|
|
*/}}
|
|
|
|
{{/* gotype: entgo.io/ent/entc/gen.typeScope */}}
|
|
|
|
{{ define "dialect/sql/decode/one" }}
|
|
{{ $receiver := $.Receiver }}
|
|
|
|
{{ $idscantype := $.ID.NewScanType }}{{ if not $.ID.UserDefined }}{{ $idscantype = "new(sql.NullInt64)" }}{{ end }}
|
|
{{ $ctypes := dict $idscantype (list $.ID.Constant) }}
|
|
{{ range $f := $.Fields }}
|
|
{{ $names := list }}
|
|
{{ if hasKey $ctypes $f.NewScanType }}
|
|
{{ $names = get $ctypes $f.NewScanType }}
|
|
{{ end }}
|
|
{{ $names = append $names $f.Constant }}
|
|
{{ $ctypes = set $ctypes $f.NewScanType $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 := $.UnexportedForeignKeys }}
|
|
{{- $f := $fk.Field }}
|
|
case {{ $.Package }}.ForeignKeys[{{ $i }}]: // {{ $f.Name }}
|
|
values[i] = {{ if not $f.UserDefined }}new(sql.NullInt64){{ else }}{{ $f.NewScanType }}{{ 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 $.ID.IsBytes $.ID.IsOther) }}
|
|
{{- 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 := $.UnexportedForeignKeys }}
|
|
{{- $f := $fk.Field }}
|
|
case {{ if $fk.UserDefined }}{{ $.Package }}.{{ $.ID.Constant }}{{ else }}{{ $.Package }}.ForeignKeys[{{ $i }}]{{ end }}:
|
|
{{- if or $fk.UserDefined (and $f.UserDefined (or $f.IsString $f.IsUUID $f.IsBytes $f.IsOther)) }}
|
|
{{- with extend $ "Idx" $idx "Field" $f "Rec" $receiver "StructField" $fk.StructField }}
|
|
{{ 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 }}.{{ $fk.StructField }} = new({{ $f.Type }})
|
|
{{ if and $f.Nillable (not $f.Type.Nillable) }}*{{ end }}{{ $receiver }}.{{ $fk.StructField }} = {{ $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.ScanType }}); !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 }}: %w", err)
|
|
}
|
|
}
|
|
{{- else }}
|
|
{{- $scantype := $f.ScanType -}}
|
|
if value, ok := values[{{ $i }}].(*{{ $scantype }}); !ok {
|
|
return fmt.Errorf("unexpected type %T for field {{ $f.Name }}", values[{{ $i }}])
|
|
{{- if hasPrefix $scantype "sql.Null" }}
|
|
} else if value.Valid {
|
|
{{- if $f.NillableValue }}
|
|
{{ $ret }}.{{ $field }} = new({{ $f.Type }})
|
|
*{{ $ret }}.{{ $field }} = {{ $f.ScanTypeField "value" }}
|
|
{{- else }}
|
|
{{ $ret }}.{{ $field }} = {{ $f.ScanTypeField "value" }}
|
|
{{- end }}
|
|
{{- else }}
|
|
} else if value != nil {
|
|
{{ $ret }}.{{ $field }} = {{ if and (not $f.Nillable) (not $f.Type.RType.IsPtr) }}*{{ end }}value
|
|
{{- end }}
|
|
}
|
|
{{- end }}
|
|
{{- end }}
|
|
|
|
{{ define "dialect/sql/decode/many" }}
|
|
{{ end }}
|