From ca86af736eb794ff291c7cddd776db2aaa4c0dff Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Tue, 8 May 2018 19:46:29 -0300 Subject: [PATCH] add batching support to get_supports and tests --- lbrynet/database/storage.py | 9 +++++++-- .../tests/unit/database/test_SQLiteStorage.py | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lbrynet/database/storage.py b/lbrynet/database/storage.py index 2e6bee68d..8f7a4b2cf 100644 --- a/lbrynet/database/storage.py +++ b/lbrynet/database/storage.py @@ -552,7 +552,7 @@ class SQLiteStorage(object): ) return self.db.runInteraction(_save_support) - def get_supports(self, claim_id): + def get_supports(self, *claim_ids): def _format_support(outpoint, supported_id, amount, address): return { "txid": outpoint.split(":")[0], @@ -563,10 +563,15 @@ class SQLiteStorage(object): } def _get_supports(transaction): + if len(claim_ids) == 1: + bind = "=?" + else: + bind = "in ({})".format(','.join('?' for _ in range(len(claim_ids)))) return [ _format_support(*support_info) for support_info in transaction.execute( - "select * from support where claim_id=?", (claim_id, ) + "select * from support where claim_id {}".format(bind), + tuple(claim_ids) ).fetchall() ] diff --git a/lbrynet/tests/unit/database/test_SQLiteStorage.py b/lbrynet/tests/unit/database/test_SQLiteStorage.py index 5bfe72988..5df80ee2e 100644 --- a/lbrynet/tests/unit/database/test_SQLiteStorage.py +++ b/lbrynet/tests/unit/database/test_SQLiteStorage.py @@ -163,6 +163,25 @@ class BlobStorageTests(StorageTest): self.assertEqual(blob_hashes, []) +class SupportsStorageTests(StorageTest): + @defer.inlineCallbacks + def test_supports_storage(self): + claim_ids = [random_lbry_hash() for _ in range(10)] + random_supports = [{"txid": random_lbry_hash(), "nout":i, "address": "addr{}".format(i), "amount": i} + for i in range(20)] + expected_supports = {} + for idx, claim_id in enumerate(claim_ids): + yield self.storage.save_supports(claim_id, random_supports[idx*2:idx*2+2]) + for random_support in random_supports[idx*2:idx*2+2]: + random_support['claim_id'] = claim_id + expected_supports.setdefault(claim_id, []).append(random_support) + supports = yield self.storage.get_supports(claim_ids[0]) + self.assertEqual(supports, expected_supports[claim_ids[0]]) + all_supports = yield self.storage.get_supports(*claim_ids) + for support in all_supports: + self.assertIn(support, expected_supports[support['claim_id']]) + + class StreamStorageTests(StorageTest): @defer.inlineCallbacks def test_store_stream(self, stream_hash=None):