// Delegates processing of the message to a worker. // // server - The server. // header - The message header. // table - The table the message is working against // input - The input file stream. // output - The output file stream. // // Returns 0 if successful, otherwise returns -1. int sky_lua_aggregate_message_process(sky_server *server, sky_message_header *header, sky_table *table, FILE *input, FILE *output) { int rc = 0; sky_lua_aggregate_message *message = NULL; assert(table != NULL); assert(header != NULL); assert(input != NULL); assert(output != NULL); // Create worker. sky_worker *worker = sky_worker_create(); check_mem(worker); worker->context = server->context; worker->map = sky_lua_aggregate_message_worker_map; worker->map_free = sky_lua_aggregate_message_worker_map_free; worker->reduce = sky_lua_aggregate_message_worker_reduce; worker->write = sky_lua_aggregate_message_worker_write; worker->free = sky_lua_aggregate_message_worker_free; worker->input = input; worker->output = output; // Attach servlets. rc = sky_server_get_table_servlets(server, table, &worker->servlets, &worker->servlet_count); check(rc == 0, "Unable to copy servlets to worker"); // Create and parse message object. message = sky_lua_aggregate_message_create(); check_mem(message); message->results = bfromcstr("\x80"); check_mem(message->results); rc = sky_lua_aggregate_message_unpack(message, input); check(rc == 0, "Unable to unpack 'lua::aggregate' message"); check(message->source != NULL, "Lua source required"); // Compile Lua script. rc = sky_lua_initscript_with_table(message->source, table, NULL, &message->L); check(rc == 0, "Unable to initialize script"); // Attach message to worker. worker->data = (sky_lua_aggregate_message*)message; // Start worker. rc = sky_worker_start(worker); check(rc == 0, "Unable to start worker"); return 0; error: sky_lua_aggregate_message_free(message); sky_worker_free(worker); return -1; }
// Delegates processing of the 'Next Actions' message to a worker. // // server - The server. // header - The message header. // table - The table the message is working against // input - The input file stream. // output - The output file stream. // // Returns 0 if successful, otherwise returns -1. int sky_lua_map_reduce_message_process(sky_server *server, sky_message_header *header, sky_table *table, FILE *input, FILE *output) { int rc = 0; sky_lua_map_reduce_message *message = NULL; assert(table != NULL); assert(header != NULL); assert(input != NULL); assert(output != NULL); // Create worker. sky_worker *worker = sky_worker_create(); check_mem(worker); worker->context = server->context; worker->read = sky_lua_map_reduce_message_worker_read; worker->map = sky_lua_map_reduce_message_worker_map; worker->map_free = sky_lua_map_reduce_message_worker_map_free; worker->reduce = sky_lua_map_reduce_message_worker_reduce; worker->write = sky_lua_map_reduce_message_worker_write; worker->free = sky_lua_map_reduce_message_worker_free; worker->input = input; worker->output = output; // Attach servlets. rc = sky_server_get_table_servlets(server, table, &worker->servlets, &worker->servlet_count); check(rc == 0, "Unable to copy servlets to worker"); // Create a message object. message = sky_lua_map_reduce_message_create(); check_mem(message); check_mem(message->results); // Attach message to worker. worker->data = (sky_lua_map_reduce_message*)message; // Start worker. rc = sky_worker_start(worker); check(rc == 0, "Unable to start worker"); return 0; error: sky_lua_map_reduce_message_free(message); sky_worker_free(worker); return -1; }