This commit is contained in:
+55
-1
@@ -172,7 +172,7 @@ func NewUpdate[T any](orm *simpleorm.ORM, toUpdate T) (Update[T], error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u Update[T]) Execute(conn *simpleorm.DBConnection) ([]T, error) {
|
func (u Update[T]) Execute(conn *simpleorm.DBConnection) ([]T, error) {
|
||||||
dml, err := u.target.GetUpdateDML(u.toUpdate)
|
dml, err := u.target.GetUpdateDML()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []T{}, err
|
return []T{}, err
|
||||||
}
|
}
|
||||||
@@ -206,6 +206,60 @@ func (u Update[T]) Execute(conn *simpleorm.DBConnection) ([]T, error) {
|
|||||||
return []T{u.toUpdate}, nil
|
return []T{u.toUpdate}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Delete[T any] struct {
|
||||||
|
target schema.Table
|
||||||
|
toDelete []T
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDelete[T any](orm *simpleorm.ORM, toDelete []T) (Delete[T], error) {
|
||||||
|
table, ok := orm.Cache().Get(reflect.TypeFor[T]().Name())
|
||||||
|
if !ok {
|
||||||
|
return Delete[T]{}, errors.New("Failed to get table from schema cache")
|
||||||
|
}
|
||||||
|
|
||||||
|
return Delete[T]{target: *table, toDelete: toDelete}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d Delete[T]) Execute(conn *simpleorm.DBConnection) ([]T, error) {
|
||||||
|
count := len(d.toDelete)
|
||||||
|
dml, err := d.target.GetDeleteDML(count)
|
||||||
|
if err != nil {
|
||||||
|
return []T{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var params []any
|
||||||
|
|
||||||
|
for _, del := range d.toDelete {
|
||||||
|
pkCols, err := getPk(del, d.target)
|
||||||
|
if err != nil {
|
||||||
|
return []T{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pk := range pkCols {
|
||||||
|
params = append(params, pk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.LogInfo("%s [%s]", dml, params)
|
||||||
|
|
||||||
|
stmt, err := conn.Prepare(dml)
|
||||||
|
if err != nil {
|
||||||
|
return []T{}, err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
|
||||||
|
result, err := stmt.Exec(params...)
|
||||||
|
if err != nil {
|
||||||
|
return []T{}, err
|
||||||
|
} else {
|
||||||
|
rowsAffected, _ := result.RowsAffected()
|
||||||
|
log.LogInfo("Deleted %s row", rowsAffected)
|
||||||
|
}
|
||||||
|
|
||||||
|
return d.toDelete, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func createSelectResultContainer(t schema.Table) []any {
|
func createSelectResultContainer(t schema.Table) []any {
|
||||||
vals := make([]any, t.Type.NumField())
|
vals := make([]any, t.Type.NumField())
|
||||||
for i := range vals {
|
for i := range vals {
|
||||||
|
|||||||
@@ -258,3 +258,64 @@ func TestInsertAndUpdate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInsertAndDelete(t *testing.T) {
|
||||||
|
// GIVEN
|
||||||
|
conn := simpleorm.OpenConnection("sqlite3", "file:test.db")
|
||||||
|
defer cleanUp("test.db", conn)
|
||||||
|
orm := simpleorm.NewORM(Test{}, TestWithFk{}, TestWithFkAndFkId{},
|
||||||
|
TestWithCompositePk{}, TestWithCompositeFk{})
|
||||||
|
|
||||||
|
exec.ExecuteDDL(conn, orm)
|
||||||
|
|
||||||
|
testObj := Test{Int64Field: 54, IntField: 12, StringField: "asdf"}
|
||||||
|
|
||||||
|
insertExec, err := exec.NewInsert(orm, testObj)
|
||||||
|
if err != nil {
|
||||||
|
log.LogError("TestInsertAndDelete setup failed: %s", err)
|
||||||
|
t.Fail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = insertExec.Execute(conn)
|
||||||
|
if err != nil {
|
||||||
|
log.LogError("TestInsertAndDelete setup failed: %s", err)
|
||||||
|
t.Fail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
selectExec, err := exec.CreateSelect[Test](orm, "")
|
||||||
|
if err != nil {
|
||||||
|
log.LogError("TestInsertAndDelete setup failed: %s", err)
|
||||||
|
t.Fail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
selectRes, err := selectExec.Execute(conn)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.LogError("TestInsertAndDelete setup failed. %s", err)
|
||||||
|
t.Fail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteExec, err := exec.NewDelete[Test](orm, selectRes)
|
||||||
|
|
||||||
|
// WHEN
|
||||||
|
_, err = deleteExec.Execute(conn)
|
||||||
|
|
||||||
|
// THEN
|
||||||
|
if err != nil {
|
||||||
|
log.LogError("TestInsertAndDelete delete failure. %s", err)
|
||||||
|
t.Fail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
selectRes, err = selectExec.Execute(conn)
|
||||||
|
if len(selectRes) != 0 {
|
||||||
|
log.LogError("TestInsertAndDelete test failed. Expected: 0, Actual: %s", len(selectRes))
|
||||||
|
t.Fail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -5,7 +5,7 @@ package schema
|
|||||||
type SchemaDescriptor interface {
|
type SchemaDescriptor interface {
|
||||||
getDDL() (string, error)
|
getDDL() (string, error)
|
||||||
GetSelectDML() (string, error)
|
GetSelectDML() (string, error)
|
||||||
GetInsertDML() (string, error)
|
GetInsertDML(count int) (string, error)
|
||||||
GetUpdateDML() (string, error)
|
GetUpdateDML() (string, error)
|
||||||
GetDeleteDML() (string, error)
|
GetDeleteDML(count int) (string, error)
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-6
@@ -1,7 +1,6 @@
|
|||||||
package schema
|
package schema
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -104,7 +103,7 @@ func (t Table) GetInsertDML(count int) (string, error) {
|
|||||||
return dml.String(), nil
|
return dml.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Table) GetUpdateDML(src any) (string, error) {
|
func (t Table) GetUpdateDML() (string, error) {
|
||||||
var dml strings.Builder
|
var dml strings.Builder
|
||||||
dml.WriteString("UPDATE " + util.CamelToSnake(t.Type.Name()) + " SET ")
|
dml.WriteString("UPDATE " + util.CamelToSnake(t.Type.Name()) + " SET ")
|
||||||
|
|
||||||
@@ -145,18 +144,33 @@ func (t Table) GetUpdateDML(src any) (string, error) {
|
|||||||
return dml.String(), nil
|
return dml.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Table) GetDeleteDML(src any) (string, error) {
|
func (t Table) GetDeleteDML(count int) (string, error) {
|
||||||
var dml strings.Builder
|
var dml strings.Builder
|
||||||
dml.WriteString("DELETE FROM " + t.Name + " WHERE ")
|
dml.WriteString("DELETE FROM " + t.Name + " WHERE ")
|
||||||
|
|
||||||
for _, col := range t.Columns {
|
for _, col := range t.Columns {
|
||||||
modifiers := col.Modifiers
|
modifiers := col.Modifiers
|
||||||
|
|
||||||
_, ok := modifiers["pk"]
|
_, ok := modifiers["pk"]
|
||||||
if ok {
|
if ok {
|
||||||
dml.WriteString(col.Name + " = ?")
|
if count > 1 {
|
||||||
return dml.String(), nil
|
dml.WriteString(col.Name + " IN (")
|
||||||
|
} else {
|
||||||
|
dml.WriteString(col.Name + " = ")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", errors.New("Failed to determine primar key column for delete dml.")
|
for i := range count {
|
||||||
|
if i != 0 {
|
||||||
|
dml.WriteString(", ")
|
||||||
|
}
|
||||||
|
dml.WriteString("?")
|
||||||
|
}
|
||||||
|
|
||||||
|
if count > 1 {
|
||||||
|
dml.WriteString(")")
|
||||||
|
}
|
||||||
|
|
||||||
|
return dml.String(), nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user