1package leveldb
2
3import (
4	"github.com/syndtr/goleveldb/leveldb/storage"
5	"sync/atomic"
6)
7
8type iStorage struct {
9	storage.Storage
10	read  uint64
11	write uint64
12}
13
14func (c *iStorage) Open(fd storage.FileDesc) (storage.Reader, error) {
15	r, err := c.Storage.Open(fd)
16	return &iStorageReader{r, c}, err
17}
18
19func (c *iStorage) Create(fd storage.FileDesc) (storage.Writer, error) {
20	w, err := c.Storage.Create(fd)
21	return &iStorageWriter{w, c}, err
22}
23
24func (c *iStorage) reads() uint64 {
25	return atomic.LoadUint64(&c.read)
26}
27
28func (c *iStorage) writes() uint64 {
29	return atomic.LoadUint64(&c.write)
30}
31
32// newIStorage returns the given storage wrapped by iStorage.
33func newIStorage(s storage.Storage) *iStorage {
34	return &iStorage{s, 0, 0}
35}
36
37type iStorageReader struct {
38	storage.Reader
39	c *iStorage
40}
41
42func (r *iStorageReader) Read(p []byte) (n int, err error) {
43	n, err = r.Reader.Read(p)
44	atomic.AddUint64(&r.c.read, uint64(n))
45	return n, err
46}
47
48func (r *iStorageReader) ReadAt(p []byte, off int64) (n int, err error) {
49	n, err = r.Reader.ReadAt(p, off)
50	atomic.AddUint64(&r.c.read, uint64(n))
51	return n, err
52}
53
54type iStorageWriter struct {
55	storage.Writer
56	c *iStorage
57}
58
59func (w *iStorageWriter) Write(p []byte) (n int, err error) {
60	n, err = w.Writer.Write(p)
61	atomic.AddUint64(&w.c.write, uint64(n))
62	return n, err
63}
64