{{/* 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/create" }} {{ $builder := pascal $.Scope.Builder }} {{ $receiver := receiver $builder }} func ({{ $receiver }} *{{ $builder }}) sqlSave(ctx context.Context) (*{{ $.Name }}, error) { var ( {{ $.Receiver }} = &{{ $.Name }}{config: {{ $receiver }}.config} spec = &sqlgraph.CreateSpec{ Table: {{ $.Package }}.Table, ID: &sqlgraph.FieldSpec{ Type: field.{{ $.ID.Type.ConstName }}, Column: {{ $.Package }}.{{ $.ID.Constant }}, }, } ) {{- if $.ID.UserDefined }} if value := {{ $receiver }}.{{ $.ID.BuilderField }}; value != nil { {{ $.Receiver }}.ID = *value spec.ID.Value = *value } {{- end }} {{- range $_, $f := $.Fields }} if value := {{ $receiver }}.{{ $f.BuilderField }}; value != nil { spec.Fields = append(spec.Fields, &sqlgraph.FieldSpec{ Type: field.{{ $f.Type.ConstName }}, Value: *value, Column: {{ $.Package }}.{{ $f.Constant }}, }) {{ $.Receiver }}.{{ $f.StructField }} = {{ if not $f.Nillable }}*{{ end }}value } {{- end }} {{- range $_, $e := $.Edges }} if nodes := {{ $receiver }}.{{ $e.BuilderField }}; len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.{{ $e.Rel.Type }}, Inverse: {{ $e.IsInverse }}, Table: {{ $.Package }}.{{ $e.TableConstant }}, Columns: {{ if $e.M2M }}{{ $.Package }}.{{ $e.PKConstant }}{{ else }}[]string{ {{ $.Package }}.{{ $e.ColumnConstant }} }{{ end }}, Bidi: {{ $e.SelfRef }}, Target: &sqlgraph.EdgeTarget{ IDSpec: &sqlgraph.FieldSpec{ Type: field.{{ $e.Type.ID.Type.ConstName }}, Column: {{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}, }, }, } for k, _ := range nodes { {{- $id := $e.Type.ID -}} {{- /* Convert string-ids that are stored as int in the database */ -}} {{- if and (not $id.UserDefined) $id.IsString }} k, err := strconv.Atoi(k) if err != nil { return nil, err } {{- end }} edge.Target.Nodes = append(edge.Target.Nodes, k) } spec.Edges = append(spec.Edges, edge) } {{- end }} if err := sqlgraph.CreateNode(ctx, {{ $receiver }}.driver, spec); err != nil { if cerr, ok := isSQLConstraintError(err); ok { err = cerr } return nil, err } {{- if and $.ID.UserDefined (or $.ID.IsString $.ID.IsUUID) }} {{- /* Do nothing, because these 2 types must be supplied by the user. */ -}} {{- else }} {{- if $.ID.UserDefined }} if {{ $.Receiver }}.ID == 0 { {{- end }} id := spec.ID.Value.(int64) {{ $.Receiver }}.ID = {{ if $.ID.IsString }}strconv.FormatInt(id, 10){{ else }}{{ $.ID.Type }}(id){{ end }} {{- if and $.ID.UserDefined }} } {{- end }} {{- end }} return {{ $.Receiver }}, nil } {{ end }}