// New returns a new MemDB. func New(o *db.Options) *MemDB { return &MemDB{ height: 1, cmp: o.GetComparer(), kvData: make([]byte, 0, 4096), // The first maxHeight values of nodeData are the next nodes after the // head node at each possible height. Their initial value is zeroNode. nodeData: make([]int, maxHeight, 256), } }
// NewWriter returns a new table writer for the file. Closing the writer will // close the file. func NewWriter(f File, o *db.Options) *Writer { w := &Writer{ closer: f, blockRestartInterval: o.GetBlockRestartInterval(), blockSize: o.GetBlockSize(), cmp: o.GetComparer(), compression: o.GetCompression(), prevKey: make([]byte, 0, 256), restarts: make([]uint32, 0, 256), } if f == nil { w.err = errors.New("leveldb/table: nil file") return w } // If f does not have a Flush method, do our own buffering. type flusher interface { Flush() error } if _, ok := f.(flusher); ok { w.writer = f } else { w.bufWriter = bufio.NewWriter(f) w.writer = w.bufWriter } return w }
// NewReader returns a new table reader for the file. Closing the reader will // close the file. func NewReader(f File, o *db.Options) *Reader { r := &Reader{ file: f, comparer: o.GetComparer(), verifyChecksums: o.GetVerifyChecksums(), } if f == nil { r.err = errors.New("leveldb/table: nil file") return r } stat, err := f.Stat() if err != nil { r.err = fmt.Errorf("leveldb/table: invalid table (could not stat file): %v", err) return r } var footer [footerLen]byte if stat.Size() < int64(len(footer)) { r.err = errors.New("leveldb/table: invalid table (file size is too small)") return r } _, err = f.ReadAt(footer[:], stat.Size()-int64(len(footer))) if err != nil && err != io.EOF { r.err = fmt.Errorf("leveldb/table: invalid table (could not read footer): %v", err) return r } if string(footer[footerLen-len(magic):footerLen]) != magic { r.err = errors.New("leveldb/table: invalid table (bad magic number)") return r } // Ignore the metaindex. _, n := decodeBlockHandle(footer[:]) if n == 0 { r.err = errors.New("leveldb/table: invalid table (bad metaindex block handle)") return r } // Read the index into memory. indexBH, n := decodeBlockHandle(footer[n:]) if n == 0 { r.err = errors.New("leveldb/table: invalid table (bad index block handle)") return r } r.index, r.err = r.readBlock(indexBH) return r }