tools/data/file.go (70 lines of code) (raw):
package data
import (
"bufio"
encoding_binary "encoding/binary"
"fmt"
"os"
"github.com/Azure/adx-mon/pkg/prompb"
)
type FileWriter struct {
f *os.File
bw *bufio.Writer
}
func NewFileWriter(path string) (*FileWriter, error) {
f, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0600)
if err != nil {
return nil, err
}
bw := bufio.NewWriter(f)
return &FileWriter{f: f, bw: bw}, nil
}
func (f *FileWriter) Write(wr *prompb.WriteRequest) (int, error) {
b, err := wr.Marshal()
if err != nil {
return 0, err
}
// Write the length
if err := encoding_binary.Write(f.f, encoding_binary.BigEndian, uint64(len(b))); err != nil {
return 0, err
}
n, err := f.bw.Write(b)
return n + 8, err
}
func (f *FileWriter) Close() error {
if err := f.bw.Flush(); err != nil {
return err
}
if err := f.f.Sync(); err != nil {
return err
}
return f.f.Close()
}
type FileReader struct {
f *os.File
}
func NewFileReader(path string) (*FileReader, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
return &FileReader{f: f}, nil
}
func (f *FileReader) Read() (*prompb.WriteRequest, error) {
var sz uint64
// Write the length
if err := encoding_binary.Read(f.f, encoding_binary.BigEndian, &sz); err != nil {
return nil, err
}
b := make([]byte, sz)
// Write the length
if n, err := f.f.Read(b[:sz]); err != nil {
return nil, err
} else if n != int(sz) {
return nil, fmt.Errorf("short read: %d != %d", n, sz)
}
wr := &prompb.WriteRequest{}
if err := wr.Unmarshal(b[:sz]); err != nil {
return nil, err
}
return wr, nil
}
func (f *FileReader) Close() error {
return f.f.Close()
}