commit 457d954a9efb0357a81813eb47a96cfdd90461ae
parent 49fd18bd69752957e1ac55c9f87b86af980ca55f
Author: lash <dev@holbrook.no>
Date: Wed, 11 Feb 2026 20:37:38 +0000
Implement put get for socket store
Diffstat:
4 files changed, 93 insertions(+), 21 deletions(-)
diff --git a/dummy/tests/server.py b/dummy/tests/server.py
@@ -67,7 +67,7 @@ class TestSocket(unittest.TestCase):
th.join()
- def test_socket_entry(self):
+ def test_socket_entry_get(self):
s = 'FOO'
x = EntryPart(s, 'income', 'foo', 1337, debit=True)
y = EntryPart(s, 'asset', 'foo', 1337)
@@ -84,12 +84,37 @@ class TestSocket(unittest.TestCase):
th.start()
client = UnixClient(path=srv_path)
- b = pfx_entry(self.ledger, entry)
- client.get(b)
+ k = pfx_entry(self.ledger, entry)
+ client.get(k)
client.close()
srv.stop()
th.join()
+ def test_socket_entry_putget(self):
+ s = 'FOO'
+ x = EntryPart(s, 'income', 'foo', 1337, debit=True)
+ y = EntryPart(s, 'asset', 'foo', 1337)
+ entry = Entry(self.ledger.peek(), datetime.datetime.now(), parent=self.ledger.current())
+ entry.add_part(x, debit=True)
+ entry.add_part(y)
+
+ s = str(uuid.uuid4())
+ srv_path = os.path.join(self.workdir, s)
+ srv = UnixServer(self.db, self.ledger, path=srv_path)
+ th = threading.Thread(target=self.serve, args=(srv,))
+ th.start()
+ client = UnixClient(path=srv_path)
+
+ k = pfx_entry(self.ledger, entry)
+ v = entry.wrap(wallet=self.wallet)
+ client.put(k, v)
+ r = client.get(k)
+ client.close()
+ srv.stop()
+ th.join()
+ Entry.unwrap(r, acl=self.acl)
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/dummy/usawa/crypto.py b/dummy/usawa/crypto.py
@@ -306,7 +306,7 @@ class ACL:
def have(self, who):
if isinstance(who, bytes):
who = who.hex()
- return self.rev.get(who) != None
+ return self.rev[who]
"""Check if key is valid for the given purpose.
diff --git a/dummy/usawa/entry.py b/dummy/usawa/entry.py
@@ -155,6 +155,8 @@ class Entry:
self.dtreg = tx_datereg
self.attachment = []
self.sigs = {}
+ if description == None:
+ description = ''
self.description = description
self.debit = []
self.credit = []
diff --git a/dummy/usawa/service.py b/dummy/usawa/service.py
@@ -87,7 +87,7 @@ class Handler:
self.buf = self.buf[c:]
self.c = 0
c = l
- logg.debug('have cmd {} len {} arg {}'.format(self.cmd, self.l, self.buf[3:self.c].hex()))
+ logg.debug('have cmd {} len {} arg {}'.format(self.cmd, self.l, self.r.hex()))
return l - c
@@ -154,14 +154,29 @@ class SocketServer:
logg.warning('connection reset')
sckc.close()
break
-
+
+
+ def put(self, b):
+ l = int.from_bytes(b[:3], byteorder='big')
+ k = b[3:l+3]
+ b = b[l+3:]
+ l = int.from_bytes(b[:3], byteorder='big')
+ v = b[3:l+3]
+ b = b[l+3:]
+ l = len(b)
+ logg.debug('put parse k {} v {}'.format(k.hex(), v.hex()))
+ if l > 0:
+ logg.warning(str(l) + 'bytes excess put data')
+ self.store.put(k, v)
+ return b'\x00'
+
def receive(self, sckc, address):
c = 0
data = bytearray()
handler = Handler()
handler.register(0, self.store.get)
- handler.register(1, self.store.put)
+ handler.register(1, self.put)
while True:
r = -1
b = sckc.recv(READ_SIZE)
@@ -176,6 +191,7 @@ class SocketServer:
sckc.sendall(b'\x02')
break
v = handler.harvest()
+ logg.debug('harvest {}'.format(v.hex()))
sckc.sendall(v)
@@ -214,22 +230,14 @@ class SocketClient(Interface):
self.sck.shutdown(socket.SHUT_RDWR)
self.sck.close()
-
-class UnixClient(SocketClient):
-
- def __init__(self, path='./usawa.socket'):
- super(UnixClient, self).__init__()
- self.sck = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- self.sck.connect(path)
-
"""
:todo: optimize length for key and value
"""
def put(self, k, v):
- b = b'\x00'
- l = len(k) + len(v)
+ b = b'\x01'
+ l = len(k) + len(v) + 6 # length of key and value, and serialized lengths of both (3+3)
b += l.to_bytes(3, byteorder='big')
l = len(k)
b += l.to_bytes(3, byteorder='big')
@@ -238,9 +246,22 @@ class UnixClient(SocketClient):
b += l.to_bytes(3, byteorder='big')
b += v
self.sck.sendall(b)
- r = self.sck.recv(1)
- if r != b'\x00':
+ r = self.sck.recv(4)
+ if r[:1] != b'\x00':
+ logg.error('error return value {}'.format(r.hex()))
raise SocketError()
+ l = int.from_bytes(r[1:], byteorder='big')
+ logg.debug('recv data len {} {}'.format(l, r))
+
+ c = l
+ b = b''
+ while c > 0:
+ r = self.sck.recv(c)
+ logg.debug('recv {} {}'.format(len(r), c, l))
+ if len(r) == 0:
+ break
+ c -= len(r)
+ b += r
def get(self, k):
@@ -249,9 +270,33 @@ class UnixClient(SocketClient):
b += l.to_bytes(3, byteorder='big')
b += k
self.sck.sendall(b)
- r = self.sck.recv(1)
- if r != b'\x00':
+ r = self.sck.recv(4)
+ if r[:1] != b'\x00':
raise SocketError()
+ l = int.from_bytes(r[1:], byteorder='big')
+ logg.debug('recv data len {} {}'.format(l, r))
+
+ c = l
+ b = b''
+ while c > 0:
+ r = self.sck.recv(c)
+ logg.debug('recv {} {}'.format(len(r), c, l))
+ if len(r) == 0:
+ break
+ c -= len(r)
+ b += r
+
+ logg.debug('get recv data {} {}'.format(len(b), b))
+ return b
+
+
+class UnixClient(SocketClient):
+
+ def __init__(self, path='./usawa.socket'):
+ super(UnixClient, self).__init__()
+ self.sck = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ self.sck.connect(path)
+
class TCPClient: