289 lines
5.4 KiB
Go
289 lines
5.4 KiB
Go
package pg
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
|
|
"github.com/go-pg/pg/internal"
|
|
"github.com/go-pg/pg/orm"
|
|
"github.com/go-pg/pg/types"
|
|
)
|
|
|
|
// Discard is used with Query and QueryOne to discard rows.
|
|
var Discard orm.Discard
|
|
|
|
func init() {
|
|
SetLogger(log.New(os.Stderr, "pg: ", log.LstdFlags|log.Lshortfile))
|
|
}
|
|
|
|
// Model returns new query for the optional model.
|
|
func Model(model ...interface{}) *orm.Query {
|
|
return orm.NewQuery(nil, model...)
|
|
}
|
|
|
|
// Scan returns ColumnScanner that copies the columns in the
|
|
// row into the values.
|
|
func Scan(values ...interface{}) orm.ColumnScanner {
|
|
return orm.Scan(values...)
|
|
}
|
|
|
|
// Q replaces any placeholders found in the query.
|
|
func Q(query string, params ...interface{}) types.ValueAppender {
|
|
return orm.Q(query, params...)
|
|
}
|
|
|
|
// F quotes a SQL identifier such as a table or column name replacing any
|
|
// placeholders found in the field.
|
|
func F(field string) types.ValueAppender {
|
|
return types.F(field)
|
|
}
|
|
|
|
// In accepts a slice and returns a wrapper that can be used with PostgreSQL
|
|
// IN operator:
|
|
//
|
|
// Where("id IN (?)", pg.In([]int{1, 2, 3}))
|
|
func In(slice interface{}) types.ValueAppender {
|
|
return types.In(slice)
|
|
}
|
|
|
|
// Array accepts a slice and returns a wrapper for working with PostgreSQL
|
|
// array data type.
|
|
//
|
|
// For struct fields you can use array tag:
|
|
//
|
|
// Emails []string `pg:",array"`
|
|
func Array(v interface{}) *types.Array {
|
|
return types.NewArray(v)
|
|
}
|
|
|
|
// Hstore accepts a map and returns a wrapper for working with hstore data type.
|
|
// Supported map types are:
|
|
// - map[string]string
|
|
//
|
|
// For struct fields you can use hstore tag:
|
|
//
|
|
// Attrs map[string]string `pg:",hstore"`
|
|
func Hstore(v interface{}) *types.Hstore {
|
|
return types.NewHstore(v)
|
|
}
|
|
|
|
func SetLogger(logger *log.Logger) {
|
|
internal.Logger = logger
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
type Strings []string
|
|
|
|
var _ orm.Model = (*Strings)(nil)
|
|
var _ types.ValueAppender = (*Strings)(nil)
|
|
|
|
func (strings *Strings) Init() error {
|
|
if s := *strings; len(s) > 0 {
|
|
*strings = s[:0]
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (strings *Strings) NewModel() orm.ColumnScanner {
|
|
return strings
|
|
}
|
|
|
|
func (Strings) AddModel(_ orm.ColumnScanner) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) AfterQuery(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) AfterSelect(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) BeforeInsert(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) AfterInsert(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) BeforeUpdate(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) AfterUpdate(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) BeforeDelete(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Strings) AfterDelete(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (strings *Strings) ScanColumn(colIdx int, _ string, b []byte) error {
|
|
*strings = append(*strings, string(b))
|
|
return nil
|
|
}
|
|
|
|
func (strings Strings) AppendValue(dst []byte, quote int) ([]byte, error) {
|
|
if len(strings) <= 0 {
|
|
return dst, nil
|
|
}
|
|
|
|
for _, s := range strings {
|
|
dst = types.AppendString(dst, s, 1)
|
|
dst = append(dst, ',')
|
|
}
|
|
dst = dst[:len(dst)-1]
|
|
return dst, nil
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
type Ints []int64
|
|
|
|
var _ orm.Model = (*Ints)(nil)
|
|
var _ types.ValueAppender = (*Ints)(nil)
|
|
|
|
func (ints *Ints) Init() error {
|
|
if s := *ints; len(s) > 0 {
|
|
*ints = s[:0]
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (ints *Ints) NewModel() orm.ColumnScanner {
|
|
return ints
|
|
}
|
|
|
|
func (Ints) AddModel(_ orm.ColumnScanner) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) AfterQuery(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) AfterSelect(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) BeforeInsert(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) AfterInsert(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) BeforeUpdate(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) AfterUpdate(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) BeforeDelete(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (Ints) AfterDelete(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (ints *Ints) ScanColumn(colIdx int, colName string, b []byte) error {
|
|
n, err := strconv.ParseInt(internal.BytesToString(b), 10, 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*ints = append(*ints, n)
|
|
return nil
|
|
}
|
|
|
|
func (ints Ints) AppendValue(dst []byte, quote int) ([]byte, error) {
|
|
if len(ints) <= 0 {
|
|
return dst, nil
|
|
}
|
|
|
|
for _, v := range ints {
|
|
dst = strconv.AppendInt(dst, v, 10)
|
|
dst = append(dst, ',')
|
|
}
|
|
dst = dst[:len(dst)-1]
|
|
return dst, nil
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
type IntSet map[int64]struct{}
|
|
|
|
var _ orm.Model = (*IntSet)(nil)
|
|
|
|
func (set *IntSet) Init() error {
|
|
if len(*set) > 0 {
|
|
*set = make(map[int64]struct{})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (set *IntSet) NewModel() orm.ColumnScanner {
|
|
return set
|
|
}
|
|
|
|
func (IntSet) AddModel(_ orm.ColumnScanner) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) AfterQuery(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) AfterSelect(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) BeforeInsert(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) AfterInsert(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) BeforeUpdate(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) AfterUpdate(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) BeforeDelete(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (IntSet) AfterDelete(_ orm.DB) error {
|
|
return nil
|
|
}
|
|
|
|
func (setptr *IntSet) ScanColumn(colIdx int, colName string, b []byte) error {
|
|
set := *setptr
|
|
if set == nil {
|
|
*setptr = make(IntSet)
|
|
set = *setptr
|
|
}
|
|
|
|
n, err := strconv.ParseInt(internal.BytesToString(b), 10, 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
set[n] = struct{}{}
|
|
return nil
|
|
}
|