| 184 | } |
| 185 | |
| 186 | PyObject* |
| 187 | Connection::close(PyObject* kwargs) |
| 188 | { |
| 189 | PyObject* pyObj_callback = kwargs ? PyDict_GetItemString(kwargs, "callback") : nullptr; |
| 190 | PyObject* pyObj_errback = kwargs ? PyDict_GetItemString(kwargs, "errback") : nullptr; |
| 191 | |
| 192 | if (!validate_and_incref_callbacks(pyObj_callback, pyObj_errback)) { |
| 193 | return nullptr; |
| 194 | } |
| 195 | |
| 196 | std::shared_ptr<std::promise<PyObject*>> barrier = nullptr; |
| 197 | std::future<PyObject*> fut; |
| 198 | if (nullptr == pyObj_callback && nullptr == pyObj_errback) { |
| 199 | barrier = std::make_shared<std::promise<PyObject*>>(); |
| 200 | fut = barrier->get_future(); |
| 201 | } |
| 202 | |
| 203 | try { |
| 204 | Py_BEGIN_ALLOW_THREADS |
| 205 | { |
| 206 | cluster_.close([callback = pyObj_callback, errback = pyObj_errback, barrier, this]() { |
| 207 | handle_connection_operation_callback(std::error_code{}, |
| 208 | "close", |
| 209 | callback, |
| 210 | errback, |
| 211 | barrier, |
| 212 | connection_state_action::set_disconnected); |
| 213 | }); |
| 214 | } |
| 215 | Py_END_ALLOW_THREADS |
| 216 | |
| 217 | if (barrier) |
| 218 | { |
| 219 | PyObject* result = nullptr; |
| 220 | Py_BEGIN_ALLOW_THREADS result = fut.get(); |
| 221 | Py_END_ALLOW_THREADS return result; |
| 222 | } |
| 223 | Py_RETURN_NONE; |
| 224 | } catch (const std::exception& e) { |
| 225 | if (barrier) { |
| 226 | barrier->set_value(nullptr); |
| 227 | } |
| 228 | PyErr_SetString(PyExc_RuntimeError, e.what()); |
| 229 | Py_XDECREF(pyObj_callback); |
| 230 | Py_XDECREF(pyObj_errback); |
| 231 | return nullptr; |
| 232 | } |
| 233 | } |
| 234 | |
| 235 | PyObject* |
| 236 | Connection::open_bucket(PyObject* kwargs) |
no outgoing calls
no test coverage detected