Newer
Older
package sqlgen
import (
"bytes"
"fmt"
"text/template"
)
const (
sqlColumnSeparator = `.`
sqlColumnComma = `, `
sqlOrderByLayout = `
{{if .Columns}}
ORDER BY {{.Columns}} {{.Sort}}
{{end}}
`
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}}
SET {{.ColumnValues}}
{{if .Where}}
WHERE {{.Where}}
{{end}}
sqlSelectCountLayout = `
COUNT(1) AS _t
FROM {{.Source}}
{{if .Where}}
WHERE {{.Where}}
{{end}}
`
sqlInsertLayout = `
INSERT INTO {{.Source}}
({{.Columns}})
VALUES
({{.Values}})
`
sqlTruncateLayout = `
sqlDropDatabaseLayout = `
sqlDropTableLayout = `
DROP TABLE {{.Source}}
`
sqlAndKeyword = `AND`
sqlOrKeyword = `OR`
sqlDescKeyword = `DESC`
sqlAscKeyword = `ASC`
sqlConditionGroup = `({{.}})`
sqlColumnValue = `{{.Column}} {{.Operator}} {{.Value}}`
)
type Type uint
const (
SqlTruncate = iota
SqlDropTable
SqlDropDatabase
SqlSelectCount
)
)
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 {
Type
Database
Where
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)
case SqlDelete:
return mustParse(sqlDeleteLayout, self)
case SqlUpdate:
return mustParse(sqlUpdateLayout, self)
case SqlInsert:
return mustParse(sqlInsertLayout, self)