Exemple #1
0
static int smack_backend_read(struct smack_backend *s, void *state, struct dnet_cmd *cmd, void *iodata)
{
	struct dnet_io_attr *io = iodata;
	char *data;
	struct index idx;
	int err;

	dnet_convert_io_attr(io);

	smack_setup_idx(&idx, io->id);
	idx.data_size = io->size;

	err = smack_read(s->smack, &idx, &data);
	if (err < 0)
		goto err_out_exit;

	io->size = idx.data_size;
	err = dnet_send_read_data(state, cmd, io, data, -1, io->offset, 0);
	if (err)
		goto err_out_free;

err_out_free:
	free(data);
err_out_exit:
	return err;
}
int ell::honest_command_handler_adaptee::file_read(module_backend_t */*r*/, void *state, dnet_cmd *cmd, void *data)
{
	const std::string key(dnet_cmd2string(cmd->id));
	const std::string result = m_uncomplicated_handler->read(key);
	dnet_io_attr *io = static_cast<dnet_io_attr *>(data);

	io->size = result.size();
	return dnet_send_read_data(state, cmd, io, (void *)result.data(), -1, io->offset, 0);
}
static int leveldb_backend_read(struct leveldb_backend *s, void *state, struct dnet_cmd *cmd, void *iodata, int last)
{
	struct dnet_io_attr *io = iodata;
	struct dnet_ext_list elist;
	char *data;
	size_t data_size;
	int err = -EINVAL;
	char *error_string = NULL;

	dnet_ext_list_init(&elist);

	dnet_convert_io_attr(io);
	if (io->size || io->offset) {
		err = -ERANGE;
		goto err_out_exit;
	}

	data = leveldb_get(s->db, s->roptions, (const char *)io->id, DNET_ID_SIZE, &data_size, &error_string);
	if (error_string || !data) {
		if (!data)
			err = -ENOENT;
		goto err_out_exit;
	}

	/* Extract original data and extension list from &data */
	err = dnet_ext_list_extract((void *)&data, (uint64_t *)&data_size,
			&elist, DNET_EXT_FREE_ON_DESTROY);
	if (err != 0)
		goto err_out_exit;
	dnet_ext_list_to_io(&elist, io);

	io->size = data_size;
	if (data_size && data && last)
		cmd->flags &= ~DNET_FLAGS_NEED_ACK;
	err = dnet_send_read_data(state, cmd, io, data, -1, io->offset, 0);
	if (err < 0)
		goto err_out_exit;

	dnet_backend_log(DNET_LOG_NOTICE, "%s: leveldb: : READ: Ok: size: %llu.\n",
			dnet_dump_id(&cmd->id), (unsigned long long)io->size);

err_out_exit:
	dnet_ext_list_destroy(&elist);
	if (err < 0)
		dnet_backend_log(DNET_LOG_ERROR, "%s: leveldb: READ: error: %s: %d\n",
			dnet_dump_id(&cmd->id), error_string, err);

	free(error_string);
	return err;
}