From 55d392c274000afab71053efc42fe7cc84437fc2 Mon Sep 17 00:00:00 2001 From: Serge Victor Date: Sat, 1 Oct 2016 05:40:40 +0000 Subject: [PATCH] Spread payment requests to subdirs Currently Electrum stores all payment requests in main requests directory. It's not going to be efficient when we have thousands of thousands of payment requests. This patch spreads that files across two level of subdirectories. --- lib/wallet.py | 18 ++++++++++++------ lib/websockets.py | 2 +- lib/www/index.html | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/wallet.py b/lib/wallet.py index 3f2909ea3..dace08cdd 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -1046,13 +1046,13 @@ class Abstract_Wallet(PrintError): rdir = config.get('requests_dir') if rdir: key = out.get('id', addr) - path = os.path.join(rdir, key) + path = os.path.join(rdir, 'req', key[0], key[1], key) if os.path.exists(path): baseurl = 'file://' + rdir rewrite = config.get('url_rewrite') if rewrite: baseurl = baseurl.replace(*rewrite) - out['request_url'] = os.path.join(baseurl, key) + out['request_url'] = os.path.join(baseurl, 'req', key[0], key[1], key, key) out['URI'] += '&r=' + out['request_url'] out['index_url'] = os.path.join(baseurl, 'index.html') + '?id=' + key websocket_server_announce = config.get('websocket_server_announce') @@ -1122,12 +1122,18 @@ class Abstract_Wallet(PrintError): if rdir and amount is not None: key = req.get('id', addr) pr = paymentrequest.make_request(config, req) - path = os.path.join(rdir, key) - with open(path, 'w') as f: + path = os.path.join(rdir, 'req', key[0], key[1], key) + if not os.path.exists(path): + try: + os.makedirs(path) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + with open(os.path.join(path, key), 'w') as f: f.write(pr.SerializeToString()) # reload req = self.get_payment_request(addr, config) - with open(os.path.join(rdir, key + '.json'), 'w') as f: + with open(os.path.join(path, key + '.json'), 'w') as f: f.write(json.dumps(req)) return req @@ -1139,7 +1145,7 @@ class Abstract_Wallet(PrintError): if rdir: key = r.get('id', addr) for s in ['.json', '']: - n = os.path.join(rdir, key + s) + n = os.path.join(rdir, 'req', key[0], key[1], key, key + s) if os.path.exists(n): os.unlink(n) self.storage.put('payment_requests', self.receive_requests) diff --git a/lib/websockets.py b/lib/websockets.py index aa80e0d5e..4f240e846 100644 --- a/lib/websockets.py +++ b/lib/websockets.py @@ -63,7 +63,7 @@ class WsClientThread(util.DaemonThread): def make_request(self, request_id): # read json file rdir = self.config.get('requests_dir') - n = os.path.join(rdir, request_id + '.json') + n = os.path.join(rdir, 'req', request_id[0], request_id[1], request_id, request_id + '.json') with open(n) as f: s = f.read() d = json.loads(s) diff --git a/lib/www/index.html b/lib/www/index.html index 4135ce441..1cfd6d0ad 100644 --- a/lib/www/index.html +++ b/lib/www/index.html @@ -25,7 +25,8 @@ function getUrlParameter(sParam) var id = getUrlParameter('id'); if (id) { - var jqxhr = $.getJSON(id + ".json", function() { + var uri_path = location.pathname; + var jqxhr = $.getJSON(uri_path.replace("index.html", "req/"+ id[0] + "/"+ id[1] + "/"+ id + "/"+ id + ".json"), function() { console.log("getJSON:success"); }) .done( function(data) {