From edbdfb8fc3f639992e988c5305b7e29b1be62c30 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 26 Dec 2018 15:18:04 -0800 Subject: [PATCH 1/2] delayed: export datastructure type That way, we can return it directly. --- delayed/delayed.go | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/delayed/delayed.go b/delayed/delayed.go index a8bfb18..3e3d4b7 100644 --- a/delayed/delayed.go +++ b/delayed/delayed.go @@ -9,50 +9,61 @@ import ( ) // New returns a new delayed datastore. -func New(ds ds.Datastore, delay delay.D) ds.Datastore { - return &delayed{ds: ds, delay: delay} +func New(ds ds.Datastore, delay delay.D) *Delayed { + return &Delayed{ds: ds, delay: delay} } -type delayed struct { +// Delayed is an adapter that delays operations on the inner datastore. +type Delayed struct { ds ds.Datastore delay delay.D } -func (dds *delayed) Put(key ds.Key, value []byte) (err error) { +var _ ds.Batching = (*Delayed)(nil) + +// Put implements the ds.Datastore interface. +func (dds *Delayed) Put(key ds.Key, value []byte) (err error) { dds.delay.Wait() return dds.ds.Put(key, value) } -func (dds *delayed) Get(key ds.Key) (value []byte, err error) { +// Get implements the ds.Datastore interface. +func (dds *Delayed) Get(key ds.Key) (value []byte, err error) { dds.delay.Wait() return dds.ds.Get(key) } -func (dds *delayed) Has(key ds.Key) (exists bool, err error) { +// Has implements the ds.Datastore interface. +func (dds *Delayed) Has(key ds.Key) (exists bool, err error) { dds.delay.Wait() return dds.ds.Has(key) } -func (dds *delayed) GetSize(key ds.Key) (size int, err error) { +// GetSize implements the ds.Datastore interface. +func (dds *Delayed) GetSize(key ds.Key) (size int, err error) { dds.delay.Wait() return dds.ds.GetSize(key) } -func (dds *delayed) Delete(key ds.Key) (err error) { +// Delete implements the ds.Datastore interface. +func (dds *Delayed) Delete(key ds.Key) (err error) { dds.delay.Wait() return dds.ds.Delete(key) } -func (dds *delayed) Query(q dsq.Query) (dsq.Results, error) { +// Query implements the ds.Datastore interface. +func (dds *Delayed) Query(q dsq.Query) (dsq.Results, error) { dds.delay.Wait() return dds.ds.Query(q) } -func (dds *delayed) Batch() (ds.Batch, error) { +// Batch implements the ds.Batching interface. +func (dds *Delayed) Batch() (ds.Batch, error) { return ds.NewBasicBatch(dds), nil } -func (dds *delayed) DiskUsage() (uint64, error) { +// DiskUsage implements the ds.PersistentDatastore interface. +func (dds *Delayed) DiskUsage() (uint64, error) { dds.delay.Wait() return ds.DiskUsage(dds.ds) } From 21c2c0e8ad98b7834026df0cc12c74d6d98d84ba Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 26 Dec 2018 15:18:45 -0800 Subject: [PATCH 2/2] delayed: make delayed implement io.Closer --- delayed/delayed.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/delayed/delayed.go b/delayed/delayed.go index 3e3d4b7..d34909f 100644 --- a/delayed/delayed.go +++ b/delayed/delayed.go @@ -3,6 +3,8 @@ package delayed import ( + "io" + ds "github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-datastore/query" delay "github.com/ipfs/go-ipfs-delay" @@ -20,6 +22,7 @@ type Delayed struct { } var _ ds.Batching = (*Delayed)(nil) +var _ io.Closer = (*Delayed)(nil) // Put implements the ds.Datastore interface. func (dds *Delayed) Put(key ds.Key, value []byte) (err error) { @@ -67,3 +70,11 @@ func (dds *Delayed) DiskUsage() (uint64, error) { dds.delay.Wait() return ds.DiskUsage(dds.ds) } + +// Close closes the inner datastore (if it implements the io.Closer interface). +func (dds *Delayed) Close() error { + if closer, ok := dds.ds.(io.Closer); ok { + return closer.Close() + } + return nil +}