| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- // Copyright 2014 The lldb Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // A memory-only implementation of Filer.
- package lldb
- import (
- "fmt"
- "io"
- "github.com/cznic/internal/file"
- )
- var _ Filer = &MemFiler{}
- // MemFiler is a memory backed Filer. It implements BeginUpdate, EndUpdate and
- // Rollback as no-ops. MemFiler is not automatically persistent, but it has
- // ReadFrom and WriteTo methods.
- type MemFiler struct {
- fi file.Interface
- nest int
- }
- // NewMemFiler returns a new MemFiler.
- func NewMemFiler() *MemFiler {
- fi, err := file.OpenMem("")
- if err != nil {
- return nil
- }
- return &MemFiler{fi: fi}
- }
- // BeginUpdate implements Filer.
- func (f *MemFiler) BeginUpdate() error {
- f.nest++
- return nil
- }
- // Close implements Filer.
- func (f *MemFiler) Close() (err error) {
- if f.nest != 0 {
- return &ErrPERM{(f.Name() + ":Close")}
- }
- return f.fi.Close()
- }
- // EndUpdate implements Filer.
- func (f *MemFiler) EndUpdate() (err error) {
- if f.nest == 0 {
- return &ErrPERM{(f.Name() + ": EndUpdate")}
- }
- f.nest--
- return
- }
- // Name implements Filer.
- func (f *MemFiler) Name() string { return fmt.Sprintf("%p.memfiler", f) }
- // PunchHole implements Filer.
- func (f *MemFiler) PunchHole(off, size int64) (err error) { return nil }
- // ReadAt implements Filer.
- func (f *MemFiler) ReadAt(b []byte, off int64) (n int, err error) { return f.fi.ReadAt(b, off) }
- // ReadFrom is a helper to populate MemFiler's content from r. 'n' reports the
- // number of bytes read from 'r'.
- func (f *MemFiler) ReadFrom(r io.Reader) (n int64, err error) { return f.fi.ReadFrom(r) }
- // Rollback implements Filer.
- func (f *MemFiler) Rollback() (err error) { return nil }
- // Size implements Filer.
- func (f *MemFiler) Size() (int64, error) {
- info, err := f.fi.Stat()
- if err != nil {
- return 0, err
- }
- return info.Size(), nil
- }
- // Sync implements Filer.
- func (f *MemFiler) Sync() error { return nil }
- // Truncate implements Filer.
- func (f *MemFiler) Truncate(size int64) (err error) { return f.fi.Truncate(size) }
- // WriteAt implements Filer.
- func (f *MemFiler) WriteAt(b []byte, off int64) (n int, err error) { return f.fi.WriteAt(b, off) }
- // WriteTo is a helper to copy/persist MemFiler's content to w. If w is also
- // an io.WriterAt then WriteTo may attempt to _not_ write any big, for some
- // value of big, runs of zeros, i.e. it will attempt to punch holes, where
- // possible, in `w` if that happens to be a freshly created or to zero length
- // truncated OS file. 'n' reports the number of bytes written to 'w'.
- func (f *MemFiler) WriteTo(w io.Writer) (n int64, err error) { return f.fi.WriteTo(w) }
|