X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbindings%2Fpython%2Fbt2%2Fbt2%2Fquery_executor.py;h=a5debfbfa95dbbe5f9db413c4310789cf8098b9b;hb=768f9bcbf4b5acd09dda85ab32c0ea30d8826136;hp=072410fbbd481c4cc2122de971228b27c96355e0;hpb=f4e38e70bf6dc1ff8c9226d9c8eedaf26fa19f09;p=babeltrace.git diff --git a/src/bindings/python/bt2/bt2/query_executor.py b/src/bindings/python/bt2/bt2/query_executor.py index 072410fb..a5debfbf 100644 --- a/src/bindings/python/bt2/bt2/query_executor.py +++ b/src/bindings/python/bt2/bt2/query_executor.py @@ -1,75 +1,47 @@ -# The MIT License (MIT) +# SPDX-License-Identifier: MIT # # Copyright (c) 2017 Philippe Proulx -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. from bt2 import native_bt, object, utils -import bt2.component -import bt2.logging +from bt2 import interrupter as bt2_interrupter +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) +def _bt2_component(): + from bt2 import component as bt2_component - def _handle_status(self, status, gen_error_msg): - if status == native_bt.QUERY_EXECUTOR_STATUS_AGAIN: - raise bt2.TryAgain - elif status == native_bt.QUERY_EXECUTOR_STATUS_CANCELED: - raise bt2.QueryExecutorCanceled - elif status == native_bt.QUERY_EXECUTOR_STATUS_INVALID_OBJECT: - raise bt2.InvalidQueryObject - elif status == native_bt.QUERY_EXECUTOR_STATUS_INVALID_PARAMS: - raise bt2.InvalidQueryParams - elif status < 0: - raise bt2.Error(gen_error_msg) - - def __init__(self): - ptr = native_bt.query_executor_create() + return bt2_component - if ptr is None: - raise bt2.CreationError('cannot create query executor object') - super().__init__(ptr) +class _QueryExecutorCommon: + @property + def _common_ptr(self): + return self._as_query_executor_ptr() - def cancel(self): - status = native_bt.query_executor_cancel(self._ptr) - self._handle_status(status, 'cannot cancel query executor object') + @property + def is_interrupted(self): + is_interrupted = native_bt.query_executor_is_interrupted(self._common_ptr) + return bool(is_interrupted) @property - def is_canceled(self): - is_canceled = native_bt.query_executor_is_canceled(self._ptr) - assert(is_canceled >= 0) - return is_canceled > 0 + def logging_level(self): + return native_bt.query_executor_get_logging_level(self._common_ptr) + + +class QueryExecutor(object._SharedObject, _QueryExecutorCommon): + _get_ref = staticmethod(native_bt.query_executor_get_ref) + _put_ref = staticmethod(native_bt.query_executor_put_ref) - def query(self, component_class, object, params=None, - logging_level=bt2.logging.LoggingLevel.NONE): - if self.is_canceled: - raise bt2.QueryExecutorCanceled + def _as_query_executor_ptr(self): + return self._ptr - if not isinstance(component_class, bt2.component._GenericComponentClass): + def __init__(self, component_class, object_name, params=None, method_obj=None): + if not isinstance(component_class, _bt2_component()._ComponentClassConst): err = False try: - if not issubclass(component_class, bt2.component._UserComponent): + if not issubclass(component_class, _bt2_component()._UserComponent): err = True except TypeError: err = True @@ -78,7 +50,7 @@ class QueryExecutor(object._SharedObject): o = component_class raise TypeError("'{}' is not a component class object".format(o)) - utils._check_str(object) + utils._check_str(object_name) if params is None: params_ptr = native_bt.value_null @@ -86,12 +58,71 @@ class QueryExecutor(object._SharedObject): params = bt2.create_value(params) params_ptr = params._ptr - utils._check_log_level(logging_level) - cc_ptr = component_class._component_class_ptr() + cc_ptr = component_class._bt_component_class_ptr() + assert cc_ptr is not None + + 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_name, 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) + + @property + def default_interrupter(self): + ptr = native_bt.query_executor_borrow_default_interrupter(self._ptr) + return bt2_interrupter.Interrupter._create_from_ptr_and_get_ref(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 is not None + return bt2_value._create_from_const_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) - status, result_ptr = native_bt.query_executor_query(self._ptr, cc_ptr, - object, params_ptr, - logging_level) - self._handle_status(status, 'cannot query component class') - assert(result_ptr) - return bt2.value._create_from_ptr(result_ptr) + def _invalidate(self): + self._ptr = None