Example #1
0
static PyObject *
AvroDeserializer_deserialize(AvroDeserializer *self, PyObject *args)
{
    int rval;
    avro_value_t value;
    char *buffer = NULL;
    size_t buffer_size;
    PyObject *result;

    if (!PyArg_ParseTuple(args, "s#", &buffer, &buffer_size)) {
        return NULL;
    }
    avro_reader_memory_set_source(self->datum_reader, buffer, buffer_size);
    avro_generic_value_new(self->iface, &value);
    rval = avro_value_read(self->datum_reader, &value);

    if (rval) {
        avro_value_decref(&value);
        set_error_prefix("Read error: ");
        return NULL;
    }

    result = avro_to_python(&self->info, &value);
    avro_value_decref(&value);
    return result;
}
/* Parses the contents of a binary-encoded Avro buffer into an Avro value, ensuring
 * that the entire buffer is read. */
int read_entirely(avro_value_t *value, avro_reader_t reader, const void *buf, size_t len) {
    int err = 0;

    avro_reader_memory_set_source(reader, buf, len);
    check(err, avro_value_read(reader, value));

    // Expect the reading of the Avro value from the buffer to entirely consume the
    // buffer contents. If there's anything left at the end, something must be wrong.
    // Avro doesn't seem to provide a way of checking how many bytes remain, so we
    // test indirectly by trying to seek forward (expecting to see an error).
    if (avro_skip(reader, 1) != ENOSPC) {
        avro_set_error("Unexpected trailing bytes at the end of buffer");
        return EINVAL;
    }

    return err;
}