mirror of https://github.com/aldy505/bob.git
feat: truncate rename and drop
This commit is contained in:
parent
0d704c88df
commit
c9b01eeb67
32
bob.go
32
bob.go
|
@ -36,6 +36,22 @@ func (b BobBuilderType) HasColumn(column string) HasBuilder {
|
||||||
return HasBuilder(b).HasColumn(column)
|
return HasBuilder(b).HasColumn(column)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b BobBuilderType) DropTable(table string) DropBuilder {
|
||||||
|
return DropBuilder(b).DropTable(table)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BobBuilderType) DropTableIfExists(table string) DropBuilder {
|
||||||
|
return DropBuilder(b).DropTable(table).IfExists()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BobBuilderType) RenameTable(from, to string) RenameBuilder {
|
||||||
|
return RenameBuilder(b).From(from).To(to)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BobBuilderType) Truncate(table string) TruncateBuilder {
|
||||||
|
return TruncateBuilder(b).Truncate(table)
|
||||||
|
}
|
||||||
|
|
||||||
// BobStmtBuilder is the parent builder for BobBuilderType
|
// BobStmtBuilder is the parent builder for BobBuilderType
|
||||||
var BobStmtBuilder = BobBuilderType(builder.EmptyBuilder)
|
var BobStmtBuilder = BobBuilderType(builder.EmptyBuilder)
|
||||||
|
|
||||||
|
@ -58,3 +74,19 @@ func HasTable(table string) HasBuilder {
|
||||||
func HasColumn(col string) HasBuilder {
|
func HasColumn(col string) HasBuilder {
|
||||||
return BobStmtBuilder.HasColumn(col)
|
return BobStmtBuilder.HasColumn(col)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DropTable(table string) DropBuilder {
|
||||||
|
return BobStmtBuilder.DropTable(table)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DropTableIfExists(table string) DropBuilder {
|
||||||
|
return BobStmtBuilder.DropTableIfExists(table)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RenameTable(from, to string) RenameBuilder {
|
||||||
|
return BobStmtBuilder.RenameTable(from, to)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Truncate(table string) TruncateBuilder {
|
||||||
|
return BobStmtBuilder.Truncate(table)
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package bob
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/lann/builder"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DropBuilder builder.Builder
|
||||||
|
|
||||||
|
type dropData struct {
|
||||||
|
TableName string
|
||||||
|
IfExists bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
builder.Register(DropBuilder{}, dropData{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// DropTable sets which table to be dropped
|
||||||
|
func (b DropBuilder) DropTable(name string) DropBuilder {
|
||||||
|
return builder.Set(b, "TableName", name).(DropBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b DropBuilder) IfExists() DropBuilder {
|
||||||
|
return builder.Set(b, "IfExists", true).(DropBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSql returns 3 variables filled out with the correct values based on bindings, etc.
|
||||||
|
func (b DropBuilder) ToSql() (string, []interface{}, error) {
|
||||||
|
data := builder.GetStruct(b).(dropData)
|
||||||
|
return data.ToSql()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSql returns 3 variables filled out with the correct values based on bindings, etc.
|
||||||
|
func (d *dropData) ToSql() (sqlStr string, args []interface{}, err error) {
|
||||||
|
if len(d.TableName) == 0 || d.TableName == "" {
|
||||||
|
err = errors.New("drop statement must specify a table")
|
||||||
|
}
|
||||||
|
sql := &bytes.Buffer{}
|
||||||
|
|
||||||
|
sql.WriteString("DROP TABLE ")
|
||||||
|
|
||||||
|
if d.IfExists {
|
||||||
|
sql.WriteString("IF EXISTS ")
|
||||||
|
}
|
||||||
|
|
||||||
|
sql.WriteString("\""+d.TableName+"\";")
|
||||||
|
|
||||||
|
sqlStr = sql.String()
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package bob_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/aldy505/bob"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDrop(t *testing.T) {
|
||||||
|
t.Run("should be able to create regular drop query", func (t *testing.T) {
|
||||||
|
sql, _, err := bob.DropTable("users").ToSql()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := "DROP TABLE \"users\";"
|
||||||
|
if sql != result {
|
||||||
|
t.Error("sql is not the same as result: ", sql)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should be able to create drop if exists query", func(t *testing.T) {
|
||||||
|
sql, _, err := bob.DropTableIfExists("users").ToSql()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := "DROP TABLE IF EXISTS \"users\";"
|
||||||
|
if sql != result {
|
||||||
|
t.Error("sql is not the same as result: ", sql)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should expect an error for no table name", func(t *testing.T) {
|
||||||
|
_, _, err := bob.DropTableIfExists("").ToSql()
|
||||||
|
if err == nil && err.Error() != "drop statement must specify a table" {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package bob
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/lann/builder"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RenameBuilder builder.Builder
|
||||||
|
|
||||||
|
type renameData struct {
|
||||||
|
From string
|
||||||
|
To string
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
builder.Register(RenameBuilder{}, renameData{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// From sets existing table name
|
||||||
|
func (b RenameBuilder) From(name string) RenameBuilder {
|
||||||
|
return builder.Set(b, "From", name).(RenameBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
// To sets desired table name
|
||||||
|
func (b RenameBuilder) To(name string) RenameBuilder {
|
||||||
|
return builder.Set(b, "To", name).(RenameBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSql returns 3 variables filled out with the correct values based on bindings, etc.
|
||||||
|
func (b RenameBuilder) ToSql() (string, []interface{}, error) {
|
||||||
|
data := builder.GetStruct(b).(renameData)
|
||||||
|
return data.ToSql()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSql returns 3 variables filled out with the correct values based on bindings, etc.
|
||||||
|
func (d *renameData) ToSql() (sqlStr string, args []interface{}, err error) {
|
||||||
|
if len(d.From) == 0 || d.From == "" || len(d.To) == 0 || d.To == "" {
|
||||||
|
err = errors.New("rename statement must specify a table")
|
||||||
|
}
|
||||||
|
sqlStr = "RENAME TABLE \""+d.From+"\" TO \""+d.To+"\";"
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package bob_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/aldy505/bob"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRename(t *testing.T) {
|
||||||
|
t.Run("should be able to create rename query", func (t *testing.T) {
|
||||||
|
sql, _, err := bob.RenameTable("users", "teachers").ToSql()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := "RENAME TABLE \"users\" TO \"teachers\";"
|
||||||
|
if sql != result {
|
||||||
|
t.Error("sql is not the same as result: ", sql)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should expect an error for no table name", func(t *testing.T) {
|
||||||
|
_, _, err := bob.RenameTable("", "").ToSql()
|
||||||
|
if err == nil && err.Error() != "rename statement must specify a table" {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package bob
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/lann/builder"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TruncateBuilder builder.Builder
|
||||||
|
|
||||||
|
type truncateData struct {
|
||||||
|
TableName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
builder.Register(TruncateBuilder{}, truncateData{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate sets which table to be dropped
|
||||||
|
func (b TruncateBuilder) Truncate(name string) TruncateBuilder {
|
||||||
|
return builder.Set(b, "TableName", name).(TruncateBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSql returns 3 variables filled out with the correct values based on bindings, etc.
|
||||||
|
func (b TruncateBuilder) ToSql() (string, []interface{}, error) {
|
||||||
|
data := builder.GetStruct(b).(truncateData)
|
||||||
|
return data.ToSql()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSql returns 3 variables filled out with the correct values based on bindings, etc.
|
||||||
|
func (d *truncateData) ToSql() (sqlStr string, args []interface{}, err error) {
|
||||||
|
if len(d.TableName) == 0 || d.TableName == "" {
|
||||||
|
err = errors.New("truncate statement must specify a table")
|
||||||
|
}
|
||||||
|
sqlStr = "TRUNCATE \""+d.TableName+"\";"
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package bob_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/aldy505/bob"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestTruncate(t *testing.T) {
|
||||||
|
t.Run("should be able to create truncate query", func (t *testing.T) {
|
||||||
|
sql, _, err := bob.Truncate("users").ToSql()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := "TRUNCATE \"users\";"
|
||||||
|
if sql != result {
|
||||||
|
t.Error("sql is not the same as result: ", sql)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should expect an error for no table name", func(t *testing.T) {
|
||||||
|
_, _, err := bob.Truncate("").ToSql()
|
||||||
|
if err == nil && err.Error() != "TRUNCATE statement must specify a table" {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue