| 1 | /*
|
| 2 | * Souffle - A Datalog Compiler
|
| 3 | * Copyright (c) 2021, The Souffle Developers. All rights reserved
|
| 4 | * Licensed under the Universal Permissive License v 1.0 as shown at:
|
| 5 | * - https://opensource.org/licenses/UPL
|
| 6 | * - <souffle root>/licenses/SOUFFLE-UPL.txt
|
| 7 | */
|
| 8 |
|
| 9 | /************************************************************************
|
| 10 | *
|
| 11 | * @file IOSystem.h
|
| 12 | *
|
| 13 | ***********************************************************************/
|
| 14 |
|
| 15 | #pragma once
|
| 16 |
|
| 17 | #include "souffle/RamTypes.h"
|
| 18 | #include "souffle/RecordTable.h"
|
| 19 | #include "souffle/SymbolTable.h"
|
| 20 | #include "souffle/io/ReadStream.h"
|
| 21 | #include "souffle/io/ReadStreamCSV.h"
|
| 22 | #include "souffle/io/ReadStreamJSON.h"
|
| 23 | #include "souffle/io/WriteStream.h"
|
| 24 | #include "souffle/io/WriteStreamCSV.h"
|
| 25 | #include "souffle/io/WriteStreamJSON.h"
|
| 26 |
|
| 27 | #ifdef USE_SQLITE
|
| 28 | #include "souffle/io/ReadStreamSQLite.h"
|
| 29 | #include "souffle/io/WriteStreamSQLite.h"
|
| 30 | #endif
|
| 31 |
|
| 32 | #include <map>
|
| 33 | #include <memory>
|
| 34 | #include <stdexcept>
|
| 35 | #include <string>
|
| 36 |
|
| 37 | namespace souffle {
|
| 38 |
|
| 39 | class IOSystem {
|
| 40 | public:
|
| 41 | static IOSystem& getInstance() {
|
| 42 | static IOSystem singleton;
|
| 43 | return singleton;
|
| 44 | }
|
| 45 |
|
| 46 | void registerWriteStreamFactory(const std::shared_ptr<WriteStreamFactory>& factory) {
|
| 47 | outputFactories[factory->getName()] = factory;
|
| 48 | }
|
| 49 |
|
| 50 | void registerReadStreamFactory(const std::shared_ptr<ReadStreamFactory>& factory) {
|
| 51 | inputFactories[factory->getName()] = factory;
|
| 52 | }
|
| 53 |
|
| 54 | /**
|
| 55 | * Return a new WriteStream
|
| 56 | */
|
| 57 | Own<WriteStream> getWriter(const std::map<std::string, std::string>& rwOperation,
|
| 58 | const SymbolTable& symbolTable, const RecordTable& recordTable) const {
|
| 59 | std::string ioType = rwOperation.at("IO");
|
| 60 | if (outputFactories.count(ioType) == 0) {
|
| 61 | throw std::invalid_argument("Requested output type <" + ioType + "> is not supported.");
|
| 62 | }
|
| 63 | return outputFactories.at(ioType)->getWriter(rwOperation, symbolTable, recordTable);
|
| 64 | }
|
| 65 | /**
|
| 66 | * Return a new ReadStream
|
| 67 | */
|
| 68 | Own<ReadStream> getReader(const std::map<std::string, std::string>& rwOperation, SymbolTable& symbolTable,
|
| 69 | RecordTable& recordTable) const {
|
| 70 | std::string ioType = rwOperation.at("IO");
|
| 71 | if (inputFactories.count(ioType) == 0) {
|
| 72 | throw std::invalid_argument("Requested input type <" + ioType + "> is not supported.");
|
| 73 | }
|
| 74 | return inputFactories.at(ioType)->getReader(rwOperation, symbolTable, recordTable);
|
| 75 | }
|
| 76 | ~IOSystem() = default;
|
| 77 |
|
| 78 | private:
|
| 79 | IOSystem() {
|
| 80 | registerReadStreamFactory(std::make_shared<ReadFileCSVFactory>());
|
| 81 | registerReadStreamFactory(std::make_shared<ReadCinCSVFactory>());
|
| 82 | registerReadStreamFactory(std::make_shared<ReadFileJSONFactory>());
|
| 83 | registerReadStreamFactory(std::make_shared<ReadCinJSONFactory>());
|
| 84 | registerWriteStreamFactory(std::make_shared<WriteFileCSVFactory>());
|
| 85 | registerWriteStreamFactory(std::make_shared<WriteCoutCSVFactory>());
|
| 86 | registerWriteStreamFactory(std::make_shared<WriteCoutPrintSizeFactory>());
|
| 87 | registerWriteStreamFactory(std::make_shared<WriteFileJSONFactory>());
|
| 88 | registerWriteStreamFactory(std::make_shared<WriteCoutJSONFactory>());
|
| 89 | #ifdef USE_SQLITE
|
| 90 | registerReadStreamFactory(std::make_shared<ReadSQLiteFactory>());
|
| 91 | registerWriteStreamFactory(std::make_shared<WriteSQLiteFactory>());
|
| 92 | #endif
|
| 93 | };
|
| 94 | std::map<std::string, std::shared_ptr<WriteStreamFactory>> outputFactories;
|
| 95 | std::map<std::string, std::shared_ptr<ReadStreamFactory>> inputFactories;
|
| 96 | };
|
| 97 |
|
| 98 | } /* namespace souffle */
|