diff -r 051e58022783 -r 2dcc22b7a424 src/GuileHandler.h --- 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& arguments) : relationalWriter(relationalWriter), configuration(configuration) { @@ -195,6 +206,7 @@ void startRelation(string_t name, vector 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(); + } } };