/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "utils.hh" #include "recordTypeInfo.hh" using namespace hadoop; void Utils::skip(IArchive& a, const char* tag, const TypeID& typeID) { bool b; size_t len=0; ::std::string str; int8_t bt; double d; float f; int32_t i; int64_t l; switch(typeID.getTypeVal()) { case RIOTYPE_BOOL: a.deserialize(b, tag); break; case RIOTYPE_BUFFER: a.deserialize(str, len, tag); break; case RIOTYPE_BYTE: a.deserialize(bt, tag); break; case RIOTYPE_DOUBLE: a.deserialize(d, tag); break; case RIOTYPE_FLOAT: a.deserialize(f, tag); break; case RIOTYPE_INT: a.deserialize(i, tag); break; case RIOTYPE_LONG: a.deserialize(l, tag); break; case RIOTYPE_MAP: { // since we don't know the key, value types, // we need to deserialize in a generic manner Index* idx = a.startMap(tag); MapTypeID& mtID = (MapTypeID&) typeID; while (!idx->done()) { skip(a, tag, *(mtID.getKeyTypeID())); skip(a, tag, *(mtID.getValueTypeID())); idx->incr(); } a.endMap(idx, tag); } break; case RIOTYPE_STRING: a.deserialize(str, tag); break; case RIOTYPE_STRUCT: { // since we don't know the key, value types, // we need to deserialize in a generic manner // we need to pass a record in, though it's never used RecordTypeInfo rec; a.startRecord(rec, tag); StructTypeID& stID = (StructTypeID&) typeID; std::vector& typeInfos = stID.getFieldTypeInfos(); for (unsigned int i=0; igetTypeID())); } a.endRecord(rec, tag); } break; case RIOTYPE_VECTOR: { // since we don't know the key, value types, // we need to deserialize in a generic manner Index* idx = a.startVector(tag); VectorTypeID& vtID = (VectorTypeID&) typeID; while (!idx->done()) { skip(a, tag, *(vtID.getElementTypeID())); idx->incr(); } a.endVector(idx, tag); } break; default: // shouldn't be here throw new IOException("Unknown typeID when skipping bytes"); break; }; }