simplefilefiler.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 basic os.File backed Filer.
  5. package lldb
  6. import (
  7. "os"
  8. "github.com/cznic/internal/file"
  9. )
  10. var _ Filer = &SimpleFileFiler{}
  11. // SimpleFileFiler is an os.File backed Filer intended for use where structural
  12. // consistency can be reached by other means (SimpleFileFiler is for example
  13. // wrapped in eg. an RollbackFiler or ACIDFiler0) or where persistence is not
  14. // required (temporary/working data sets).
  15. //
  16. // SimpleFileFiler is the most simple os.File backed Filer implementation as it
  17. // does not really implement BeginUpdate and EndUpdate/Rollback in any way
  18. // which would protect the structural integrity of data. If misused e.g. as a
  19. // real database storage w/o other measures, it can easily cause data loss
  20. // when, for example, a power outage occurs or the updating process terminates
  21. // abruptly.
  22. type SimpleFileFiler struct {
  23. fi file.Interface
  24. name string
  25. nest int
  26. }
  27. // NewSimpleFileFiler returns a new SimpleFileFiler.
  28. func NewSimpleFileFiler(f *os.File) *SimpleFileFiler {
  29. fi, err := file.Open(f)
  30. if err != nil {
  31. return nil
  32. }
  33. sf := &SimpleFileFiler{fi: fi, name: f.Name()}
  34. return sf
  35. }
  36. // BeginUpdate implements Filer.
  37. func (f *SimpleFileFiler) BeginUpdate() error {
  38. f.nest++
  39. return nil
  40. }
  41. // Close implements Filer.
  42. func (f *SimpleFileFiler) Close() (err error) {
  43. if f.nest != 0 {
  44. return &ErrPERM{(f.Name() + ":Close")}
  45. }
  46. return f.fi.Close()
  47. }
  48. // EndUpdate implements Filer.
  49. func (f *SimpleFileFiler) EndUpdate() (err error) {
  50. if f.nest == 0 {
  51. return &ErrPERM{(f.Name() + ":EndUpdate")}
  52. }
  53. f.nest--
  54. return
  55. }
  56. // Name implements Filer.
  57. func (f *SimpleFileFiler) Name() string { return f.name }
  58. // PunchHole implements Filer.
  59. func (f *SimpleFileFiler) PunchHole(off, size int64) (err error) { return nil }
  60. // ReadAt implements Filer.
  61. func (f *SimpleFileFiler) ReadAt(b []byte, off int64) (n int, err error) { return f.fi.ReadAt(b, off) }
  62. // Rollback implements Filer.
  63. func (f *SimpleFileFiler) Rollback() (err error) { return nil }
  64. // Size implements Filer.
  65. func (f *SimpleFileFiler) Size() (int64, error) {
  66. info, err := f.fi.Stat()
  67. if err != nil {
  68. return 0, err
  69. }
  70. return info.Size(), nil
  71. }
  72. // Sync implements Filer.
  73. func (f *SimpleFileFiler) Sync() error { return f.fi.Sync() }
  74. // Truncate implements Filer.
  75. func (f *SimpleFileFiler) Truncate(size int64) (err error) { return f.fi.Truncate(size) }
  76. // WriteAt implements Filer.
  77. func (f *SimpleFileFiler) WriteAt(b []byte, off int64) (n int, err error) { return f.fi.WriteAt(b, off) }