diff --git a/python/opendht.pyx b/python/opendht.pyx index a2f408b2a250b64c85da20de56b3c74b2bf9f853..c1f493c154ba2eca59a5a217cc0f6dfdc410d6fa 100644 --- a/python/opendht.pyx +++ b/python/opendht.pyx @@ -406,8 +406,11 @@ cdef class IndexValue(object): cdef class Pht(object): cdef cpp.Pht* thisptr - def __cinit__(self, bytes name, DhtRunner dht): - self.thisptr = new cpp.Pht(name, dht.thisptr) + def __cinit__(self, bytes name, key_spec, DhtRunner dht): + cdef cpp.IndexKeySpec cpp_key_spec + for kk, size in key_spec.items(): + cpp_key_spec[bytes(kk, 'utf-8')] = size + self.thisptr = new cpp.Pht(name, cpp_key_spec, dht.thisptr) property MAX_NODE_ENTRY_COUNT: def __get__(self): return cpp.PHT_MAX_NODE_ENTRY_COUNT @@ -424,7 +427,7 @@ cdef class Pht(object): ref.Py_INCREF(cb_obj) cdef cpp.IndexKey cppk for kk, v in key.items(): - cppk[bytes(kk, 'utf-8')] = cpp.Prefix(bytes(v)) + cppk[bytes(kk, 'utf-8')] = bytes(v) self.thisptr.lookup( cppk, cpp.Pht.bindLookupCb(lookup_callback, <void*>cb_obj), @@ -441,7 +444,7 @@ cdef class Pht(object): ref.Py_INCREF(cb_obj) cdef cpp.IndexKey cppk for kk, v in key.items(): - cppk[bytes(kk, 'utf-8')] = cpp.Prefix(bytes(v)) + cppk[bytes(kk, 'utf-8')] = bytes(v) cdef cpp.IndexValue val val.first = (<InfoHash>value.getKey())._infohash val.second = value.getValueId() diff --git a/python/opendht_cpp.pxd b/python/opendht_cpp.pxd index 95b95500e7ba1bce1aeb3bacaf4592fa59b95307..d2f53026bb35c936a2ff84b2b10b45f40ca254a3 100644 --- a/python/opendht_cpp.pxd +++ b/python/opendht_cpp.pxd @@ -167,12 +167,13 @@ cdef extern from "opendht/indexation/pht.h" namespace "dht::indexation": Prefix(vector[uint8_t]) except + string toString() const ctypedef pair[InfoHash, uint64_t] IndexValue "dht::indexation::Value" - ctypedef map[string, Prefix] IndexKey "dht::indexation::Pht::Key" + ctypedef map[string, vector[uint8_t]] IndexKey "dht::indexation::Pht::Key" + ctypedef map[string, uint32_t] IndexKeySpec "dht::indexation::Pht::KeySpec" ctypedef void (*LookupCallbackRaw)(vector[shared_ptr[IndexValue]]* values, Prefix* p, void* user_data); cdef cppclass Pht: cppclass LookupCallback: LookupCallback() except + - Pht(string, shared_ptr[DhtRunner]) except + + Pht(string, IndexKeySpec, shared_ptr[DhtRunner]) except + void lookup(IndexKey k, LookupCallback cb, DoneCallbackSimple doneCb); void insert(IndexKey k, IndexValue v, DoneCallbackSimple cb) @staticmethod diff --git a/python/tools/dht/tests.py b/python/tools/dht/tests.py index 67cdd6a4ea67c8ee6687745159d0a27ee7e28e14..91eb810ff260b9c499907191a7903ff227362967 100644 --- a/python/tools/dht/tests.py +++ b/python/tools/dht/tests.py @@ -10,6 +10,7 @@ import string import time import subprocess import re +import collections from matplotlib.ticker import FuncFormatter import math @@ -276,17 +277,18 @@ class PhtTest(FeatureTest): """ bootstrap = self._bootstrap bootstrap.resize(2) - dht = bootstrap.get(1) - pht = Pht(b'foo_index', dht) + + NUM_DIG = max(math.log(self._num_keys, 2)/4, 5) # at least 5 digit keys. + keyspec = collections.OrderedDict([('foo', NUM_DIG)]) + pht = Pht(b'foo_index', keyspec, dht) DhtNetwork.log('PHT has', pht.MAX_NODE_ENTRY_COUNT, 'node'+ ('s' if pht.MAX_NODE_ENTRY_COUNT > 1 else ''), 'per leaf bucket.') - NUM_DIG = max(math.log(self._num_keys, 2)/4, 5) # at least 5 digit keys. keys = [{ - 'foo' : + [_ for _ in keyspec.keys()][0] : ''.join(random.SystemRandom().choice(string.hexdigits) for _ in range(NUM_DIG)).encode() } for n in range(self._num_keys)]