package nstore import ( "database/sql" "fmt" "reflect" "strings" ) func (d *Database) deleteFieldRelations(tx *sql.Tx, srcID int64, rType reflect.Type, rField reflect.StructField) error { if fieldRelationTypeToDatabaseType(rField.Type) == "" { return errInvalidRelationType } relTableName := structFieldTableName(rType, rField) query := fmt.Sprintf(`DELETE FROM "%s" WHERE src_id = ?`, relTableName) d.debugQuery(query, srcID) if _, err := tx.Exec(query, srcID); err != nil { return err } return nil } func (d *Database) deleteFieldRelationsByValues(tx *sql.Tx, srcID int64, rType reflect.Type, rField reflect.StructField, fieldValues []any) error { if fieldRelationTypeToDatabaseType(rField.Type) == "" { return errInvalidRelationType } relTableName := structFieldTableName(rType, rField) query := fmt.Sprintf(`DELETE FROM "%s" WHERE value NOT IN (%s) AND src_id = ? `, relTableName, strings.TrimSuffix(strings.Repeat("?,", len(fieldValues)), ",")) args := append(fieldValues, srcID) d.debugQuery(query, args...) if _, err := tx.Exec(query, args...); err != nil { return err } return nil } func (d *Database) deleteStruct(tx *sql.Tx, ID int64, rType reflect.Type) error { if rType.Kind() != reflect.Struct { return errInvalidStruct } tableName := structTypeTableName(rType) for rField := range rType.Fields() { if rField.IsExported() && fieldRelationTypeToDatabaseType(rField.Type) != "" { if err := d.deleteFieldRelations(tx, ID, rType, rField); err != nil { return err } } } query := fmt.Sprintf(`DELETE FROM "%s" WHERE _id = ?`, tableName) d.debugQuery(query, ID) if _, err := tx.Exec(query, ID); err != nil { return err } return nil }