123 lines
2.5 KiB
Go
123 lines
2.5 KiB
Go
|
package bun
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
|
||
|
"github.com/uptrace/bun/schema"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
Safe = schema.Safe
|
||
|
Ident = schema.Ident
|
||
|
)
|
||
|
|
||
|
type NullTime = schema.NullTime
|
||
|
|
||
|
type BaseModel = schema.BaseModel
|
||
|
|
||
|
type (
|
||
|
BeforeScanHook = schema.BeforeScanHook
|
||
|
AfterScanHook = schema.AfterScanHook
|
||
|
)
|
||
|
|
||
|
type BeforeSelectHook interface {
|
||
|
BeforeSelect(ctx context.Context, query *SelectQuery) error
|
||
|
}
|
||
|
|
||
|
type AfterSelectHook interface {
|
||
|
AfterSelect(ctx context.Context, query *SelectQuery) error
|
||
|
}
|
||
|
|
||
|
type BeforeInsertHook interface {
|
||
|
BeforeInsert(ctx context.Context, query *InsertQuery) error
|
||
|
}
|
||
|
|
||
|
type AfterInsertHook interface {
|
||
|
AfterInsert(ctx context.Context, query *InsertQuery) error
|
||
|
}
|
||
|
|
||
|
type BeforeUpdateHook interface {
|
||
|
BeforeUpdate(ctx context.Context, query *UpdateQuery) error
|
||
|
}
|
||
|
|
||
|
type AfterUpdateHook interface {
|
||
|
AfterUpdate(ctx context.Context, query *UpdateQuery) error
|
||
|
}
|
||
|
|
||
|
type BeforeDeleteHook interface {
|
||
|
BeforeDelete(ctx context.Context, query *DeleteQuery) error
|
||
|
}
|
||
|
|
||
|
type AfterDeleteHook interface {
|
||
|
AfterDelete(ctx context.Context, query *DeleteQuery) error
|
||
|
}
|
||
|
|
||
|
type BeforeCreateTableHook interface {
|
||
|
BeforeCreateTable(ctx context.Context, query *CreateTableQuery) error
|
||
|
}
|
||
|
|
||
|
type AfterCreateTableHook interface {
|
||
|
AfterCreateTable(ctx context.Context, query *CreateTableQuery) error
|
||
|
}
|
||
|
|
||
|
type BeforeDropTableHook interface {
|
||
|
BeforeDropTable(ctx context.Context, query *DropTableQuery) error
|
||
|
}
|
||
|
|
||
|
type AfterDropTableHook interface {
|
||
|
AfterDropTable(ctx context.Context, query *DropTableQuery) error
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
type InValues struct {
|
||
|
slice reflect.Value
|
||
|
err error
|
||
|
}
|
||
|
|
||
|
var _ schema.QueryAppender = InValues{}
|
||
|
|
||
|
func In(slice interface{}) InValues {
|
||
|
v := reflect.ValueOf(slice)
|
||
|
if v.Kind() != reflect.Slice {
|
||
|
return InValues{
|
||
|
err: fmt.Errorf("bun: In(non-slice %T)", slice),
|
||
|
}
|
||
|
}
|
||
|
return InValues{
|
||
|
slice: v,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (in InValues) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, err error) {
|
||
|
if in.err != nil {
|
||
|
return nil, in.err
|
||
|
}
|
||
|
return appendIn(fmter, b, in.slice), nil
|
||
|
}
|
||
|
|
||
|
func appendIn(fmter schema.Formatter, b []byte, slice reflect.Value) []byte {
|
||
|
sliceLen := slice.Len()
|
||
|
for i := 0; i < sliceLen; i++ {
|
||
|
if i > 0 {
|
||
|
b = append(b, ", "...)
|
||
|
}
|
||
|
|
||
|
elem := slice.Index(i)
|
||
|
if elem.Kind() == reflect.Interface {
|
||
|
elem = elem.Elem()
|
||
|
}
|
||
|
|
||
|
if elem.Kind() == reflect.Slice {
|
||
|
b = append(b, '(')
|
||
|
b = appendIn(fmter, b, elem)
|
||
|
b = append(b, ')')
|
||
|
} else {
|
||
|
b = fmter.AppendValue(b, elem)
|
||
|
}
|
||
|
}
|
||
|
return b
|
||
|
}
|