src/SqlHandler.h
branchv_0
changeset 5 cbc7817a3346
parent 4 925b15fb5c63
child 6 32b4293307f4
--- 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.");
+		}
 	}
 
 };