| 114 | } |
| 115 | |
| 116 | Status HdfsRCFileScanner::ReadFileHeader() { |
| 117 | RcFileHeader* rc_header = reinterpret_cast<RcFileHeader*>(header_); |
| 118 | |
| 119 | // Validate file version |
| 120 | uint8_t* header; |
| 121 | RETURN_IF_FALSE(stream_->ReadBytes( |
| 122 | sizeof(RCFILE_VERSION_HEADER), &header, &parse_status_)); |
| 123 | if (!memcmp(header, HdfsSequenceScanner::SEQFILE_VERSION_HEADER, |
| 124 | sizeof(HdfsSequenceScanner::SEQFILE_VERSION_HEADER))) { |
| 125 | rc_header->version = SEQ6; |
| 126 | } else if (!memcmp(header, RCFILE_VERSION_HEADER, sizeof(RCFILE_VERSION_HEADER))) { |
| 127 | rc_header->version = RCF1; |
| 128 | } else { |
| 129 | stringstream ss; |
| 130 | ss << stream_->filename() << " Invalid RCFILE_VERSION_HEADER: '" |
| 131 | << ReadWriteUtil::HexDump(header, sizeof(RCFILE_VERSION_HEADER)) << "'"; |
| 132 | return Status(ss.str()); |
| 133 | } |
| 134 | |
| 135 | if (rc_header->version == SEQ6) { |
| 136 | // Validate class name key/value |
| 137 | uint8_t* class_name_key; |
| 138 | int64_t len; |
| 139 | RETURN_IF_FALSE( |
| 140 | stream_->ReadText(&class_name_key, &len, &parse_status_)); |
| 141 | if (len != strlen(HdfsRCFileScanner::RCFILE_KEY_CLASS_NAME) || |
| 142 | memcmp(class_name_key, HdfsRCFileScanner::RCFILE_KEY_CLASS_NAME, len)) { |
| 143 | stringstream ss; |
| 144 | ss << stream_->filename() << " Invalid RCFILE_KEY_CLASS_NAME: '" |
| 145 | << string(reinterpret_cast<char*>(class_name_key), len) << "' len=" << len; |
| 146 | return Status(ss.str()); |
| 147 | } |
| 148 | |
| 149 | uint8_t* class_name_val; |
| 150 | RETURN_IF_FALSE( |
| 151 | stream_->ReadText(&class_name_val, &len, &parse_status_)); |
| 152 | if (len != strlen(HdfsRCFileScanner::RCFILE_VALUE_CLASS_NAME) || |
| 153 | memcmp(class_name_val, HdfsRCFileScanner::RCFILE_VALUE_CLASS_NAME, len)) { |
| 154 | stringstream ss; |
| 155 | ss << stream_->filename() << " Invalid RCFILE_VALUE_CLASS_NAME: '" |
| 156 | << string(reinterpret_cast<char*>(class_name_val), len) << "' len=" << len; |
| 157 | return Status(ss.str()); |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | // Check for compression |
| 162 | RETURN_IF_FALSE( |
| 163 | stream_->ReadBoolean(&header_->is_compressed, &parse_status_)); |
| 164 | if (rc_header->version == SEQ6) { |
| 165 | // Read the is_blk_compressed header field. This field should *always* |
| 166 | // be FALSE, and is the result of using the sequence file header format in the |
| 167 | // original RCFile format. |
| 168 | bool is_blk_compressed; |
| 169 | RETURN_IF_FALSE( |
| 170 | stream_->ReadBoolean(&is_blk_compressed, &parse_status_)); |
| 171 | if (is_blk_compressed) { |
| 172 | stringstream ss; |
| 173 | ss << stream_->filename() << " RC files does not support block compression."; |
nothing calls this directly
no test coverage detected