for each attribute v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 05 May 2019 01:08:24 +0200
branchv_0
changeset 2 580ccb511301
parent 1 05d969cd90d4
child 3 e086ae6a19c3
for each attribute
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<AttributeMetadata> 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<char> 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<char> 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();
 	}
 
 };