Finish update optimization.
This commit is contained in:
parent
0ebccdb20a
commit
ecfa35350c
2 changed files with 30 additions and 12 deletions
templates
|
@ -37,31 +37,40 @@ func (o *{{$tableNameSingular}}) UpdateP(exec boil.Executor, whitelist ... strin
|
||||||
func (o *{{$tableNameSingular}}) Update(exec boil.Executor, whitelist ... string) error {
|
func (o *{{$tableNameSingular}}) Update(exec boil.Executor, whitelist ... string) error {
|
||||||
{{- template "timestamp_update_helper" . -}}
|
{{- template "timestamp_update_helper" . -}}
|
||||||
|
|
||||||
|
var err error
|
||||||
{{if not .NoHooks -}}
|
{{if not .NoHooks -}}
|
||||||
if err := o.doBeforeUpdateHooks(exec); err != nil {
|
if err = o.doBeforeUpdateHooks(exec); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
{{- end}}
|
{{end -}}
|
||||||
|
|
||||||
var err error
|
key := makeCacheKey(whitelist, nil)
|
||||||
var query string
|
{{$varNameSingular}}UpdateCacheMut.RLock()
|
||||||
var values []interface{}
|
cache, cached := {{$varNameSingular}}UpdateCache[key]
|
||||||
|
{{$varNameSingular}}UpdateCacheMut.RUnlock()
|
||||||
|
|
||||||
wl := strmangle.UpdateColumnSet({{$varNameSingular}}Columns, {{$varNameSingular}}PrimaryKeyColumns, whitelist)
|
if !cached {
|
||||||
if len(wl) == 0 {
|
wl := strmangle.UpdateColumnSet({{$varNameSingular}}Columns, {{$varNameSingular}}PrimaryKeyColumns, whitelist)
|
||||||
|
|
||||||
|
cache.query = fmt.Sprintf(`UPDATE "{{.Table.Name}}" SET %s WHERE %s`, strmangle.SetParamNames(wl), strmangle.WhereClause(len(wl)+1, {{$varNameSingular}}PrimaryKeyColumns))
|
||||||
|
cache.valueMapping, err = boil.BindMapping({{$varNameSingular}}Type, {{$varNameSingular}}Mapping, append(wl, {{$varNameSingular}}PrimaryKeyColumns...))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cache.valueMapping) == 0 {
|
||||||
return errors.New("{{.PkgName}}: unable to update {{.Table.Name}}, could not build whitelist")
|
return errors.New("{{.PkgName}}: unable to update {{.Table.Name}}, could not build whitelist")
|
||||||
}
|
}
|
||||||
|
|
||||||
query = fmt.Sprintf(`UPDATE {{.Table.Name}} SET %s WHERE %s`, strmangle.SetParamNames(wl), strmangle.WhereClause(len(wl)+1, {{$varNameSingular}}PrimaryKeyColumns))
|
values := boil.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping)
|
||||||
values = boil.GetStructValues(o, wl...)
|
|
||||||
values = append(values, {{.Table.PKey.Columns | stringMap .StringFuncs.titleCase | prefixStringSlice "o." | join ", "}})
|
|
||||||
|
|
||||||
if boil.DebugMode {
|
if boil.DebugMode {
|
||||||
fmt.Fprintln(boil.DebugWriter, query)
|
fmt.Fprintln(boil.DebugWriter, cache.query)
|
||||||
fmt.Fprintln(boil.DebugWriter, values)
|
fmt.Fprintln(boil.DebugWriter, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := exec.Exec(query, values...)
|
result, err := exec.Exec(cache.query, values...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "{{.PkgName}}: unable to update {{.Table.Name}} row")
|
return errors.Wrap(err, "{{.PkgName}}: unable to update {{.Table.Name}} row")
|
||||||
}
|
}
|
||||||
|
@ -70,6 +79,12 @@ func (o *{{$tableNameSingular}}) Update(exec boil.Executor, whitelist ... string
|
||||||
return errors.Errorf("failed to update single row, updated %d rows", r)
|
return errors.Errorf("failed to update single row, updated %d rows", r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !cached {
|
||||||
|
{{$varNameSingular}}UpdateCacheMut.Lock()
|
||||||
|
{{$varNameSingular}}UpdateCache[key] = cache
|
||||||
|
{{$varNameSingular}}UpdateCacheMut.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
{{if not .NoHooks -}}
|
{{if not .NoHooks -}}
|
||||||
return o.doAfterUpdateHooks(exec)
|
return o.doAfterUpdateHooks(exec)
|
||||||
{{- else -}}
|
{{- else -}}
|
||||||
|
|
|
@ -24,6 +24,9 @@ func makeCacheKey(wl, nzDefaults []string) string {
|
||||||
for _, w := range wl {
|
for _, w := range wl {
|
||||||
buf.WriteString(w)
|
buf.WriteString(w)
|
||||||
}
|
}
|
||||||
|
if len(nzDefaults) != 0 {
|
||||||
|
buf.WriteByte('.')
|
||||||
|
}
|
||||||
for _, nz := range nzDefaults {
|
for _, nz := range nzDefaults {
|
||||||
buf.WriteString(nz)
|
buf.WriteString(nz)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue