コード例 #1
0
ファイル: lua_aggregate_message.c プロジェクト: fxstein/sky
// 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;
}
コード例 #2
0
// 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;
}