X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbindings%2Fpython%2Fbt2%2Fbt2%2Fquery_executor.py;h=8e51f82522d1149efc5540a32ed5953ed9598ec4;hb=57081273d1191fc79edc101af619fab96b72460d;hp=146a2cf461b81b2cb59633d3e3049b8f7952e9ef;hpb=3fb99a226ccb40c79de6b55b5a249d93b9c5262e;p=babeltrace.git diff --git a/src/bindings/python/bt2/bt2/query_executor.py b/src/bindings/python/bt2/bt2/query_executor.py index 146a2cf4..8e51f825 100644 --- a/src/bindings/python/bt2/bt2/query_executor.py +++ b/src/bindings/python/bt2/bt2/query_executor.py @@ -23,42 +23,33 @@ from bt2 import native_bt, object, utils from bt2 import interrupter as bt2_interrupter from bt2 import component as bt2_component -from bt2 import logging as bt2_logging from bt2 import value as bt2_value import bt2 -class QueryExecutor(object._SharedObject): - _get_ref = staticmethod(native_bt.query_executor_get_ref) - _put_ref = staticmethod(native_bt.query_executor_put_ref) +class _QueryExecutorCommon: + @property + def _common_ptr(self): + return self._as_query_executor_ptr() - def __init__(self): - ptr = native_bt.query_executor_create() + @property + def is_interrupted(self): + is_interrupted = native_bt.query_executor_is_interrupted(self._common_ptr) + return bool(is_interrupted) - if ptr is None: - raise bt2._MemoryError('cannot create query executor object') + @property + def logging_level(self): + return native_bt.query_executor_get_logging_level(self._common_ptr) - super().__init__(ptr) - def add_interrupter(self, interrupter): - utils._check_type(interrupter, bt2_interrupter.Interrupter) - native_bt.query_executor_add_interrupter(self._ptr, interrupter._ptr) - - def interrupt(self): - native_bt.query_executor_interrupt(self._ptr) +class QueryExecutor(object._SharedObject, _QueryExecutorCommon): + _get_ref = staticmethod(native_bt.query_executor_get_ref) + _put_ref = staticmethod(native_bt.query_executor_put_ref) - @property - def is_interrupted(self): - is_interrupted = native_bt.query_executor_is_interrupted(self._ptr) - return bool(is_interrupted) + def _as_query_executor_ptr(self): + return self._ptr - def query( - self, - component_class, - object, - params=None, - logging_level=bt2_logging.LoggingLevel.NONE, - ): + def __init__(self, component_class, object, params=None, method_obj=None): if not isinstance(component_class, bt2_component._ComponentClass): err = False @@ -80,12 +71,69 @@ class QueryExecutor(object._SharedObject): params = bt2.create_value(params) params_ptr = params._ptr - utils._check_log_level(logging_level) cc_ptr = component_class._bt_component_class_ptr() + assert cc_ptr is not None - status, result_ptr = native_bt.query_executor_query( - self._ptr, cc_ptr, object, params_ptr, logging_level + if method_obj is not None and not native_bt.bt2_is_python_component_class( + cc_ptr + ): + raise ValueError( + 'cannot pass a Python object to a non-Python component class' + ) + + ptr = native_bt.bt2_query_executor_create( + cc_ptr, object, params_ptr, method_obj ) + + if ptr is None: + raise bt2._MemoryError('cannot create query executor object') + + super().__init__(ptr) + + # Keep a reference of `method_obj` as the native query executor + # does not have any. This ensures that, when this object's + # query() method is called, the Python object still exists. + self._method_obj = method_obj + + def add_interrupter(self, interrupter): + utils._check_type(interrupter, bt2_interrupter.Interrupter) + native_bt.query_executor_add_interrupter(self._ptr, interrupter._ptr) + + def interrupt(self): + native_bt.query_executor_interrupt(self._ptr) + + def _set_logging_level(self, log_level): + utils._check_log_level(log_level) + status = native_bt.query_executor_set_logging_level(self._ptr, log_level) + utils._handle_func_status(status, "cannot set query executor's logging level") + + logging_level = property( + fget=_QueryExecutorCommon.logging_level, fset=_set_logging_level + ) + + @property + def is_interrupted(self): + is_interrupted = native_bt.query_executor_is_interrupted(self._ptr) + return bool(is_interrupted) + + def query(self): + status, result_ptr = native_bt.query_executor_query(self._ptr) utils._handle_func_status(status, 'cannot query component class') - assert result_ptr + assert result_ptr is not None return bt2_value._create_from_ptr(result_ptr) + + +class _PrivateQueryExecutor(_QueryExecutorCommon): + def __init__(self, ptr): + self._ptr = ptr + + def _check_validity(self): + if self._ptr is None: + raise RuntimeError('this object is not valid anymore') + + def _as_query_executor_ptr(self): + self._check_validity() + return native_bt.private_query_executor_as_query_executor_const(self._ptr) + + def _invalidate(self): + self._ptr = None