--- a/src/SqlHandler.h Tue Jul 30 15:51:35 2019 +0200
+++ b/src/SqlHandler.h Tue Jul 30 17:06:41 2019 +0200
@@ -22,6 +22,7 @@
#include <vector>
#include <locale>
#include <codecvt>
+#include <unistd.h>
#include <sqlite3.h>
@@ -100,7 +101,10 @@
Connection(const char* filename) {
int result = sqlite3_open(filename, &db);
- if (result != SQLITE_OK) throw SqlException(L"Unable to open SQLite database.");
+ if (result != SQLITE_OK) {
+ sqlite3_close(db);
+ throw SqlException(L"Unable to open SQLite database.");
+ }
}
virtual ~Connection() {
@@ -134,6 +138,7 @@
}
std::vector<relpipe::writer::AttributeMetadata> metadata;
+ // TODO: support also other data types
for (int i = 0; i < columnCount; i++) metadata.push_back({convertor.from_bytes(prepared.getColumName(i).c_str()), relpipe::writer::TypeId::STRING});
relationalWriter->startRelation(statement.relation, metadata, true);
@@ -147,7 +152,8 @@
public:
SqlHandler(writer::RelationalWriter* relationalWriter, Configuration& configuration) : relationalWriter(relationalWriter), configuration(configuration) {
- connection.reset(new Connection(":memory:"));
+ std::string file = configuration.file.size() ? convertor.to_bytes(configuration.file) : ":memory:";
+ connection.reset(new Connection(file.c_str()));
}
virtual ~SqlHandler() {
@@ -163,6 +169,11 @@
void endOfPipe() {
for (const Statement& statement : configuration.statements) processStatement(statement);
+
+ if (configuration.file.size() && !configuration.keepFile) {
+ int result = unlink(convertor.to_bytes(configuration.file).c_str());
+ if (result) throw SqlException(L"Unable to delete SQLite file.");
+ }
}
};