forked from mirrors/gotosocial
81 lines
1.4 KiB
Go
81 lines
1.4 KiB
Go
|
package pool
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
type Reader interface {
|
||
|
Buffered() int
|
||
|
|
||
|
Bytes() []byte
|
||
|
Read([]byte) (int, error)
|
||
|
ReadByte() (byte, error)
|
||
|
UnreadByte() error
|
||
|
ReadSlice(byte) ([]byte, error)
|
||
|
Discard(int) (int, error)
|
||
|
|
||
|
// ReadBytes(fn func(byte) bool) ([]byte, error)
|
||
|
// ReadN(int) ([]byte, error)
|
||
|
ReadFull() ([]byte, error)
|
||
|
ReadFullTemp() ([]byte, error)
|
||
|
}
|
||
|
|
||
|
type ColumnInfo struct {
|
||
|
Index int16
|
||
|
DataType int32
|
||
|
Name string
|
||
|
}
|
||
|
|
||
|
type ColumnAlloc struct {
|
||
|
columns []ColumnInfo
|
||
|
}
|
||
|
|
||
|
func NewColumnAlloc() *ColumnAlloc {
|
||
|
return new(ColumnAlloc)
|
||
|
}
|
||
|
|
||
|
func (c *ColumnAlloc) Reset() {
|
||
|
c.columns = c.columns[:0]
|
||
|
}
|
||
|
|
||
|
func (c *ColumnAlloc) New(index int16, name []byte) *ColumnInfo {
|
||
|
c.columns = append(c.columns, ColumnInfo{
|
||
|
Index: index,
|
||
|
Name: string(name),
|
||
|
})
|
||
|
return &c.columns[len(c.columns)-1]
|
||
|
}
|
||
|
|
||
|
func (c *ColumnAlloc) Columns() []ColumnInfo {
|
||
|
return c.columns
|
||
|
}
|
||
|
|
||
|
type ReaderContext struct {
|
||
|
*BufReader
|
||
|
ColumnAlloc *ColumnAlloc
|
||
|
}
|
||
|
|
||
|
func NewReaderContext() *ReaderContext {
|
||
|
const bufSize = 1 << 20 // 1mb
|
||
|
return &ReaderContext{
|
||
|
BufReader: NewBufReader(bufSize),
|
||
|
ColumnAlloc: NewColumnAlloc(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var readerPool = sync.Pool{
|
||
|
New: func() interface{} {
|
||
|
return NewReaderContext()
|
||
|
},
|
||
|
}
|
||
|
|
||
|
func GetReaderContext() *ReaderContext {
|
||
|
rd := readerPool.Get().(*ReaderContext)
|
||
|
return rd
|
||
|
}
|
||
|
|
||
|
func PutReaderContext(rd *ReaderContext) {
|
||
|
rd.ColumnAlloc.Reset()
|
||
|
readerPool.Put(rd)
|
||
|
}
|