Compare commits
No commits in common. "ded07eb1829d861b98b560d4eed60b2c1c7b2706" and "d9df69eccf27483e2f1c493f4abe0a1d30cc79b7" have entirely different histories.
ded07eb182
...
d9df69eccf
@ -62,9 +62,8 @@ var generate_model = &cobra.Command{
|
|||||||
modelgenerate.GenerateIDType(table),
|
modelgenerate.GenerateIDType(table),
|
||||||
modelgenerate.GenerateModelAST(table),
|
modelgenerate.GenerateModelAST(table),
|
||||||
modelgenerate.GenerateSaveItemFunc(table),
|
modelgenerate.GenerateSaveItemFunc(table),
|
||||||
modelgenerate.GenerateDeleteItemFunc(table),
|
|
||||||
modelgenerate.GenerateSQLFieldsConst(table),
|
|
||||||
modelgenerate.GenerateGetItemByIDFunc(table),
|
modelgenerate.GenerateGetItemByIDFunc(table),
|
||||||
|
modelgenerate.GenerateDeleteItemFunc(table),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import (
|
|||||||
"go/token"
|
"go/token"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/jinzhu/inflection"
|
||||||
|
|
||||||
"git.offline-twitter.com/offline-labs/gas-stack/pkg/schema"
|
"git.offline-twitter.com/offline-labs/gas-stack/pkg/schema"
|
||||||
"git.offline-twitter.com/offline-labs/gas-stack/pkg/textutils"
|
"git.offline-twitter.com/offline-labs/gas-stack/pkg/textutils"
|
||||||
)
|
)
|
||||||
@ -38,7 +40,7 @@ func GenerateModelAST(table schema.Table) *ast.GenDecl {
|
|||||||
if col.IsForeignKey && strings.HasSuffix(col.Name, "_id") {
|
if col.IsForeignKey && strings.HasSuffix(col.Name, "_id") {
|
||||||
fields = append(fields, &ast.Field{
|
fields = append(fields, &ast.Field{
|
||||||
Names: []*ast.Ident{ast.NewIdent(textutils.SnakeToCamel(strings.TrimSuffix(col.Name, "_id")) + "ID")},
|
Names: []*ast.Ident{ast.NewIdent(textutils.SnakeToCamel(strings.TrimSuffix(col.Name, "_id")) + "ID")},
|
||||||
Type: ast.NewIdent(schema.TypenameFromTablename(col.ForeignKeyTargetTable) + "ID"),
|
Type: ast.NewIdent(textutils.SnakeToCamel(inflection.Singular(col.ForeignKeyTargetTable) + "ID")),
|
||||||
Tag: &ast.BasicLit{Kind: token.STRING, Value: fmt.Sprintf("`db:\"%s\" json:\"%s\"`", col.Name, col.Name)},
|
Tag: &ast.BasicLit{Kind: token.STRING, Value: fmt.Sprintf("`db:\"%s\" json:\"%s\"`", col.Name, col.Name)},
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@ -173,23 +175,18 @@ func GenerateGetItemByIDFunc(tbl schema.Table) *ast.FuncDecl {
|
|||||||
arg := &ast.FieldList{List: []*ast.Field{{Names: []*ast.Ident{ast.NewIdent("id")}, Type: ast.NewIdent(tbl.TypeIDName)}}}
|
arg := &ast.FieldList{List: []*ast.Field{{Names: []*ast.Ident{ast.NewIdent("id")}, Type: ast.NewIdent(tbl.TypeIDName)}}}
|
||||||
result := &ast.FieldList{List: []*ast.Field{{Names: []*ast.Ident{ast.NewIdent("ret")}, Type: ast.NewIdent(tbl.TypeName)}, {Names: []*ast.Ident{ast.NewIdent("err")}, Type: ast.NewIdent("error")}}}
|
result := &ast.FieldList{List: []*ast.Field{{Names: []*ast.Ident{ast.NewIdent("ret")}, Type: ast.NewIdent(tbl.TypeName)}, {Names: []*ast.Ident{ast.NewIdent("err")}, Type: ast.NewIdent("error")}}}
|
||||||
|
|
||||||
// Use the xyzSQLFields constant in the select query
|
selectCols := make([]string, 0, len(tbl.Columns))
|
||||||
selectExpr := &ast.BinaryExpr{
|
for _, col := range tbl.Columns {
|
||||||
X: &ast.BinaryExpr{
|
selectCols = append(selectCols, col.Name)
|
||||||
X: &ast.BasicLit{Kind: token.STRING, Value: "`\n\t select `"},
|
|
||||||
Op: token.ADD,
|
|
||||||
Y: SQLFieldsConstIdent(tbl),
|
|
||||||
},
|
|
||||||
Op: token.ADD,
|
|
||||||
Y: &ast.BasicLit{Kind: token.STRING, Value: "`\n\t from " + tbl.TableName + "\n\t where rowid = ?\n\t`"},
|
|
||||||
}
|
}
|
||||||
|
selectStmt := fmt.Sprintf("\n\t select %s\n\t from %s\n\t where rowid = ?\n\t", strings.Join(selectCols, ", "), tbl.TableName)
|
||||||
|
|
||||||
funcBody := &ast.BlockStmt{
|
funcBody := &ast.BlockStmt{
|
||||||
List: []ast.Stmt{
|
List: []ast.Stmt{
|
||||||
&ast.AssignStmt{
|
&ast.AssignStmt{
|
||||||
Lhs: []ast.Expr{ast.NewIdent("err")},
|
Lhs: []ast.Expr{ast.NewIdent("err")},
|
||||||
Tok: token.ASSIGN,
|
Tok: token.ASSIGN,
|
||||||
Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("Get")}, Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: ast.NewIdent("ret")}, selectExpr, ast.NewIdent("id")}}},
|
Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("db.DB"), Sel: ast.NewIdent("Get")}, Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: ast.NewIdent("ret")}, &ast.BasicLit{Kind: token.STRING, Value: "`" + selectStmt + "`"}, ast.NewIdent("id")}}},
|
||||||
},
|
},
|
||||||
&ast.IfStmt{
|
&ast.IfStmt{
|
||||||
Cond: &ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("errors"), Sel: ast.NewIdent("Is")}, Args: []ast.Expr{ast.NewIdent("err"), &ast.SelectorExpr{X: ast.NewIdent("sql"), Sel: ast.NewIdent("ErrNoRows")}}},
|
Cond: &ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("errors"), Sel: ast.NewIdent("Is")}, Args: []ast.Expr{ast.NewIdent("err"), &ast.SelectorExpr{X: ast.NewIdent("sql"), Sel: ast.NewIdent("ErrNoRows")}}},
|
||||||
@ -244,31 +241,3 @@ func GenerateDeleteItemFunc(tbl schema.Table) *ast.FuncDecl {
|
|||||||
}
|
}
|
||||||
return funcDecl
|
return funcDecl
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateSQLFieldsConst produces an AST for the `const xyzSQLFields = ...` string.
|
|
||||||
func GenerateSQLFieldsConst(tbl schema.Table) *ast.GenDecl {
|
|
||||||
columns := make([]string, 0, len(tbl.Columns))
|
|
||||||
for _, col := range tbl.Columns {
|
|
||||||
columns = append(columns, col.Name)
|
|
||||||
}
|
|
||||||
// Join with comma and space
|
|
||||||
value := "`" + strings.Join(columns, ", ") + "`"
|
|
||||||
|
|
||||||
return &ast.GenDecl{
|
|
||||||
Tok: token.CONST,
|
|
||||||
Specs: []ast.Spec{
|
|
||||||
&ast.ValueSpec{
|
|
||||||
Names: []*ast.Ident{SQLFieldsConstIdent(tbl)},
|
|
||||||
Values: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: value}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------
|
|
||||||
// Helpers
|
|
||||||
// ---------------
|
|
||||||
|
|
||||||
func SQLFieldsConstIdent(tbl schema.Table) *ast.Ident {
|
|
||||||
return ast.NewIdent(strings.ToLower(tbl.TypeName) + "SQLFields")
|
|
||||||
}
|
|
||||||
|
|||||||
@ -40,7 +40,7 @@ func SchemaFromDB(db *sqlx.DB) Schema {
|
|||||||
var tables []Table
|
var tables []Table
|
||||||
PanicIf(db.Select(&tables, `select name, is_strict, is_without_rowid from tables`))
|
PanicIf(db.Select(&tables, `select name, is_strict, is_without_rowid from tables`))
|
||||||
for _, tbl := range tables {
|
for _, tbl := range tables {
|
||||||
tbl.TypeName = TypenameFromTablename(tbl.TableName)
|
tbl.TypeName = textutils.SnakeToCamel(inflection.Singular(tbl.TableName))
|
||||||
tbl.TypeIDName = tbl.TypeName + "ID"
|
tbl.TypeIDName = tbl.TypeName + "ID"
|
||||||
tbl.VarName = strings.ToLower(string(tbl.TableName[0]))
|
tbl.VarName = strings.ToLower(string(tbl.TableName[0]))
|
||||||
|
|
||||||
@ -56,7 +56,3 @@ func SchemaFromDB(db *sqlx.DB) Schema {
|
|||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func TypenameFromTablename(tablename string) string {
|
|
||||||
return textutils.SnakeToCamel(inflection.Singular(tablename))
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user