Skip to content

Instantly share code, notes, and snippets.

@baali
Created August 24, 2012 07:58

Revisions

  1. baali created this gist Aug 24, 2012.
    82 changes: 82 additions & 0 deletions dump_file.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,82 @@
    /*
    * 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 <cstdlib>
    #include <iostream>

    #include <thrift/transport/TBufferTransports.h>
    #include <thrift/transport/TFDTransport.h>
    #include <thrift/protocol/TBinaryProtocol.h>
    #include <thrift/protocol/TDebugProtocol.h>
    #include <thrift/protocol/TProtocolTap.h>
    #include <transport/TFileTransport.h>

    using namespace std;
    using boost::shared_ptr;
    using namespace apache::thrift::transport;
    using namespace apache::thrift::protocol;

    void usage() {
    fprintf(stderr,
    "usage: thrift_dump filename\n");
    exit(EXIT_FAILURE);
    }

    int main(int argc, char *argv[]) {
    if (argc != 2) {
    usage();
    }

    std::string filename = argv[1] ;

    shared_ptr<TTransport> stdin_trans(new TFDTransport(STDIN_FILENO));
    shared_ptr<TTransport> itrans;

    itrans.reset(new TBufferedTransport(stdin_trans));

    shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
    shared_ptr<TFileTransport> logTransport(new TFileTransport( filename ));
    shared_ptr<TProtocol> iprot = protocolFactory->getProtocol(logTransport);
    // shared_ptr<TProtocol> iprot(new TBinaryProtocol(itrans));
    shared_ptr<TProtocol> oprot(
    new TDebugProtocol(
    shared_ptr<TTransport>(new TBufferedTransport(
    shared_ptr<TTransport>(new TFDTransport(STDOUT_FILENO))))));

    TProtocolTap tap(iprot, oprot);

    try {
    std::string name;
    TMessageType messageType;
    int32_t seqid;
    for (;;) {
    tap.readMessageBegin(name, messageType, seqid);
    tap.skip(T_STRUCT);
    tap.readMessageEnd();
    }
    } catch (TProtocolException exn) {
    cout << "Protocol Exception: " << exn.what() << endl;
    } catch (...) {
    oprot->getTransport()->flush();
    }

    cout << endl;

    return 0;
    }