blob: 25508020b28fcd76d6ca107b92a114bc2e00e006 [file] [log] [blame]
/**
* 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 "Adaptor.hh"
#include "wrap/orc-proto-wrapper.hh"
#include <fstream>
#include <iostream>
#include <string>
/**
* Write an empty custom ORC file with a lot of control over format.
* We use this to create files to test the reader rather than anything
* that users would want to do.
*/
void writeCustomOrcFile(const std::string& filename,
const orc::proto::Metadata& metadata,
const orc::proto::Footer& footer,
const std::vector<std::uint32_t>& version,
std::uint32_t writerVersion) {
std::fstream output(filename.c_str(),
std::ios::out | std::ios::trunc | std::ios::binary);
output << "ORC";
if (!metadata.SerializeToOstream(&output)) {
std::cerr << "Failed to write metadata for " << filename << "\n";
exit(1);
}
if (!footer.SerializeToOstream(&output)) {
std::cerr << "Failed to write footer for " << filename << "\n";
exit(1);
}
orc::proto::PostScript ps;
ps.set_footerlength(static_cast<uint64_t>(footer.ByteSize()));
ps.set_compression(orc::proto::NONE);
ps.set_compressionblocksize(64*1024);
for(size_t i=0; i < version.size(); ++i) {
ps.add_version(version[i]);
}
ps.set_metadatalength(static_cast<uint64_t>(metadata.ByteSize()));
ps.set_writerversion(writerVersion);
ps.set_magic("ORC");
if (!ps.SerializeToOstream(&output)) {
std::cerr << "Failed to write postscript for " << filename << "\n";
exit(1);
}
output.put(static_cast<char>(ps.ByteSize()));
}
/**
* Create a file from a future version 19.99.
*/
void writeVersion1999() {
orc::proto::Metadata meta;
orc::proto::Footer footer;
footer.set_headerlength(3);
footer.set_contentlength(3);
orc::proto::Type* type = footer.add_types();
type->set_kind(orc::proto::Type_Kind_STRUCT);
footer.set_numberofrows(0);
footer.set_rowindexstride(10000);
orc::proto::ColumnStatistics* stats = footer.add_statistics();
stats->set_numberofvalues(0);
stats->set_hasnull(false);
std::vector<std::uint32_t> version;
version.push_back(19);
version.push_back(99);
writeCustomOrcFile("version1999.orc", meta, footer, version, 1);
}
int main(int, char *[]) {
writeVersion1999();
google::protobuf::ShutdownProtobufLibrary();
return 0;
}