memfiler.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2014 The lldb Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // A memory-only implementation of Filer.
  5. package lldb
  6. import (
  7. "fmt"
  8. "io"
  9. "github.com/cznic/internal/file"
  10. )
  11. var _ Filer = &MemFiler{}
  12. // MemFiler is a memory backed Filer. It implements BeginUpdate, EndUpdate and
  13. // Rollback as no-ops. MemFiler is not automatically persistent, but it has
  14. // ReadFrom and WriteTo methods.
  15. type MemFiler struct {
  16. fi file.Interface
  17. nest int
  18. }
  19. // NewMemFiler returns a new MemFiler.
  20. func NewMemFiler() *MemFiler {
  21. fi, err := file.OpenMem("")
  22. if err != nil {
  23. return nil
  24. }
  25. return &MemFiler{fi: fi}
  26. }
  27. // BeginUpdate implements Filer.
  28. func (f *MemFiler) BeginUpdate() error {
  29. f.nest++
  30. return nil
  31. }
  32. // Close implements Filer.
  33. func (f *MemFiler) Close() (err error) {
  34. if f.nest != 0 {
  35. return &ErrPERM{(f.Name() + ":Close")}
  36. }
  37. return f.fi.Close()
  38. }
  39. // EndUpdate implements Filer.
  40. func (f *MemFiler) EndUpdate() (err error) {
  41. if f.nest == 0 {
  42. return &ErrPERM{(f.Name() + ": EndUpdate")}
  43. }
  44. f.nest--
  45. return
  46. }
  47. // Name implements Filer.
  48. func (f *MemFiler) Name() string { return fmt.Sprintf("%p.memfiler", f) }
  49. // PunchHole implements Filer.
  50. func (f *MemFiler) PunchHole(off, size int64) (err error) { return nil }
  51. // ReadAt implements Filer.
  52. func (f *MemFiler) ReadAt(b []byte, off int64) (n int, err error) { return f.fi.ReadAt(b, off) }
  53. // ReadFrom is a helper to populate MemFiler's content from r. 'n' reports the
  54. // number of bytes read from 'r'.
  55. func (f *MemFiler) ReadFrom(r io.Reader) (n int64, err error) { return f.fi.ReadFrom(r) }
  56. // Rollback implements Filer.
  57. func (f *MemFiler) Rollback() (err error) { return nil }
  58. // Size implements Filer.
  59. func (f *MemFiler) Size() (int64, error) {
  60. info, err := f.fi.Stat()
  61. if err != nil {
  62. return 0, err
  63. }
  64. return info.Size(), nil
  65. }
  66. // Sync implements Filer.
  67. func (f *MemFiler) Sync() error { return nil }
  68. // Truncate implements Filer.
  69. func (f *MemFiler) Truncate(size int64) (err error) { return f.fi.Truncate(size) }
  70. // WriteAt implements Filer.
  71. func (f *MemFiler) WriteAt(b []byte, off int64) (n int, err error) { return f.fi.WriteAt(b, off) }
  72. // WriteTo is a helper to copy/persist MemFiler's content to w. If w is also
  73. // an io.WriterAt then WriteTo may attempt to _not_ write any big, for some
  74. // value of big, runs of zeros, i.e. it will attempt to punch holes, where
  75. // possible, in `w` if that happens to be a freshly created or to zero length
  76. // truncated OS file. 'n' reports the number of bytes written to 'w'.
  77. func (f *MemFiler) WriteTo(w io.Writer) (n int64, err error) { return f.fi.WriteTo(w) }