PyObject * AerospikeQuery_Foreach(AerospikeQuery * self, PyObject * args, PyObject * kwds) { // Python Function Arguments PyObject * py_callback = NULL; PyObject * py_policy = NULL; // Python Function Keyword Arguments static char * kwlist[] = {"callback", "policy", NULL}; // Python Function Argument Parsing if ( PyArg_ParseTupleAndKeywords(args, kwds, "O|O:foreach", kwlist, &py_callback, &py_policy) == false ) { return NULL; } // Aerospike Client Arguments as_error err; as_policy_query policy; as_policy_query * policy_p = NULL; // Initialize error as_error_init(&err); // Convert python policy object to as_policy_exists pyobject_to_policy_query(&err, py_policy, &policy, &policy_p); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // Create and initialize callback user-data LocalData data; data.callback = py_callback; as_error_init(&data.error); // We are spawning multiple threads PyThreadState * _save = PyEval_SaveThread(); // Invoke operation aerospike_query_foreach(self->client->as, &err, policy_p, &self->query, each_result, &data); // We are done using multiple threads PyEval_RestoreThread(_save); CLEANUP: if ( err.code != AEROSPIKE_OK ) { PyObject * py_err = NULL; error_to_pyobject(&err, &py_err); PyErr_SetObject(PyExc_Exception, py_err); return NULL; } Py_INCREF(Py_None); return Py_None; }
PyObject * AerospikeQuery_Foreach(AerospikeQuery * self, PyObject * args, PyObject * kwds) { // Python Function Arguments PyObject * py_callback = NULL; PyObject * py_policy = NULL; // Python Function Keyword Arguments static char * kwlist[] = {"callback", "policy", NULL}; // Python Function Argument Parsing if ( PyArg_ParseTupleAndKeywords(args, kwds, "O|O:foreach", kwlist, &py_callback, &py_policy) == false ) { as_query_destroy(&self->query); return NULL; } // Initialize callback user data LocalData data; data.callback = py_callback; as_error_init(&data.error); // Aerospike Client Arguments as_error err; as_policy_query query_policy; as_policy_query * query_policy_p = NULL; // Initialize error as_error_init(&err); if (!self || !self->client->as) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Invalid aerospike object"); goto CLEANUP; } if (!self->client->is_conn_16) { as_error_update(&err, AEROSPIKE_ERR_CLUSTER, "No connection to aerospike cluster"); goto CLEANUP; } // Convert python policy object to as_policy_exists pyobject_to_policy_query(&err, py_policy, &query_policy, &query_policy_p, &self->client->as->config.policies.query); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // We are spawning multiple threads PyThreadState * _save = PyEval_SaveThread(); // Invoke operation aerospike_query_foreach(self->client->as, &err, query_policy_p, &self->query, each_result, &data); // We are done using multiple threads PyEval_RestoreThread(_save); if (data.error.code != AEROSPIKE_OK) { goto CLEANUP; } CLEANUP: if ( self->query.apply.arglist ){ as_arraylist_destroy( (as_arraylist *) self->query.apply.arglist ); } self->query.apply.arglist = NULL; if ( err.code != AEROSPIKE_OK || data.error.code != AEROSPIKE_OK ) { PyObject * py_err = NULL; if ( err.code != AEROSPIKE_OK ){ error_to_pyobject(&err, &py_err); } if ( data.error.code != AEROSPIKE_OK ){ error_to_pyobject(&data.error, &py_err); } PyErr_SetObject(PyExc_Exception, py_err); Py_DECREF(py_err); return NULL; } Py_INCREF(Py_None); return Py_None; }