template

package
v0.0.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 3, 2021 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Constants

View Source
const (
	EntityFields    = "$ENTITY_FIELDS$"
	ScanFields      = "$SCAN_FIELDS$"
	ReferenceFields = "$REFERENCE_FIELDS$"
)
View Source
const (
	PackageName         = "$PACKAGE_NAME$"
	StdlibImports       = "$STDLIB_IMPORTS$"
	RepositoriesPackage = "$REPOSITORIES_PACKAGE$"
	Type                = "$TYPE$"
	ColumnName          = "$COLUMN_NAME$"
	FuncName            = "$FUNC_NAME$"
	Operator            = "$OPERATOR$"
	Value               = "$VALUE$"

	Equals         = "Equals"
	Not            = "Not"
	Contains       = "Contains"
	ContainsNot    = "ContainsNot"
	StartsWith     = "StartsWith"
	StartsWithNot  = "StartsWithNot"
	EndsWith       = "EndsWith"
	EndsWithNot    = "EndsWithNot"
	GreaterThan    = "GreaterThan"
	GreaterOrEqual = "GreaterOrEqual"
	LessThan       = "LessThan"
	LessOrEqual    = "LessOrEqual"
	Before         = "Before"
	BeforeOrEqual  = "BeforeOrEqual"
	After          = "After"
	AfterOrEqual   = "AfterOrEqual"
)
View Source
const (
	QueryFile = `package ` + PackageName + `

import (
	` + StdlibImports + `

	"` + RepositoriesPackage + `query"
)

type Query struct {
	n query.Node
}

func (q Query) SQL() (string, []interface{}) {
	return q.n.SQL()
}

func (q Query) Or(in Query) Query {
	return Query{query.Node{
		Children: &[2]query.Node{q.n, in.n},
		Operator: query.Or,
	}}
}
`
	QueryMethod = `func (q Query) ` + FuncName + `(in ` + Type + `) Query {
	return Query{query.Node{
		Children: &[2]query.Node{q.n, ` + FuncName + `(in).n},
		Operator: query.And,
	}}
}
`
	QueryFunction = `func ` + FuncName + `(in ` + Type + `) Query {
	return Query{query.Node{
		Condition: query.Condition{
			Column:   "` + ColumnName + `",
			Operator: query.` + Operator + `,
			Value:    ` + Value + `,
		},
	}}
}
`
)
View Source
const (
	ReposStructFields = "$REPOS_STRUCT_FIELDS$"
	RepoInits         = "$REPO_INITS$"
)
View Source
const (
	Imports               = "$IMPORTS$"
	TableName             = "$TABLE_NAME$"
	QueryPackageName      = "$ENTITY_PACKAGE_NAME$"
	ColumnNames           = "$COLUMN_NAMES$"
	StatementPlaceholders = "$STATEMENT_PLACEHOLDERS$"
	ColumnAssignments     = "$COLUMN_ASSIGNMENTS$"
	EntityName            = "$ENTITY_NAME$"
	InFields              = "$IN_FIELDS$"
	PKCapture             = "$ID_CAPTURE$"
	FieldName             = "$PK_FIELD_NAME$"
	PKQuery               = "$PK_QUERY$"
	PKFields              = "$PK_FIELDS"
	SaveFuncs             = "$SAVE_FUNCS$"
)
View Source
const EntityFile = `package ` + PackageName + `

import (
	"database/sql"
	"fmt"

	` + Imports + `
)

type ` + EntityName + ` struct {
	` + EntityFields + `

	` + ReferenceFields + `

	persisted *` + EntityName + `
}

type ` + EntityName + `s struct {
	rs *sql.Rows
}

func (es *` + EntityName + `s) Next() bool {
	return es.rs.Next()
}

func (es *` + EntityName + `s) Scan(e *` + EntityName + `) (err error) {
	if e == nil {
		return fmt.Errorf("in ` + EntityName + `s.Scan: passed a nil entity")
	}

	err = es.rs.Scan(` + ScanFields + `)
	persisted := *e
	e.persisted = &persisted
	return err
}
`
View Source
const MultiPKCaptureTemplate = `
	e = in
	var eid int64
	eid, err = res.LastInsertId()
	e.Id = int32(eid)
	if err != nil {
		return e, err
	}
`
View Source
const NodeFile = `` /* 1205-byte string literal not displayed */
View Source
const PKFieldTemplate = FieldName + "(in.persisted." + FieldName + ")."
View Source
const PKQueryTemplate = `
	q, args := ` + QueryPackageName + `.Query{}.
		` + PKFields + `
		SQL()
`
View Source
const RepositoriesFile = `package ` + PackageName + `

import (
	"database/sql"
)

type TransactFunc func(func() error) error

type Repositories struct {
	` + ReposStructFields + `
}

func InitRepositories(db *sql.DB) (Repositories, TransactFunc) {
	baseRepo := &repository{db: db}
	return Repositories{
		` + RepoInits + `
	}, initTransact(baseRepo)
}

type repository struct {
	db   *sql.DB
	tx   *sql.Tx
	isTx bool
}

func (r repository) prepare(query string) (*sql.Stmt, error) {
	if r.isTx {
		return r.tx.Prepare(query)
	} else {
		return r.db.Prepare(query)
	}
}

func initTransact(r *repository) TransactFunc {
	return func(f func() error) (err error) {
		r.tx, err = r.db.Begin()
		r.isTx = true
		defer func() {
			r.isTx = false
			if err != nil {
				err = r.tx.Rollback()
			} else {
				err = r.tx.Commit()
			}
		}()

		if err == nil {
			err = f()
		}

		return
	}
}
`
View Source
const RepositoryFile = `package ` + PackageName + `

import (
	"database/sql"
	"fmt"
	
	` + Imports + `
)

const (
	insert` + EntityName + ` = "INSERT INTO ` + TableName + `" +
		" (` + ColumnNames + `) " +
		" VALUES (` + StatementPlaceholders + `);"
	update` + EntityName + ` = "UPDATE ` + TableName + `" +
		" SET ` + ColumnAssignments + ` %s;"
	select` + EntityName + ` = "SELECT ` + ColumnNames + ` FROM ` + TableName + ` %s;"
	delete` + EntityName + ` = "DELETE FROM ` + TableName + ` %s;"
)

type ` + EntityName + `Repository struct {
	*repository
}

func (r *` + EntityName + `Repository) FetchOne(query ` + QueryPackageName + `.Query) (ent ` + EntityName + `, err error) {
	var stmt *sql.Stmt
	// ensure the *sql.Stmt is closed after we're done with it
	defer func() {
		if stmt != nil {
			_ = stmt.Close()
		}
	}()

	conditions, args := query.SQL()
	stmt, err = r.prepare(fmt.Sprintf(select` + EntityName + `, conditions))
	if err != nil {
		return
	}

	row := stmt.QueryRow(args...)

	err = row.Scan(` + ScanFields + `)

	persisted := ent
	ent.persisted = &persisted

	return ent, err
}

func (r *` + EntityName + `Repository) Search(query ` + QueryPackageName + `.Query) (es ` + EntityName + `s, err error) {
	var stmt *sql.Stmt
	// ensure the *sql.Stmt is closed after we're done with it
	defer func() {
		if stmt != nil {
			_ = stmt.Close()
		}
	}()

	conditions, args := query.SQL()
	stmt, err = r.prepare(fmt.Sprintf(select` + EntityName + `, conditions))
	if err != nil {
		return es, err
	}

	es.rs, err = stmt.Query(args...)

	return es, err
}

` + SaveFuncs + `

`
View Source
const SaveWithPK = `func (r *` + EntityName + `Repository) Save(in ` + EntityName + `) (` + EntityName + `, error) {
	if in.persisted == nil {
		return r.insert(in)
	} else {
		return r.update(in)
	}
}

func (r *` + EntityName + `Repository) insert(in ` + EntityName + `) (e ` + EntityName + `, err error) {
	var (
		stmt *sql.Stmt
		res  sql.Result
	)
	// ensure the *sql.Stmt is closed after we're done with it
	defer func() {
		if stmt != nil {
			_ = stmt.Close()
		}
	}()

	stmt, err = r.prepare(insert` + EntityName + `)
	if err != nil {
		return e, err
	}

	res, err = stmt.Exec(` + InFields + `)
	if err != nil {
		return e, err
	}
` + PKCapture + `
	in = e
	e.persisted = &in

	return e, err
}

func (r *` + EntityName + `Repository) update(in ` + EntityName + `) (e ` + EntityName + `, err error) {
	var (
		stmt *sql.Stmt
	)
	// ensure the *sql.Stmt is closed after we're done with it
	defer func() {
		if stmt != nil {
			_ = stmt.Close()
		}
	}()
` + PKQuery + `
	stmt, err = r.prepare(fmt.Sprintf(update` + EntityName + `, q))
	if err != nil {
		return e, err
	}

	fields := []interface{}{` + InFields + `}
	_, err = stmt.Exec(append(fields, args...)...)
	if err != nil {
		return e, err
	}

	e = in
	in = e
	e.persisted = &in

	return e, err
}

func (r *` + EntityName + `Repository) Delete(query ` + QueryPackageName + `.Query) (err error) {
	var stmt *sql.Stmt
	// ensure the *sql.Stmt is closed after we're done with it
	defer func() {
		if stmt != nil {
			_ = stmt.Close()
		}
	}()

	conditions, args := query.SQL()
	stmt, err = r.prepare(fmt.Sprintf(delete` + EntityName + `, conditions))
	if err != nil {
		return err
	}

	_, err = stmt.Exec(args...)

	return err
}`
View Source
const SaveWithoutPK = `func (r *` + EntityName + `Repository) Save(in ` + EntityName + `) (` + EntityName + `, error) {
	var (
		stmt *sql.Stmt
		res  sql.Result
	)
	// ensure the *sql.Stmt is closed after we're done with it
	defer func() {
		if stmt != nil {
			_ = stmt.Close()
		}
	}()

	stmt, err = r.prepare(insert` + EntityName + `)
	if err != nil {
		return e, err
	}

	res, err = stmt.Exec(` + InFields + `)
	if err != nil {
		return e, err
	}
` + PKCapture + `
	in = e
	e.persisted = &in

	return e, err
}`
View Source
const SinglePKCaptureTemplate = `
	e = in
	var eid int64
	eid, err = res.LastInsertId()
	e.` + FieldName + ` = ` + Type + `(eid)
	if err != nil {
		return e, err
	}
`

Variables

This section is empty.

Functions

func GenerateQueryLogic

func GenerateQueryLogic(col string, column schema.Column) (methods, functions, imports []string)

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL