Finished Update and UpdateX (needs make and copy)
* Added test for camelCaseCommaList * Added function signature for UpdateAt and UpdateAtX * Moved column type slices to helpers.tpl
This commit is contained in:
parent
f1e8b21c0e
commit
92e2608a1b
6 changed files with 115 additions and 42 deletions
|
@ -85,33 +85,34 @@ var sqlBoilerTestMainImports = map[string]imports{
|
|||
// sqlBoilerTemplateFuncs is a map of all the functions that get passed into the templates.
|
||||
// If you wish to pass a new function into your own template, add a pointer to it here.
|
||||
var sqlBoilerTemplateFuncs = template.FuncMap{
|
||||
"singular": strmangle.Singular,
|
||||
"plural": strmangle.Plural,
|
||||
"titleCase": strmangle.TitleCase,
|
||||
"titleCaseSingular": strmangle.TitleCaseSingular,
|
||||
"titleCasePlural": strmangle.TitleCasePlural,
|
||||
"camelCase": strmangle.CamelCase,
|
||||
"camelCaseSingular": strmangle.CamelCaseSingular,
|
||||
"camelCasePlural": strmangle.CamelCasePlural,
|
||||
"camelCaseCommaList": strmangle.CamelCaseCommaList,
|
||||
"commaList": strmangle.CommaList,
|
||||
"makeDBName": strmangle.MakeDBName,
|
||||
"selectParamNames": strmangle.SelectParamNames,
|
||||
"insertParamNames": strmangle.InsertParamNames,
|
||||
"insertParamFlags": strmangle.InsertParamFlags,
|
||||
"insertParamVariables": strmangle.InsertParamVariables,
|
||||
"scanParamNames": strmangle.ScanParamNames,
|
||||
"hasPrimaryKey": strmangle.HasPrimaryKey,
|
||||
"primaryKeyFuncSig": strmangle.PrimaryKeyFuncSig,
|
||||
"wherePrimaryKey": strmangle.WherePrimaryKey,
|
||||
"paramsPrimaryKey": strmangle.ParamsPrimaryKey,
|
||||
"primaryKeyFlagIndex": strmangle.PrimaryKeyFlagIndex,
|
||||
"updateParamNames": strmangle.UpdateParamNames,
|
||||
"updateParamVariables": strmangle.UpdateParamVariables,
|
||||
"primaryKeyStrList": strmangle.PrimaryKeyStrList,
|
||||
"supportsResultObject": strmangle.SupportsResultObject,
|
||||
"filterColumnsByDefault": strmangle.FilterColumnsByDefault,
|
||||
"autoIncPrimaryKey": strmangle.AutoIncPrimaryKey,
|
||||
"singular": strmangle.Singular,
|
||||
"plural": strmangle.Plural,
|
||||
"titleCase": strmangle.TitleCase,
|
||||
"titleCaseSingular": strmangle.TitleCaseSingular,
|
||||
"titleCasePlural": strmangle.TitleCasePlural,
|
||||
"camelCase": strmangle.CamelCase,
|
||||
"camelCaseSingular": strmangle.CamelCaseSingular,
|
||||
"camelCasePlural": strmangle.CamelCasePlural,
|
||||
"camelCaseCommaList": strmangle.CamelCaseCommaList,
|
||||
"commaList": strmangle.CommaList,
|
||||
"makeDBName": strmangle.MakeDBName,
|
||||
"selectParamNames": strmangle.SelectParamNames,
|
||||
"insertParamNames": strmangle.InsertParamNames,
|
||||
"insertParamFlags": strmangle.InsertParamFlags,
|
||||
"insertParamVariables": strmangle.InsertParamVariables,
|
||||
"scanParamNames": strmangle.ScanParamNames,
|
||||
"hasPrimaryKey": strmangle.HasPrimaryKey,
|
||||
"primaryKeyFuncSig": strmangle.PrimaryKeyFuncSig,
|
||||
"wherePrimaryKey": strmangle.WherePrimaryKey,
|
||||
"paramsPrimaryKey": strmangle.ParamsPrimaryKey,
|
||||
"primaryKeyFlagIndex": strmangle.PrimaryKeyFlagIndex,
|
||||
"updateParamNames": strmangle.UpdateParamNames,
|
||||
"updateParamVariables": strmangle.UpdateParamVariables,
|
||||
"primaryKeyStrList": strmangle.PrimaryKeyStrList,
|
||||
"supportsResultObject": strmangle.SupportsResultObject,
|
||||
"filterColumnsByDefault": strmangle.FilterColumnsByDefault,
|
||||
"filterColumnsByAutoIncrement": strmangle.FilterColumnsByAutoIncrement,
|
||||
"autoIncPrimaryKey": strmangle.AutoIncPrimaryKey,
|
||||
}
|
||||
|
||||
// LoadConfigFile loads the toml config file into the cfg object
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
{{- $varNameSingular := camelCaseSingular .Table.Name -}}
|
||||
var {{$varNameSingular}}ColumnsWithoutDefault = []string{{"{"}}{{filterColumnsByDefault .Table.Columns false}}{{"}"}}
|
||||
var {{$varNameSingular}}ColumnsWithDefault = []string{{"{"}}{{filterColumnsByDefault .Table.Columns true}}{{"}"}}
|
||||
var {{$varNameSingular}}PrimaryKeyColumns = []string{{"{"}}{{primaryKeyStrList .Table.PKey.Columns}}{{"}"}}
|
||||
var {{$varNameSingular}}AutoIncrementColumns = []string{{"{"}}{{filterColumnsByAutoIncrement .Table.Columns}}{{"}"}}
|
||||
var {{$varNameSingular}}AutoIncPrimaryKey = "{{autoIncPrimaryKey .Table.Columns .Table.PKey}}"
|
||||
|
||||
{{if hasPrimaryKey .Table.PKey -}}
|
||||
{{- $tableNameSingular := titleCaseSingular .Table.Name -}}
|
||||
{{- $varNameSingular := camelCaseSingular .Table.Name -}}
|
||||
func (o {{$varNameSingular}}Slice) inPrimaryKeyArgs() []interface{} {
|
||||
var args []interface{}
|
||||
|
||||
|
|
|
@ -6,17 +6,13 @@ func (o *{{$tableNameSingular}}) Insert(whitelist ... string) error {
|
|||
return o.InsertX(boil.GetDB(), whitelist...)
|
||||
}
|
||||
|
||||
var {{$varNameSingular}}DefaultInsertWhitelist = []string{{"{"}}{{filterColumnsByDefault .Table.Columns false}}{{"}"}}
|
||||
var {{$varNameSingular}}ColumnsWithDefault = []string{{"{"}}{{filterColumnsByDefault .Table.Columns true}}{{"}"}}
|
||||
var {{$varNameSingular}}AutoIncPrimaryKey = "{{autoIncPrimaryKey .Table.Columns .Table.PKey}}"
|
||||
|
||||
func (o *{{$tableNameSingular}}) InsertX(exec boil.Executor, whitelist ... string) error {
|
||||
if o == nil {
|
||||
return errors.New("{{.PkgName}}: no {{.Table.Name}} provided for insertion")
|
||||
}
|
||||
|
||||
if len(whitelist) == 0 {
|
||||
whitelist = {{$varNameSingular}}DefaultInsertWhitelist
|
||||
whitelist = {{$varNameSingular}}ColumnsWithoutDefault
|
||||
}
|
||||
|
||||
nzDefaultSet := boil.NonZeroDefaultSet({{$varNameSingular}}ColumnsWithDefault, o)
|
||||
|
|
|
@ -15,13 +15,19 @@ func (o *{{$tableNameSingular}}) UpdateX(exec boil.Executor, whitelist ... strin
|
|||
return err
|
||||
}
|
||||
|
||||
{{$flagIndex := primaryKeyFlagIndex .Table.Columns .Table.PKey.Columns}}
|
||||
var err error
|
||||
if len(whitelist) == 0 {
|
||||
_, err = exec.Exec(`UPDATE {{.Table.Name}} SET {{updateParamNames .Table.Columns .Table.PKey.Columns}} WHERE {{wherePrimaryKey .Table.PKey.Columns $flagIndex}}`, {{updateParamVariables "o." .Table.Columns .Table.PKey.Columns}}, {{paramsPrimaryKey "o." .Table.PKey.Columns true}})
|
||||
} else {
|
||||
whitelist = {{$varNameSingular}}ColumnsWithoutDefault
|
||||
whitelist = append(boil.NonZeroDefaultSet({{$varNameSingular}}ColumnsWithDefault, o), whitelist...)
|
||||
whitelist = boil.SetComplement(whitelist, {{$varNameSingular}}PrimaryKeyColumns)
|
||||
whitelist = boil.SetComplement(whitelist, {{$varNameSingular}}AutoIncrementColumns)
|
||||
}
|
||||
|
||||
var err error
|
||||
if len(whitelist) != 0 {
|
||||
query := fmt.Sprintf(`UPDATE {{.Table.Name}} SET %s WHERE %s`, boil.SetParamNames(whitelist), boil.WherePrimaryKey(len(whitelist)+1, {{commaList .Table.PKey.Columns}}))
|
||||
_, err = exec.Exec(query, {{updateParamVariables "o." .Table.Columns .Table.PKey.Columns}}, {{paramsPrimaryKey "o." .Table.PKey.Columns true}})
|
||||
_, err = exec.Exec(query, boil.GetStructValues(o, whitelist...), {{paramsPrimaryKey "o." .Table.PKey.Columns true}})
|
||||
} else {
|
||||
return fmt.Errorf("{{.PkgName}}: unable to update {{.Table.Name}}, could not build a whitelist for row: %s")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
@ -35,6 +41,14 @@ func (o *{{$tableNameSingular}}) UpdateX(exec boil.Executor, whitelist ... strin
|
|||
return nil
|
||||
}
|
||||
|
||||
func (o *{{$tableNameSingular}}) UpdateAt({{primaryKeyFuncSig .Table.Columns .Table.PKey.Columns}}, whitelist ...string) error {
|
||||
return o.UpdateAtX(boil.GetDB(), {{camelCaseCommaList .Table.PKey.Columns}}, whitelist...)
|
||||
}
|
||||
|
||||
func (o *{{$tableNameSingular}}) UpdateAtX(exec boil.Executor, {{primaryKeyFuncSig .Table.Columns .Table.PKey.Columns}}, whitelist ...string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v {{$varNameSingular}}Query) UpdateAll(cols M) error {
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -367,7 +367,15 @@ func FilterColumnsByDefault(columns []dbdrivers.Column, defaults bool) string {
|
|||
return strings.Join(cols, `,`)
|
||||
}
|
||||
|
||||
// DEFAULT WHITELIST: The things that are not default values. The things we want to insert all the time.
|
||||
// WHITELIST: The things that we will NEVER return. The things that we will ALWAYS insert.
|
||||
// DEFAULTS: The things that we will return (if not in WHITELIST)
|
||||
// NON-ZEROS: The things that we will return (if not in WHITELIST)
|
||||
// FilterColumnsByAutoIncrement generates the list of auto increment columns
|
||||
func FilterColumnsByAutoIncrement(columns []dbdrivers.Column) string {
|
||||
var cols []string
|
||||
|
||||
for _, c := range columns {
|
||||
if rgxAutoIncColumn.MatchString(c.Default) {
|
||||
cols = append(cols, fmt.Sprintf(`"%s"`, c.Name))
|
||||
}
|
||||
}
|
||||
|
||||
return strings.Join(cols, `,`)
|
||||
}
|
||||
|
|
|
@ -41,6 +41,21 @@ func TestCommaList(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestCamelCaseCommaList(t *testing.T) {
|
||||
cols := []string{
|
||||
"test_id",
|
||||
"test_thing",
|
||||
"test_stuff_thing",
|
||||
"test",
|
||||
}
|
||||
|
||||
x := CamelCaseCommaList(cols)
|
||||
expected := `testID, testThing, testStuffThing, test`
|
||||
if x != expected {
|
||||
t.Errorf("Expected %s, got %s", expected, x)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAutoIncPrimaryKey(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
@ -398,3 +413,36 @@ func TestFilterColumnsByDefault(t *testing.T) {
|
|||
t.Errorf("Invalid result: %s", res)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterColumnsByAutoIncrement(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cols := []dbdrivers.Column{
|
||||
{
|
||||
Name: "col1",
|
||||
Default: `nextval("thing"::thing)`,
|
||||
},
|
||||
{
|
||||
Name: "col2",
|
||||
Default: "things",
|
||||
},
|
||||
{
|
||||
Name: "col3",
|
||||
Default: "",
|
||||
},
|
||||
{
|
||||
Name: "col4",
|
||||
Default: `nextval("thing"::thing)`,
|
||||
},
|
||||
}
|
||||
|
||||
res := FilterColumnsByAutoIncrement(cols)
|
||||
if res != `"col1","col4"` {
|
||||
t.Errorf("Invalid result: %s", res)
|
||||
}
|
||||
|
||||
res = FilterColumnsByAutoIncrement([]dbdrivers.Column{})
|
||||
if res != `` {
|
||||
t.Errorf("Invalid result: %s", res)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue