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 */
|