/** ******************************************************************************************************* * This function read a record with a given key, and return the record. * * @param self AerospikeClient object * @param py_key The key under which to store the record. * @param py_policy The dictionary of policies to be given while * reading a record. * * Returns the record on success. * In case of error,appropriate exceptions will be raised. ******************************************************************************************************* */ PyObject * AerospikeClient_Get_Invoke( AerospikeClient * self, PyObject * py_key, PyObject * py_policy) { // Python Return Value PyObject * py_rec = NULL; // Aerospike Client Arguments as_error err; as_policy_read read_policy; as_policy_read * read_policy_p = NULL; as_key key; as_record * rec = NULL; // Initialised flags bool key_initialised = false; bool record_initialised = false; // Initialize error as_error_init(&err); if (!self || !self->as) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Invalid aerospike object"); goto CLEANUP; } if (!self->is_conn_16) { as_error_update(&err, AEROSPIKE_ERR_CLUSTER, "No connection to aerospike cluster"); goto CLEANUP; } // Convert python key object to as_key pyobject_to_key(&err, py_key, &key); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // Key is successfully initialised. key_initialised = true; // Convert python policy object to as_policy_exists pyobject_to_policy_read(&err, py_policy, &read_policy, &read_policy_p, &self->as->config.policies.read); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // Initialize record as_record_init(rec, 0); // Record initialised successfully. record_initialised = true; // Invoke operation aerospike_key_get(self->as, &err, read_policy_p, &key, &rec); if ( err.code == AEROSPIKE_OK ) { record_to_pyobject(&err, rec, &key, &py_rec); if ( read_policy_p == NULL || ( read_policy_p != NULL && read_policy_p->key == AS_POLICY_KEY_DIGEST)){ // This is a special case. // C-client returns NULL key, so to the user // response will be (<ns>, <set>, None, <digest>) // Using the same input key, just making primary key part to be None // Only in case of POLICY_KEY_DIGEST or no policy specified PyObject * p_key = PyTuple_GetItem( py_rec, 0 ); Py_INCREF(Py_None); PyTuple_SetItem(p_key, 2, Py_None); } } else if( err.code == AEROSPIKE_ERR_RECORD_NOT_FOUND ) { as_error_reset(&err); PyObject * py_rec_key = NULL; PyObject * py_rec_meta = Py_None; PyObject * py_rec_bins = Py_None; key_to_pyobject(&err, &key, &py_rec_key); py_rec = PyTuple_New(3); PyTuple_SetItem(py_rec, 0, py_rec_key); PyTuple_SetItem(py_rec, 1, py_rec_meta); PyTuple_SetItem(py_rec, 2, py_rec_bins); Py_INCREF(py_rec_meta); Py_INCREF(py_rec_bins); } else { as_error_update(&err, err.code, NULL); } CLEANUP: if (key_initialised == true){ // Destroy key only if it is initialised. as_key_destroy(&key); } if (record_initialised == true){ // Destroy record only if it is initialised. as_record_destroy(rec); } if ( err.code != AEROSPIKE_OK ) { PyObject * py_err = NULL; error_to_pyobject(&err, &py_err); PyObject *exception_type = raise_exception(&err); if(PyObject_HasAttrString(exception_type, "key")) { PyObject_SetAttrString(exception_type, "key", py_key); } if(PyObject_HasAttrString(exception_type, "bin")) { PyObject_SetAttrString(exception_type, "bin", Py_None); } PyErr_SetObject(exception_type, py_err); Py_DECREF(py_err); return NULL; } return py_rec; }
PyObject * AerospikeClient_Exists_Invoke( AerospikeClient * self, PyObject * py_key, PyObject * py_policy) { // Python Return Value PyObject * py_result = NULL; // Aerospike Client Arguments as_error err; as_policy_read policy; as_policy_read * policy_p = NULL; as_key key; as_record * rec = NULL; // Initialize error as_error_init(&err); // Convert python key object to as_key pyobject_to_key(&err, py_key, &key); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // Convert python policy object to as_policy_exists pyobject_to_policy_read(&err, py_policy, &policy, &policy_p); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // Invoke operation aerospike_key_exists(self->as, &err, policy_p, &key, &rec); if ( err.code == AEROSPIKE_OK ) { PyObject * py_result_key = NULL; PyObject * py_result_meta = NULL; key_to_pyobject(&err, &key, &py_result_key); metadata_to_pyobject(&err, rec, &py_result_meta); py_result = PyTuple_New(2); PyTuple_SetItem(py_result, 0, py_result_key); PyTuple_SetItem(py_result, 1, py_result_meta); } else if ( err.code == AEROSPIKE_ERR_RECORD_NOT_FOUND ) { as_error_reset(&err); PyObject * py_result_key = NULL; PyObject * py_result_meta = Py_None; key_to_pyobject(&err, &key, &py_result_key); py_result = PyTuple_New(2); PyTuple_SetItem(py_result, 0, py_result_key); PyTuple_SetItem(py_result, 1, py_result_meta); Py_INCREF(py_result_meta); } CLEANUP: as_record_destroy(rec); if ( err.code != AEROSPIKE_OK ) { PyObject * py_err = NULL; error_to_pyobject(&err, &py_err); PyErr_SetObject(PyExc_Exception, py_err); return NULL; } return py_result; }
/** ******************************************************************************************************* * This function applies a registered udf module on a particular record. * * @param self AerospikeClient object * @param py_key The key under which the record is stored. * @param py_policy The dictionary of policies * * Returns a tuple of record having key and meta sequentially. ******************************************************************************************************* */ extern PyObject * AerospikeClient_Exists_Invoke( AerospikeClient * self, PyObject * py_key, PyObject * py_policy) { // Python Return Value PyObject * py_result = NULL; // Aerospike Client Arguments as_error err; as_policy_read read_policy; as_policy_read * read_policy_p = NULL; as_key key; as_record * rec = NULL; // Initialisation flags bool key_initialised = false; // Initialize error as_error_init(&err); if (!self || !self->as) { as_error_update(&err, AEROSPIKE_ERR_PARAM, "Invalid aerospike object"); goto CLEANUP; } if (!self->is_conn_16) { as_error_update(&err, AEROSPIKE_ERR_CLUSTER, "No connection to aerospike cluster"); goto CLEANUP; } // Convert python key object to as_key pyobject_to_key(&err, py_key, &key); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // key is initialised successfully key_initialised = true; // Convert python policy object to as_policy_exists pyobject_to_policy_read(&err, py_policy, &read_policy, &read_policy_p, &self->as->config.policies.read); if ( err.code != AEROSPIKE_OK ) { goto CLEANUP; } // Invoke operation Py_BEGIN_ALLOW_THREADS aerospike_key_exists(self->as, &err, read_policy_p, &key, &rec); Py_END_ALLOW_THREADS if ( err.code == AEROSPIKE_OK ) { PyObject * py_result_key = NULL; PyObject * py_result_meta = NULL; key_to_pyobject(&err, &key, &py_result_key); metadata_to_pyobject(&err, rec, &py_result_meta); py_result = PyTuple_New(2); PyTuple_SetItem(py_result, 0, py_result_key); PyTuple_SetItem(py_result, 1, py_result_meta); } else { as_error_update(&err, err.code, NULL); } CLEANUP: if (key_initialised == true){ // Destroy the key if it is initialised successfully. as_key_destroy(&key); } as_record_destroy(rec); if ( err.code != AEROSPIKE_OK ) { PyObject * py_err = NULL; error_to_pyobject(&err, &py_err); PyObject *exception_type = raise_exception(&err); if(PyObject_HasAttrString(exception_type, "key")) { PyObject_SetAttrString(exception_type, "key", py_key); } if(PyObject_HasAttrString(exception_type, "bin")) { PyObject_SetAttrString(exception_type, "bin", Py_None); } PyErr_SetObject(exception_type, py_err); Py_DECREF(py_err); } return py_result; }