mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-11-27 04:39:25 +08:00
53 lines
1014 B
Go
53 lines
1014 B
Go
package buffered_writer
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
var _ = io.WriteCloser(&BufferedWriteCloser{})
|
|
|
|
type BufferedWriteCloser struct {
|
|
buffer bytes.Buffer
|
|
bufferLimit int
|
|
position int64
|
|
nextFlushOffset int64
|
|
FlushFunc func([]byte, int64) error
|
|
CloseFunc func() error
|
|
}
|
|
|
|
func NewBufferedWriteCloser(bufferLimit int) *BufferedWriteCloser {
|
|
return &BufferedWriteCloser{
|
|
bufferLimit: bufferLimit,
|
|
}
|
|
}
|
|
|
|
func (b *BufferedWriteCloser) Write(p []byte) (n int, err error) {
|
|
|
|
if b.buffer.Len()+len(p) >= b.bufferLimit {
|
|
if err := b.FlushFunc(b.buffer.Bytes(), b.nextFlushOffset); err != nil {
|
|
return 0, err
|
|
}
|
|
b.nextFlushOffset += int64(b.buffer.Len())
|
|
b.buffer.Reset()
|
|
}
|
|
|
|
return b.buffer.Write(p)
|
|
|
|
}
|
|
|
|
func (b *BufferedWriteCloser) Close() error {
|
|
if b.buffer.Len() > 0 {
|
|
if err := b.FlushFunc(b.buffer.Bytes(), b.nextFlushOffset); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if b.CloseFunc != nil {
|
|
if err := b.CloseFunc(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|