mydb/adapter/mysql/collection.go

57 lines
1.1 KiB
Go
Raw Permalink Normal View History

2023-09-18 15:15:42 +08:00
package mysql
import (
"git.hexq.cn/tiglog/mydb"
"git.hexq.cn/tiglog/mydb/internal/sqladapter"
"git.hexq.cn/tiglog/mydb/internal/sqlbuilder"
)
type collectionAdapter struct {
}
func (*collectionAdapter) Insert(col sqladapter.Collection, item interface{}) (interface{}, error) {
columnNames, columnValues, err := sqlbuilder.Map(item, nil)
if err != nil {
return nil, err
}
pKey, err := col.PrimaryKeys()
if err != nil {
return nil, err
}
q := col.SQL().InsertInto(col.Name()).
Columns(columnNames...).
Values(columnValues...)
res, err := q.Exec()
if err != nil {
return nil, err
}
lastID, err := res.LastInsertId()
if err == nil && len(pKey) <= 1 {
return lastID, nil
}
keyMap := mydb.Cond{}
for i := range columnNames {
for j := 0; j < len(pKey); j++ {
if pKey[j] == columnNames[i] {
keyMap[pKey[j]] = columnValues[i]
}
}
}
// There was an auto column among primary keys, let's search for it.
if lastID > 0 {
for j := 0; j < len(pKey); j++ {
if keyMap[pKey[j]] == nil {
keyMap[pKey[j]] = lastID
}
}
}
return keyMap, nil
}