mdbc/insert.go

111 lines
2.3 KiB
Go

package mdbc
import (
"context"
"gitter.top/common/goref"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
type insertScope struct {
scope *scope
mdbc *mdbc
ctx context.Context
opts any
docs any
}
type insert interface {
insert(docs any) (*InsertResult, error)
}
type insertOne struct {
*insertScope
}
func (io *insertOne) insert(docs any) (*InsertResult, error) {
result, err := io.mdbc.database.Collection(io.scope.tableName).InsertOne(io.ctx, docs, io.opts.(*options.InsertOneOptions))
if err != nil {
return nil, err
}
return &InsertResult{id: result.InsertedID}, nil
}
type insertMany struct {
*insertScope
}
func (im *insertMany) insert(docs any) (*InsertResult, error) {
vals, ok := goref.ToInterfaces(docs)
if !ok {
return nil, ErrorNoInsertDocuments
}
result, err := im.mdbc.database.Collection(im.scope.tableName).InsertMany(im.ctx, vals, im.opts.(*options.InsertManyOptions))
if err != nil {
return nil, err
}
return &InsertResult{id: result.InsertedIDs}, nil
}
type InsertResult struct {
id interface{}
}
func (ir *InsertResult) GetID() string {
objectID, ok := ir.id.(primitive.ObjectID)
if ok {
return objectID.Hex()
}
val, ok := goref.ToString(ir.id)
if !ok {
panic("get insert id failed")
}
return val
}
func (ir *InsertResult) GetIDs() []string {
vals, ok := goref.ToStrings(ir.id)
if !ok {
panic("get insert id failed")
}
return vals
}
func (is *insertScope) SetContext(ctx context.Context) *insertScope {
is.ctx = ctx
return is
}
func (is *insertScope) SetInsertOneOptions(opts options.InsertOneOptions) *insertScope {
is.opts = &opts
return is
}
func (is *insertScope) SetInsertManyOptions(opts options.InsertManyOptions) *insertScope {
is.opts = &opts
return is
}
func (is *insertScope) mergeOptions(isMany bool) *insertScope {
if is.ctx == nil {
is.ctx = context.Background()
}
if is.opts == nil && isMany {
is.opts = &options.InsertManyOptions{}
}
if is.opts == nil && !isMany {
is.opts = &options.InsertOneOptions{}
}
return is
}
func (is *insertScope) Insert(docs any) (*InsertResult, error) {
isMany := goref.IsBaseList(docs)
is.mergeOptions(isMany)
var action insert = &insertOne{is}
if isMany {
action = &insertMany{is}
}
return action.insert(docs)
}