--- 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();
+ }
}
};