src/SqlHandler.h
branchv_0
changeset 5 cbc7817a3346
parent 4 925b15fb5c63
child 6 32b4293307f4
equal deleted inserted replaced
4:925b15fb5c63 5:cbc7817a3346
    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 }