|
@@ -17,6 +17,12 @@ type DataStore interface {
|
|
|
PutObject(kvObject KV) error
|
|
|
// PutObjectAtomic provides an atomic add and update operation for a Record
|
|
|
PutObjectAtomic(kvObject KV) error
|
|
|
+ // DeleteObject deletes a record
|
|
|
+ DeleteObject(kvObject KV) error
|
|
|
+ // DeleteObjectAtomic performs an atomic delete operation
|
|
|
+ DeleteObjectAtomic(kvObject KV) error
|
|
|
+ // DeleteTree deletes a record
|
|
|
+ DeleteTree(kvObject KV) error
|
|
|
// KVStore returns access to the KV Store
|
|
|
KVStore() store.Store
|
|
|
}
|
|
@@ -29,6 +35,8 @@ type datastore struct {
|
|
|
type KV interface {
|
|
|
// Key method lets an object to provide the Key to be used in KV Store
|
|
|
Key() []string
|
|
|
+ // KeyPrefix method lets an object to return immediate parent key that can be used for tree walk
|
|
|
+ KeyPrefix() []string
|
|
|
// Value method lets an object to marshal its content to be stored in the KV store
|
|
|
Value() []byte
|
|
|
// Index method returns the latest DB Index as seen by the object
|
|
@@ -122,6 +130,7 @@ func (ds *datastore) putObjectWithKey(kvObject KV, key ...string) error {
|
|
|
return ds.store.Put(Key(key...), kvObjValue, nil)
|
|
|
}
|
|
|
|
|
|
+// GetObject returns a record matching the key
|
|
|
func (ds *datastore) GetObject(key string, o interface{}) error {
|
|
|
kvPair, err := ds.store.Get(key)
|
|
|
if err != nil {
|
|
@@ -129,3 +138,28 @@ func (ds *datastore) GetObject(key string, o interface{}) error {
|
|
|
}
|
|
|
return json.Unmarshal(kvPair.Value, o)
|
|
|
}
|
|
|
+
|
|
|
+// DeleteObject unconditionally deletes a record from the store
|
|
|
+func (ds *datastore) DeleteObject(kvObject KV) error {
|
|
|
+ return ds.store.Delete(Key(kvObject.Key()...))
|
|
|
+}
|
|
|
+
|
|
|
+// DeleteObjectAtomic performs atomic delete on a record
|
|
|
+func (ds *datastore) DeleteObjectAtomic(kvObject KV) error {
|
|
|
+ if kvObject == nil {
|
|
|
+ return errors.New("kvObject is nil")
|
|
|
+ }
|
|
|
+
|
|
|
+ previous := &store.KVPair{Key: Key(kvObject.Key()...), LastIndex: kvObject.Index()}
|
|
|
+ _, err := ds.store.AtomicDelete(Key(kvObject.Key()...), previous)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// DeleteTree unconditionally deletes a record from the store
|
|
|
+func (ds *datastore) DeleteTree(kvObject KV) error {
|
|
|
+ return ds.store.DeleteTree(Key(kvObject.KeyPrefix()...))
|
|
|
+}
|