# HG changeset patch # User František Kučera # Date 1557011304 -7200 # Node ID 580ccb511301f37c775fbe1996d717404f5f5ad4 # Parent 05d969cd90d47d9e5f17fde52733f3440b4875e3 for each attribute diff -r 05d969cd90d4 -r 580ccb511301 src/AwkHandler.h --- a/src/AwkHandler.h Fri May 03 17:33:00 2019 +0200 +++ b/src/AwkHandler.h Sun May 05 01:08:24 2019 +0200 @@ -55,6 +55,8 @@ Configuration configuration; writer::RelationalWriter* relationalWriter; + int awkInputWriterFD = -1; + void createPipe(int& readerFD, int& writerFD) { int fds[2]; int result = pipe(fds); @@ -70,7 +72,19 @@ void closeOrThrow(int fd) { int error = close(fd); - if (error) throw cli::RelpipeCLIException(L"Unable to close FD: ", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? + if (error) throw cli::RelpipeCLIException(L"Unable to close FD: " + to_wstring(fd) + L" from PID: " + to_wstring(getpid()), cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? + } + + void cleanUp() { + if (awkInputWriterFD >= 0) { + closeOrThrow(awkInputWriterFD); + fwprintf(stderr, L"writing done and closed\n"); + __pid_t waitResult1 = wait(NULL); + fwprintf(stderr, L"wait 1 done: %d\n", waitResult1); + __pid_t waitResult2 = wait(NULL); + fwprintf(stderr, L"wait 2 done: %d\n", waitResult2); + awkInputWriterFD = -1; + } } public: @@ -79,10 +93,10 @@ } void startRelation(string_t name, vector attributes) override { + cleanUp(); int awkInputReaderFD; - int awkInputWriterFD; int awkOutputReaderFD; int awkOutputWriterFD; @@ -95,11 +109,11 @@ throw cli::RelpipeCLIException(L"Unable to fork AWK process.", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? } else if (awkPid == 0) { // AWK child process - close(awkInputWriterFD); - close(awkOutputReaderFD); + closeOrThrow(awkInputWriterFD); + closeOrThrow(awkOutputReaderFD); - redirectFD(awkInputReaderFD, 0); - redirectFD(awkOutputWriterFD, 1); + redirectFD(awkInputReaderFD, STDIN_FILENO); + redirectFD(awkOutputWriterFD, STDOUT_FILENO); fwprintf(stderr, L"I am child AWK with PID: %d\n", getpid()); @@ -107,8 +121,8 @@ } else { // Parent process - close(awkInputReaderFD); - close(awkOutputWriterFD); + closeOrThrow(awkInputReaderFD); + closeOrThrow(awkOutputWriterFD); fwprintf(stderr, L"Forked AWK has PID: %d\n", awkPid); __pid_t writerPid = fork(); @@ -117,7 +131,7 @@ throw cli::RelpipeCLIException(L"Unable to fork Writer process.", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? } else if (writerPid == 0) { // Writer child process - close(awkInputWriterFD); + closeOrThrow(awkInputWriterFD); fwprintf(stderr, L"I am child Writer with PID: %d\n", getpid()); __gnu_cxx::stdio_filebuf awkOutputReaderBuffer(awkOutputReaderFD, std::ios::in); @@ -129,39 +143,35 @@ } std::cout << "--- PIPE end ----------" << std::endl; - close(awkOutputReaderFD); + closeOrThrow(awkOutputReaderFD); + exit(0); } else { // Parent process - close(awkOutputReaderFD); + closeOrThrow(awkOutputReaderFD); fwprintf(stderr, L"Forked Writer has PID: %d\n", writerPid); dprintf(awkInputWriterFD, "hello world :-)\n"); - close(awkInputWriterFD); + //closeOrThrow(awkInputWriterFD); /* __gnu_cxx::stdio_filebuf awkInputWriterBuffer(awkInputWriterFD, std::ios::out); std::ostream awkInputWriter(&awkInputWriterBuffer); awkInputWriter << "hello world :-)" << std::endl; awkInputWriter.flush(); - close(awkInputWriterFD); + closeOrThrow(awkInputWriterFD); */ - fwprintf(stderr, L"writing done and closed\n"); - __pid_t waitResult1 = wait(NULL); - fwprintf(stderr, L"wait 1 done: %d\n", waitResult1); - __pid_t waitResult2 = wait(NULL); - fwprintf(stderr, L"wait 2 done: %d\n", waitResult2); } } } void attribute(const string_t& value) override { - + dprintf(awkInputWriterFD, "attribute!\n"); } void endOfPipe() { - + cleanUp(); } };