@@ -2,6 +2,7 @@ package keytransform
2
2
3
3
import (
4
4
"context"
5
+ "errors"
5
6
6
7
ds "github.com/ipfs/go-datastore"
7
8
dsq "github.com/ipfs/go-datastore/query"
@@ -31,6 +32,7 @@ type Datastore struct {
31
32
32
33
var _ ds.Datastore = (* Datastore )(nil )
33
34
var _ ds.Batching = (* Datastore )(nil )
35
+ var _ ds.TxnDatastore = (* Datastore )(nil )
34
36
var _ ds.Shim = (* Datastore )(nil )
35
37
var _ ds.PersistentDatastore = (* Datastore )(nil )
36
38
var _ ds.CheckedDatastore = (* Datastore )(nil )
@@ -223,6 +225,23 @@ func (d *Datastore) Batch(ctx context.Context) (ds.Batch, error) {
223
225
}, nil
224
226
}
225
227
228
+ func (d * Datastore ) NewTransaction (ctx context.Context , readOnly bool ) (ds.Txn , error ) {
229
+ tds , ok := d .child .(ds.TxnDatastore )
230
+ if ! ok {
231
+ return nil , errors .New ("keytransform: transaction feature not supported" )
232
+ }
233
+
234
+ childTxn , err := tds .NewTransaction (ctx , readOnly )
235
+ if err != nil {
236
+ return nil , err
237
+ }
238
+
239
+ return & transformTxn {
240
+ dst : childTxn ,
241
+ f : d .ConvertKey ,
242
+ }, nil
243
+ }
244
+
226
245
type transformBatch struct {
227
246
dst ds.Batch
228
247
@@ -243,6 +262,47 @@ func (t *transformBatch) Commit(ctx context.Context) error {
243
262
return t .dst .Commit (ctx )
244
263
}
245
264
265
+ type transformTxn struct {
266
+ ds * Datastore
267
+ dst ds.Txn
268
+
269
+ f KeyMapping
270
+ }
271
+
272
+ var _ ds.Txn = (* transformTxn )(nil )
273
+
274
+ func (t * transformTxn ) Put (ctx context.Context , key ds.Key , val []byte ) error {
275
+ return t .dst .Put (ctx , t .f (key ), val )
276
+ }
277
+
278
+ func (t * transformTxn ) Delete (ctx context.Context , key ds.Key ) error {
279
+ return t .dst .Delete (ctx , t .f (key ))
280
+ }
281
+
282
+ func (t * transformTxn ) Commit (ctx context.Context ) error {
283
+ return t .dst .Commit (ctx )
284
+ }
285
+
286
+ func (t * transformTxn ) Get (ctx context.Context , key ds.Key ) (value []byte , err error ) {
287
+ return t .dst .Get (ctx , t .f (key ))
288
+ }
289
+
290
+ func (t * transformTxn ) Has (ctx context.Context , key ds.Key ) (exists bool , err error ) {
291
+ return t .dst .Has (ctx , t .f (key ))
292
+ }
293
+
294
+ func (t * transformTxn ) GetSize (ctx context.Context , key ds.Key ) (size int , err error ) {
295
+ return t .dst .GetSize (ctx , t .f (key ))
296
+ }
297
+
298
+ func (t * transformTxn ) Query (ctx context.Context , q dsq.Query ) (dsq.Results , error ) {
299
+ return t .ds .Query (ctx , q )
300
+ }
301
+
302
+ func (t * transformTxn ) Discard (ctx context.Context ) {
303
+ t .dst .Discard (ctx )
304
+ }
305
+
246
306
func (d * Datastore ) Check (ctx context.Context ) error {
247
307
if c , ok := d .child .(ds.CheckedDatastore ); ok {
248
308
return c .Check (ctx )
0 commit comments