ERL_NIF_TERM as_ldt_lset_get(ErlNifEnv* env, handle_t* handle, void* obj) { ldt_get_args_t* args = (ldt_get_args_t*)obj; as_status res; as_error err; as_list* p_list = NULL; res = aerospike_lset_filter(&handle->instance, &err, NULL, &args->key, &args->ldt, NULL, NULL, &p_list); as_ldt_clean_get_args(env, args); if(res != AEROSPIKE_OK) return A_AS_ERROR(env, err); ERL_NIF_TERM* results; uint32_t nresults = as_list_size(p_list); results = malloc(sizeof(ERL_NIF_TERM) * nresults); as_arraylist_iterator it; as_arraylist_iterator_init(&it, (const as_arraylist*)p_list); int i = 0; // See if the elements match what we expect. while (as_arraylist_iterator_has_next(&it)) { const as_val* p_val = as_arraylist_iterator_next(&it); results[i++] = make_nif_term_from_as_val(env, p_val); } as_list_destroy(p_list); p_list = NULL; ERL_NIF_TERM returnValue; returnValue = enif_make_list_from_array(env, results, nresults); free(results); return A_OK_VALUE(env, returnValue); }
/** ******************************************************************************************************** * Scan the set and apply a predicate filter. * * @param self AerospikeLSet object * @param args The args is a tuple object containing an argument * list passed from Python to a C function * @param kwds Dictionary of keywords * * Returns a list of elements from the set after applying predicate. * In case of error,appropriate exceptions will be raised. ******************************************************************************************************** */ PyObject * AerospikeLSet_Filter(AerospikeLSet * self, PyObject * args, PyObject * kwds) { char* filter_name = NULL; PyObject * py_args = NULL; PyObject* py_policy = NULL; as_policy_apply apply_policy; as_policy_apply* apply_policy_p = NULL; as_list* arg_list = NULL; as_list* elements_list = NULL; as_static_pool static_pool; memset(&static_pool, 0, sizeof(static_pool)); as_error err; as_error_init(&err); static char * kwlist[] = {"udf_function_name", "args", "policy", NULL}; // Python Function Argument Parsing if ( PyArg_ParseTupleAndKeywords(args, kwds, "|sOO:filter", kwlist, &filter_name, &py_args, &py_policy) == false ) { return NULL; } 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_apply pyobject_to_policy_apply(&err, py_policy, &apply_policy, &apply_policy_p, &self->client->as->config.policies.apply); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } if ( py_args && !filter_name) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Filter arguments without filter name"); goto CLEANUP; } if ( py_args && !PyList_Check(py_args)) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Invalid filter argument(type)"); goto CLEANUP; } if (py_args) { pyobject_to_list(&err, py_args, &arg_list, &static_pool, SERIALIZER_PYTHON); } aerospike_lset_filter(self->client->as, &err, apply_policy_p, &self->key, &self->lset, filter_name, arg_list, &elements_list); if (err.code != AEROSPIKE_OK) { as_error_update(&err, err.code, NULL); goto CLEANUP; } PyObject* py_list = NULL; list_to_pyobject(&err, elements_list, &py_list); CLEANUP: if (elements_list) { as_list_destroy(elements_list); } if (arg_list) { as_list_destroy(arg_list); } if ( err.code != AEROSPIKE_OK ) { PyObject * py_err = NULL, *py_key = NULL; PyObject *exception_type = raise_exception(&err); error_to_pyobject(&err, &py_err); if(PyObject_HasAttrString(exception_type, "key")) { key_to_pyobject(&err, &self->key, &py_key); PyObject_SetAttrString(exception_type, "key", py_key); Py_DECREF(py_key); } if(PyObject_HasAttrString(exception_type, "bin")) { PyObject *py_bins = PyString_FromString((char *)&self->bin_name); PyObject_SetAttrString(exception_type, "bin", py_bins); Py_DECREF(py_bins); } PyErr_SetObject(exception_type, py_err); Py_DECREF(py_err); return NULL; } return py_list; }