package orm
import (
)
type m2mModel struct {
*sliceTableModel
baseTable *Table
rel *Relation
buf []byte
dstValues map[string][]reflect.Value
columns map[string]string
}
var _ TableModel = (*m2mModel)(nil)
func ( *join) *m2mModel {
:= .BaseModel.Table()
:= .JoinModel.(*sliceTableModel)
:= dstValues(, .PKs)
if len() == 0 {
return nil
}
:= &m2mModel{
sliceTableModel: ,
baseTable: ,
rel: .Rel,
dstValues: ,
columns: make(map[string]string),
}
if !.sliceOfPtr {
.strct = reflect.New(.table.Type).Elem()
}
return
}
func ( *m2mModel) () ColumnScanner {
if .sliceOfPtr {
.strct = reflect.New(.table.Type).Elem()
} else {
.strct.Set(.table.zeroStruct)
}
.structInited = false
return
}
func ( *m2mModel) ( ColumnScanner) error {
, := .modelIDMap(.buf[:0])
if != nil {
return
}
.buf =
, := .dstValues[string()]
if ! {
return fmt.Errorf(
"pg: relation=%q does not have base %s with id=%q (check join conditions)",
.rel.Field.GoName, .baseTable, )
}
for , := range {
if .sliceOfPtr {
.Set(reflect.Append(, .strct.Addr()))
} else {
.Set(reflect.Append(, .strct))
}
}
return nil
}
func ( *m2mModel) ( []byte) ([]byte, error) {
for , := range .rel.M2MBaseFKs {
if > 0 {
= append(, ',')
}
if , := .columns[]; {
= append(, ...)
} else {
return nil, fmt.Errorf("pg: %s does not have column=%q",
.sliceTableModel, )
}
}
return , nil
}
func ( *m2mModel) ( types.ColumnInfo, types.Reader, int) error {
if > 0 {
, := .ReadFullTemp()
if != nil {
return
}
.columns[.Name] = string()
= pool.NewBytesReader()
} else {
.columns[.Name] = ""
}
if , := .sliceTableModel.scanColumn(, , ); {
return
}
return nil
}