codegen: wrap foreign key checks for nullable FKs in "if a.Val != 0 { ... }"
This commit is contained in:
@@ -161,9 +161,21 @@ func buildFKCheckLambda(tbl schema.Table) (*ast.AssignStmt, bool) {
|
|||||||
structFieldName := col.GoFieldName()
|
structFieldName := col.GoFieldName()
|
||||||
structField := &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent(structFieldName)}
|
structField := &ast.SelectorExpr{X: ast.NewIdent(tbl.VarName), Sel: ast.NewIdent(structFieldName)}
|
||||||
|
|
||||||
|
ret = append(ret, func() ast.Stmt {
|
||||||
|
// Wrap nullable FKs in "if a.val != 0 { ... }"
|
||||||
|
wrap := func(input ast.Stmt) ast.Stmt {
|
||||||
|
if col.IsNullableForeignKey() {
|
||||||
|
return &ast.IfStmt{
|
||||||
|
Cond: &ast.BinaryExpr{X: structField, Op: token.NEQ, Y: &ast.BasicLit{Kind: token.INT, Value: "0"}},
|
||||||
|
Body: &ast.BlockStmt{List: []ast.Stmt{input}},
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
}
|
||||||
if col.IsNonCodeTableForeignKey() {
|
if col.IsNonCodeTableForeignKey() {
|
||||||
// Real foreign key; look up referent by ID to see if it exists
|
// Real foreign key; look up referent by ID to see if it exists
|
||||||
ret = append(ret, &ast.IfStmt{
|
return wrap(&ast.IfStmt{
|
||||||
Init: &ast.AssignStmt{
|
Init: &ast.AssignStmt{
|
||||||
Lhs: []ast.Expr{ast.NewIdent("_"), ast.NewIdent("err")},
|
Lhs: []ast.Expr{ast.NewIdent("_"), ast.NewIdent("err")},
|
||||||
Tok: token.DEFINE,
|
Tok: token.DEFINE,
|
||||||
@@ -197,7 +209,7 @@ func buildFKCheckLambda(tbl schema.Table) (*ast.AssignStmt, bool) {
|
|||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// Code table value. Query the table to see if it exists
|
// Code table value. Query the table to see if it exists
|
||||||
ret = append(ret, &ast.IfStmt{
|
return wrap(&ast.IfStmt{
|
||||||
Init: &ast.AssignStmt{
|
Init: &ast.AssignStmt{
|
||||||
Lhs: []ast.Expr{ast.NewIdent("err")},
|
Lhs: []ast.Expr{ast.NewIdent("err")},
|
||||||
Tok: token.DEFINE,
|
Tok: token.DEFINE,
|
||||||
@@ -234,6 +246,7 @@ func buildFKCheckLambda(tbl schema.Table) (*ast.AssignStmt, bool) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}())
|
||||||
}
|
}
|
||||||
// final return nil
|
// final return nil
|
||||||
ret = append(ret, &ast.ReturnStmt{Results: []ast.Expr{ast.NewIdent("nil")}})
|
ret = append(ret, &ast.ReturnStmt{Results: []ast.Expr{ast.NewIdent("nil")}})
|
||||||
|
|||||||
Reference in New Issue
Block a user