00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef avro_Reader_hh__
00020 #define avro_Reader_hh__
00021
00022 #include <stdint.h>
00023 #include <vector>
00024 #include <boost/noncopyable.hpp>
00025
00026 #include "Config.hh"
00027 #include "Zigzag.hh"
00028 #include "Types.hh"
00029 #include "Validator.hh"
00030 #include "buffer/BufferReader.hh"
00031
00032 namespace avro {
00033
00038
00039 template<class ValidatorType>
00040 class ReaderImpl : private boost::noncopyable
00041 {
00042
00043 public:
00044
00045 explicit ReaderImpl(const InputBuffer &buffer) :
00046 reader_(buffer)
00047 {}
00048
00049 ReaderImpl(const ValidSchema &schema, const InputBuffer &buffer) :
00050 validator_(schema),
00051 reader_(buffer)
00052 {}
00053
00054 void readValue(Null &) {
00055 validator_.checkTypeExpected(AVRO_NULL);
00056 }
00057
00058 void readValue(bool &val) {
00059 validator_.checkTypeExpected(AVRO_BOOL);
00060 uint8_t ival = 0;
00061 reader_.read(ival);
00062 val = (ival != 0);
00063 }
00064
00065 void readValue(int32_t &val) {
00066 validator_.checkTypeExpected(AVRO_INT);
00067 uint32_t encoded = static_cast<uint32_t>(readVarInt());
00068 val = decodeZigzag32(encoded);
00069 }
00070
00071 void readValue(int64_t &val) {
00072 validator_.checkTypeExpected(AVRO_LONG);
00073 uint64_t encoded = readVarInt();
00074 val = decodeZigzag64(encoded);
00075 }
00076
00077 void readValue(float &val) {
00078 validator_.checkTypeExpected(AVRO_FLOAT);
00079 union {
00080 float f;
00081 uint32_t i;
00082 } v;
00083 reader_.read(v.i);
00084 val = v.f;
00085 }
00086
00087 void readValue(double &val) {
00088 validator_.checkTypeExpected(AVRO_DOUBLE);
00089 union {
00090 double d;
00091 uint64_t i;
00092 } v;
00093 reader_.read(v.i);
00094 val = v.d;
00095 }
00096
00097 void readValue(std::string &val) {
00098 validator_.checkTypeExpected(AVRO_STRING);
00099 size_t size = static_cast<size_t>(readSize());
00100 reader_.read(val, size);
00101 }
00102
00103 void readBytes(std::vector<uint8_t> &val) {
00104 validator_.checkTypeExpected(AVRO_BYTES);
00105 size_t size = static_cast<size_t>(readSize());
00106 val.resize(size);
00107 reader_.read(reinterpret_cast<char *>(&val[0]), size);
00108 }
00109
00110 void readFixed(uint8_t *val, size_t size) {
00111 validator_.checkFixedSizeExpected(size);
00112 reader_.read(reinterpret_cast<char *>(val), size);
00113 }
00114
00115 template <size_t N>
00116 void readFixed(uint8_t (&val)[N]) {
00117 this->readFixed(val, N);
00118 }
00119
00120 template <size_t N>
00121 void readFixed(boost::array<uint8_t, N> &val) {
00122 this->readFixed(val.c_array(), N);
00123 }
00124
00125 void readRecord() {
00126 validator_.checkTypeExpected(AVRO_RECORD);
00127 validator_.checkTypeExpected(AVRO_LONG);
00128 validator_.setCount(1);
00129 }
00130
00131 void readRecordEnd() {
00132 validator_.checkTypeExpected(AVRO_RECORD);
00133 validator_.checkTypeExpected(AVRO_LONG);
00134 validator_.setCount(0);
00135 }
00136
00137 int64_t readArrayBlockSize() {
00138 validator_.checkTypeExpected(AVRO_ARRAY);
00139 return readCount();
00140 }
00141
00142 int64_t readUnion() {
00143 validator_.checkTypeExpected(AVRO_UNION);
00144 return readCount();
00145 }
00146
00147 int64_t readEnum() {
00148 validator_.checkTypeExpected(AVRO_ENUM);
00149 return readCount();
00150 }
00151
00152 int64_t readMapBlockSize() {
00153 validator_.checkTypeExpected(AVRO_MAP);
00154 return readCount();
00155 }
00156
00157 Type nextType() const {
00158 return validator_.nextTypeExpected();
00159 }
00160
00161 bool currentRecordName(std::string &name) const {
00162 return validator_.getCurrentRecordName(name);
00163 }
00164
00165 bool nextFieldName(std::string &name) const {
00166 return validator_.getNextFieldName(name);
00167 }
00168
00169 private:
00170
00171 uint64_t readVarInt() {
00172 uint64_t encoded = 0;
00173 uint8_t val = 0;
00174 int shift = 0;
00175 do {
00176 reader_.read(val);
00177 uint64_t newbits = static_cast<uint64_t>(val & 0x7f) << shift;
00178 encoded |= newbits;
00179 shift += 7;
00180 } while (val & 0x80);
00181
00182 return encoded;
00183 }
00184
00185 int64_t readSize() {
00186 uint64_t encoded = readVarInt();
00187 int64_t size = decodeZigzag64(encoded);
00188 return size;
00189 }
00190
00191 int64_t readCount() {
00192 validator_.checkTypeExpected(AVRO_LONG);
00193 int64_t count = readSize();
00194 validator_.setCount(count);
00195 return count;
00196 }
00197
00198 ValidatorType validator_;
00199 BufferReader reader_;
00200
00201 };
00202
00203 typedef ReaderImpl<NullValidator> Reader;
00204 typedef ReaderImpl<Validator> ValidatingReader;
00205
00206 }
00207
00208 #endif