equal
deleted
inserted
replaced
20 #include <memory> |
20 #include <memory> |
21 #include <string> |
21 #include <string> |
22 #include <vector> |
22 #include <vector> |
23 #include <locale> |
23 #include <locale> |
24 #include <codecvt> |
24 #include <codecvt> |
|
25 #include <unistd.h> |
25 |
26 |
26 #include <sqlite3.h> |
27 #include <sqlite3.h> |
27 |
28 |
28 #include <relpipe/reader/typedefs.h> |
29 #include <relpipe/reader/typedefs.h> |
29 #include <relpipe/reader/TypeId.h> |
30 #include <relpipe/reader/TypeId.h> |
98 sqlite3* db; |
99 sqlite3* db; |
99 public: |
100 public: |
100 |
101 |
101 Connection(const char* filename) { |
102 Connection(const char* filename) { |
102 int result = sqlite3_open(filename, &db); |
103 int result = sqlite3_open(filename, &db); |
103 if (result != SQLITE_OK) throw SqlException(L"Unable to open SQLite database."); |
104 if (result != SQLITE_OK) { |
|
105 sqlite3_close(db); |
|
106 throw SqlException(L"Unable to open SQLite database."); |
|
107 } |
104 } |
108 } |
105 |
109 |
106 virtual ~Connection() { |
110 virtual ~Connection() { |
107 sqlite3_close(db); |
111 sqlite3_close(db); |
108 } |
112 } |
132 for (int i = 0; i < parameterCount; i++) { |
136 for (int i = 0; i < parameterCount; i++) { |
133 prepared.setString(i + 1, convertor.to_bytes(statement.parameters[i].value)); |
137 prepared.setString(i + 1, convertor.to_bytes(statement.parameters[i].value)); |
134 } |
138 } |
135 |
139 |
136 std::vector<relpipe::writer::AttributeMetadata> metadata; |
140 std::vector<relpipe::writer::AttributeMetadata> metadata; |
|
141 // TODO: support also other data types |
137 for (int i = 0; i < columnCount; i++) metadata.push_back({convertor.from_bytes(prepared.getColumName(i).c_str()), relpipe::writer::TypeId::STRING}); |
142 for (int i = 0; i < columnCount; i++) metadata.push_back({convertor.from_bytes(prepared.getColumName(i).c_str()), relpipe::writer::TypeId::STRING}); |
138 relationalWriter->startRelation(statement.relation, metadata, true); |
143 relationalWriter->startRelation(statement.relation, metadata, true); |
139 |
144 |
140 while (prepared.next()) { |
145 while (prepared.next()) { |
141 for (int i = 0; i < columnCount; i++) { |
146 for (int i = 0; i < columnCount; i++) { |
145 } |
150 } |
146 |
151 |
147 public: |
152 public: |
148 |
153 |
149 SqlHandler(writer::RelationalWriter* relationalWriter, Configuration& configuration) : relationalWriter(relationalWriter), configuration(configuration) { |
154 SqlHandler(writer::RelationalWriter* relationalWriter, Configuration& configuration) : relationalWriter(relationalWriter), configuration(configuration) { |
150 connection.reset(new Connection(":memory:")); |
155 std::string file = configuration.file.size() ? convertor.to_bytes(configuration.file) : ":memory:"; |
|
156 connection.reset(new Connection(file.c_str())); |
151 } |
157 } |
152 |
158 |
153 virtual ~SqlHandler() { |
159 virtual ~SqlHandler() { |
154 } |
160 } |
155 |
161 |
161 |
167 |
162 } |
168 } |
163 |
169 |
164 void endOfPipe() { |
170 void endOfPipe() { |
165 for (const Statement& statement : configuration.statements) processStatement(statement); |
171 for (const Statement& statement : configuration.statements) processStatement(statement); |
|
172 |
|
173 if (configuration.file.size() && !configuration.keepFile) { |
|
174 int result = unlink(convertor.to_bytes(configuration.file).c_str()); |
|
175 if (result) throw SqlException(L"Unable to delete SQLite file."); |
|
176 } |
166 } |
177 } |
167 |
178 |
168 }; |
179 }; |
169 |
180 |
170 } |
181 } |