From 8aa24f12895a25de2e30793b7713726bc937af70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?JUAN=20M=C3=89NDEZ?= <vpsink@gmail.com> Date: Fri, 7 May 2021 00:34:37 -0500 Subject: [PATCH] Add python bindings for TypeValue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JUAN MÉNDEZ <vpsink@gmail.com> --- python/opendht.pyx | 16 ++++++++++++++-- python/opendht_cpp.pxd | 18 ++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/python/opendht.pyx b/python/opendht.pyx index c888c0fc..31ac7609 100644 --- a/python/opendht.pyx +++ b/python/opendht.pyx @@ -36,6 +36,7 @@ from libcpp.memory cimport shared_ptr from cython.parallel import parallel, prange from cython.operator cimport dereference as deref, preincrement as inc, predecrement as dec from cpython cimport ref +from datetime import timedelta cimport opendht_cpp as cpp @@ -235,8 +236,9 @@ cdef class Where(object): cdef class Value(object): cdef shared_ptr[cpp.Value] _value - def __init__(self, bytes val=b''): - self._value.reset(new cpp.Value(val, len(val))) + def __init__(self, bytes val=b'', cpp.uint16_t id=0): + self._value.reset(new cpp.Value(id, val, len(val))) + def __str__(self): return self._value.get().toString().decode() property owner: @@ -270,6 +272,14 @@ cdef class Value(object): def __get__(self): return self._value.get().size() +cdef class ValueType(object): + cdef cpp.ValueType * _value + def __init__(self, cpp.uint16_t id, str name, expiration: timedelta): + if not isinstance(expiration, timedelta): + raise TypeError("expiration argument must be of type timedelta") + cdef cpp.seconds duration = cpp.seconds(int(expiration.total_seconds())) + self._value = new cpp.ValueType(id, name.encode(), duration) + cdef class NodeSetIter(object): cdef map[cpp.InfoHash, shared_ptr[cpp.Node]]* _nodes cdef map[cpp.InfoHash, shared_ptr[cpp.Node]].iterator _curIter @@ -513,6 +523,8 @@ cdef class DhtRunner(_WithID): cb_obj = {'shutdown':shutdown_cb} ref.Py_INCREF(cb_obj) self.thisptr.get().shutdown(cpp.bindShutdownCb(shutdown_callback, <void*>cb_obj)) + def registerType(self, ValueType type): + self.thisptr.get().registerType(deref(type._value)) def enableLogging(self): cpp.enableLogging(self.thisptr.get()[0]) def disableLogging(self): diff --git a/python/opendht_cpp.pxd b/python/opendht_cpp.pxd index 1bc866a0..2aeff604 100644 --- a/python/opendht_cpp.pxd +++ b/python/opendht_cpp.pxd @@ -26,6 +26,14 @@ from libc.string cimport const_char, const_uchar ctypedef uint16_t in_port_t ctypedef unsigned short int sa_family_t; +cdef extern from "<iostream>" namespace "std::chrono" nogil: + cdef cppclass duration[ulong]: + duration() except + + + cdef cppclass seconds: + duration seconds(uint64_t) except + + duration seconds() + cdef extern from "<memory>" namespace "std" nogil: cdef cppclass shared_ptr[T]: shared_ptr() except + @@ -131,7 +139,6 @@ cdef extern from "opendht/value.h" namespace "dht::Value": cdef extern from "opendht/value.h" namespace "dht::Value::Field": cdef Field None cdef Field Id - cdef Field ValueType cdef Field OwnerPk cdef Field SeqNum cdef Field UserType @@ -141,7 +148,7 @@ cdef extern from "opendht/value.h" namespace "dht": cdef cppclass Value: Value() except + Value(vector[uint8_t]) except + - Value(const uint8_t* dat_ptr, size_t dat_len) except + + Value(const uint16_t t, const uint8_t* dat_ptr, size_t dat_len) except + string toString() const size_t size() const uint64_t id @@ -150,6 +157,12 @@ cdef extern from "opendht/value.h" namespace "dht": vector[uint8_t] data string user_type + cdef cppclass ValueType: + ValueType(uint16_t id, string name, seconds expiration) except + + uint16_t id + string name + seconds expiration + cdef cppclass Query: Query() except + Query(Select s, Where w) except + @@ -234,6 +247,7 @@ cdef extern from "opendht/dhtrunner.h" namespace "dht": void run(const_char*, const_char*, const_char*, Config config) void join() void shutdown(ShutdownCallback) + void registerType(ValueType& value); bool isRunning() SockAddr getBound(sa_family_t af) const string getStorageLog() const -- GitLab