mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-22 16:44:20 +01:00
datastore: turn keys into arrays
After some discussion with @shesek, and my own usage, we agreed that a more comprehensive interface, which explicitly supports grouping, is desirable. Thus keys are now arrays, with the semantic that a key is either a parent or has a value, never both. For convenience in the JSON schema, we always return them as arrays, though we accept simple strings as arguments. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Christian Decker
parent
533571a655
commit
fe86c117d9
@@ -2635,7 +2635,7 @@ def test_datastore(node_factory):
|
||||
|
||||
# Add entries.
|
||||
somedata = b'somedata'.hex()
|
||||
somedata_expect = {'key': 'somekey',
|
||||
somedata_expect = {'key': ['somekey'],
|
||||
'generation': 0,
|
||||
'hex': somedata,
|
||||
'string': 'somedata'}
|
||||
@@ -2673,7 +2673,7 @@ def test_datastore(node_factory):
|
||||
l1.rpc.datastore(key='otherkey', hex=somedata, mode="must-append")
|
||||
|
||||
otherdata = b'otherdata'.hex()
|
||||
otherdata_expect = {'key': 'otherkey',
|
||||
otherdata_expect = {'key': ['otherkey'],
|
||||
'generation': 0,
|
||||
'hex': otherdata,
|
||||
'string': 'otherdata'}
|
||||
@@ -2683,10 +2683,8 @@ def test_datastore(node_factory):
|
||||
assert l1.rpc.listdatastore('otherkey') == {'datastore': [otherdata_expect]}
|
||||
assert l1.rpc.listdatastore('badkey') == {'datastore': []}
|
||||
|
||||
ds = l1.rpc.listdatastore()
|
||||
# Order is undefined!
|
||||
assert (ds == {'datastore': [somedata_expect, otherdata_expect]}
|
||||
or ds == {'datastore': [otherdata_expect, somedata_expect]})
|
||||
# Order is sorted!
|
||||
assert l1.rpc.listdatastore() == {'datastore': [otherdata_expect, somedata_expect]}
|
||||
|
||||
assert l1.rpc.deldatastore('somekey') == somedata_expect
|
||||
assert l1.rpc.listdatastore() == {'datastore': [otherdata_expect]}
|
||||
@@ -2696,7 +2694,7 @@ def test_datastore(node_factory):
|
||||
assert l1.rpc.listdatastore() == {'datastore': [otherdata_expect]}
|
||||
|
||||
# if it's not a string, won't print
|
||||
badstring_expect = {'key': 'badstring',
|
||||
badstring_expect = {'key': ['badstring'],
|
||||
'generation': 0,
|
||||
'hex': '00'}
|
||||
assert l1.rpc.datastore(key='badstring', hex='00') == badstring_expect
|
||||
@@ -2731,3 +2729,65 @@ def test_datastore(node_factory):
|
||||
generation=otherdata_expect['generation'])
|
||||
== otherdata_expect)
|
||||
assert l1.rpc.listdatastore() == {'datastore': []}
|
||||
|
||||
|
||||
def test_datastore_keylist(node_factory):
|
||||
l1 = node_factory.get_node()
|
||||
|
||||
# Starts empty
|
||||
assert l1.rpc.listdatastore() == {'datastore': []}
|
||||
assert l1.rpc.listdatastore(['a']) == {'datastore': []}
|
||||
assert l1.rpc.listdatastore(['a', 'b']) == {'datastore': []}
|
||||
|
||||
# Cannot add child to existing!
|
||||
l1.rpc.datastore(key='a', string='aval')
|
||||
with pytest.raises(RpcError, match=r'1206.*Parent key \[a\] exists'):
|
||||
l1.rpc.datastore(key=['a', 'b'], string='abval',
|
||||
mode='create-or-replace')
|
||||
# Listing subkey gives DNE.
|
||||
assert l1.rpc.listdatastore(['a', 'b']) == {'datastore': []}
|
||||
l1.rpc.deldatastore(key=['a'])
|
||||
|
||||
# Create child key.
|
||||
l1.rpc.datastore(key=['a', 'b'], string='abval')
|
||||
assert l1.rpc.listdatastore() == {'datastore': [{'key': ['a']}]}
|
||||
assert l1.rpc.listdatastore(key=['a']) == {'datastore': [{'key': ['a', 'b'],
|
||||
'generation': 0,
|
||||
'string': 'abval',
|
||||
'hex': b'abval'.hex()}]}
|
||||
|
||||
# Cannot create key over that
|
||||
with pytest.raises(RpcError, match='has children'):
|
||||
l1.rpc.datastore(key='a', string='aval', mode='create-or-replace')
|
||||
|
||||
# Can create another key.
|
||||
l1.rpc.datastore(key=['a', 'b2'], string='ab2val')
|
||||
assert l1.rpc.listdatastore() == {'datastore': [{'key': ['a']}]}
|
||||
assert l1.rpc.listdatastore(key=['a']) == {'datastore': [{'key': ['a', 'b'],
|
||||
'string': 'abval',
|
||||
'generation': 0,
|
||||
'hex': b'abval'.hex()},
|
||||
{'key': ['a', 'b2'],
|
||||
'string': 'ab2val',
|
||||
'generation': 0,
|
||||
'hex': b'ab2val'.hex()}]}
|
||||
|
||||
# Can create subkey.
|
||||
l1.rpc.datastore(key=['a', 'b3', 'c'], string='ab2val')
|
||||
assert l1.rpc.listdatastore() == {'datastore': [{'key': ['a']}]}
|
||||
assert l1.rpc.listdatastore(key=['a']) == {'datastore': [{'key': ['a', 'b'],
|
||||
'string': 'abval',
|
||||
'generation': 0,
|
||||
'hex': b'abval'.hex()},
|
||||
{'key': ['a', 'b2'],
|
||||
'string': 'ab2val',
|
||||
'generation': 0,
|
||||
'hex': b'ab2val'.hex()},
|
||||
{'key': ['a', 'b3']}]}
|
||||
|
||||
# Can update subkey
|
||||
l1.rpc.datastore(key=['a', 'b3', 'c'], string='2', mode='must-append')
|
||||
assert l1.rpc.listdatastore(key=['a', 'b3', 'c']) == {'datastore': [{'key': ['a', 'b3', 'c'],
|
||||
'string': 'ab2val2',
|
||||
'generation': 1,
|
||||
'hex': b'ab2val2'.hex()}]}
|
||||
|
||||
Reference in New Issue
Block a user