usawa

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | Submodules | LICENSE

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:
Mdummy/tests/server.py | 31++++++++++++++++++++++++++++---
Mdummy/usawa/crypto.py | 2+-
Mdummy/usawa/entry.py | 2++
Mdummy/usawa/service.py | 79++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
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: