codegen (refactor): move foreign key failure check lambda function generator to a helper func
This commit is contained in:
parent
93b589d1b2
commit
ee1d0a5ed7
@ -82,37 +82,11 @@ func GenerateModelAST(table schema.Table) *ast.GenDecl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateSaveItemFunc produces an AST for the SaveXyz() function of the model.
|
// buildFKCheckLambda builds the `checkForeignKeyFailures := func(err error) error { ... }` AST.
|
||||||
// E.g., a table with `table.TypeName = "foods"` will produce a "SaveFood()" function.
|
// Returns the assignment statement and whether any FK columns were found.
|
||||||
func GenerateSaveItemFunc(tbl schema.Table) *ast.FuncDecl {
|
func buildFKCheckLambda(tbl schema.Table) (*ast.AssignStmt, bool) {
|
||||||
insertCols := make([]string, 0, len(tbl.Columns))
|
|
||||||
insertVals := make([]string, 0, len(tbl.Columns))
|
|
||||||
updatePairs := make([]string, 0, len(tbl.Columns))
|
|
||||||
|
|
||||||
hasCreatedAt, hasUpdatedAt := tbl.HasAutoTimestamps()
|
|
||||||
|
|
||||||
// Assemble data for building SQL "insert" and "update" strings
|
|
||||||
for _, col := range tbl.Columns {
|
|
||||||
if col.Name == "rowid" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
insertCols = append(insertCols, col.Name)
|
|
||||||
val := ":" + col.Name
|
|
||||||
if col.IsNullableForeignKey() {
|
|
||||||
val = fmt.Sprintf("nullif(%s, 0)", val)
|
|
||||||
}
|
|
||||||
insertVals = append(insertVals, val)
|
|
||||||
// created_at should not be updated after creation
|
|
||||||
if col.Name == "created_at" && hasCreatedAt {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
updatePairs = append(updatePairs, col.Name+"="+val)
|
|
||||||
}
|
|
||||||
insertStmt := fmt.Sprintf("\n\t\t insert into %s (%s)\n\t\t values (%s)\n\t\t", tbl.TableName, strings.Join(insertCols, ", "), strings.Join(insertVals, ", "))
|
|
||||||
updateStmt := fmt.Sprintf("\n\t\t update %s\n\t\t set %s\n\t\t where rowid = :rowid\n\t\t", tbl.TableName, strings.Join(updatePairs, ",\n\t\t "))
|
|
||||||
|
|
||||||
hasFks := false
|
hasFks := false
|
||||||
checkForeignKeyFailuresAssignment := &ast.AssignStmt{
|
stmt := &ast.AssignStmt{
|
||||||
Lhs: []ast.Expr{ast.NewIdent("checkForeignKeyFailures")},
|
Lhs: []ast.Expr{ast.NewIdent("checkForeignKeyFailures")},
|
||||||
Tok: token.DEFINE,
|
Tok: token.DEFINE,
|
||||||
Rhs: []ast.Expr{
|
Rhs: []ast.Expr{
|
||||||
@ -228,6 +202,39 @@ func GenerateSaveItemFunc(tbl schema.Table) *ast.FuncDecl {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
return stmt, hasFks
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenerateSaveItemFunc produces an AST for the SaveXyz() function of the model.
|
||||||
|
// E.g., a table with `table.TypeName = "foods"` will produce a "SaveFood()" function.
|
||||||
|
func GenerateSaveItemFunc(tbl schema.Table) *ast.FuncDecl {
|
||||||
|
insertCols := make([]string, 0, len(tbl.Columns))
|
||||||
|
insertVals := make([]string, 0, len(tbl.Columns))
|
||||||
|
updatePairs := make([]string, 0, len(tbl.Columns))
|
||||||
|
|
||||||
|
hasCreatedAt, hasUpdatedAt := tbl.HasAutoTimestamps()
|
||||||
|
|
||||||
|
// Assemble data for building SQL "insert" and "update" strings
|
||||||
|
for _, col := range tbl.Columns {
|
||||||
|
if col.Name == "rowid" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
insertCols = append(insertCols, col.Name)
|
||||||
|
val := ":" + col.Name
|
||||||
|
if col.IsNullableForeignKey() {
|
||||||
|
val = fmt.Sprintf("nullif(%s, 0)", val)
|
||||||
|
}
|
||||||
|
insertVals = append(insertVals, val)
|
||||||
|
// created_at should not be updated after creation
|
||||||
|
if col.Name == "created_at" && hasCreatedAt {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
updatePairs = append(updatePairs, col.Name+"="+val)
|
||||||
|
}
|
||||||
|
insertStmt := fmt.Sprintf("\n\t\t insert into %s (%s)\n\t\t values (%s)\n\t\t", tbl.TableName, strings.Join(insertCols, ", "), strings.Join(insertVals, ", "))
|
||||||
|
updateStmt := fmt.Sprintf("\n\t\t update %s\n\t\t set %s\n\t\t where rowid = :rowid\n\t\t", tbl.TableName, strings.Join(updatePairs, ",\n\t\t "))
|
||||||
|
|
||||||
|
checkForeignKeyFailuresAssignment, hasFks := buildFKCheckLambda(tbl)
|
||||||
|
|
||||||
funcBody := &ast.BlockStmt{
|
funcBody := &ast.BlockStmt{
|
||||||
List: func() []ast.Stmt {
|
List: func() []ast.Stmt {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user