102 lines
2.1 KiB
Go
102 lines
2.1 KiB
Go
package queries
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/db"
|
|
"github.com/go-pg/pg/v10"
|
|
"github.com/go-pg/pg/v10/orm"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type QueryBaseInterface interface {
|
|
GetDBConn() *pg.DB
|
|
GetClient() *db.DBClient
|
|
SetClient(client *db.DBClient)
|
|
}
|
|
|
|
type QueryBase struct {
|
|
client *db.DBClient
|
|
once sync.Once
|
|
}
|
|
|
|
func (q *QueryBase) GetDBConn() *pg.DB {
|
|
return q.GetClient().GetConn()
|
|
}
|
|
|
|
func (q *QueryBase) GetClient() *db.DBClient {
|
|
q.once.Do(func() {
|
|
if q.client == nil {
|
|
q.client = &db.DBClient{}
|
|
}
|
|
})
|
|
|
|
return q.client
|
|
}
|
|
|
|
func (q *QueryBase) SetClient(client *db.DBClient) {
|
|
if q.client != nil {
|
|
q.client.Close()
|
|
}
|
|
q.client = client
|
|
}
|
|
|
|
// pageQuery update orm query with PageQueryOptions
|
|
func (q *QueryBase) pageQuery(query *orm.Query, options *PageQueryOptions) *orm.Query {
|
|
if options == nil {
|
|
return query
|
|
}
|
|
|
|
if options.Order != "" {
|
|
query.Order(options.Order)
|
|
}
|
|
|
|
// A limit of 0 is not respected
|
|
if options.Limit > 0 {
|
|
query.Limit(options.Limit)
|
|
}
|
|
|
|
if options.Offset > 0 {
|
|
query.Offset(options.Offset)
|
|
}
|
|
|
|
return query
|
|
}
|
|
|
|
func (q *QueryBase) countWithStack(count int, err error) (int, error) {
|
|
return count, errors.WithStack(err)
|
|
}
|
|
|
|
func (q *QueryBase) resultWithStack(result orm.Result, err error) (orm.Result, error) {
|
|
return result, errors.WithStack(err)
|
|
}
|
|
|
|
func (q *QueryBase) insertSelectWithStack(inserted bool, err error) (bool, error) {
|
|
return inserted, errors.WithStack(err)
|
|
}
|
|
|
|
func (q *QueryBase) count(filter interface{}) (int, error) {
|
|
return q.countWithStack(q.GetDBConn().Model(filter).Count())
|
|
}
|
|
|
|
func (q *QueryBase) delete(model interface{}) (orm.Result, error) {
|
|
return q.resultWithStack(q.GetDBConn().Model(model).WherePK().Delete())
|
|
}
|
|
|
|
func (q *QueryBase) insert(model interface{}) (orm.Result, error) {
|
|
return q.resultWithStack(q.GetDBConn().Model(model).Insert())
|
|
}
|
|
|
|
func (q *QueryBase) update(model interface{}) (orm.Result, error) {
|
|
return q.resultWithStack(q.GetDBConn().Model(model).WherePK().Update())
|
|
}
|
|
|
|
func (q *QueryBase) hasErrorResult(total *ORMResults, result orm.Result, err error) bool {
|
|
if err != nil {
|
|
return true
|
|
}
|
|
|
|
total.AddResult(result)
|
|
return false
|
|
}
|