Skip to content

Commit

Permalink
fix: code generation
Browse files Browse the repository at this point in the history
  • Loading branch information
si3nloong committed Jul 4, 2024
1 parent 1b018f3 commit 4b03d9a
Show file tree
Hide file tree
Showing 61 changed files with 1,211 additions and 211 deletions.
67 changes: 41 additions & 26 deletions codegen/codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import (
"strings"
"syscall"

"strconv"

"github.com/Masterminds/semver/v3"
"github.com/samber/lo"
"github.com/si3nloong/sqlgen/codegen/config"
Expand Down Expand Up @@ -160,38 +162,21 @@ func (b tableInfo) hasNoColsExceptPK() bool {
}

type columnInfo struct {
goName string
goPath string
colName string
colPos int
t types.Type
tag tagOpts
model *config.Model
size int64
goName string
goPath string
colName string
colPos int
t types.Type
autoIncr bool
tag tagOpts
model *config.Model
size int64
}

var (
_ (sequel.GoColumnSchema) = (*columnInfo)(nil)
)

func (i columnInfo) SQLValuer() sequel.QueryFunc {
if i.model == nil {
return nil
}
return func(placeholder string) string {
return strings.Replace(i.model.SQLValuer, "{placeholder}", placeholder, 1)
}
}

func (i columnInfo) SQLScanner() sequel.QueryFunc {
if i.model == nil {
return nil
}
return func(column string) string {
return strings.Replace(i.model.SQLScanner, "{column}", column, 1)
}
}

func (c *columnInfo) GoName() string {
return c.goName
}
Expand All @@ -208,6 +193,10 @@ func (c *columnInfo) Size() int64 {
return c.size
}

func (c *columnInfo) AutoIncr() bool {
return c.autoIncr
}

func (c *columnInfo) ColumnName() string {
return c.colName
}
Expand All @@ -221,6 +210,24 @@ func (c *columnInfo) Implements(T *types.Interface) (wrongType bool) {
return
}

func (i columnInfo) SQLValuer() sequel.QueryFunc {
if i.model == nil {
return nil
}
return func(placeholder string) string {
return strings.Replace(i.model.SQLValuer, "{placeholder}", placeholder, 1)
}
}

func (i columnInfo) SQLScanner() sequel.QueryFunc {
if i.model == nil {
return nil
}
return func(column string) string {
return strings.Replace(i.model.SQLScanner, "{column}", column, 1)
}
}

type indexInfo struct {
columns []string
indexType string
Expand Down Expand Up @@ -741,6 +748,13 @@ func parseGoPackage(
return fmt.Errorf("sqlgen: struct %q has duplicate key %q in %s", s.name, column.colName, dir)
}

if v, ok := column.tag.Lookup(TagOptionSize); ok {
column.size, err = strconv.ParseInt(v, 10, 64)
if err != nil {
return fmt.Errorf(`sqlgen: %w`, err)
}
}

if _, ok := column.tag.Lookup(TagOptionPK, TagOptionPKAlias, TagOptionAutoIncrement); ok {
// Check auto increment
_, autoIncr := column.tag.Lookup(TagOptionAutoIncrement)
Expand All @@ -749,6 +763,7 @@ func parseGoPackage(
return fmt.Errorf(`sqlgen: you cannot have a composite key if you define auto increment key`)
}
table.autoIncrKey = column
column.autoIncr = true
}
table.keys = append(table.keys, column)
}
Expand Down
16 changes: 8 additions & 8 deletions codegen/templates/db.go.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

type autoIncrKeyInserter interface {
sequel.AutoIncrKeyer
sequel.PrimaryKeyer
sequel.SingleInserter
}

{{ if eq driver "postgres" -}}
Expand Down Expand Up @@ -260,7 +260,7 @@ func WithDuplicateKeys(keys []string) UpsertOption {
}
}

func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, opts ...UpsertOption) error {
func UpsertOne[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, opts ...UpsertOption) error {
var opt upsertOpts
for i := range opts {
opts[i](&opt)
Expand Down Expand Up @@ -345,7 +345,7 @@ func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context
}
// Upsert is a helper function to upsert multiple records.
func Upsert[T sequel.KeyValuer[T], Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, opts ...UpsertOption) (sql.Result, error) {
func Upsert[T sequel.KeyValuer, Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, opts ...UpsertOption) (sql.Result, error) {
noOfData := len(data)
if noOfData == 0 {
return new(sequel.EmptyResult), nil
Expand Down Expand Up @@ -491,7 +491,7 @@ func Upsert[T sequel.KeyValuer[T], Ptr sequel.PtrScanner[T]](ctx context.Context
return sequel.NewRowsAffectedResult(i), rows.Close()
}
{{ else }}
func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, override bool, omittedFields ...string) (sql.Result, error) {
func UpsertOne[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, override bool, omittedFields ...string) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.PrimaryKeyer:
pkName, idx, _ := v.PK()
Expand Down Expand Up @@ -578,7 +578,7 @@ func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context
}

// Upsert is a helper function to upsert multiple records.
func Upsert[T sequel.KeyValuer[T], Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, override bool, omittedFields ...string) (sql.Result, error) {
func Upsert[T sequel.KeyValuer, Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, override bool, omittedFields ...string) (sql.Result, error) {
noOfData := len(data)
if noOfData == 0 {
return new(sequel.EmptyResult), nil
Expand Down Expand Up @@ -684,7 +684,7 @@ type primaryKeyFinder interface {
}
// FindByPK is to find single record using primary key.
func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
func FindByPK[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
switch v := any(model).(type) {
case primaryKeyFinder:
query, args := v.FindOneByPKStmt()
Expand Down Expand Up @@ -719,7 +719,7 @@ func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.
}
// UpdateByPK is to update single record using primary key.
func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func UpdateByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyUpdater:
query, args := v.UpdateOneByPKStmt()
Expand Down Expand Up @@ -751,7 +751,7 @@ func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, m
}
// DeleteByPK is to update single record using primary key.
func DeleteByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func DeleteByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyDeleter:
query, args := v.DeleteOneByPKStmt()
Expand Down
12 changes: 6 additions & 6 deletions examples/db/mysql/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (

type autoIncrKeyInserter interface {
sequel.AutoIncrKeyer
sequel.PrimaryKeyer
sequel.SingleInserter
}

func InsertOne[T sequel.TableColumnValuer, Ptr interface {
Expand Down Expand Up @@ -108,7 +108,7 @@ func Insert[T sequel.TableColumnValuer](ctx context.Context, sqlConn sequel.DB,
}
}

func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, override bool, omittedFields ...string) (sql.Result, error) {
func UpsertOne[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, override bool, omittedFields ...string) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.PrimaryKeyer:
pkName, idx, _ := v.PK()
Expand Down Expand Up @@ -195,7 +195,7 @@ func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context
}

// Upsert is a helper function to upsert multiple records.
func Upsert[T sequel.KeyValuer[T], Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, override bool, omittedFields ...string) (sql.Result, error) {
func Upsert[T sequel.KeyValuer, Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, override bool, omittedFields ...string) (sql.Result, error) {
noOfData := len(data)
if noOfData == 0 {
return new(sequel.EmptyResult), nil
Expand Down Expand Up @@ -300,7 +300,7 @@ type primaryKeyFinder interface {
}

// FindByPK is to find single record using primary key.
func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
func FindByPK[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
switch v := any(model).(type) {
case primaryKeyFinder:
query, args := v.FindOneByPKStmt()
Expand All @@ -319,7 +319,7 @@ func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.
}

// UpdateByPK is to update single record using primary key.
func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func UpdateByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyUpdater:
query, args := v.UpdateOneByPKStmt()
Expand All @@ -337,7 +337,7 @@ func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, m
}

// DeleteByPK is to update single record using primary key.
func DeleteByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func DeleteByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyDeleter:
query, args := v.DeleteOneByPKStmt()
Expand Down
12 changes: 6 additions & 6 deletions examples/db/postgres/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (

type autoIncrKeyInserter interface {
sequel.AutoIncrKeyer
sequel.PrimaryKeyer
sequel.SingleInserter
}

func InsertOne[T sequel.TableColumnValuer, Ptr interface {
Expand Down Expand Up @@ -168,7 +168,7 @@ func WithDuplicateKeys(keys []string) UpsertOption {
}
}

func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, opts ...UpsertOption) error {
func UpsertOne[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, opts ...UpsertOption) error {
var opt upsertOpts
for i := range opts {
opts[i](&opt)
Expand Down Expand Up @@ -253,7 +253,7 @@ func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context
}

// Upsert is a helper function to upsert multiple records.
func Upsert[T sequel.KeyValuer[T], Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, opts ...UpsertOption) (sql.Result, error) {
func Upsert[T sequel.KeyValuer, Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, opts ...UpsertOption) (sql.Result, error) {
noOfData := len(data)
if noOfData == 0 {
return new(sequel.EmptyResult), nil
Expand Down Expand Up @@ -405,7 +405,7 @@ type primaryKeyFinder interface {
}

// FindByPK is to find single record using primary key.
func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
func FindByPK[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
switch v := any(model).(type) {
case primaryKeyFinder:
query, args := v.FindOneByPKStmt()
Expand Down Expand Up @@ -436,7 +436,7 @@ func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.
}

// UpdateByPK is to update single record using primary key.
func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func UpdateByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyUpdater:
query, args := v.UpdateOneByPKStmt()
Expand Down Expand Up @@ -464,7 +464,7 @@ func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, m
}

// DeleteByPK is to update single record using primary key.
func DeleteByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func DeleteByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyDeleter:
query, args := v.DeleteOneByPKStmt()
Expand Down
12 changes: 6 additions & 6 deletions examples/db/sqlite/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (

type autoIncrKeyInserter interface {
sequel.AutoIncrKeyer
sequel.PrimaryKeyer
sequel.SingleInserter
}

func InsertOne[T sequel.TableColumnValuer, Ptr interface {
Expand Down Expand Up @@ -108,7 +108,7 @@ func Insert[T sequel.TableColumnValuer](ctx context.Context, sqlConn sequel.DB,
}
}

func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, override bool, omittedFields ...string) (sql.Result, error) {
func UpsertOne[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr, override bool, omittedFields ...string) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.PrimaryKeyer:
pkName, idx, _ := v.PK()
Expand Down Expand Up @@ -195,7 +195,7 @@ func UpsertOne[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context
}

// Upsert is a helper function to upsert multiple records.
func Upsert[T sequel.KeyValuer[T], Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, override bool, omittedFields ...string) (sql.Result, error) {
func Upsert[T sequel.KeyValuer, Ptr sequel.PtrScanner[T]](ctx context.Context, sqlConn sequel.DB, data []T, override bool, omittedFields ...string) (sql.Result, error) {
noOfData := len(data)
if noOfData == 0 {
return new(sequel.EmptyResult), nil
Expand Down Expand Up @@ -300,7 +300,7 @@ type primaryKeyFinder interface {
}

// FindByPK is to find single record using primary key.
func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
func FindByPK[T sequel.KeyValuer, Ptr sequel.KeyValueScanner[T]](ctx context.Context, sqlConn sequel.DB, model Ptr) error {
switch v := any(model).(type) {
case primaryKeyFinder:
query, args := v.FindOneByPKStmt()
Expand All @@ -319,7 +319,7 @@ func FindByPK[T sequel.KeyValuer[T], Ptr sequel.KeyValueScanner[T]](ctx context.
}

// UpdateByPK is to update single record using primary key.
func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func UpdateByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyUpdater:
query, args := v.UpdateOneByPKStmt()
Expand All @@ -337,7 +337,7 @@ func UpdateByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, m
}

// DeleteByPK is to update single record using primary key.
func DeleteByPK[T sequel.KeyValuer[T]](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
func DeleteByPK[T sequel.KeyValuer](ctx context.Context, sqlConn sequel.DB, model T) (sql.Result, error) {
switch v := any(model).(type) {
case sequel.KeyDeleter:
query, args := v.DeleteOneByPKStmt()
Expand Down
6 changes: 5 additions & 1 deletion examples/testcase/main/generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ import (
)

func (A) Schemas() sequel.TableDefinition {
return sequel.TableDefinition{}
return sequel.TableDefinition{
Columns: []sequel.ColumnDefinition{
{Name: "`t`", Definition: "`t` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"},
},
}
}
func (A) TableName() string {
return "`a`"
Expand Down
7 changes: 7 additions & 0 deletions examples/testcase/main/generated.go.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ import (
"github.com/si3nloong/sqlgen/sequel"
)

func (A) Schemas() sequel.TableDefinition {
return sequel.TableDefinition{
Columns: []sequel.ColumnDefinition{
{Name: "`t`", Definition: "`t` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"},
},
}
}
func (A) TableName() string {
return "`a`"
}
Expand Down
6 changes: 5 additions & 1 deletion examples/testcase/schema/custom-declare/generated.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ import (
)

func (A) Schemas() sequel.TableDefinition {
return sequel.TableDefinition{}
return sequel.TableDefinition{
Columns: []sequel.ColumnDefinition{
{Name: "`name`", Definition: "`name` VARCHAR(255) NOT NULL DEFAULT ''"},
},
}
}
func (A) InsertPlaceholders(row int) string {
return "(?)"
Expand Down
Loading

0 comments on commit 4b03d9a

Please sign in to comment.