Guile --for-each record v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 03 Feb 2019 19:29:52 +0100
branchv_0
changeset 9 65f9d6b94f5c
parent 8 1e6206284c6c
child 10 f7f9a2553128
Guile --for-each record
src/GuileHandler.h
--- a/src/GuileHandler.h	Sun Feb 03 19:02:50 2019 +0100
+++ b/src/GuileHandler.h	Sun Feb 03 19:29:52 2019 +0100
@@ -76,8 +76,14 @@
 		return scm_string_to_symbol(scm_from_locale_string(convertor.to_bytes(name).c_str()));
 	}
 
-	SCM evalGuileCode(const string_t& value) {
-		return scm_eval_string(toGuileValue(&value, typeid (string_t), TypeId::STRING));
+	/**
+	 * @param code guile source code e.g. (+ 1 2 3) or #t
+	 * @param defaultReturnValue is returned if code is empty
+	 * @return result of code execution or defaultReturnValue
+	 */
+	SCM evalGuileCode(const string_t& code, SCM defaultReturnValue = SCM_BOOL_F) {
+		if (code.size()) return scm_eval_string(toGuileValue(&code, typeid (string_t), TypeId::STRING));
+		else return defaultReturnValue;
 	}
 
 	SCM toGuileValue(const void* value, const std::type_info& typeInfo, TypeId type) {
@@ -176,7 +182,8 @@
 
 			// TODO: > 0 ?:
 			if (currentAttributeIndex > 0 && currentAttributeIndex % currentReaderMetadata.size() == 0) {
-				includeCurrentRecord = scm_to_bool(evalGuileCode(currentRelationConfiguration->guileWhere));
+				evalGuileCode(currentRelationConfiguration->guileForEach);
+				includeCurrentRecord = scm_to_bool(evalGuileCode(currentRelationConfiguration->guileWhere, SCM_BOOL_T));
 				if (includeCurrentRecord) for (auto attribute : currentWriterMetadata) writeGuileValueToAttribute(attribute);
 				includeCurrentRecord = false;
 			}