@op-engineering/op-sqlite 7.4.3 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/android/build.gradle +8 -0
- package/cpp/DBHostObject.cpp +118 -112
- package/cpp/PreparedStatementHostObject.cpp +39 -14
- package/cpp/PreparedStatementHostObject.h +17 -4
- package/cpp/bindings.cpp +5 -5
- package/cpp/bridge.cpp +221 -98
- package/cpp/bridge.h +11 -9
- package/cpp/libsql/bridge.cpp +212 -92
- package/cpp/libsql/bridge.h +7 -3
- package/cpp/macros.h +2 -2
- package/cpp/types.h +11 -8
- package/cpp/utils.cpp +43 -7
- package/cpp/utils.h +2 -0
- package/lib/commonjs/index.js +53 -30
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +53 -29
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +11 -11
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +80 -46
package/README.md
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
|
-
**Current SQLite version: 3.45.1**
|
|
4
|
-
|
|
5
3
|
Created by [@ospfranco](https://twitter.com/ospfranco). **Please consider sponsoring!**.
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
OP-SQLite has grown large to cover a lot of plugins, sqlite versions and APIs. Please read the full documentation before opening an issue.
|
|
8
6
|
|
|
9
7
|
[See the docs](https://ospfranco.notion.site/OP-SQLite-Documentation-a279a52102464d0cb13c3fa230d2f2dc?pvs=4)
|
|
10
8
|
|
|
9
|
+
Some of the big and external (back-ends, out-of-tree features, plugins) supported features:
|
|
10
|
+
|
|
11
|
+
- Vanilla sqlite ofc
|
|
12
|
+
- Libsql is supported as a sqlite backend
|
|
13
|
+
- SQLCipher is supported as a sqlite backend
|
|
14
|
+
- FTS5 plugin
|
|
15
|
+
- cr-sqlite plugin
|
|
16
|
+
- sqlite-vec plugin
|
|
17
|
+
- Reactive queries (currently with some issues, please donate)
|
|
18
|
+
|
|
11
19
|
# License
|
|
12
20
|
|
|
13
21
|
MIT License.
|
package/android/build.gradle
CHANGED
|
@@ -225,4 +225,12 @@ tasks.whenTaskAdded { task ->
|
|
|
225
225
|
task.dependsOn(it)
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (isNewArchitectureEnabled()) {
|
|
231
|
+
react {
|
|
232
|
+
jsRootDir = file("../src/")
|
|
233
|
+
libraryName = "opsqlite"
|
|
234
|
+
codegenJavaPackageName = "com.op.sqlite.example"
|
|
235
|
+
}
|
|
228
236
|
}
|
package/cpp/DBHostObject.cpp
CHANGED
|
@@ -39,7 +39,7 @@ void DBHostObject::auto_register_update_hook() {
|
|
|
39
39
|
if (operation != "DELETE") {
|
|
40
40
|
std::string query = "SELECT * FROM " + table_name +
|
|
41
41
|
" where rowid = " + std::to_string(rowId) + ";";
|
|
42
|
-
|
|
42
|
+
opsqlite_execute_host_objects(name, query, ¶ms, &results, metadata);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
jsCallInvoker->invokeAsync(
|
|
@@ -57,7 +57,7 @@ void DBHostObject::auto_register_update_hook() {
|
|
|
57
57
|
res.setProperty(
|
|
58
58
|
rt, "row",
|
|
59
59
|
jsi::Object::createFromHostObject(
|
|
60
|
-
rt, std::make_shared<
|
|
60
|
+
rt, std::make_shared<HostObject>(results->at(0))));
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
callback->asObject(rt).asFunction(rt).call(rt, res);
|
|
@@ -194,7 +194,7 @@ DBHostObject::DBHostObject(jsi::Runtime &rt, std::string &base_path,
|
|
|
194
194
|
};
|
|
195
195
|
|
|
196
196
|
void DBHostObject::create_jsi_functions() {
|
|
197
|
-
auto attach = HOSTFN("attach"
|
|
197
|
+
auto attach = HOSTFN("attach") {
|
|
198
198
|
if (count < 3) {
|
|
199
199
|
throw jsi::JSError(rt,
|
|
200
200
|
"[op-sqlite][attach] Incorrect number of arguments");
|
|
@@ -232,7 +232,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
232
232
|
return {};
|
|
233
233
|
});
|
|
234
234
|
|
|
235
|
-
auto detach = HOSTFN("detach"
|
|
235
|
+
auto detach = HOSTFN("detach") {
|
|
236
236
|
if (count < 2) {
|
|
237
237
|
throw std::runtime_error(
|
|
238
238
|
"[op-sqlite][detach] Incorrect number of arguments");
|
|
@@ -258,7 +258,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
258
258
|
return {};
|
|
259
259
|
});
|
|
260
260
|
|
|
261
|
-
auto close = HOSTFN("close"
|
|
261
|
+
auto close = HOSTFN("close") {
|
|
262
262
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
263
263
|
BridgeResult result = opsqlite_libsql_close(db_name);
|
|
264
264
|
#else
|
|
@@ -272,8 +272,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
272
272
|
return {};
|
|
273
273
|
});
|
|
274
274
|
|
|
275
|
-
auto remove = HOSTFN("delete"
|
|
276
|
-
|
|
275
|
+
auto remove = HOSTFN("delete") {
|
|
277
276
|
std::string path = std::string(base_path);
|
|
278
277
|
|
|
279
278
|
if (count == 1 && !args[0].isUndefined() && !args[0].isNull()) {
|
|
@@ -308,7 +307,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
308
307
|
return {};
|
|
309
308
|
});
|
|
310
309
|
|
|
311
|
-
auto
|
|
310
|
+
auto execute_raw = HOSTFN("executeRaw") {
|
|
312
311
|
const std::string query = args[0].asString(rt).utf8(rt);
|
|
313
312
|
std::vector<JSVariant> params;
|
|
314
313
|
|
|
@@ -317,59 +316,87 @@ void DBHostObject::create_jsi_functions() {
|
|
|
317
316
|
params = to_variant_vec(rt, originalParams);
|
|
318
317
|
}
|
|
319
318
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
319
|
+
auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise");
|
|
320
|
+
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor") {
|
|
321
|
+
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
|
|
322
|
+
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
|
|
323
|
+
|
|
324
|
+
auto task = [&rt, this, query, params = std::move(params), resolve,
|
|
325
|
+
reject, invoker = this->jsCallInvoker]() {
|
|
326
|
+
try {
|
|
327
|
+
std::vector<std::vector<JSVariant>> results;
|
|
323
328
|
|
|
324
329
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
325
|
-
|
|
326
|
-
|
|
330
|
+
auto status =
|
|
331
|
+
opsqlite_libsql_execute_raw(db_name, query, ¶ms, &results);
|
|
327
332
|
#else
|
|
328
|
-
|
|
333
|
+
auto status = opsqlite_execute_raw(db_name, query, ¶ms, &results);
|
|
329
334
|
#endif
|
|
330
335
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
336
|
+
invoker->invokeAsync([&rt, results = std::move(results),
|
|
337
|
+
status = std::move(status), resolve, reject] {
|
|
338
|
+
if (status.type == SQLiteOk) {
|
|
339
|
+
auto jsiResult = create_raw_result(rt, status, &results);
|
|
340
|
+
resolve->asObject(rt).asFunction(rt).call(rt,
|
|
341
|
+
std::move(jsiResult));
|
|
342
|
+
} else {
|
|
343
|
+
auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error");
|
|
344
|
+
auto error = errorCtr.callAsConstructor(
|
|
345
|
+
rt, jsi::String::createFromUtf8(rt, status.message));
|
|
346
|
+
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
} catch (std::exception &exc) {
|
|
351
|
+
auto what = exc.what();
|
|
352
|
+
invoker->invokeAsync([&rt, what = std::move(what), reject] {
|
|
353
|
+
auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error");
|
|
354
|
+
auto error = errorCtr.callAsConstructor(
|
|
355
|
+
rt, jsi::String::createFromAscii(rt, what));
|
|
356
|
+
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
thread_pool->queueWork(task);
|
|
362
|
+
|
|
363
|
+
return {};
|
|
364
|
+
}));
|
|
334
365
|
|
|
335
|
-
|
|
336
|
-
return jsiResult;
|
|
366
|
+
return promise;
|
|
337
367
|
});
|
|
338
368
|
|
|
339
|
-
auto
|
|
369
|
+
auto execute = HOSTFN("execute") {
|
|
340
370
|
const std::string query = args[0].asString(rt).utf8(rt);
|
|
341
371
|
std::vector<JSVariant> params;
|
|
342
372
|
|
|
343
373
|
if (count == 2) {
|
|
344
|
-
|
|
345
|
-
params = to_variant_vec(rt, originalParams);
|
|
374
|
+
params = to_variant_vec(rt, args[1]);
|
|
346
375
|
}
|
|
347
376
|
|
|
348
377
|
auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise");
|
|
349
|
-
|
|
378
|
+
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor") {
|
|
350
379
|
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
|
|
351
380
|
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
|
|
352
381
|
|
|
353
382
|
auto task = [&rt, this, query, params = std::move(params), resolve,
|
|
354
383
|
reject, invoker = this->jsCallInvoker]() {
|
|
355
384
|
try {
|
|
356
|
-
std::vector<std::vector<JSVariant>> results;
|
|
357
385
|
|
|
358
386
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
359
|
-
auto status =
|
|
360
|
-
opsqlite_libsql_execute_raw(db_name, query, ¶ms, &results);
|
|
387
|
+
auto status = opsqlite_libsql_execute(db_name, query, ¶ms);
|
|
361
388
|
#else
|
|
362
|
-
auto status =
|
|
389
|
+
auto status = opsqlite_execute(db_name, query, ¶ms);
|
|
363
390
|
#endif
|
|
364
|
-
|
|
391
|
+
|
|
365
392
|
// if (invalidated) {
|
|
366
393
|
// return;
|
|
367
394
|
// }
|
|
368
395
|
|
|
369
|
-
invoker->invokeAsync([&rt,
|
|
370
|
-
|
|
396
|
+
invoker->invokeAsync([&rt, status = std::move(status), resolve,
|
|
397
|
+
reject] {
|
|
371
398
|
if (status.type == SQLiteOk) {
|
|
372
|
-
auto jsiResult =
|
|
399
|
+
auto jsiResult = create_js_rows(rt, status);
|
|
373
400
|
resolve->asObject(rt).asFunction(rt).call(rt,
|
|
374
401
|
std::move(jsiResult));
|
|
375
402
|
} else {
|
|
@@ -381,10 +408,12 @@ void DBHostObject::create_jsi_functions() {
|
|
|
381
408
|
});
|
|
382
409
|
|
|
383
410
|
} catch (std::exception &exc) {
|
|
384
|
-
|
|
411
|
+
auto what = exc.what();
|
|
412
|
+
invoker->invokeAsync([&rt, what = std::move(what), reject] {
|
|
385
413
|
auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error");
|
|
414
|
+
|
|
386
415
|
auto error = errorCtr.callAsConstructor(
|
|
387
|
-
rt, jsi::String::createFromAscii(rt,
|
|
416
|
+
rt, jsi::String::createFromAscii(rt, what));
|
|
388
417
|
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
389
418
|
});
|
|
390
419
|
}
|
|
@@ -393,12 +422,12 @@ void DBHostObject::create_jsi_functions() {
|
|
|
393
422
|
thread_pool->queueWork(task);
|
|
394
423
|
|
|
395
424
|
return {};
|
|
396
|
-
|
|
425
|
+
}));
|
|
397
426
|
|
|
398
|
-
|
|
427
|
+
return promise;
|
|
399
428
|
});
|
|
400
429
|
|
|
401
|
-
auto
|
|
430
|
+
auto execute_with_host_objects = HOSTFN("executeWithHostObjects") {
|
|
402
431
|
const std::string query = args[0].asString(rt).utf8(rt);
|
|
403
432
|
std::vector<JSVariant> params;
|
|
404
433
|
|
|
@@ -408,7 +437,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
408
437
|
}
|
|
409
438
|
|
|
410
439
|
auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise");
|
|
411
|
-
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor"
|
|
440
|
+
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor") {
|
|
412
441
|
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
|
|
413
442
|
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
|
|
414
443
|
|
|
@@ -419,11 +448,11 @@ void DBHostObject::create_jsi_functions() {
|
|
|
419
448
|
std::shared_ptr<std::vector<SmartHostObject>> metadata =
|
|
420
449
|
std::make_shared<std::vector<SmartHostObject>>();
|
|
421
450
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
422
|
-
auto status =
|
|
423
|
-
|
|
451
|
+
auto status = opsqlite_libsql_execute_with_host_objects(
|
|
452
|
+
db_name, query, ¶ms, &results, metadata);
|
|
424
453
|
#else
|
|
425
|
-
auto status =
|
|
426
|
-
|
|
454
|
+
auto status = opsqlite_execute_host_objects(db_name, query, ¶ms,
|
|
455
|
+
&results, metadata);
|
|
427
456
|
#endif
|
|
428
457
|
|
|
429
458
|
// if (invalidated) {
|
|
@@ -449,10 +478,11 @@ void DBHostObject::create_jsi_functions() {
|
|
|
449
478
|
});
|
|
450
479
|
|
|
451
480
|
} catch (std::exception &exc) {
|
|
452
|
-
|
|
481
|
+
auto what = exc.what();
|
|
482
|
+
invoker->invokeAsync([&rt, what = std::move(what), reject] {
|
|
453
483
|
auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error");
|
|
454
484
|
auto error = errorCtr.callAsConstructor(
|
|
455
|
-
rt, jsi::String::createFromAscii(rt,
|
|
485
|
+
rt, jsi::String::createFromAscii(rt, what));
|
|
456
486
|
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
457
487
|
});
|
|
458
488
|
}
|
|
@@ -466,36 +496,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
466
496
|
return promise;
|
|
467
497
|
});
|
|
468
498
|
|
|
469
|
-
auto execute_batch = HOSTFN("executeBatch"
|
|
470
|
-
if (sizeof(args) < 1) {
|
|
471
|
-
throw std::runtime_error(
|
|
472
|
-
"[op-sqlite][executeBatch] - Incorrect parameter count");
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
const jsi::Value ¶ms = args[0];
|
|
476
|
-
if (params.isNull() || params.isUndefined()) {
|
|
477
|
-
throw std::runtime_error("[op-sqlite][executeBatch] - An array of SQL "
|
|
478
|
-
"commands or parameters is needed");
|
|
479
|
-
}
|
|
480
|
-
const jsi::Array &batchParams = params.asObject(rt).asArray(rt);
|
|
481
|
-
std::vector<BatchArguments> commands;
|
|
482
|
-
to_batch_arguments(rt, batchParams, &commands);
|
|
483
|
-
|
|
484
|
-
#ifdef OP_SQLITE_USE_LIBSQL
|
|
485
|
-
auto batchResult = opsqlite_libsql_execute_batch(db_name, &commands);
|
|
486
|
-
#else
|
|
487
|
-
auto batchResult = opsqlite_execute_batch(db_name, &commands);
|
|
488
|
-
#endif
|
|
489
|
-
if (batchResult.type == SQLiteOk) {
|
|
490
|
-
auto res = jsi::Object(rt);
|
|
491
|
-
res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows));
|
|
492
|
-
return std::move(res);
|
|
493
|
-
} else {
|
|
494
|
-
throw std::runtime_error(batchResult.message);
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
|
|
498
|
-
auto execute_batch_async = HOSTFN("executeBatchAsync", 1) {
|
|
499
|
+
auto execute_batch = HOSTFN("executeBatch") {
|
|
499
500
|
if (sizeof(args) < 1) {
|
|
500
501
|
throw std::runtime_error(
|
|
501
502
|
"[op-sqlite][executeAsyncBatch] Incorrect parameter count");
|
|
@@ -517,7 +518,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
517
518
|
to_batch_arguments(rt, batchParams, &commands);
|
|
518
519
|
|
|
519
520
|
auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise");
|
|
520
|
-
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor"
|
|
521
|
+
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor") {
|
|
521
522
|
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
|
|
522
523
|
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
|
|
523
524
|
|
|
@@ -547,8 +548,13 @@ void DBHostObject::create_jsi_functions() {
|
|
|
547
548
|
}
|
|
548
549
|
});
|
|
549
550
|
} catch (std::exception &exc) {
|
|
550
|
-
|
|
551
|
-
|
|
551
|
+
auto what = exc.what();
|
|
552
|
+
jsCallInvoker->invokeAsync([&rt, what = std::move(what), reject] {
|
|
553
|
+
auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error");
|
|
554
|
+
auto error = errorCtr.callAsConstructor(
|
|
555
|
+
rt, jsi::String::createFromAscii(rt, what));
|
|
556
|
+
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
557
|
+
});
|
|
552
558
|
}
|
|
553
559
|
};
|
|
554
560
|
thread_pool->queueWork(task);
|
|
@@ -560,17 +566,15 @@ void DBHostObject::create_jsi_functions() {
|
|
|
560
566
|
});
|
|
561
567
|
|
|
562
568
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
563
|
-
auto sync = HOSTFN("sync"
|
|
569
|
+
auto sync = HOSTFN("sync") {
|
|
564
570
|
BridgeResult result = opsqlite_libsql_sync(db_name);
|
|
565
571
|
if (result.type == SQLiteError) {
|
|
566
572
|
throw std::runtime_error(result.message);
|
|
567
573
|
}
|
|
568
574
|
return {};
|
|
569
575
|
});
|
|
570
|
-
#
|
|
571
|
-
|
|
572
|
-
#ifndef OP_SQLITE_USE_LIBSQL
|
|
573
|
-
auto load_file = HOSTFN("loadFile", 1) {
|
|
576
|
+
#else
|
|
577
|
+
auto load_file = HOSTFN("loadFile") {
|
|
574
578
|
if (sizeof(args) < 1) {
|
|
575
579
|
throw std::runtime_error(
|
|
576
580
|
"[op-sqlite][loadFile] Incorrect parameter count");
|
|
@@ -580,17 +584,17 @@ void DBHostObject::create_jsi_functions() {
|
|
|
580
584
|
const std::string sqlFileName = args[0].asString(rt).utf8(rt);
|
|
581
585
|
|
|
582
586
|
auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise");
|
|
583
|
-
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor"
|
|
587
|
+
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor")
|
|
584
588
|
{
|
|
585
589
|
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
|
|
586
590
|
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
|
|
587
591
|
|
|
588
592
|
auto task = [&rt, this, sqlFileName, resolve, reject]() {
|
|
589
593
|
try {
|
|
590
|
-
const auto
|
|
594
|
+
const auto result = importSQLFile(db_name, sqlFileName);
|
|
591
595
|
|
|
592
|
-
jsCallInvoker->invokeAsync([&rt, result = std::move(
|
|
593
|
-
|
|
596
|
+
jsCallInvoker->invokeAsync([&rt, result = std::move(result), resolve,
|
|
597
|
+
reject] {
|
|
594
598
|
if (result.type == SQLiteOk) {
|
|
595
599
|
auto res = jsi::Object(rt);
|
|
596
600
|
res.setProperty(rt, "rowsAffected",
|
|
@@ -605,8 +609,13 @@ void DBHostObject::create_jsi_functions() {
|
|
|
605
609
|
}
|
|
606
610
|
});
|
|
607
611
|
} catch (std::exception &exc) {
|
|
608
|
-
|
|
609
|
-
|
|
612
|
+
auto what = exc.what();
|
|
613
|
+
jsCallInvoker->invokeAsync([&rt, what = std::move(what), reject] {
|
|
614
|
+
auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error");
|
|
615
|
+
auto error = errorCtr.callAsConstructor(
|
|
616
|
+
rt, jsi::String::createFromAscii(rt, what));
|
|
617
|
+
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
618
|
+
});
|
|
610
619
|
}
|
|
611
620
|
};
|
|
612
621
|
thread_pool->queueWork(task);
|
|
@@ -616,7 +625,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
616
625
|
return promise;
|
|
617
626
|
});
|
|
618
627
|
|
|
619
|
-
auto update_hook = HOSTFN("updateHook"
|
|
628
|
+
auto update_hook = HOSTFN("updateHook") {
|
|
620
629
|
auto callback = std::make_shared<jsi::Value>(rt, args[0]);
|
|
621
630
|
|
|
622
631
|
if (callback->isUndefined() || callback->isNull()) {
|
|
@@ -628,7 +637,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
628
637
|
return {};
|
|
629
638
|
});
|
|
630
639
|
|
|
631
|
-
auto commit_hook = HOSTFN("commitHook"
|
|
640
|
+
auto commit_hook = HOSTFN("commitHook") {
|
|
632
641
|
if (sizeof(args) < 1) {
|
|
633
642
|
throw std::runtime_error("[op-sqlite][commitHook] callback needed");
|
|
634
643
|
return {};
|
|
@@ -651,7 +660,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
651
660
|
return {};
|
|
652
661
|
});
|
|
653
662
|
|
|
654
|
-
auto rollback_hook = HOSTFN("rollbackHook"
|
|
663
|
+
auto rollback_hook = HOSTFN("rollbackHook") {
|
|
655
664
|
if (sizeof(args) < 1) {
|
|
656
665
|
throw std::runtime_error("[op-sqlite][rollbackHook] callback needed");
|
|
657
666
|
return {};
|
|
@@ -674,7 +683,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
674
683
|
return {};
|
|
675
684
|
});
|
|
676
685
|
|
|
677
|
-
auto load_extension = HOSTFN("loadExtension"
|
|
686
|
+
auto load_extension = HOSTFN("loadExtension") {
|
|
678
687
|
auto path = args[0].asString(rt).utf8(rt);
|
|
679
688
|
std::string entry_point = "";
|
|
680
689
|
if (count > 1 && args[1].isString()) {
|
|
@@ -688,7 +697,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
688
697
|
return {};
|
|
689
698
|
});
|
|
690
699
|
|
|
691
|
-
auto reactive_execute = HOSTFN("reactiveExecute"
|
|
700
|
+
auto reactive_execute = HOSTFN("reactiveExecute") {
|
|
692
701
|
auto query = args[0].asObject(rt);
|
|
693
702
|
// if (!query.hasProperty(rt, "query") || !query.hasProperty(rt, "args")
|
|
694
703
|
// ||
|
|
@@ -748,7 +757,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
748
757
|
|
|
749
758
|
auto_register_update_hook();
|
|
750
759
|
|
|
751
|
-
auto unsubscribe = HOSTFN("unsubscribe"
|
|
760
|
+
auto unsubscribe = HOSTFN("unsubscribe") {
|
|
752
761
|
auto it = std::find(reactive_queries.begin(), reactive_queries.end(),
|
|
753
762
|
reactiveQuery);
|
|
754
763
|
if (it != reactive_queries.end()) {
|
|
@@ -763,7 +772,7 @@ void DBHostObject::create_jsi_functions() {
|
|
|
763
772
|
|
|
764
773
|
#endif
|
|
765
774
|
|
|
766
|
-
auto prepare_statement = HOSTFN("prepareStatement"
|
|
775
|
+
auto prepare_statement = HOSTFN("prepareStatement") {
|
|
767
776
|
auto query = args[0].asString(rt).utf8(rt);
|
|
768
777
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
769
778
|
libsql_stmt_t statement = opsqlite_libsql_prepare_statement(db_name, query);
|
|
@@ -771,12 +780,13 @@ void DBHostObject::create_jsi_functions() {
|
|
|
771
780
|
sqlite3_stmt *statement = opsqlite_prepare_statement(db_name, query);
|
|
772
781
|
#endif
|
|
773
782
|
auto preparedStatementHostObject =
|
|
774
|
-
std::make_shared<PreparedStatementHostObject>(
|
|
783
|
+
std::make_shared<PreparedStatementHostObject>(
|
|
784
|
+
db_name, statement, jsCallInvoker, thread_pool);
|
|
775
785
|
|
|
776
786
|
return jsi::Object::createFromHostObject(rt, preparedStatementHostObject);
|
|
777
787
|
});
|
|
778
788
|
|
|
779
|
-
auto get_db_path = HOSTFN("getDbPath"
|
|
789
|
+
auto get_db_path = HOSTFN("getDbPath") {
|
|
780
790
|
std::string path = std::string(base_path);
|
|
781
791
|
if (count == 1 && !args[0].isUndefined() && !args[0].isNull()) {
|
|
782
792
|
if (!args[0].isString()) {
|
|
@@ -802,12 +812,11 @@ void DBHostObject::create_jsi_functions() {
|
|
|
802
812
|
function_map["attach"] = std::move(attach);
|
|
803
813
|
function_map["detach"] = std::move(detach);
|
|
804
814
|
function_map["close"] = std::move(close);
|
|
805
|
-
function_map["executeRawAsync"] = std::move(execute_raw_async);
|
|
806
815
|
function_map["execute"] = std::move(execute);
|
|
807
|
-
function_map["
|
|
816
|
+
function_map["executeRaw"] = std::move(execute_raw);
|
|
817
|
+
function_map["executeWithHostObjects"] = std::move(execute_with_host_objects);
|
|
808
818
|
function_map["delete"] = std::move(remove);
|
|
809
819
|
function_map["executeBatch"] = std::move(execute_batch);
|
|
810
|
-
function_map["executeBatchAsync"] = std::move(execute_batch_async);
|
|
811
820
|
function_map["prepareStatement"] = std::move(prepare_statement);
|
|
812
821
|
function_map["getDbPath"] = std::move(get_db_path);
|
|
813
822
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
@@ -841,14 +850,14 @@ jsi::Value DBHostObject::get(jsi::Runtime &rt,
|
|
|
841
850
|
if (name == "close") {
|
|
842
851
|
return jsi::Value(rt, function_map["close"]);
|
|
843
852
|
}
|
|
844
|
-
if (name == "
|
|
845
|
-
return jsi::Value(rt, function_map["
|
|
853
|
+
if (name == "executeRaw") {
|
|
854
|
+
return jsi::Value(rt, function_map["executeRaw"]);
|
|
846
855
|
}
|
|
847
856
|
if (name == "execute") {
|
|
848
857
|
return jsi::Value(rt, function_map["execute"]);
|
|
849
858
|
}
|
|
850
|
-
if (name == "
|
|
851
|
-
return jsi::Value(rt, function_map["
|
|
859
|
+
if (name == "executeWithHostObjects") {
|
|
860
|
+
return jsi::Value(rt, function_map["executeWithHostObjects"]);
|
|
852
861
|
}
|
|
853
862
|
if (name == "delete") {
|
|
854
863
|
return jsi::Value(rt, function_map["delete"]);
|
|
@@ -856,9 +865,6 @@ jsi::Value DBHostObject::get(jsi::Runtime &rt,
|
|
|
856
865
|
if (name == "executeBatch") {
|
|
857
866
|
return jsi::Value(rt, function_map["executeBatch"]);
|
|
858
867
|
}
|
|
859
|
-
if (name == "executeBatchAsync") {
|
|
860
|
-
return jsi::Value(rt, function_map["executeBatchAsync"]);
|
|
861
|
-
}
|
|
862
868
|
if (name == "prepareStatement") {
|
|
863
869
|
return jsi::Value(rt, function_map["prepareStatement"]);
|
|
864
870
|
}
|
|
@@ -870,32 +876,32 @@ jsi::Value DBHostObject::get(jsi::Runtime &rt,
|
|
|
870
876
|
}
|
|
871
877
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
872
878
|
if (name == "loadFile") {
|
|
873
|
-
return HOSTFN("loadFile"
|
|
879
|
+
return HOSTFN("loadFile") {
|
|
874
880
|
throw std::runtime_error("[op-sqlite] Load file not implemented");
|
|
875
881
|
});
|
|
876
882
|
}
|
|
877
883
|
if (name == "updateHook") {
|
|
878
|
-
return HOSTFN("updateHook"
|
|
884
|
+
return HOSTFN("updateHook") {
|
|
879
885
|
throw std::runtime_error("[op-sqlite] Hooks not supported in libsql");
|
|
880
886
|
});
|
|
881
887
|
}
|
|
882
888
|
if (name == "commitHook") {
|
|
883
|
-
return HOSTFN("commitHook"
|
|
889
|
+
return HOSTFN("commitHook") {
|
|
884
890
|
throw std::runtime_error("[op-sqlite] Hooks not supported in libsql");
|
|
885
891
|
});
|
|
886
892
|
}
|
|
887
893
|
if (name == "rollbackHook") {
|
|
888
|
-
return HOSTFN("rollbackHook"
|
|
894
|
+
return HOSTFN("rollbackHook") {
|
|
889
895
|
throw std::runtime_error("[op-sqlite] Hooks not supported in libsql");
|
|
890
896
|
});
|
|
891
897
|
}
|
|
892
898
|
if (name == "loadExtension") {
|
|
893
|
-
return HOSTFN("loadExtension"
|
|
899
|
+
return HOSTFN("loadExtension") {
|
|
894
900
|
throw std::runtime_error("[op-sqlite] Hooks not supported in libsql");
|
|
895
901
|
});
|
|
896
902
|
}
|
|
897
903
|
if (name == "reactiveExecute") {
|
|
898
|
-
return HOSTFN("reactiveExecute"
|
|
904
|
+
return HOSTFN("reactiveExecute") {
|
|
899
905
|
throw std::runtime_error("[op-sqlite] Hooks not supported in libsql");
|
|
900
906
|
});
|
|
901
907
|
}
|
|
@@ -23,7 +23,7 @@ jsi::Value PreparedStatementHostObject::get(jsi::Runtime &rt,
|
|
|
23
23
|
auto name = propNameID.utf8(rt);
|
|
24
24
|
|
|
25
25
|
if (name == "bind") {
|
|
26
|
-
return HOSTFN("bind"
|
|
26
|
+
return HOSTFN("bind") {
|
|
27
27
|
if (_stmt == nullptr) {
|
|
28
28
|
throw std::runtime_error("statement has been freed");
|
|
29
29
|
}
|
|
@@ -41,28 +41,53 @@ jsi::Value PreparedStatementHostObject::get(jsi::Runtime &rt,
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (name == "execute") {
|
|
44
|
-
return HOSTFN("execute"
|
|
44
|
+
return HOSTFN("execute") {
|
|
45
45
|
if (_stmt == nullptr) {
|
|
46
46
|
throw std::runtime_error("statement has been freed");
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise");
|
|
50
|
+
auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor") {
|
|
51
|
+
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
|
|
52
|
+
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
|
|
53
|
+
|
|
54
|
+
auto task = [&rt, this, resolve, reject,
|
|
55
|
+
invoker = this->_js_call_invoker]() {
|
|
56
|
+
std::vector<DumbHostObject> results;
|
|
57
|
+
std::shared_ptr<std::vector<SmartHostObject>> metadata =
|
|
58
|
+
std::make_shared<std::vector<SmartHostObject>>();
|
|
52
59
|
#ifdef OP_SQLITE_USE_LIBSQL
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
auto status = opsqlite_libsql_execute_prepared_statement(
|
|
61
|
+
_name, _stmt, &results, metadata);
|
|
55
62
|
#else
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
auto status = opsqlite_execute_prepared_statement(_name, _stmt,
|
|
64
|
+
&results, metadata);
|
|
58
65
|
#endif
|
|
66
|
+
invoker->invokeAsync(
|
|
67
|
+
[&rt, status = std::move(status),
|
|
68
|
+
results = std::make_shared<std::vector<DumbHostObject>>(results),
|
|
69
|
+
metadata, resolve, reject] {
|
|
70
|
+
if (status.type == SQLiteOk) {
|
|
71
|
+
auto jsiResult =
|
|
72
|
+
createResult(rt, status, results.get(), metadata);
|
|
73
|
+
resolve->asObject(rt).asFunction(rt).call(
|
|
74
|
+
rt, std::move(jsiResult));
|
|
75
|
+
} else {
|
|
76
|
+
auto errorCtr =
|
|
77
|
+
rt.global().getPropertyAsFunction(rt, "Error");
|
|
78
|
+
auto error = errorCtr.callAsConstructor(
|
|
79
|
+
rt, jsi::String::createFromUtf8(rt, status.message));
|
|
80
|
+
reject->asObject(rt).asFunction(rt).call(rt, error);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
};
|
|
59
84
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
85
|
+
_thread_pool->queueWork(task);
|
|
86
|
+
|
|
87
|
+
return {};
|
|
88
|
+
}));
|
|
63
89
|
|
|
64
|
-
|
|
65
|
-
return jsiResult;
|
|
90
|
+
return promise;
|
|
66
91
|
});
|
|
67
92
|
}
|
|
68
93
|
|