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; }