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:
Patrick O'brien 2016-05-05 19:01:24 +10:00
parent f1e8b21c0e
commit 92e2608a1b
6 changed files with 115 additions and 42 deletions

View file

@ -85,33 +85,34 @@ var sqlBoilerTestMainImports = map[string]imports{
// sqlBoilerTemplateFuncs is a map of all the functions that get passed into the templates. // 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. // If you wish to pass a new function into your own template, add a pointer to it here.
var sqlBoilerTemplateFuncs = template.FuncMap{ var sqlBoilerTemplateFuncs = template.FuncMap{
"singular": strmangle.Singular, "singular": strmangle.Singular,
"plural": strmangle.Plural, "plural": strmangle.Plural,
"titleCase": strmangle.TitleCase, "titleCase": strmangle.TitleCase,
"titleCaseSingular": strmangle.TitleCaseSingular, "titleCaseSingular": strmangle.TitleCaseSingular,
"titleCasePlural": strmangle.TitleCasePlural, "titleCasePlural": strmangle.TitleCasePlural,
"camelCase": strmangle.CamelCase, "camelCase": strmangle.CamelCase,
"camelCaseSingular": strmangle.CamelCaseSingular, "camelCaseSingular": strmangle.CamelCaseSingular,
"camelCasePlural": strmangle.CamelCasePlural, "camelCasePlural": strmangle.CamelCasePlural,
"camelCaseCommaList": strmangle.CamelCaseCommaList, "camelCaseCommaList": strmangle.CamelCaseCommaList,
"commaList": strmangle.CommaList, "commaList": strmangle.CommaList,
"makeDBName": strmangle.MakeDBName, "makeDBName": strmangle.MakeDBName,
"selectParamNames": strmangle.SelectParamNames, "selectParamNames": strmangle.SelectParamNames,
"insertParamNames": strmangle.InsertParamNames, "insertParamNames": strmangle.InsertParamNames,
"insertParamFlags": strmangle.InsertParamFlags, "insertParamFlags": strmangle.InsertParamFlags,
"insertParamVariables": strmangle.InsertParamVariables, "insertParamVariables": strmangle.InsertParamVariables,
"scanParamNames": strmangle.ScanParamNames, "scanParamNames": strmangle.ScanParamNames,
"hasPrimaryKey": strmangle.HasPrimaryKey, "hasPrimaryKey": strmangle.HasPrimaryKey,
"primaryKeyFuncSig": strmangle.PrimaryKeyFuncSig, "primaryKeyFuncSig": strmangle.PrimaryKeyFuncSig,
"wherePrimaryKey": strmangle.WherePrimaryKey, "wherePrimaryKey": strmangle.WherePrimaryKey,
"paramsPrimaryKey": strmangle.ParamsPrimaryKey, "paramsPrimaryKey": strmangle.ParamsPrimaryKey,
"primaryKeyFlagIndex": strmangle.PrimaryKeyFlagIndex, "primaryKeyFlagIndex": strmangle.PrimaryKeyFlagIndex,
"updateParamNames": strmangle.UpdateParamNames, "updateParamNames": strmangle.UpdateParamNames,
"updateParamVariables": strmangle.UpdateParamVariables, "updateParamVariables": strmangle.UpdateParamVariables,
"primaryKeyStrList": strmangle.PrimaryKeyStrList, "primaryKeyStrList": strmangle.PrimaryKeyStrList,
"supportsResultObject": strmangle.SupportsResultObject, "supportsResultObject": strmangle.SupportsResultObject,
"filterColumnsByDefault": strmangle.FilterColumnsByDefault, "filterColumnsByDefault": strmangle.FilterColumnsByDefault,
"autoIncPrimaryKey": strmangle.AutoIncPrimaryKey, "filterColumnsByAutoIncrement": strmangle.FilterColumnsByAutoIncrement,
"autoIncPrimaryKey": strmangle.AutoIncPrimaryKey,
} }
// LoadConfigFile loads the toml config file into the cfg object // LoadConfigFile loads the toml config file into the cfg object

View file

@ -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 -}} {{if hasPrimaryKey .Table.PKey -}}
{{- $tableNameSingular := titleCaseSingular .Table.Name -}} {{- $tableNameSingular := titleCaseSingular .Table.Name -}}
{{- $varNameSingular := camelCaseSingular .Table.Name -}}
func (o {{$varNameSingular}}Slice) inPrimaryKeyArgs() []interface{} { func (o {{$varNameSingular}}Slice) inPrimaryKeyArgs() []interface{} {
var args []interface{} var args []interface{}

View file

@ -6,17 +6,13 @@ func (o *{{$tableNameSingular}}) Insert(whitelist ... string) error {
return o.InsertX(boil.GetDB(), whitelist...) 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 { func (o *{{$tableNameSingular}}) InsertX(exec boil.Executor, whitelist ... string) error {
if o == nil { if o == nil {
return errors.New("{{.PkgName}}: no {{.Table.Name}} provided for insertion") return errors.New("{{.PkgName}}: no {{.Table.Name}} provided for insertion")
} }
if len(whitelist) == 0 { if len(whitelist) == 0 {
whitelist = {{$varNameSingular}}DefaultInsertWhitelist whitelist = {{$varNameSingular}}ColumnsWithoutDefault
} }
nzDefaultSet := boil.NonZeroDefaultSet({{$varNameSingular}}ColumnsWithDefault, o) nzDefaultSet := boil.NonZeroDefaultSet({{$varNameSingular}}ColumnsWithDefault, o)

View file

@ -15,13 +15,19 @@ func (o *{{$tableNameSingular}}) UpdateX(exec boil.Executor, whitelist ... strin
return err return err
} }
{{$flagIndex := primaryKeyFlagIndex .Table.Columns .Table.PKey.Columns}}
var err error
if len(whitelist) == 0 { 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}}) whitelist = {{$varNameSingular}}ColumnsWithoutDefault
} else { 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}})) 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 { if err != nil {
@ -35,6 +41,14 @@ func (o *{{$tableNameSingular}}) UpdateX(exec boil.Executor, whitelist ... strin
return nil 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 { func (v {{$varNameSingular}}Query) UpdateAll(cols M) error {
return nil return nil
} }

View file

@ -367,7 +367,15 @@ func FilterColumnsByDefault(columns []dbdrivers.Column, defaults bool) string {
return strings.Join(cols, `,`) return strings.Join(cols, `,`)
} }
// DEFAULT WHITELIST: The things that are not default values. The things we want to insert all the time. // FilterColumnsByAutoIncrement generates the list of auto increment columns
// WHITELIST: The things that we will NEVER return. The things that we will ALWAYS insert. func FilterColumnsByAutoIncrement(columns []dbdrivers.Column) string {
// DEFAULTS: The things that we will return (if not in WHITELIST) var cols []string
// NON-ZEROS: The things that we will return (if not in WHITELIST)
for _, c := range columns {
if rgxAutoIncColumn.MatchString(c.Default) {
cols = append(cols, fmt.Sprintf(`"%s"`, c.Name))
}
}
return strings.Join(cols, `,`)
}

View file

@ -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) { func TestAutoIncPrimaryKey(t *testing.T) {
t.Parallel() t.Parallel()
@ -398,3 +413,36 @@ func TestFilterColumnsByDefault(t *testing.T) {
t.Errorf("Invalid result: %s", res) 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)
}
}