You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-library/vendor/github.com/upper/db/v4/internal/sqladapter/record.go

123 lines
2.5 KiB

package sqladapter
import (
"reflect"
db "github.com/upper/db/v4"
"github.com/upper/db/v4/internal/sqlbuilder"
)
func recordID(store db.Store, record db.Record) (db.Cond, error) {
if record == nil {
return nil, db.ErrNilRecord
}
if hasConstraints, ok := record.(db.HasConstraints); ok {
return hasConstraints.Constraints(), nil
}
id := db.Cond{}
keys, fields, err := recordPrimaryKeyFieldValues(store, record)
if err != nil {
return nil, err
}
for i := range fields {
if fields[i] == reflect.Zero(reflect.TypeOf(fields[i])).Interface() {
return nil, db.ErrRecordIDIsZero
}
id[keys[i]] = fields[i]
}
if len(id) < 1 {
return nil, db.ErrRecordIDIsZero
}
return id, nil
}
func recordPrimaryKeyFieldValues(store db.Store, record db.Record) ([]string, []interface{}, error) {
sess := store.Session()
pKeys, err := sess.(Session).PrimaryKeys(store.Name())
if err != nil {
return nil, nil, err
}
fields := sqlbuilder.Mapper.FieldsByName(reflect.ValueOf(record), pKeys)
values := make([]interface{}, 0, len(fields))
for i := range fields {
if fields[i].IsValid() {
values = append(values, fields[i].Interface())
}
}
return pKeys, values, nil
}
func recordCreate(store db.Store, record db.Record) error {
sess := store.Session()
if validator, ok := record.(db.Validator); ok {
if err := validator.Validate(); err != nil {
return err
}
}
if hook, ok := record.(db.BeforeCreateHook); ok {
if err := hook.BeforeCreate(sess); err != nil {
return err
}
}
if creator, ok := store.(db.StoreCreator); ok {
if err := creator.Create(record); err != nil {
return err
}
} else {
if err := store.InsertReturning(record); err != nil {
return err
}
}
if hook, ok := record.(db.AfterCreateHook); ok {
if err := hook.AfterCreate(sess); err != nil {
return err
}
}
return nil
}
func recordUpdate(store db.Store, record db.Record) error {
sess := store.Session()
if validator, ok := record.(db.Validator); ok {
if err := validator.Validate(); err != nil {
return err
}
}
if hook, ok := record.(db.BeforeUpdateHook); ok {
if err := hook.BeforeUpdate(sess); err != nil {
return err
}
}
if updater, ok := store.(db.StoreUpdater); ok {
if err := updater.Update(record); err != nil {
return err
}
} else {
if err := record.Store(sess).UpdateReturning(record); err != nil {
return err
}
}
if hook, ok := record.(db.AfterUpdateHook); ok {
if err := hook.AfterUpdate(sess); err != nil {
return err
}
}
return nil
}