# HG changeset patch # User František Kučera # Date 1557257145 -7200 # Node ID 2ac59242d0cb6daf5ff76cb8a4bb4fb5d63f2ce0 # Parent 54716ea44d521ec81eec21d4c9bdd1507e8ef9dc environment variables diff -r 54716ea44d52 -r 2ac59242d0cb src/AwkHandler.h --- a/src/AwkHandler.h Tue May 07 17:03:07 2019 +0200 +++ b/src/AwkHandler.h Tue May 07 21:25:45 2019 +0200 @@ -101,6 +101,21 @@ throw cli::RelpipeCLIException(L"Unable to do execvp().", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? } + /* TODO: move to lib-cli when stable and used in other modules */ + void setEnv(const char * name, const string_t& value) { + setenv(name, convertor.to_bytes(value).c_str(), true); + } + + /* TODO: move to lib-cli when stable and used in other modules */ + void setEnv(const char * name, std::string& value) { + setenv(name, value.c_str(), true); + } + + /* TODO: move to lib-cli when stable and used in other modules */ + void setEnv(const char * name, const integer_t& value) { + setenv(name, to_string(value).c_str(), true); + } + void addDefinition(std::vector& awkCliArgs, DefinitionRecipe& d) { awkCliArgs.push_back("-v"); awkCliArgs.push_back(convertor.to_bytes(a2v(d.name) + L"=" + d.value)); @@ -188,10 +203,25 @@ redirectFD(awkInputReaderFD, STDIN_FILENO); redirectFD(awkOutputWriterFD, STDOUT_FILENO); + // Environment variables: + setEnv("relationName", name); + setEnv("inputAttributeCount", currentReaderMetadata.size()); + setEnv("outputAttributeCount", currentWriterMetadata.size()); + // TODO: better names? ENV vs. AWK variables? + for (int i = 0; i < currentReaderMetadata.size(); i++) { + setEnv((std::string("inputAttributeName") + std::to_string(i)).c_str(), currentReaderMetadata[i].getAttributeName()); + setEnv("inputAttributeType" + i, currentReaderMetadata[i].getTypeName()); + } + for (int i = 0; i < currentWriterMetadata.size(); i++) { + setEnv("outputAttributeName" + i, currentWriterMetadata[i].attributeName); + // setEnv("outputAttributeType" + i, currentWriterMetadata[i].typeId); // TODO: type? + } + // AWK script: std::wstringstream awkScript; awkScript << L"BEGIN {" << std::endl; awkScript << L"FS=\"\\t\";" << std::endl; + awkScript << L"OFS=\"\\t\";" << std::endl; awkScript << currentRelationConfiguration->awkBeforeRecords << std::endl; awkScript << L"};" << std::endl; awkScript << std::endl;