diff -r 000000000000 -r 17fc678e0a94 src/X11Handler.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/X11Handler.h Sun Mar 28 18:41:21 2021 +0200
@@ -0,0 +1,93 @@
+/**
+ * Relational pipes
+ * Copyright © 2021 František Kučera (Frantovo.cz, GlobalCode.info)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include "Configuration.h"
+
+namespace relpipe {
+namespace out {
+namespace x11 {
+
+using namespace relpipe;
+using namespace relpipe::reader;
+using namespace relpipe::reader::handlers;
+
+class X11Handler : public RelationalReaderStringHandler {
+private:
+ std::ostream& output;
+ Configuration& configuration;
+ const char QUOTE = '"';
+ std::wstring_convert> convertor; // TODO: probably not needed
+ std::vector firstAttributes;
+ integer_t valueCount = 0;
+public:
+
+ X11Handler(std::ostream& output, Configuration& configuration) : output(output), configuration(configuration) {
+ }
+
+ void startRelation(string_t name, std::vector attributes) override {
+ if (firstAttributes.empty()) {
+ firstAttributes = attributes;
+ if (configuration.writeHeader) for (auto attr : attributes) attribute(attr.getAttributeName());
+ } else {
+ throw std::logic_error("Only a single relation can be converted to the X11 format.");
+ }
+ }
+
+ void attribute(const string_t& value) override {
+ valueCount++;
+
+ if (value.size() > 0) {
+ output << QUOTE;
+ for (auto ch : convertor.to_bytes(value)) {
+ if (ch == QUOTE) output << QUOTE << QUOTE;
+ else output << ch;
+ }
+ output << QUOTE;
+ }
+
+ if (valueCount % firstAttributes.size()) {
+ output << ",";
+ } else {
+ output << "\r\n";
+ valueCount = 0;
+ }
+ }
+
+ void endOfPipe() {
+ output.flush();
+ }
+
+};
+
+}
+}
+}