/** * @brief Test whether multiple records exist in the cluster. * * @param[in] argc The argc * @param argv The argv * @param[in] self The object * * @return { description_of_the_return_value } */ static VALUE batch_read(int argc, VALUE * argv, VALUE self) { rb_aero_TIMED(tm); as_error err; as_status status; aerospike * as = rb_aero_CLIENT; VALUE keys; VALUE options; rb_scan_args(argc, argv, "11", &keys, &options); long keys_len = rb_ary_len_long(keys); as_batch batch; as_batch_inita(&batch, keys_len); VALUE return_data = rb_hash_new(); for (long i = 0; i < keys_len; ++i) { VALUE element = rb_ary_entry(keys, i); // set into hash for return values rb_hash_aset(return_data, element, Qfalse); VALUE tmp = rb_funcall(element, rb_intern("namespace"), 0); char * c_namespace = StringValueCStr( tmp ); tmp = rb_funcall(element, rb_intern("set"), 0); char * c_set = StringValueCStr( tmp ); tmp = rb_funcall(element, rb_intern("key"), 0); if ( TYPE(tmp) != T_FIXNUM ) { char * c_key = StringValueCStr( tmp ); as_key_init(as_batch_keyat(&batch,i), c_namespace, c_set, c_key); } else { as_key_init_int64(as_batch_keyat(&batch,i), c_namespace, c_set, FIX2LONG(tmp)); } } if ( aerospike_batch_get(as, &err, NULL, &batch, batch_read_callback, return_data) != AEROSPIKE_OK ) { as_batch_destroy(&batch); raise_as_error(err); } as_batch_destroy(&batch); rb_aero_logger(AS_LOG_LEVEL_DEBUG, &tm, 1, rb_str_new2("[Client][batch_read] success")); return return_data; }
int main(int argc, char* argv[]) { // Parse command line arguments. if (! example_get_opts(argc, argv, EXAMPLE_MULTI_KEY_OPTS)) { exit(-1); } // Connect to the aerospike database cluster. aerospike as; example_connect_to_aerospike(&as); // Start clean. example_remove_test_records(&as); if (! insert_records(&as)) { cleanup(&as); exit(-1); } as_error err; // Make a batch of all the keys we inserted. as_batch batch; as_batch_inita(&batch, g_n_keys); uint32_t i; for (i = 0; i < g_n_keys; i++) { as_key_init_int64(as_batch_keyat(&batch, i), g_namespace, g_set, (int64_t)i); } // Check existence of these keys - they should all be there. if (aerospike_batch_exists(&as, &err, NULL, &batch, batch_read_cb, NULL) != AEROSPIKE_OK) { LOG("aerospike_batch_exists() returned %d - %s", err.code, err.message); cleanup(&as); exit(-1); } LOG("batch exists call completed"); // Get all of these keys - they should all be there. if (aerospike_batch_get(&as, &err, NULL, &batch, batch_read_cb, NULL) != AEROSPIKE_OK) { LOG("aerospike_batch_get() returned %d - %s", err.code, err.message); cleanup(&as); exit(-1); } LOG("batch get call completed"); // Delete some records in the middle. uint32_t n_to_delete = g_n_keys / 5; if (n_to_delete == 0) { n_to_delete = 1; } uint32_t n_start = g_n_keys / 2; if (n_start + n_to_delete > g_n_keys) { n_start = 0; } uint32_t n_end = n_start + n_to_delete; for (i = n_start; i < n_end; i++) { // No need to destroy a stack as_key object, if we only use // as_key_init_int64(). as_key key; as_key_init_int64(&key, g_namespace, g_set, (int64_t)i); if (aerospike_key_remove(&as, &err, NULL, &key) != AEROSPIKE_OK) { LOG("aerospike_key_remove() returned %d - %s", err.code, err.message); cleanup(&as); exit(-1); } } LOG("deleted records %u ... %u", n_start, n_end - 1); // Check existence of these keys - some should not be found. if (aerospike_batch_exists(&as, &err, NULL, &batch, batch_read_cb, NULL) != AEROSPIKE_OK) { LOG("aerospike_batch_exists() returned %d - %s", err.code, err.message); cleanup(&as); exit(-1); } LOG("second batch exists call completed"); // Get all of these keys - some should not be found. if (aerospike_batch_get(&as, &err, NULL, &batch, batch_read_cb, NULL) != AEROSPIKE_OK) { LOG("aerospike_batch_get() returned %d - %s", err.code, err.message); cleanup(&as); exit(-1); } LOG("second batch get call completed"); // Cleanup and disconnect from the database cluster. cleanup(&as); LOG("batch get example successfully completed"); return 0; }