|
14 | 14 | #include <vector> |
15 | 15 | #include <iostream> |
16 | 16 | #include <thread> |
| 17 | +#include <iostream> |
| 18 | +#include <fstream> |
17 | 19 |
|
18 | 20 | using namespace std; |
19 | 21 | using namespace facebook; |
@@ -177,6 +179,58 @@ void installSequel(jsi::Runtime &rt, const char *docPath) |
177 | 179 | return move(result.value); |
178 | 180 | }); |
179 | 181 |
|
| 182 | + auto loadSQLFile = jsi::Function::createFromHostFunction( |
| 183 | + rt, |
| 184 | + jsi::PropNameID::forAscii(rt, "sequel_loadSQLFile"), |
| 185 | + 2, |
| 186 | + [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value |
| 187 | + { |
| 188 | + const string dbName = args[0].asString(rt).utf8(rt); |
| 189 | + const string sqlFileName = args[1].asString(rt).utf8(rt); |
| 190 | + |
| 191 | + string line; |
| 192 | + ifstream sqFile (sqlFileName); |
| 193 | + if (sqFile.is_open()) |
| 194 | + { |
| 195 | + try { |
| 196 | + int affectedRows = 0; |
| 197 | + int commands = 0; |
| 198 | + sequel_execute_literal_update(dbName, "BEGIN TRANSACTION"); |
| 199 | + while ( std::getline (sqFile, line, '\n') ) |
| 200 | + { |
| 201 | + if (!line.empty()) { |
| 202 | + SequelLiteralUpdateResult result = sequel_execute_literal_update(dbName, line); |
| 203 | + if( result.type == SequelResultError ) { |
| 204 | + sequel_execute_literal_update(dbName, "ROLLBACK"); |
| 205 | + auto res = jsi::Object(rt); |
| 206 | + res.setProperty(rt, "status", jsi::Value(1)); |
| 207 | + res.setProperty(rt, "message", jsi::String::createFromUtf8(rt, result.message.c_str())); |
| 208 | + sqFile.close(); |
| 209 | + return move(res); |
| 210 | + } else { |
| 211 | + affectedRows += result.affectedRows; |
| 212 | + commands++; |
| 213 | + } |
| 214 | + } |
| 215 | + } |
| 216 | + sqFile.close(); |
| 217 | + sequel_execute_literal_update(dbName, "COMMIT"); |
| 218 | + auto res = jsi::Object(rt); |
| 219 | + res.setProperty(rt, "status", jsi::Value(0)); |
| 220 | + res.setProperty(rt, "rowsAffected", jsi::Value(affectedRows)); |
| 221 | + res.setProperty(rt, "commands", jsi::Value(commands)); |
| 222 | + return move(res); |
| 223 | + } catch (...) { |
| 224 | + sequel_execute_literal_update(dbName, "ROLLBACK"); |
| 225 | + jsi::detail::throwJSError(rt, "Unexpected error, transaction was rolledback"); |
| 226 | + return {}; |
| 227 | + } |
| 228 | + } else { |
| 229 | + jsi::detail::throwJSError(rt, "Unable to open file"); |
| 230 | + return {}; |
| 231 | + } |
| 232 | + }); |
| 233 | + |
180 | 234 | // Async Execute SQL |
181 | 235 | // auto asyncExecSQL = jsi::Function::createFromHostFunction( |
182 | 236 | // rt, |
@@ -220,6 +274,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) |
220 | 274 | module.setProperty(rt, "delete", move(remove)); |
221 | 275 |
|
222 | 276 | module.setProperty(rt, "executeSql", move(execSQL)); |
| 277 | + module.setProperty(rt, "loadSqlFile", move(loadSQLFile)); |
223 | 278 | // module.setProperty(rt, "backgroundExecuteSql", move(asyncExecSQL)); |
224 | 279 |
|
225 | 280 | rt.global().setProperty(rt, "sqlite", move(module)); |
|
0 commit comments