示例#1
0
AkumuliConnection::AkumuliConnection(const char *path,
                                     bool hugetlb,
                                     Durability durability,
                                     uint32_t compression_threshold,
                                     uint64_t window_width,
                                     uint64_t cache_size)
    : dbpath_(path)
{
    aku_FineTuneParams params = {};
    params.debug_mode = 0;
    params.durability = (uint32_t)durability;
    params.enable_huge_tlb = hugetlb ? 1u : 0u;
    params.logger = &db_logger;
    params.compression_threshold = compression_threshold;
    params.window_size = window_width;
    params.max_cache_size = cache_size;
    db_ = aku_open_database(dbpath_.c_str(), params);

    aku_Status status = aku_open_status(db_);
    if (status != AKU_SUCCESS) {
        std::stringstream fmt;
        fmt << "can't open database, error: `" << aku_error_message(status) << "`";
        std::runtime_error err(fmt.str());
        BOOST_THROW_EXCEPTION(err);
    }
}
示例#2
0
static int accept_connection(void           *cls,
                             MHD_Connection *connection,
                             const char     *url,
                             const char     *method,
                             const char     *version,
                             const char     *upload_data,
                             size_t         *upload_data_size,
                             void          **con_cls)
{
    if (strcmp(method, "POST") == 0) {
        ReadOperationBuilder *queryproc = static_cast<ReadOperationBuilder*>(cls);
        ReadOperation* cursor = static_cast<ReadOperation*>(*con_cls);

        if (cursor == nullptr) {
            cursor = queryproc->create();
            *con_cls = cursor;
            return MHD_YES;
        }
        if (*upload_data_size) {
            cursor->append(upload_data, *upload_data_size);
            *upload_data_size = 0;
            return MHD_YES;
        }

        auto error_response = [&](const char* msg) {
            char buffer[0x200];
            int len = snprintf(buffer, 0x200, "-%s\r\n", msg);
            auto response = MHD_create_response_from_buffer(len, buffer, MHD_RESPMEM_MUST_COPY);
            int ret = MHD_queue_response(connection, MHD_HTTP_BAD_REQUEST, response);
            MHD_destroy_response(response);
            return ret;
        };

        // Should be called once
        try {
            cursor->start();
        } catch (const std::exception& err) {
            return error_response(err.what());
        }

        // Check for error
        auto err = cursor->get_error();
        if (err != AKU_SUCCESS) {
            const char* error_msg = aku_error_message(err);
            return error_response(error_msg);
        }

        auto response = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN, 64*1024, &read_callback, cursor, &free_callback);
        int ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
        MHD_destroy_response(response);
        return ret;
    } else {
        // Unsupported method
        // TODO: implement GET handler for simple queries (self diagnostics)
        return MHD_NO;
    }
}
示例#3
0
 bool can_proceed() {
     aku_Status status = AKU_SUCCESS;
     if (aku_cursor_is_error(cursor_, &status)) {
         std::runtime_error err(aku_error_message(status));
         BOOST_THROW_EXCEPTION(err);
         return false;
     }
     return true;
 }
示例#4
0
 void throw_on_error(aku_Status status) const {
     if (status != AKU_SUCCESS) {
         std::runtime_error err(aku_error_message(status));
         BOOST_THROW_EXCEPTION(err);
     }
 }