good morning!!!!

Skip to content
Snippets Groups Projects
main.go 2.48 KiB
Newer Older
package sqlgen

import (
	"bytes"
	"fmt"
	"text/template"
)

const (
	sqlColumnSeparator = `.`
	sqlColumnComma     = `, `
José Carlos Nieto's avatar
José Carlos Nieto committed
	sqlValueComma      = `, `
	sqlEscape          = `"{{.Raw}}"`

	sqlOrderByLayout = `
		{{if .Columns}}
			ORDER BY {{.Columns}} {{.Sort}}
		{{end}}
	`
	sqlSelectLayout = `
		SELECT

			{{if .Columns}}
				{{.Columns}}
			{{else}}
				*
			{{end}}
			{{if .Where}}
				WHERE {{.Where}}
			{{end}}
			{{if .Limit}}
				LIMIT {{.Limit}}
			{{end}}
			{{if .Offset}}
				OFFSET {{.Offset}}
			{{end}}
	`
	sqlDeleteLayout = `
		DELETE
			FROM {{.Source}}
			{{if .Where}}
				WHERE {{.Where}}
			{{end}}
	`
	sqlUpdateLayout = `
		UPDATE
			{{.Source}}
José Carlos Nieto's avatar
José Carlos Nieto committed
		SET {{.ColumnValues}}
			{{if .Where}}
				WHERE {{.Where}}
			{{end}}
		FROM {{.Source}}
			{{if .Where}}
				WHERE {{.Where}}
			{{end}}
	`

	sqlInsertLayout = `
		INSERT INTO {{.Source}}
			({{.Columns}})
		VALUES
			({{.Values}})
	`

		TRUNCATE TABLE {{.Source}}
	`

		DROP DATABASE {{.Database}}
	`

	sqlDropTableLayout = `
		DROP TABLE {{.Source}}
	`

	sqlAndKeyword      = `AND`
	sqlOrKeyword       = `OR`
	sqlDescKeyword     = `DESC`
	sqlAscKeyword      = `ASC`
	sqlDefaultOperator = `=`
	sqlConditionGroup  = `({{.}})`

	sqlColumnValue = `{{.Column}} {{.Operator}} {{.Value}}`
)

type Type uint

const (
	SqlTruncate = iota
	SqlDropTable
	SqlDropDatabase
	SqlSelectCount
José Carlos Nieto's avatar
José Carlos Nieto committed
	SqlInsert
	SqlSelect
José Carlos Nieto's avatar
José Carlos Nieto committed
	SqlUpdate
	SqlDelete
	Limit  int
	Offset int
)

func mustParse(text string, data interface{}) string {
	var b bytes.Buffer

	t := template.Must(template.New("").Parse(text))

	if err := t.Execute(&b, data); err != nil {
		fmt.Printf("data: %v\n", data)
		panic("t.Execute: " + err.Error())
	}

	return b.String()
}

type Statement struct {
	Limit
	Offset
	Columns
José Carlos Nieto's avatar
José Carlos Nieto committed
	Values
	ColumnValues
	OrderBy
func (self *Statement) Compile() string {
	switch self.Type {
	case SqlTruncate:
		return mustParse(sqlTruncateLayout, self)
	case SqlDropTable:
		return mustParse(sqlDropTableLayout, self)
	case SqlDropDatabase:
		return mustParse(sqlDropDatabaseLayout, self)
	case SqlSelectCount:
		return mustParse(sqlSelectCountLayout, self)
	case SqlSelect:
		return mustParse(sqlSelectLayout, self)
José Carlos Nieto's avatar
José Carlos Nieto committed
	case SqlDelete:
		return mustParse(sqlDeleteLayout, self)
	case SqlUpdate:
		return mustParse(sqlUpdateLayout, self)
	case SqlInsert:
		return mustParse(sqlInsertLayout, self)