func _values(values ...interface{}) (string, []interface{}) { var bindStr string var sql strings.Builder var vars []interface{} sql.WriteString("VALUES ") for i, value := range values { v := value.([]interface{}) if bindStr == "" { bindStr = genBindVars(len(v)) } sql.WriteString(fmt.Sprintf("(%v)", bindStr)) if i+1 != len(values) { sql.WriteString(", ") } vars = append(vars, v...) } return sql.String(), vars
type Clause struct { sql map[Type]string sqlVars map[Type][]interface{} }
type Type int const ( INSERT Type = iota VALUES SELECT LIMIT WHERE ORDERBY )
func(c *Clause) Set(name Type, vars ...interface{}) { if c.sql == nil { c.sql = make(map[Type]string) c.sqlVars = make(map[Type][]interface{}) } sql, vars := generators[name](vars...) c.sql[name] = sql c.sqlVars[name] = vars }
func(c *Clause) Build(orders ...Type) (string, []interface{}) { var sqls []string var vars []interface{} for _, order := range orders { if sql, ok := c.sql[order]; ok { sqls = append(sqls, sql) vars = append(vars, c.sqlVars[order]...) } } return strings.Join(sqls, " "), vars }
functestSelect(t *testing.T) { var clause Clause clause.Set(LIMIT, 3) clause.Set(SELECT, "User", []string{"*"}) clause.Set(WHERE, "Name = ?", "Tom") clause.Set(ORDERBY, "Age ASC") sql, vars := clause.Build(SELECT, WHERE, ORDERBY, LIMIT) t.Log(sql, vars) if sql != "SELECT * FROM User WHERE Name = ? ORDER BY Age ASC LIMIT ?" { t.Fatal("failed to build SQL") } if !reflect.DeepEqual(vars, []interface{}{"Tom", 3}) { t.Fatal("failed to build SQLVars") } }
func _values(values ...interface{}) (string, []interface{}) { var bindStr string var sql strings.Builder var vars []interface{} sql.WriteString("VALUES ") for i, value := range values { v := value.([]interface{}) if bindStr == "" { bindStr = genBindVars(len(v)) } sql.WriteString(fmt.Sprintf("(%v)", bindStr)) if i+1 != len(values) { sql.WriteString(", ") } vars = append(vars, v...) } return sql.String(), vars
type Clause struct { sql map[Type]string sqlVars map[Type][]interface{} }
type Type int const ( INSERT Type = iota VALUES SELECT LIMIT WHERE ORDERBY )
func(c *Clause) Set(name Type, vars ...interface{}) { if c.sql == nil { c.sql = make(map[Type]string) c.sqlVars = make(map[Type][]interface{}) } sql, vars := generators[name](vars...) c.sql[name] = sql c.sqlVars[name] = vars }
func(c *Clause) Build(orders ...Type) (string, []interface{}) { var sqls []string var vars []interface{} for _, order := range orders { if sql, ok := c.sql[order]; ok { sqls = append(sqls, sql) vars = append(vars, c.sqlVars[order]...) } } return strings.Join(sqls, " "), vars }
functestSelect(t *testing.T) { var clause Clause clause.Set(LIMIT, 3) clause.Set(SELECT, "User", []string{"*"}) clause.Set(WHERE, "Name = ?", "Tom") clause.Set(ORDERBY, "Age ASC") sql, vars := clause.Build(SELECT, WHERE, ORDERBY, LIMIT) t.Log(sql, vars) if sql != "SELECT * FROM User WHERE Name = ? ORDER BY Age ASC LIMIT ?" { t.Fatal("failed to build SQL") } if !reflect.DeepEqual(vars, []interface{}{"Tom", 3}) { t.Fatal("failed to build SQLVars") } }