WIP: Refactor - delete dml
Go Tests / test (pull_request) Failing after 9s

This commit is contained in:
2026-05-11 00:12:41 +02:00
parent f50004d9b4
commit 7bd3c333fe
4 changed files with 138 additions and 9 deletions
+55 -1
View File
@@ -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) {
dml, err := u.target.GetUpdateDML(u.toUpdate)
dml, err := u.target.GetUpdateDML()
if err != nil {
return []T{}, err
}
@@ -206,6 +206,60 @@ func (u Update[T]) Execute(conn *simpleorm.DBConnection) ([]T, error) {
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 {
vals := make([]any, t.Type.NumField())
for i := range vals {
+61
View File
@@ -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
View File
@@ -5,7 +5,7 @@ package schema
type SchemaDescriptor interface {
getDDL() (string, error)
GetSelectDML() (string, error)
GetInsertDML() (string, error)
GetInsertDML(count int) (string, error)
GetUpdateDML() (string, error)
GetDeleteDML() (string, error)
GetDeleteDML(count int) (string, error)
}
+20 -6
View File
@@ -1,7 +1,6 @@
package schema
import (
"errors"
"reflect"
"strings"
@@ -104,7 +103,7 @@ func (t Table) GetInsertDML(count int) (string, error) {
return dml.String(), nil
}
func (t Table) GetUpdateDML(src any) (string, error) {
func (t Table) GetUpdateDML() (string, error) {
var dml strings.Builder
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
}
func (t Table) GetDeleteDML(src any) (string, error) {
func (t Table) GetDeleteDML(count int) (string, error) {
var dml strings.Builder
dml.WriteString("DELETE FROM " + t.Name + " WHERE ")
for _, col := range t.Columns {
modifiers := col.Modifiers
_, ok := modifiers["pk"]
if ok {
dml.WriteString(col.Name + " = ?")
return dml.String(), nil
if count > 1 {
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
}