00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef avro_Validating_hh__
00020 #define avro_Validating_hh__
00021
00022 #include <boost/noncopyable.hpp>
00023 #include <vector>
00024 #include <stdint.h>
00025
00026 #include "Config.hh"
00027 #include "Types.hh"
00028 #include "ValidSchema.hh"
00029
00030 namespace avro {
00031
00032 class AVRO_DECL NullValidator : private boost::noncopyable
00033 {
00034 public:
00035
00036 explicit NullValidator(const ValidSchema &schema) {}
00037 NullValidator() {}
00038
00039 void setCount(int64_t val) {}
00040
00041 bool typeIsExpected(Type type) const {
00042 return true;
00043 }
00044
00045 Type nextTypeExpected() const {
00046 return AVRO_UNKNOWN;
00047 }
00048
00049 int nextSizeExpected() const {
00050 return 0;
00051 }
00052
00053 bool getCurrentRecordName(std::string &name) const {
00054 return true;
00055 }
00056
00057 bool getNextFieldName(std::string &name) const {
00058 return true;
00059 }
00060
00061 void checkTypeExpected(Type type) { }
00062 void checkFixedSizeExpected(int size) { }
00063
00064
00065 };
00066
00072
00073 class AVRO_DECL Validator : private boost::noncopyable
00074 {
00075 public:
00076
00077 explicit Validator(const ValidSchema &schema);
00078
00079 void setCount(int64_t val);
00080
00081 bool typeIsExpected(Type type) const {
00082 return (expectedTypesFlag_ & typeToFlag(type)) != 0;
00083 }
00084
00085 Type nextTypeExpected() const {
00086 return nextType_;
00087 }
00088
00089 int nextSizeExpected() const;
00090
00091 bool getCurrentRecordName(std::string &name) const;
00092 bool getNextFieldName(std::string &name) const;
00093
00094 void checkTypeExpected(Type type) {
00095 if(! typeIsExpected(type)) {
00096 throw Exception(
00097 boost::format("Type %1% does not match schema %2%")
00098 % type % nextType_
00099 );
00100 }
00101 advance();
00102 }
00103
00104 void checkFixedSizeExpected(int size) {
00105 if( nextSizeExpected() != size) {
00106 throw Exception(
00107 boost::format("Wrong size for fixed, got %1%, expected %2%")
00108 % size % nextSizeExpected()
00109 );
00110 }
00111 checkTypeExpected(AVRO_FIXED);
00112 }
00113
00114 private:
00115
00116 typedef uint32_t flag_t;
00117
00118 flag_t typeToFlag(Type type) const {
00119 flag_t flag = (1L << type);
00120 return flag;
00121 }
00122
00123 void setupOperation(const NodePtr &node);
00124
00125 void setWaitingForCount();
00126
00127 void advance();
00128 void doAdvance();
00129
00130 void enumAdvance();
00131 bool countingSetup();
00132 void countingAdvance();
00133 void unionAdvance();
00134 void fixedAdvance();
00135
00136 void setupFlag(Type type);
00137
00138 const ValidSchema schema_;
00139
00140 Type nextType_;
00141 flag_t expectedTypesFlag_;
00142 bool compoundStarted_;
00143 bool waitingForCount_;
00144 int64_t count_;
00145
00146 struct CompoundType {
00147 explicit CompoundType(const NodePtr &n) :
00148 node(n), pos(0)
00149 {}
00150 NodePtr node;
00151 size_t pos;
00152 };
00153
00154 std::vector<CompoundType> compoundStack_;
00155 std::vector<size_t> counters_;
00156
00157 };
00158
00159 }
00160
00161 #endif