Compare commits

..

3 Commits

Author SHA1 Message Date
93b589d1b2 codegen (refactor): compress whitespace
All checks were successful
CI / build-docker (push) Successful in 5s
CI / build-docker-bootstrap (push) Has been skipped
CI / release-test (push) Successful in 15s
2026-02-15 14:10:10 -08:00
b0d95c5948 codegen: skip generating ID type for "without rowid" tables 2026-02-15 14:10:10 -08:00
85d544152f schema: add PrimaryKeyColumns method to Table, useful for 'without rowid' tables 2026-02-15 14:10:06 -08:00
3 changed files with 55 additions and 39 deletions

View File

@ -43,38 +43,43 @@ var generate_model = &cobra.Command{
file2 := modelgenerate.GenerateModelTestAST(table, modname) file2 := modelgenerate.GenerateModelTestAST(table, modname)
PanicIf(printer.Fprint(os.Stdout, fset, file2)) PanicIf(printer.Fprint(os.Stdout, fset, file2))
} else { } else {
file := &ast.File{ decls := []ast.Decl{
Name: ast.NewIdent("db"), // TODO: parameterize &ast.GenDecl{
Tok: token.IMPORT,
Decls: []ast.Decl{ Specs: []ast.Spec{
&ast.GenDecl{ &ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"database/sql"`}},
Tok: token.IMPORT, &ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"errors"`}},
Specs: []ast.Spec{ &ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"fmt"`}},
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"database/sql"`}}, &ast.ImportSpec{
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"errors"`}}, Name: ast.NewIdent("."),
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"fmt"`}}, Path: &ast.BasicLit{Kind: token.STRING, Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/db"`},
&ast.ImportSpec{ },
Name: ast.NewIdent("."), &ast.ImportSpec{
Path: &ast.BasicLit{Kind: token.STRING, Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/db"`}, Name: ast.NewIdent("."),
}, Path: &ast.BasicLit{
&ast.ImportSpec{ Kind: token.STRING,
Name: ast.NewIdent("."), Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/flowutils"`,
Path: &ast.BasicLit{
Kind: token.STRING,
Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/flowutils"`,
},
}, },
}, },
}, },
modelgenerate.GenerateIDType(table),
modelgenerate.GenerateModelAST(table),
modelgenerate.GenerateSQLFieldsConst(table),
modelgenerate.GenerateSaveItemFunc(table),
modelgenerate.GenerateDeleteItemFunc(table),
modelgenerate.GenerateGetItemByIDFunc(table),
modelgenerate.GenerateGetAllItemsFunc(table),
}, },
} }
if !table.IsWithoutRowid {
decls = append(decls, modelgenerate.GenerateIDType(table))
}
decls = append(decls,
modelgenerate.GenerateModelAST(table),
modelgenerate.GenerateSQLFieldsConst(table),
modelgenerate.GenerateSaveItemFunc(table),
modelgenerate.GenerateDeleteItemFunc(table),
modelgenerate.GenerateGetItemByIDFunc(table),
modelgenerate.GenerateGetAllItemsFunc(table),
)
file := &ast.File{
Name: ast.NewIdent("db"), // TODO: parameterize
Decls: decls,
}
PanicIf(printer.Fprint(os.Stdout, fset, file)) PanicIf(printer.Fprint(os.Stdout, fset, file))
} }

View File

@ -154,19 +154,14 @@ func GenerateSaveItemFunc(tbl schema.Table) *ast.FuncDecl {
Tok: token.DEFINE, Tok: token.DEFINE,
Rhs: []ast.Expr{ Rhs: []ast.Expr{
&ast.CallExpr{ &ast.CallExpr{
Fun: &ast.SelectorExpr{X: ast.NewIdent("db"), Sel: ast.NewIdent(getByIDFuncName(col.ForeignKeyTargetTable))}, Fun: &ast.SelectorExpr{X: ast.NewIdent("db"), Sel: ast.NewIdent(getByIDFuncName(col.ForeignKeyTargetTable))},
Args: []ast.Expr{ Args: []ast.Expr{structField},
structField,
},
}, },
}, },
}, },
Cond: &ast.CallExpr{ Cond: &ast.CallExpr{
Fun: &ast.SelectorExpr{X: ast.NewIdent("errors"), Sel: ast.NewIdent("Is")}, Fun: &ast.SelectorExpr{X: ast.NewIdent("errors"), Sel: ast.NewIdent("Is")},
Args: []ast.Expr{ Args: []ast.Expr{ast.NewIdent("err"), ast.NewIdent("ErrNotInDB")},
ast.NewIdent("err"),
ast.NewIdent("ErrNotInDB"),
},
}, },
Body: &ast.BlockStmt{ Body: &ast.BlockStmt{
List: []ast.Stmt{ List: []ast.Stmt{
@ -189,9 +184,7 @@ func GenerateSaveItemFunc(tbl schema.Table) *ast.FuncDecl {
// 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{ ret = append(ret, &ast.IfStmt{
Init: &ast.AssignStmt{ Init: &ast.AssignStmt{
Lhs: []ast.Expr{ Lhs: []ast.Expr{ast.NewIdent("err")},
ast.NewIdent("err"),
},
Tok: token.ASSIGN, Tok: token.ASSIGN,
Rhs: []ast.Expr{ Rhs: []ast.Expr{
&ast.CallExpr{ &ast.CallExpr{

View File

@ -1,6 +1,7 @@
package schema package schema
import ( import (
"sort"
"strings" "strings"
"git.offline-twitter.com/offline-labs/gas-stack/pkg/textutils" "git.offline-twitter.com/offline-labs/gas-stack/pkg/textutils"
@ -83,6 +84,23 @@ type Table struct {
GoTypeName string GoTypeName string
} }
// PrimaryKeyColumns returns the ordered list of columns in this table's primary key.
// This can be useful for "without rowid" tables with composite primary keys.
//
// TODO: needs test
func (t Table) PrimaryKeyColumns() []Column {
pks := make([]Column, 0)
for _, c := range t.Columns {
if c.IsPrimaryKey {
pks = append(pks, c)
}
}
sort.Slice(pks, func(i, j int) bool {
return pks[i].PrimaryKeyRank < pks[j].PrimaryKeyRank
})
return pks
}
func (t Table) HasAutoTimestamps() (hasCreatedAt bool, hasUpdatedAt bool) { func (t Table) HasAutoTimestamps() (hasCreatedAt bool, hasUpdatedAt bool) {
for _, c := range t.Columns { for _, c := range t.Columns {
if c.Name == "created_at" && c.Type == "integer" { if c.Name == "created_at" && c.Type == "integer" {