added ErrorWithStack

This commit is contained in:
Sebastian Frank 2020-11-28 20:34:06 +01:00
parent 1fee9fe349
commit ef51f2446b

27
crud.go
View File

@ -3,6 +3,7 @@ package mgocrud
import (
"fmt"
"reflect"
"runtime/debug"
"strings"
"time"
@ -11,6 +12,19 @@ import (
"gopkg.in/mgo.v2/bson"
)
type ErrorWithStack struct {
Message string
StackTrace string
}
func (e *ErrorWithStack) Error() string {
return e.Message
}
func (e *ErrorWithStack) Stack() string {
return e.StackTrace
}
// CreateDocument creates a document from specified model
func CreateDocument(db *mgo.Database, m ModelInterface) error {
m.PrepareInsert()
@ -116,10 +130,10 @@ func idToObjectID(filter interface{}) {
}
// ReadCollection gets the filtered collection of the model
func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, selector bson.M, offset int, limit int, sort []string, pipelineModifier PipelineModifierFunction) (err error) {
func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, selector bson.M, offset int, limit int, sort []string, pipelineModifier PipelineModifierFunction) (err *ErrorWithStack) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
err = &ErrorWithStack{Message: fmt.Sprintf("%v", r), StackTrace: string(debug.Stack())}
}
}()
@ -142,6 +156,8 @@ func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, select
c := db.C(GetCollectionName(m))
var _err error
if pipelineModifier != nil {
// search via pipeline
@ -190,7 +206,7 @@ func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, select
}
q := c.Pipe(pipeline).AllowDiskUse().Iter()
err = q.All(results)
_err = q.All(results)
} else {
// search without pipe is faster
@ -212,9 +228,12 @@ func ReadCollection(db *mgo.Database, results interface{}, filter bson.M, select
q = q.Limit(limit)
}
err = q.All(results)
_err = q.All(results)
}
if _err != nil {
return &ErrorWithStack{Message: _err.Error(), StackTrace: string(debug.Stack())}
}
return err
}