Hi Bryan, I'm fine with either of those. If it were to go into the tutorial directory I think it needs a makefile. All I have is an Xcode project that really depends on our whole build infrastructure, so it's not really useful to anyone else.
I suppose it could go into the Wiki just as source. It's at least a starting point for someone who wants to see an example. - Rush On Oct 25, 2010, at 10:52 AM, Bryan Duxbury wrote: > Rush - > > What do you think of us including this in the tutorial directory? Or maybe > putting it on the wiki? Open to suggestions, but I think this will get lost > in the mailing list if we don't preserve it elsewhere. > > -Bryan > > On Mon, Oct 25, 2010 at 10:46 AM, Rush Manbert <r...@manbert.com> wrote: > >> A couple of people have asked for an example of how to serialize to and >> from a file with Thrift. I wrote a C++ test program quite a while ago that >> does that. I recently tried to attach it, but the attachment got stripped. >> Since it was just one file, and it's really not very big, I thought I'd just >> post the code. (I also discovered that I had added some extra test code that >> is very specific to our environment. This version has that code stripped >> out, but the test has sort of moved on from this original "how does this >> work?" version.) >> >> Here it is. It uses the structures defined in test/ThriftTest.thrift, and >> you can use different transport types, although I'm not sure that DENSE >> works these days. Using JSON is useful because you can look at the file with >> a text editor. >> >> Obviously, you need to change the path "/Users/rmanbert/TFileTestData" to >> something that works for you. (It's hardcoded twice - once for write and >> once for read.) >> >> I also need to mention that we are running on an old version of Thrift, so >> I don't know what changes you might need to make for the current version. >> >> I hope this is useful to someone, >> Rush >> >> >> ----------------------------------------------------------------------------------------- >> #include <iostream> >> #include <fcntl.h> >> #include <stdio.h> >> #include <unistd.h> >> #include <sys/time.h> >> #include <protocol/TBinaryProtocol.h> >> #include <protocol/TDenseProtocol.h> >> #include <protocol/TJSONProtocol.h> >> #include <transport/TTransportUtils.h> >> #include <transport/TFDTransport.h> >> >> >> #include <boost/shared_ptr.hpp> >> #include "ThriftTest.h" >> >> >> #define __STDC_FORMAT_MACROS >> #include <inttypes.h> >> >> // Define which protocol to use >> #define JSON >> //#define BINARY >> //#define DENSE >> >> // Define which tests to run >> #define Test_Struct >> #define Test_NestedStruct >> #define Test_Insanity >> >> using namespace boost; >> using namespace std; >> using namespace apache::thrift; >> using namespace apache::thrift::protocol; >> using namespace apache::thrift::transport; >> using namespace thrift::test; >> >> >> int main(int argc, char * const argv[]) { >> >> >> int fd = open("/Users/rmanbert/TFileTestData", O_CREAT | O_TRUNC | >> O_WRONLY, S_IRUSR | S_IWUSR | S_IXUSR); >> if (-1 == fd) >> { >> printf("ERROR: Open/create for write failed!\n"); >> return -1; >> } >> >> shared_ptr<TFDTransport> innerTransport(new TFDTransport(fd)); >> shared_ptr<TBufferedTransport> transport(new >> TBufferedTransport(innerTransport)); >> >> #if defined(BINARY) >> shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport)); >> #elif defined(DENSE) >> shared_ptr<TDenseProtocol> protocol(new TDenseProtocol(transport)); >> #elif defined(JSON) >> shared_ptr<TJSONProtocol> protocol(new TJSONProtocol(transport)); >> #endif >> transport->open(); >> >> #ifdef Test_Struct >> /** >> * STRUCT TEST >> */ >> printf("testStruct({\"Zero\", 1, -3, -5})\n"); >> Xtruct out; >> out.string_thing = "Zero"; >> out.byte_thing = 1; >> out.i32_thing = -3; >> out.i64_thing = -5; >> #if defined(DENSE) >> // protocol->setTypeSpec(out.local_reflection); >> #endif >> out.write(protocol.get()); >> #endif // Test_Struct >> >> #ifdef Test_NestedStruct >> /** >> * NESTED STRUCT TEST >> */ >> printf("testNest({1, {\"Zero\", 1, -3, -5}), 5}\n"); >> Xtruct2 out2; >> out2.byte_thing = 1; >> out2.struct_thing = out; >> out2.i32_thing = 5; >> #if defined(DENSE) >> // protocol->setTypeSpec(out2.local_reflection); >> #endif >> out2.write(protocol.get()); >> #endif // Test_NestedStruct >> >> #ifdef Test_Insanity >> /** >> * INSANITY TEST >> */ >> printf("test Insanity\n"); >> Insanity insane; >> insane.userMap.insert(make_pair(FIVE, 5000)); >> insane.userMap.insert(make_pair(THREE, 3333)); >> Xtruct truck; >> truck.string_thing = "Truck"; >> truck.byte_thing = 8; >> truck.i32_thing = 8; >> truck.i64_thing = 8; >> insane.xtructs.push_back(truck); >> truck.string_thing = "Tractor"; >> truck.byte_thing = 88; >> truck.i32_thing = 12345; >> truck.i64_thing = 32475862891754ll; >> insane.xtructs.push_back(truck); >> truck.string_thing = "Freight Train"; >> truck.byte_thing = 255; >> truck.i32_thing = ~0; >> truck.i64_thing = ~0; >> insane.xtructs.push_back(truck); >> #if defined(DENSE) >> // protocol->setTypeSpec(insane.local_reflection); >> #endif >> insane.write(protocol.get()); >> #endif // Test_Insanity >> >> >> transport->close(); >> >> fd = open("/Users/rmanbert/TFileTestData", O_RDONLY); >> if (-1 == fd) >> { >> printf("ERROR: Open for read failed!\n"); >> return -1; >> } >> >> >> shared_ptr<TFDTransport> innerTransport2(new TFDTransport(fd)); >> shared_ptr<TBufferedTransport> transport2(new >> TBufferedTransport(innerTransport2)); >> >> >> #if defined(BINARY) >> shared_ptr<TBinaryProtocol> protocol2(new TBinaryProtocol(transport2)); >> #elif defined(DENSE) >> shared_ptr<TDenseProtocol> protocol2(new TDenseProtocol(transport2)); >> #elif defined(JSON) >> shared_ptr<TJSONProtocol> protocol2(new TJSONProtocol(transport2)); >> #endif >> >> transport2->open(); >> >> #ifdef Test_Struct >> { >> printf("Read Xtruct test:\n"); >> Xtruct in; >> # if defined(DENSE) >> //protocol2->setTypeSpec(in.local_reflection); >> # endif >> in.read(protocol2.get()); >> if (in != out) >> { >> printf ("ERROR: Xtruct read in does not match wat >> was written!\n"); >> } >> else >> { >> printf ("Structure read from file matches the >> original.\n"); >> } >> } >> #endif // Test_Struct >> >> #ifdef Test_NestedStruct >> { >> printf("Read Xtruct2 test:\n"); >> Xtruct2 in2; >> # if defined(DENSE) >> //protocol2->setTypeSpec(in2.local_reflection); >> # endif >> in2.read(protocol2.get()); >> if (in2 != out2) >> { >> printf ("ERROR: Xtruct2 read in does not match wat >> was written!\n"); >> } >> else >> { >> printf ("Structure read from file matches the >> original.\n"); >> } >> } >> #endif // Test_NestedStruct >> >> #ifdef Test_Insanity >> { >> printf("Read Insanity test:\n"); >> Insanity insane2; >> # if defined(DENSE) >> //protocol2->setTypeSpec(insane2.local_reflection); >> # endif >> insane2.read(protocol2.get()); >> if (insane2 != insane) >> { >> printf ("ERROR: Insanity read in does not match wat >> was written!\n"); >> } >> else >> { >> printf ("Structure read from file matches the >> original.\n"); >> } >> } >> #endif // Test_Insanity >> >> >> printf("\nAll tests done.\n"); >> return 0; >> } >> >>