@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 CHANGED
@@ -1,13 +1,21 @@
1
1
  ![benchmark](benchmark.png)
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
- # Docs
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.
@@ -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
  }
@@ -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
- opsqlite_execute(name, query, &params, &results, metadata);
42
+ opsqlite_execute_host_objects(name, query, &params, &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<DumbHostObject>(results->at(0))));
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", 4) {
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", 2) {
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", 0) {
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", 1) {
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 execute = HOSTFN("execute", 2) {
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
- std::vector<DumbHostObject> results;
321
- std::shared_ptr<std::vector<SmartHostObject>> metadata =
322
- std::make_shared<std::vector<SmartHostObject>>();
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
- auto status =
326
- opsqlite_libsql_execute(db_name, query, &params, &results, metadata);
330
+ auto status =
331
+ opsqlite_libsql_execute_raw(db_name, query, &params, &results);
327
332
  #else
328
- auto status = opsqlite_execute(db_name, query, &params, &results, metadata);
333
+ auto status = opsqlite_execute_raw(db_name, query, &params, &results);
329
334
  #endif
330
335
 
331
- if (status.type == SQLiteError) {
332
- throw std::runtime_error(status.message);
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
- auto jsiResult = createResult(rt, status, &results, metadata);
336
- return jsiResult;
366
+ return promise;
337
367
  });
338
368
 
339
- auto execute_raw_async = HOSTFN("executeRawAsync", 2) {
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
- const jsi::Value &originalParams = args[1];
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
- auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor", 2) {
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, &params, &results);
387
+ auto status = opsqlite_libsql_execute(db_name, query, &params);
361
388
  #else
362
- auto status = opsqlite_execute_raw(db_name, query, &params, &results);
389
+ auto status = opsqlite_execute(db_name, query, &params);
363
390
  #endif
364
- //
391
+
365
392
  // if (invalidated) {
366
393
  // return;
367
394
  // }
368
395
 
369
- invoker->invokeAsync([&rt, results = std::move(results),
370
- status = std::move(status), resolve, reject] {
396
+ invoker->invokeAsync([&rt, status = std::move(status), resolve,
397
+ reject] {
371
398
  if (status.type == SQLiteOk) {
372
- auto jsiResult = create_raw_result(rt, status, &results);
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
- invoker->invokeAsync([&rt, exc = std::move(exc), reject] {
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, exc.what()));
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
- return promise;
427
+ return promise;
399
428
  });
400
429
 
401
- auto execute_async = HOSTFN("executeAsync", 2) {
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", 2) {
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 = opsqlite_libsql_execute(db_name, query, &params,
423
- &results, metadata);
451
+ auto status = opsqlite_libsql_execute_with_host_objects(
452
+ db_name, query, &params, &results, metadata);
424
453
  #else
425
- auto status =
426
- opsqlite_execute(db_name, query, &params, &results, metadata);
454
+ auto status = opsqlite_execute_host_objects(db_name, query, &params,
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
- invoker->invokeAsync([&rt, exc = std::move(exc), reject] {
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, exc.what()));
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", 1) {
470
- if (sizeof(args) < 1) {
471
- throw std::runtime_error(
472
- "[op-sqlite][executeBatch] - Incorrect parameter count");
473
- }
474
-
475
- const jsi::Value &params = 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", 2) {
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
- jsCallInvoker->invokeAsync(
551
- [&rt, reject, &exc] { throw jsi::JSError(rt, exc.what()); });
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", 0) {
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
- #endif
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", 2)
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 importResult = importSQLFile(db_name, sqlFileName);
594
+ const auto result = importSQLFile(db_name, sqlFileName);
591
595
 
592
- jsCallInvoker->invokeAsync([&rt, result = std::move(importResult),
593
- resolve, reject] {
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
- jsCallInvoker->invokeAsync(
609
- [&rt, err = exc.what(), reject] { throw jsi::JSError(rt, err); });
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", 1) {
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", 1) {
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", 1) {
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", 1) {
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", 0) {
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", 0) {
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", 1) {
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>(db_name, statement);
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", 1) {
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["executeAsync"] = std::move(execute_async);
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 == "executeRawAsync") {
845
- return jsi::Value(rt, function_map["executeRawAsync"]);
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 == "executeAsync") {
851
- return jsi::Value(rt, function_map["executeAsync"]);
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", 0) {
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", 0) {
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", 0) {
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", 0) {
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", 0) {
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", 0) {
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", 1) {
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", 1) {
44
+ return HOSTFN("execute") {
45
45
  if (_stmt == nullptr) {
46
46
  throw std::runtime_error("statement has been freed");
47
47
  }
48
48
 
49
- std::vector<DumbHostObject> results;
50
- std::shared_ptr<std::vector<SmartHostObject>> metadata =
51
- std::make_shared<std::vector<SmartHostObject>>();
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
- auto status = opsqlite_libsql_execute_prepared_statement(
54
- _name, _stmt, &results, metadata);
60
+ auto status = opsqlite_libsql_execute_prepared_statement(
61
+ _name, _stmt, &results, metadata);
55
62
  #else
56
- auto status =
57
- opsqlite_execute_prepared_statement(_name, _stmt, &results, metadata);
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
- if (status.type == SQLiteError) {
61
- throw std::runtime_error(status.message);
62
- }
85
+ _thread_pool->queueWork(task);
86
+
87
+ return {};
88
+ }));
63
89
 
64
- auto jsiResult = createResult(rt, status, &results, metadata);
65
- return jsiResult;
90
+ return promise;
66
91
  });
67
92
  }
68
93