encoder.go 790 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package wal
  2. import (
  3. "bufio"
  4. "encoding/binary"
  5. "hash"
  6. "io"
  7. "github.com/coreos/etcd/crc"
  8. )
  9. type encoder struct {
  10. bw *bufio.Writer
  11. crc hash.Hash32
  12. }
  13. func newEncoder(w io.Writer, prevCrc uint32) *encoder {
  14. return &encoder{
  15. bw: bufio.NewWriter(w),
  16. crc: crc.New(prevCrc, crcTable),
  17. }
  18. }
  19. func (e *encoder) encode(rec *Record) error {
  20. e.crc.Write(rec.Data)
  21. rec.Crc = e.crc.Sum32()
  22. data, err := rec.Marshal()
  23. if err != nil {
  24. return err
  25. }
  26. if err := writeInt64(e.bw, int64(len(data))); err != nil {
  27. return err
  28. }
  29. _, err = e.bw.Write(data)
  30. return err
  31. }
  32. func (e *encoder) flush() error {
  33. return e.bw.Flush()
  34. }
  35. func (e *encoder) buffered() int {
  36. return e.bw.Buffered()
  37. }
  38. func writeInt64(w io.Writer, n int64) error {
  39. return binary.Write(w, binary.LittleEndian, n)
  40. }