gosora/query_gen/mysql.go

230 lines
6.1 KiB
Go

/* WIP Under Construction */
package main
//import "fmt"
import "strings"
import "errors"
func init() {
db_registry = append(db_registry,&Mysql_Adapter{Name:"mysql"})
}
type Mysql_Adapter struct
{
Name string
Stmts string
Body string
}
func (adapter *Mysql_Adapter) get_name() string {
return adapter.Name
}
func (adapter *Mysql_Adapter) simple_insert(name string, table string, columns string, fields []string, quoteWhat []bool) error {
if name == "" {
return errors.New("You need a name for this statement")
}
if table == "" {
return errors.New("You need a name for this table")
}
if len(columns) == 0 {
return errors.New("No columns found for simple_insert")
}
if len(fields) == 0 {
return errors.New("No input data found for simple_insert")
}
// Slice up the user friendly strings into something easier to process
var colslice []string = strings.Split(strings.TrimSpace(columns),",")
var noquotes bool = (len(quoteWhat) == 0)
var querystr string = "INSERT INTO " + table + "("
// Escape the column names, just in case we've used a reserved keyword
// TO-DO: Subparse the columns to allow functions and AS keywords
for _, column := range colslice {
querystr += "`" + column + "`,"
}
// Remove the trailing comma
querystr = querystr[0:len(querystr) - 1]
querystr += ") VALUES ("
for fid, field := range fields {
if !noquotes && quoteWhat[fid] {
querystr += "'" + field + "',"
} else {
querystr += field + ","
}
}
querystr = querystr[0:len(querystr) - 1]
adapter.write_statement(name,querystr + ")")
return nil
}
func (adapter *Mysql_Adapter) simple_update() error {
return nil
}
func (adapter *Mysql_Adapter) simple_select(name string, table string, columns string, where string, orderby string/*, offset int, maxCount int*/) error {
if name == "" {
return errors.New("You need a name for this statement")
}
if table == "" {
return errors.New("You need a name for this table")
}
if len(columns) == 0 {
return errors.New("No columns found for simple_select")
}
// Slice up the user friendly strings into something easier to process
var colslice []string = strings.Split(strings.TrimSpace(columns),",")
var querystr string = "SELECT "
// Escape the column names, just in case we've used a reserved keyword
for _, column := range colslice {
querystr += "`" + strings.TrimSpace(column) + "`,"
}
// Remove the trailing comma
querystr = querystr[0:len(querystr) - 1]
querystr += " FROM " + table
if len(where) != 0 {
querystr += " WHERE"
//fmt.Println("where",where)
//fmt.Println("_process_where(where)",_process_where(where))
for _, loc := range _process_where(where) {
var lquote, rquote string
if loc.LeftType == "column" {
lquote = "`"
}
if loc.RightType == "column" {
rquote = "`"
}
querystr += " " + lquote + loc.Left + lquote + " " + loc.Operator + " " + rquote + loc.Right + rquote + " AND "
}
// Remove the trailing AND
querystr = querystr[0:len(querystr) - 4]
}
if len(orderby) != 0 {
querystr += " ORDER BY "
for _, column := range _process_orderby(orderby) {
querystr += column.Column + " " + strings.ToUpper(column.Order) + ","
}
querystr = querystr[0:len(querystr) - 1]
}
adapter.write_statement(name,strings.TrimSpace(querystr))
return nil
}
func (adapter *Mysql_Adapter) simple_left_join(name string, table1 string, table2 string, columns string, joiners string, where string, orderby string/*, offset int, maxCount int*/) error {
if name == "" {
return errors.New("You need a name for this statement")
}
if table1 == "" {
return errors.New("You need a name for the left table")
}
if table2 == "" {
return errors.New("You need a name for the right table")
}
if len(columns) == 0 {
return errors.New("No columns found for simple_left_join")
}
if len(joiners) == 0 {
return errors.New("No joiners found for simple_left_join")
}
var querystr string = "SELECT "
for _, column := range _process_columns(columns) {
var source, alias string
// Escape the column names, just in case we've used a reserved keyword
if column.Table != "" {
source = "`" + column.Table + "`.`" + column.Left + "`"
} else if column.Type == "function" {
source = column.Left
} else {
source = "`" + column.Left + "`"
}
if column.Alias != "" {
alias = " AS `" + column.Alias + "`"
}
querystr += source + alias + ","
}
// Remove the trailing comma
querystr = querystr[0:len(querystr) - 1]
querystr += " FROM " + table1 + " LEFT JOIN " + table2 + " ON "
for _, joiner := range _process_joiner(joiners) {
querystr += "`" + joiner.LeftTable + "`.`" + joiner.LeftColumn + "`=`" + joiner.RightTable + "`.`" + joiner.RightColumn + "` AND "
}
// Remove the trailing AND
querystr = querystr[0:len(querystr) - 4]
if len(where) != 0 {
querystr += " " + "WHERE"
for _, loc := range _process_where(where) {
var lquote, rquote string
if loc.LeftType == "column" {
lquote = "`"
}
if loc.RightType == "column" {
rquote = "`"
}
querystr += " " + lquote + loc.Left + lquote + " " + loc.Operator + " " + rquote + loc.Right + rquote + " AND "
}
querystr = querystr[0:len(querystr) - 3]
}
if len(orderby) != 0 {
querystr += " ORDER BY "
for _, column := range _process_orderby(orderby) {
querystr += column.Column + " " + strings.ToUpper(column.Order) + ","
}
querystr = querystr[0:len(querystr) - 1]
}
adapter.write_statement(name,strings.TrimSpace(querystr))
return nil
}
func (adapter *Mysql_Adapter) write() error {
out := `/* This file was generated by Gosora's Query Generator */
package main
import "log"
import "database/sql"
` + adapter.Stmts + `
func gen_mysql() (err error) {
if debug {
log.Print("Building the generated statements")
}
` + adapter.Body + `
return nil
}
`
return write_file("./gen_mysql.go", out)
}
// Internal method, not exposed in the interface
func (adapter *Mysql_Adapter) write_statement(name string, querystr string ) {
adapter.Stmts += "var " + name + "_stmt *sql.Stmt\n"
adapter.Body += `
log.Print("Preparing ` + name + ` statement.")
` + name + `_stmt, err = db.Prepare("` + querystr + `")
if err != nil {
return err
}
`
}