src/GuileHandler.h
branchv_0
changeset 16 2dcc22b7a424
parent 15 051e58022783
child 18 3f46b784b617
--- a/src/GuileHandler.h	Tue Feb 05 20:40:32 2019 +0100
+++ b/src/GuileHandler.h	Thu Feb 07 00:55:54 2019 +0100
@@ -187,6 +187,17 @@
 		}
 	}
 
+	/**
+	 * Read from the Guile variables and write to relational output stream.
+	 */
+	void writeCurrentRecord() {
+		for (auto attribute : currentWriterMetadata) writeGuileValueToAttribute(attribute);
+	}
+
+	void writeMoreRecords() {
+		while (scm_to_bool(evalGuileCode(currentRelationConfiguration->guileHasMoreRecords, SCM_BOOL_F))) writeCurrentRecord();
+	}
+
 public:
 
 	GuileHandler(writer::RelationalWriter* relationalWriter, Configuration& configuration, const vector<string_t>& arguments) : relationalWriter(relationalWriter), configuration(configuration) {
@@ -195,6 +206,7 @@
 	void startRelation(string_t name, vector<AttributeMetadata> attributes) override {
 		if (currentRelationConfiguration) {
 			evalGuileCode(currentRelationConfiguration->guileAfterRecords);
+			writeMoreRecords();
 			for (DefinitionRecipe definition : currentRelationConfiguration->definitions) undefineGuileVariable(definition.name);
 		}
 		for (auto attribute : currentReaderMetadata) undefineGuileVariable(attribute.getAttributeName());
@@ -240,8 +252,9 @@
 			if (currentAttributeIndex > 0 && currentAttributeIndex % currentReaderMetadata.size() == 0) {
 				evalGuileCode(currentRelationConfiguration->guileForEach);
 				includeCurrentRecord = scm_to_bool(evalGuileCode(currentRelationConfiguration->guileWhere, SCM_BOOL_T));
-				if (includeCurrentRecord && !currentRelationConfiguration->drop) for (auto attribute : currentWriterMetadata) writeGuileValueToAttribute(attribute);
+				if (includeCurrentRecord && !currentRelationConfiguration->drop) writeCurrentRecord();
 				includeCurrentRecord = false;
+				writeMoreRecords();
 			}
 
 			currentAttributeIndex = currentAttributeIndex % currentReaderMetadata.size();
@@ -251,7 +264,10 @@
 	}
 
 	void endOfPipe() {
-		if (currentRelationConfiguration) evalGuileCode(currentRelationConfiguration->guileAfterRecords);
+		if (currentRelationConfiguration) {
+			evalGuileCode(currentRelationConfiguration->guileAfterRecords);
+			writeMoreRecords();
+		}
 	}
 
 };