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); } }
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; } }
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; }
void throw_on_error(aku_Status status) const { if (status != AKU_SUCCESS) { std::runtime_error err(aku_error_message(status)); BOOST_THROW_EXCEPTION(err); } }