@op-engineering/op-sqlite 1.0.12 → 1.0.14
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 +58 -11
- package/android/src/main/java/com/op/sqlite/OPSQLiteBridge.java +0 -3
- package/cpp/bindings.cpp +71 -0
- package/cpp/bridge.cpp +194 -38
- package/cpp/bridge.h +9 -2
- package/ios/OPSQLite.mm +0 -3
- package/lib/commonjs/index.js +3 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +8 -4
- package/op-sqlite.podspec +1 -1
- package/package.json +1 -1
- package/src/index.ts +10 -4
package/README.md
CHANGED
|
@@ -43,9 +43,9 @@ const largeDb = open({
|
|
|
43
43
|
|
|
44
44
|
Note that on iOS the file system is sand-boxed, so you cannot access files/directories outside your app bundle directories.
|
|
45
45
|
|
|
46
|
-
## In
|
|
46
|
+
## In-memory
|
|
47
47
|
|
|
48
|
-
Using SQLite in
|
|
48
|
+
Using SQLite in-memory mode is supported:
|
|
49
49
|
|
|
50
50
|
```ts
|
|
51
51
|
import { open } from '@op-engineering/op-sqlite';
|
|
@@ -69,15 +69,22 @@ db = {
|
|
|
69
69
|
delete: () => void,
|
|
70
70
|
attach: (dbNameToAttach: string, alias: string, location?: string) => void,
|
|
71
71
|
detach: (alias: string) => void,
|
|
72
|
-
transaction: (fn: (tx: Transaction) => void) => Promise<void>,
|
|
72
|
+
transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>,
|
|
73
73
|
execute: (query: string, params?: any[]) => QueryResult,
|
|
74
|
-
executeAsync: (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
) => Promise<
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
74
|
+
executeAsync: (query: string, params?: any[]) => Promise<QueryResult>,
|
|
75
|
+
executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult,
|
|
76
|
+
executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>,
|
|
77
|
+
loadFile: (location: string) => Promise<FileLoadResult>,
|
|
78
|
+
updateHook: (
|
|
79
|
+
callback: ((params: {
|
|
80
|
+
table: string;
|
|
81
|
+
operation: UpdateHookOperation;
|
|
82
|
+
row?: any;
|
|
83
|
+
rowId: number;
|
|
84
|
+
}) => void) | null
|
|
85
|
+
) => void,
|
|
86
|
+
commitHook: (callback: (() => void) | null) => void,
|
|
87
|
+
rollbackHook: (callback: (() => void) | null) => void
|
|
81
88
|
}
|
|
82
89
|
```
|
|
83
90
|
|
|
@@ -281,7 +288,7 @@ const { rowsAffected, commands } = db
|
|
|
281
288
|
});
|
|
282
289
|
```
|
|
283
290
|
|
|
284
|
-
##
|
|
291
|
+
## Hooks
|
|
285
292
|
|
|
286
293
|
You can subscribe to changes in your database by using an update hook:
|
|
287
294
|
|
|
@@ -303,6 +310,46 @@ db.execute('INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', [
|
|
|
303
310
|
]);
|
|
304
311
|
```
|
|
305
312
|
|
|
313
|
+
Same goes for commit and rollback hooks
|
|
314
|
+
|
|
315
|
+
```ts
|
|
316
|
+
// will fire whenever a transaction commits
|
|
317
|
+
db.commitHook(() => {
|
|
318
|
+
console.log('Transaction commmitted!');
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
db.rollbackHook(() => {
|
|
322
|
+
console.log('Transaction rolled back!');
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// will fire the commit hook
|
|
326
|
+
db.transaction(async (tx) => {
|
|
327
|
+
tx.execute(
|
|
328
|
+
'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)',
|
|
329
|
+
[id, name, age, networth]
|
|
330
|
+
);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// will fire the rollback hook
|
|
334
|
+
try {
|
|
335
|
+
await db.transaction(async (tx) => {
|
|
336
|
+
throw new Error('Test Error');
|
|
337
|
+
});
|
|
338
|
+
} catch (e) {
|
|
339
|
+
// intentionally left blank
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
You can pass `null`` to remove hooks at any moment:
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
db.updateHook(null);
|
|
347
|
+
|
|
348
|
+
db.commitHook(null);
|
|
349
|
+
|
|
350
|
+
db.rollbackHook(null);
|
|
351
|
+
```
|
|
352
|
+
|
|
306
353
|
## Use built-in SQLite
|
|
307
354
|
|
|
308
355
|
On iOS you can use the embedded SQLite, when running `pod-install` add an environment flag:
|
package/cpp/bindings.cpp
CHANGED
|
@@ -19,6 +19,8 @@ std::string basePath;
|
|
|
19
19
|
std::shared_ptr<react::CallInvoker> invoker;
|
|
20
20
|
ThreadPool pool;
|
|
21
21
|
std::unordered_map<std::string, std::shared_ptr<jsi::Value>> updateHooks = std::unordered_map<std::string, std::shared_ptr<jsi::Value>>();
|
|
22
|
+
std::unordered_map<std::string, std::shared_ptr<jsi::Value>> commitHooks = std::unordered_map<std::string, std::shared_ptr<jsi::Value>>();
|
|
23
|
+
std::unordered_map<std::string, std::shared_ptr<jsi::Value>> rollbackHooks = std::unordered_map<std::string, std::shared_ptr<jsi::Value>>();
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
// React native will try to clean the module on JS context invalidation (CodePush/Hot Reload)
|
|
@@ -447,6 +449,13 @@ void install(jsi::Runtime &rt, std::shared_ptr<react::CallInvoker> jsCallInvoker
|
|
|
447
449
|
|
|
448
450
|
auto dbName = args[0].asString(rt).utf8(rt);
|
|
449
451
|
auto callback = std::make_shared<jsi::Value>(rt, args[1]);
|
|
452
|
+
|
|
453
|
+
if (callback->isUndefined() || callback->isNull())
|
|
454
|
+
{
|
|
455
|
+
unregisterUpdateHook(dbName);
|
|
456
|
+
return {};
|
|
457
|
+
}
|
|
458
|
+
|
|
450
459
|
updateHooks[dbName] = callback;
|
|
451
460
|
|
|
452
461
|
auto hook = [&rt, callback](std::string dbName, std::string tableName, std::string operation, int rowId) {
|
|
@@ -479,6 +488,66 @@ void install(jsi::Runtime &rt, std::shared_ptr<react::CallInvoker> jsCallInvoker
|
|
|
479
488
|
return {};
|
|
480
489
|
});
|
|
481
490
|
|
|
491
|
+
auto commitHook = HOSTFN("commitHook", 2)
|
|
492
|
+
{
|
|
493
|
+
if (sizeof(args) < 2)
|
|
494
|
+
{
|
|
495
|
+
throw jsi::JSError(rt, "[op-sqlite][loadFileAsync] Incorrect parameters: dbName and callback needed");
|
|
496
|
+
return {};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
auto dbName = args[0].asString(rt).utf8(rt);
|
|
500
|
+
auto callback = std::make_shared<jsi::Value>(rt, args[1]);
|
|
501
|
+
if (callback->isUndefined() || callback->isNull())
|
|
502
|
+
{
|
|
503
|
+
unregisterCommitHook(dbName);
|
|
504
|
+
return {};
|
|
505
|
+
}
|
|
506
|
+
commitHooks[dbName] = callback;
|
|
507
|
+
|
|
508
|
+
auto hook = [&rt, callback](std::string dbName) {
|
|
509
|
+
invoker->invokeAsync([&rt, callback]
|
|
510
|
+
{
|
|
511
|
+
callback->asObject(rt).asFunction(rt).call(rt);
|
|
512
|
+
});
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
registerCommitHook(dbName, std::move(hook));
|
|
516
|
+
|
|
517
|
+
return {};
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
auto rollbackHook = HOSTFN("rollbackHook", 2)
|
|
521
|
+
{
|
|
522
|
+
if (sizeof(args) < 2)
|
|
523
|
+
{
|
|
524
|
+
throw jsi::JSError(rt, "[op-sqlite][loadFileAsync] Incorrect parameters: dbName and callback needed");
|
|
525
|
+
return {};
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
auto dbName = args[0].asString(rt).utf8(rt);
|
|
529
|
+
auto callback = std::make_shared<jsi::Value>(rt, args[1]);
|
|
530
|
+
|
|
531
|
+
if (callback->isUndefined() || callback->isNull())
|
|
532
|
+
{
|
|
533
|
+
unregisterRollbackHook(dbName);
|
|
534
|
+
return {};
|
|
535
|
+
}
|
|
536
|
+
rollbackHooks[dbName] = callback;
|
|
537
|
+
|
|
538
|
+
auto hook = [&rt, callback](std::string dbName) {
|
|
539
|
+
|
|
540
|
+
invoker->invokeAsync([&rt, callback] {
|
|
541
|
+
callback->asObject(rt).asFunction(rt).call(rt);
|
|
542
|
+
|
|
543
|
+
});
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
registerRollbackHook(dbName, std::move(hook));
|
|
547
|
+
|
|
548
|
+
return {};
|
|
549
|
+
});
|
|
550
|
+
|
|
482
551
|
jsi::Object module = jsi::Object(rt);
|
|
483
552
|
|
|
484
553
|
module.setProperty(rt, "open", std::move(open));
|
|
@@ -492,6 +561,8 @@ void install(jsi::Runtime &rt, std::shared_ptr<react::CallInvoker> jsCallInvoker
|
|
|
492
561
|
module.setProperty(rt, "executeBatchAsync", std::move(executeBatchAsync));
|
|
493
562
|
module.setProperty(rt, "loadFile", std::move(loadFile));
|
|
494
563
|
module.setProperty(rt, "updateHook", std::move(updateHook));
|
|
564
|
+
module.setProperty(rt, "commitHook", std::move(commitHook));
|
|
565
|
+
module.setProperty(rt, "rollbackHook", std::move(rollbackHook));
|
|
495
566
|
|
|
496
567
|
rt.global().setProperty(rt, "__OPSQLiteProxy", std::move(module));
|
|
497
568
|
}
|
package/cpp/bridge.cpp
CHANGED
|
@@ -16,10 +16,20 @@ namespace opsqlite {
|
|
|
16
16
|
std::unordered_map<std::string, sqlite3 *> dbMap = std::unordered_map<std::string, sqlite3 *>();
|
|
17
17
|
std::unordered_map<
|
|
18
18
|
std::string,
|
|
19
|
-
std::function<void (std::string dbName, std::string tableName, std::string operation, int rowId)>>
|
|
19
|
+
std::function<void (std::string dbName, std::string tableName, std::string operation, int rowId)>> updateCallbackMap =
|
|
20
20
|
std::unordered_map<
|
|
21
21
|
std::string,
|
|
22
22
|
std::function<void (std::string dbName, std::string tableName, std::string operation, int rowId)>>();
|
|
23
|
+
|
|
24
|
+
std::unordered_map<
|
|
25
|
+
std::string,
|
|
26
|
+
std::function<void (std::string dbName)>> commitCallbackMap =
|
|
27
|
+
std::unordered_map<std::string, std::function<void (std::string dbName)>>();
|
|
28
|
+
|
|
29
|
+
std::unordered_map<
|
|
30
|
+
std::string,
|
|
31
|
+
std::function<void (std::string dbName)>> rollbackCallbackMap =
|
|
32
|
+
std::unordered_map<std::string, std::function<void (std::string dbName)>>();
|
|
23
33
|
|
|
24
34
|
bool folder_exists(const std::string &foldername)
|
|
25
35
|
{
|
|
@@ -357,27 +367,30 @@ namespace opsqlite {
|
|
|
357
367
|
}
|
|
358
368
|
i++;
|
|
359
369
|
}
|
|
360
|
-
results
|
|
370
|
+
if (results != nullptr) {
|
|
371
|
+
results->push_back(row);
|
|
372
|
+
}
|
|
361
373
|
break;
|
|
362
374
|
}
|
|
363
375
|
|
|
364
376
|
case SQLITE_DONE:
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
while (i < count)
|
|
369
|
-
{
|
|
370
|
-
column_name = sqlite3_column_name(statement, i);
|
|
371
|
-
const char *type = sqlite3_column_decltype(statement, i);
|
|
372
|
-
auto metadata = DynamicHostObject();
|
|
373
|
-
metadata.fields.push_back(std::make_pair("name", column_name));
|
|
374
|
-
metadata.fields.push_back(std::make_pair("index", i));
|
|
375
|
-
metadata.fields.push_back(std::make_pair("type", type));
|
|
377
|
+
if (metadatas != nullptr) {
|
|
378
|
+
i = 0;
|
|
379
|
+
count = sqlite3_column_count(statement);
|
|
376
380
|
|
|
377
|
-
|
|
378
|
-
|
|
381
|
+
while (i < count)
|
|
382
|
+
{
|
|
383
|
+
column_name = sqlite3_column_name(statement, i);
|
|
384
|
+
const char *type = sqlite3_column_decltype(statement, i);
|
|
385
|
+
auto metadata = DynamicHostObject();
|
|
386
|
+
metadata.fields.push_back(std::make_pair("name", column_name));
|
|
387
|
+
metadata.fields.push_back(std::make_pair("index", i));
|
|
388
|
+
metadata.fields.push_back(std::make_pair("type", type == NULL ? "UNKNOWN" : type));
|
|
389
|
+
|
|
390
|
+
metadatas->push_back(metadata);
|
|
391
|
+
i++;
|
|
392
|
+
}
|
|
379
393
|
}
|
|
380
|
-
|
|
381
394
|
isConsuming = false;
|
|
382
395
|
break;
|
|
383
396
|
|
|
@@ -490,32 +503,34 @@ namespace opsqlite {
|
|
|
490
503
|
dbMap.clear();
|
|
491
504
|
}
|
|
492
505
|
|
|
493
|
-
std::string operationToString(int operation_type) {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
case SQLITE_DELETE:
|
|
499
|
-
return "DELETE";
|
|
500
|
-
|
|
501
|
-
case SQLITE_UPDATE:
|
|
502
|
-
return "UPDATE";
|
|
506
|
+
std::string operationToString(int operation_type) {
|
|
507
|
+
switch (operation_type) {
|
|
508
|
+
case SQLITE_INSERT:
|
|
509
|
+
return "INSERT";
|
|
503
510
|
|
|
504
|
-
|
|
505
|
-
|
|
511
|
+
case SQLITE_DELETE:
|
|
512
|
+
return "DELETE";
|
|
513
|
+
|
|
514
|
+
case SQLITE_UPDATE:
|
|
515
|
+
return "UPDATE";
|
|
516
|
+
|
|
517
|
+
default:
|
|
518
|
+
throw std::invalid_argument("Uknown SQLite operation on hook");
|
|
519
|
+
}
|
|
506
520
|
}
|
|
507
|
-
}
|
|
508
521
|
|
|
509
|
-
void update_callback
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
522
|
+
void update_callback(void *dbName,
|
|
523
|
+
int operation_type,
|
|
524
|
+
char const *database,
|
|
525
|
+
char const *table,
|
|
526
|
+
sqlite3_int64 rowid) {
|
|
527
|
+
std::string &strDbName = *(static_cast<std::string*>(dbName));
|
|
528
|
+
auto callback = updateCallbackMap[strDbName];
|
|
529
|
+
callback(strDbName, std::string(table), operationToString(operation_type), static_cast<int>(rowid));
|
|
516
530
|
}
|
|
517
531
|
|
|
518
|
-
BridgeResult registerUpdateHook(std::string const dbName,
|
|
532
|
+
BridgeResult registerUpdateHook(std::string const dbName,
|
|
533
|
+
std::function<void (std::string dbName, std::string tableName, std::string operation, int rowId)> const callback) {
|
|
519
534
|
if (dbMap.count(dbName) == 0)
|
|
520
535
|
{
|
|
521
536
|
return {
|
|
@@ -525,7 +540,7 @@ void update_callback ( void *dbName, int operation_type,
|
|
|
525
540
|
}
|
|
526
541
|
|
|
527
542
|
sqlite3 *db = dbMap[dbName];
|
|
528
|
-
|
|
543
|
+
updateCallbackMap[dbName] = callback;
|
|
529
544
|
const std::string *key = nullptr;
|
|
530
545
|
|
|
531
546
|
// TODO find a more elegant way to retrieve a reference to the key
|
|
@@ -544,4 +559,145 @@ void update_callback ( void *dbName, int operation_type,
|
|
|
544
559
|
SQLiteOk
|
|
545
560
|
};
|
|
546
561
|
}
|
|
562
|
+
|
|
563
|
+
BridgeResult unregisterUpdateHook(std::string const dbName) {
|
|
564
|
+
if (dbMap.count(dbName) == 0)
|
|
565
|
+
{
|
|
566
|
+
return {
|
|
567
|
+
SQLiteError,
|
|
568
|
+
"[op-sqlite] Database not opened: " + dbName
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
sqlite3 *db = dbMap[dbName];
|
|
573
|
+
updateCallbackMap.erase(dbName);
|
|
574
|
+
|
|
575
|
+
sqlite3_update_hook(
|
|
576
|
+
db,
|
|
577
|
+
NULL,
|
|
578
|
+
NULL);
|
|
579
|
+
|
|
580
|
+
return {
|
|
581
|
+
SQLiteOk
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
int commit_callback(void *dbName) {
|
|
586
|
+
std::string &strDbName = *(static_cast<std::string*>(dbName));
|
|
587
|
+
auto callback = commitCallbackMap[strDbName];
|
|
588
|
+
callback(strDbName);
|
|
589
|
+
// You need to return 0 to allow commits to continue
|
|
590
|
+
return 0;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
BridgeResult registerCommitHook(std::string const dbName,
|
|
594
|
+
std::function<void (std::string dbName)> const callback) {
|
|
595
|
+
if (dbMap.count(dbName) == 0)
|
|
596
|
+
{
|
|
597
|
+
return {
|
|
598
|
+
SQLiteError,
|
|
599
|
+
"[op-sqlite] Database not opened: " + dbName
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
sqlite3 *db = dbMap[dbName];
|
|
604
|
+
commitCallbackMap[dbName] = callback;
|
|
605
|
+
const std::string *key = nullptr;
|
|
606
|
+
|
|
607
|
+
// TODO find a more elegant way to retrieve a reference to the key
|
|
608
|
+
for (auto const& element : dbMap) {
|
|
609
|
+
if(element.first == dbName) {
|
|
610
|
+
key = &element.first;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
sqlite3_commit_hook(
|
|
615
|
+
db,
|
|
616
|
+
&commit_callback,
|
|
617
|
+
(void *)key);
|
|
618
|
+
|
|
619
|
+
return {
|
|
620
|
+
SQLiteOk
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
BridgeResult unregisterCommitHook(std::string const dbName) {
|
|
625
|
+
if (dbMap.count(dbName) == 0)
|
|
626
|
+
{
|
|
627
|
+
return {
|
|
628
|
+
SQLiteError,
|
|
629
|
+
"[op-sqlite] Database not opened: " + dbName
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
sqlite3 *db = dbMap[dbName];
|
|
634
|
+
commitCallbackMap.erase(dbName);
|
|
635
|
+
sqlite3_commit_hook(
|
|
636
|
+
db,
|
|
637
|
+
NULL,
|
|
638
|
+
NULL);
|
|
639
|
+
|
|
640
|
+
return {
|
|
641
|
+
SQLiteOk
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
void rollback_callback(void *dbName) {
|
|
646
|
+
std::string &strDbName = *(static_cast<std::string*>(dbName));
|
|
647
|
+
auto callback = rollbackCallbackMap[strDbName];
|
|
648
|
+
callback(strDbName);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
BridgeResult registerRollbackHook(std::string const dbName,
|
|
652
|
+
std::function<void (std::string dbName)> const callback) {
|
|
653
|
+
if (dbMap.count(dbName) == 0)
|
|
654
|
+
{
|
|
655
|
+
return {
|
|
656
|
+
SQLiteError,
|
|
657
|
+
"[op-sqlite] Database not opened: " + dbName
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
sqlite3 *db = dbMap[dbName];
|
|
662
|
+
rollbackCallbackMap[dbName] = callback;
|
|
663
|
+
const std::string *key = nullptr;
|
|
664
|
+
|
|
665
|
+
// TODO find a more elegant way to retrieve a reference to the key
|
|
666
|
+
for (auto const& element : dbMap) {
|
|
667
|
+
if(element.first == dbName) {
|
|
668
|
+
key = &element.first;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
sqlite3_rollback_hook(
|
|
673
|
+
db,
|
|
674
|
+
&rollback_callback,
|
|
675
|
+
(void *)key);
|
|
676
|
+
|
|
677
|
+
return {
|
|
678
|
+
SQLiteOk
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
BridgeResult unregisterRollbackHook(std::string const dbName) {
|
|
683
|
+
if (dbMap.count(dbName) == 0)
|
|
684
|
+
{
|
|
685
|
+
return {
|
|
686
|
+
SQLiteError,
|
|
687
|
+
"[op-sqlite] Database not opened: " + dbName
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
sqlite3 *db = dbMap[dbName];
|
|
692
|
+
rollbackCallbackMap.erase(dbName);
|
|
693
|
+
|
|
694
|
+
sqlite3_rollback_hook(
|
|
695
|
+
db,
|
|
696
|
+
NULL,
|
|
697
|
+
NULL);
|
|
698
|
+
|
|
699
|
+
return {
|
|
700
|
+
SQLiteOk
|
|
701
|
+
};
|
|
702
|
+
}
|
|
547
703
|
}
|
package/cpp/bridge.h
CHANGED
|
@@ -31,8 +31,15 @@ BridgeResult sqliteExecuteLiteral(std::string const dbName, std::string const &q
|
|
|
31
31
|
|
|
32
32
|
void sqliteCloseAll();
|
|
33
33
|
|
|
34
|
-
BridgeResult registerUpdateHook(std::string const dbName,
|
|
35
|
-
|
|
34
|
+
BridgeResult registerUpdateHook(std::string const dbName,
|
|
35
|
+
std::function<void (std::string dbName, std::string tableName, std::string operation, int rowId)> const callback);
|
|
36
|
+
BridgeResult unregisterUpdateHook(std::string const dbName);
|
|
37
|
+
BridgeResult registerCommitHook(std::string const dbName,
|
|
38
|
+
std::function<void (std::string dbName)> const callback);
|
|
39
|
+
BridgeResult unregisterCommitHook(std::string const dbName);
|
|
40
|
+
BridgeResult registerRollbackHook(std::string const dbName,
|
|
41
|
+
std::function<void (std::string dbName)> const callback);
|
|
42
|
+
BridgeResult unregisterRollbackHook(std::string const dbName);
|
|
36
43
|
}
|
|
37
44
|
|
|
38
45
|
#endif /* bridge_h */
|
package/ios/OPSQLite.mm
CHANGED
package/lib/commonjs/index.js
CHANGED
|
@@ -205,7 +205,9 @@ const open = options => {
|
|
|
205
205
|
executeBatch: commands => OPSQLite.executeBatch(options.name, commands),
|
|
206
206
|
executeBatchAsync: commands => OPSQLite.executeBatchAsync(options.name, commands),
|
|
207
207
|
loadFile: location => OPSQLite.loadFile(options.name, location),
|
|
208
|
-
updateHook: callback => OPSQLite.updateHook(options.name, callback)
|
|
208
|
+
updateHook: callback => OPSQLite.updateHook(options.name, callback),
|
|
209
|
+
commitHook: callback => OPSQLite.commitHook(options.name, callback),
|
|
210
|
+
rollbackHook: callback => OPSQLite.rollbackHook(options.name, callback)
|
|
209
211
|
};
|
|
210
212
|
};
|
|
211
213
|
exports.open = open;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["global","__OPSQLiteProxy","OPSQLiteModule","NativeModules","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","sanitizedParams","map","p","ArrayBuffer","isView","buffer","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile","updateHook","callback"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\nexport type UpdateHookOperation = 'INSERT' | 'DELETE' | 'UPDATE';\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n updateHook: (\n dbName: string,\n callback: (params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void\n ) => void;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nfunction enhanceQueryResult(result: QueryResult): void {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows?._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows?._array[idx];\n }\n}\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location, !!inMemory);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const result = _execute(dbName, query, sanitizedParams);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const res = await _executeAsync(dbName, query, sanitizedParams);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n\n if (!tx) {\n throw new Error('Could not get a operation on datebase');\n }\n\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n updateHook: (\n callback: (params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void\n ) => void;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void>) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n updateHook: (callback) => OPSQLite.updateHook(options.name, callback),\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["global","__OPSQLiteProxy","OPSQLiteModule","NativeModules","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","sanitizedParams","map","p","ArrayBuffer","isView","buffer","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile","updateHook","callback","commitHook","rollbackHook"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\nexport type UpdateHookOperation = 'INSERT' | 'DELETE' | 'UPDATE';\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n updateHook: (\n dbName: string,\n callback?: ((params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void) | null\n ) => void;\n commitHook: (dbName: string, callback?: (() => void) | null) => void;\n rollbackHook: (dbName: string, callback?: (() => void) | null) => void;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nfunction enhanceQueryResult(result: QueryResult): void {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows?._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows?._array[idx];\n }\n}\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location, !!inMemory);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const result = _execute(dbName, query, sanitizedParams);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const res = await _executeAsync(dbName, query, sanitizedParams);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n\n if (!tx) {\n throw new Error('Could not get a operation on datebase');\n }\n\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n updateHook: (\n callback: ((params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void) | null\n ) => void;\n commitHook: (callback: (() => void) | null) => void;\n rollbackHook: (callback: (() => void) | null) => void;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void>) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n updateHook: (callback) => OPSQLite.updateHook(options.name, callback),\n commitHook: (callback) => OPSQLite.commitHook(options.name, callback),\n rollbackHook: (callback) => OPSQLite.rollbackHook(options.name, callback),\n };\n};\n"],"mappings":"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"}
|
package/lib/module/index.js
CHANGED
|
@@ -199,7 +199,9 @@ export const open = options => {
|
|
|
199
199
|
executeBatch: commands => OPSQLite.executeBatch(options.name, commands),
|
|
200
200
|
executeBatchAsync: commands => OPSQLite.executeBatchAsync(options.name, commands),
|
|
201
201
|
loadFile: location => OPSQLite.loadFile(options.name, location),
|
|
202
|
-
updateHook: callback => OPSQLite.updateHook(options.name, callback)
|
|
202
|
+
updateHook: callback => OPSQLite.updateHook(options.name, callback),
|
|
203
|
+
commitHook: callback => OPSQLite.commitHook(options.name, callback),
|
|
204
|
+
rollbackHook: callback => OPSQLite.rollbackHook(options.name, callback)
|
|
203
205
|
};
|
|
204
206
|
};
|
|
205
207
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","global","__OPSQLiteProxy","OPSQLiteModule","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","sanitizedParams","map","p","ArrayBuffer","isView","buffer","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile","updateHook","callback"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\nexport type UpdateHookOperation = 'INSERT' | 'DELETE' | 'UPDATE';\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n updateHook: (\n dbName: string,\n callback: (params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void\n ) => void;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nfunction enhanceQueryResult(result: QueryResult): void {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows?._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows?._array[idx];\n }\n}\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location, !!inMemory);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const result = _execute(dbName, query, sanitizedParams);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const res = await _executeAsync(dbName, query, sanitizedParams);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n\n if (!tx) {\n throw new Error('Could not get a operation on datebase');\n }\n\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n updateHook: (\n callback: (params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void\n ) => void;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void>) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n updateHook: (callback) => OPSQLite.updateHook(options.name, callback),\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["NativeModules","global","__OPSQLiteProxy","OPSQLiteModule","OPSQLite","Error","nativeCallSyncHook","install","result","proxy","locks","enhanceQueryResult","rows","_array","length","item","idx","_open","open","dbName","location","inMemory","queue","inProgress","_close","close","_execute","execute","query","params","sanitizedParams","map","p","ArrayBuffer","isView","buffer","_executeAsync","executeAsync","res","transaction","fn","isFinalized","commit","rollback","run","executionError","rollbackError","startNextTransaction","Promise","resolve","reject","tx","start","then","catch","push","shift","setImmediate","options","name","delete","attach","dbNameToAttach","alias","detach","executeBatch","commands","executeBatchAsync","loadFile","updateHook","callback","commitHook","rollbackHook"],"sources":["index.ts"],"sourcesContent":["import { NativeModules } from 'react-native';\n\ndeclare global {\n function nativeCallSyncHook(): unknown;\n var __OPSQLiteProxy: object | undefined;\n}\n\nif (global.__OPSQLiteProxy == null) {\n const OPSQLiteModule = NativeModules.OPSQLite;\n\n if (OPSQLiteModule == null) {\n throw new Error('Base module not found. Maybe try rebuilding the app.');\n }\n\n // Check if we are running on-device (JSI)\n if (global.nativeCallSyncHook == null || OPSQLiteModule.install == null) {\n throw new Error(\n 'Failed to install op-sqlite: React Native is not running on-device. OPSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.'\n );\n }\n\n // Call the synchronous blocking install() function\n const result = OPSQLiteModule.install();\n if (result !== true) {\n throw new Error(\n `Failed to install op-sqlite: The native OPSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}`\n );\n }\n\n // Check again if the constructor now exists. If not, throw an error.\n if (global.__OPSQLiteProxy == null) {\n throw new Error(\n 'Failed to install op-sqlite, the native initializer function does not exist. Are you trying to use OPSQLite from different JS Runtimes?'\n );\n }\n}\n\nconst proxy = global.__OPSQLiteProxy;\nexport const OPSQLite = proxy as ISQLite;\n\n/**\n * Object returned by SQL Query executions {\n * insertId: Represent the auto-generated row id if applicable\n * rowsAffected: Number of affected rows if result of a update query\n * message: if status === 1, here you will find error description\n * rows: if status is undefined or 0 this object will contain the query results\n * }\n *\n * @interface QueryResult\n */\nexport type QueryResult = {\n insertId?: number;\n rowsAffected: number;\n rows?: {\n /** Raw array with all dataset */\n _array: any[];\n /** The lengh of the dataset */\n length: number;\n /** A convenience function to acess the index based the row object\n * @param idx the row index\n * @returns the row structure identified by column names\n */\n item: (idx: number) => any;\n };\n /**\n * Query metadata, avaliable only for select query results\n */\n metadata?: ColumnMetadata[];\n};\n\n/**\n * Column metadata\n * Describes some information about columns fetched by the query\n */\nexport type ColumnMetadata = {\n /** The name used for this column for this resultset */\n name: string;\n /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. \"UNKNOWN\" for dynamic values, like function returned ones. */\n type: string;\n /**\n * The index for this column for this resultset*/\n index: number;\n};\n\n/**\n * Allows the execution of bulk of sql commands\n * inside a transaction\n * If a single query must be executed many times with different arguments, its preferred\n * to declare it a single time, and use an array of array parameters.\n */\nexport type SQLBatchTuple = [string] | [string, Array<any> | Array<Array<any>>];\n\nexport type UpdateHookOperation = 'INSERT' | 'DELETE' | 'UPDATE';\n\n/**\n * status: 0 or undefined for correct execution, 1 for error\n * message: if status === 1, here you will find error description\n * rowsAffected: Number of affected rows if status == 0\n */\nexport type BatchQueryResult = {\n rowsAffected?: number;\n};\n\n/**\n * Result of loading a file and executing every line as a SQL command\n * Similar to BatchQueryResult\n */\nexport interface FileLoadResult extends BatchQueryResult {\n commands?: number;\n}\n\nexport interface Transaction {\n commit: () => QueryResult;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ) => Promise<QueryResult>;\n rollback: () => QueryResult;\n}\n\nexport interface PendingTransaction {\n /*\n * The start function should not throw or return a promise because the\n * queue just calls it and does not monitor for failures or completions.\n *\n * It should catch any errors and call the resolve or reject of the wrapping\n * promise when complete.\n *\n * It should also automatically commit or rollback the transaction if needed\n */\n start: () => void;\n}\n\ninterface ISQLite {\n open: (dbName: string, location?: string, inMemory?: boolean) => void;\n close: (dbName: string) => void;\n delete: (dbName: string, location?: string) => void;\n attach: (\n mainDbName: string,\n dbNameToAttach: string,\n alias: string,\n location?: string\n ) => void;\n detach: (mainDbName: string, alias: string) => void;\n transaction: (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n ) => Promise<void>;\n execute: (dbName: string, query: string, params?: any[]) => QueryResult;\n executeAsync: (\n dbName: string,\n query: string,\n params?: any[]\n ) => Promise<QueryResult>;\n executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (\n dbName: string,\n commands: SQLBatchTuple[]\n ) => Promise<BatchQueryResult>;\n loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;\n updateHook: (\n dbName: string,\n callback?: ((params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void) | null\n ) => void;\n commitHook: (dbName: string, callback?: (() => void) | null) => void;\n rollbackHook: (dbName: string, callback?: (() => void) | null) => void;\n}\n\nconst locks: Record<\n string,\n { queue: PendingTransaction[]; inProgress: boolean }\n> = {};\n\n// Enhance some host functions\n\n// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\nfunction enhanceQueryResult(result: QueryResult): void {\n // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work\n if (result.rows == null) {\n result.rows = {\n _array: [],\n length: 0,\n item: (idx: number) => result.rows?._array[idx],\n };\n } else {\n result.rows.item = (idx: number) => result.rows?._array[idx];\n }\n}\n\nconst _open = OPSQLite.open;\nOPSQLite.open = (dbName: string, location?: string, inMemory?: boolean) => {\n _open(dbName, location, !!inMemory);\n\n locks[dbName] = {\n queue: [],\n inProgress: false,\n };\n};\n\nconst _close = OPSQLite.close;\nOPSQLite.close = (dbName: string) => {\n _close(dbName);\n delete locks[dbName];\n};\n\nconst _execute = OPSQLite.execute;\nOPSQLite.execute = (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): QueryResult => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const result = _execute(dbName, query, sanitizedParams);\n enhanceQueryResult(result);\n return result;\n};\n\nconst _executeAsync = OPSQLite.executeAsync;\nOPSQLite.executeAsync = async (\n dbName: string,\n query: string,\n params?: any[] | undefined\n): Promise<QueryResult> => {\n const sanitizedParams = params?.map((p) => {\n if (ArrayBuffer.isView(p)) {\n return p.buffer;\n }\n\n return p;\n });\n\n const res = await _executeAsync(dbName, query, sanitizedParams);\n enhanceQueryResult(res);\n return res;\n};\n\nOPSQLite.transaction = async (\n dbName: string,\n fn: (tx: Transaction) => Promise<void>\n): Promise<void> => {\n if (!locks[dbName]) {\n throw Error(`SQLite Error: No lock found on db: ${dbName}`);\n }\n\n let isFinalized = false;\n\n // Local transaction context object implementation\n const execute = (query: string, params?: any[]): QueryResult => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.execute(dbName, query, params);\n };\n\n const executeAsync = (query: string, params?: any[] | undefined) => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute query on finalized transaction: ${dbName}`\n );\n }\n return OPSQLite.executeAsync(dbName, query, params);\n };\n\n const commit = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute commit on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'COMMIT');\n isFinalized = true;\n return result;\n };\n\n const rollback = () => {\n if (isFinalized) {\n throw Error(\n `SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}`\n );\n }\n const result = OPSQLite.execute(dbName, 'ROLLBACK');\n isFinalized = true;\n return result;\n };\n\n async function run() {\n try {\n await OPSQLite.executeAsync(dbName, 'BEGIN TRANSACTION');\n\n await fn({\n commit,\n execute,\n executeAsync,\n rollback,\n });\n\n if (!isFinalized) {\n commit();\n }\n } catch (executionError) {\n if (!isFinalized) {\n try {\n rollback();\n } catch (rollbackError) {\n throw rollbackError;\n }\n }\n\n throw executionError;\n } finally {\n locks[dbName].inProgress = false;\n isFinalized = false;\n startNextTransaction(dbName);\n }\n }\n\n return await new Promise((resolve, reject) => {\n const tx: PendingTransaction = {\n start: () => {\n run().then(resolve).catch(reject);\n },\n };\n\n locks[dbName].queue.push(tx);\n startNextTransaction(dbName);\n });\n};\n\nconst startNextTransaction = (dbName: string) => {\n if (!locks[dbName]) {\n throw Error(`Lock not found for db: ${dbName}`);\n }\n\n if (locks[dbName].inProgress) {\n // Transaction is already in process bail out\n return;\n }\n\n if (locks[dbName].queue.length) {\n locks[dbName].inProgress = true;\n const tx = locks[dbName].queue.shift();\n\n if (!tx) {\n throw new Error('Could not get a operation on datebase');\n }\n\n setImmediate(() => {\n tx.start();\n });\n }\n};\n\nexport type OPSQLiteConnection = {\n close: () => void;\n delete: () => void;\n attach: (dbNameToAttach: string, alias: string, location?: string) => void;\n detach: (alias: string) => void;\n transaction: (fn: (tx: Transaction) => Promise<void>) => Promise<void>;\n execute: (query: string, params?: any[]) => QueryResult;\n executeAsync: (query: string, params?: any[]) => Promise<QueryResult>;\n executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;\n executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;\n loadFile: (location: string) => Promise<FileLoadResult>;\n updateHook: (\n callback: ((params: {\n table: string;\n operation: UpdateHookOperation;\n row?: any;\n rowId: number;\n }) => void) | null\n ) => void;\n commitHook: (callback: (() => void) | null) => void;\n rollbackHook: (callback: (() => void) | null) => void;\n};\n\nexport const open = (options: {\n name: string;\n location?: string;\n inMemory?: boolean;\n}): OPSQLiteConnection => {\n OPSQLite.open(options.name, options.location, options.inMemory);\n\n return {\n close: () => OPSQLite.close(options.name),\n delete: () => OPSQLite.delete(options.name, options.location),\n attach: (dbNameToAttach: string, alias: string, location?: string) =>\n OPSQLite.attach(options.name, dbNameToAttach, alias, location),\n detach: (alias: string) => OPSQLite.detach(options.name, alias),\n transaction: (fn: (tx: Transaction) => Promise<void>) =>\n OPSQLite.transaction(options.name, fn),\n execute: (query: string, params?: any[] | undefined): QueryResult =>\n OPSQLite.execute(options.name, query, params),\n executeAsync: (\n query: string,\n params?: any[] | undefined\n ): Promise<QueryResult> =>\n OPSQLite.executeAsync(options.name, query, params),\n executeBatch: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatch(options.name, commands),\n executeBatchAsync: (commands: SQLBatchTuple[]) =>\n OPSQLite.executeBatchAsync(options.name, commands),\n loadFile: (location: string) => OPSQLite.loadFile(options.name, location),\n updateHook: (callback) => OPSQLite.updateHook(options.name, callback),\n commitHook: (callback) => OPSQLite.commitHook(options.name, callback),\n rollbackHook: (callback) => OPSQLite.rollbackHook(options.name, callback),\n };\n};\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,cAAc;AAO5C,IAAIC,MAAM,CAACC,eAAe,IAAI,IAAI,EAAE;EAClC,MAAMC,cAAc,GAAGH,aAAa,CAACI,QAAQ;EAE7C,IAAID,cAAc,IAAI,IAAI,EAAE;IAC1B,MAAM,IAAIE,KAAK,CAAC,sDAAsD,CAAC;EACzE;;EAEA;EACA,IAAIJ,MAAM,CAACK,kBAAkB,IAAI,IAAI,IAAIH,cAAc,CAACI,OAAO,IAAI,IAAI,EAAE;IACvE,MAAM,IAAIF,KAAK,CACb,iQAAiQ,CAClQ;EACH;;EAEA;EACA,MAAMG,MAAM,GAAGL,cAAc,CAACI,OAAO,EAAE;EACvC,IAAIC,MAAM,KAAK,IAAI,EAAE;IACnB,MAAM,IAAIH,KAAK,CACZ,iJAAgJG,MAAO,EAAC,CAC1J;EACH;;EAEA;EACA,IAAIP,MAAM,CAACC,eAAe,IAAI,IAAI,EAAE;IAClC,MAAM,IAAIG,KAAK,CACb,yIAAyI,CAC1I;EACH;AACF;AAEA,MAAMI,KAAK,GAAGR,MAAM,CAACC,eAAe;AACpC,OAAO,MAAME,QAAQ,GAAGK,KAAgB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA6HA,MAAMC,KAGL,GAAG,CAAC,CAAC;;AAEN;;AAEA;AACA,SAASC,kBAAkB,CAACH,MAAmB,EAAQ;EACrD;EACA,IAAIA,MAAM,CAACI,IAAI,IAAI,IAAI,EAAE;IACvBJ,MAAM,CAACI,IAAI,GAAG;MACZC,MAAM,EAAE,EAAE;MACVC,MAAM,EAAE,CAAC;MACTC,IAAI,EAAGC,GAAW;QAAA;QAAA,uBAAKR,MAAM,CAACI,IAAI,iDAAX,aAAaC,MAAM,CAACG,GAAG,CAAC;MAAA;IACjD,CAAC;EACH,CAAC,MAAM;IACLR,MAAM,CAACI,IAAI,CAACG,IAAI,GAAIC,GAAW;MAAA;MAAA,wBAAKR,MAAM,CAACI,IAAI,kDAAX,cAAaC,MAAM,CAACG,GAAG,CAAC;IAAA;EAC9D;AACF;AAEA,MAAMC,KAAK,GAAGb,QAAQ,CAACc,IAAI;AAC3Bd,QAAQ,CAACc,IAAI,GAAG,CAACC,MAAc,EAAEC,QAAiB,EAAEC,QAAkB,KAAK;EACzEJ,KAAK,CAACE,MAAM,EAAEC,QAAQ,EAAE,CAAC,CAACC,QAAQ,CAAC;EAEnCX,KAAK,CAACS,MAAM,CAAC,GAAG;IACdG,KAAK,EAAE,EAAE;IACTC,UAAU,EAAE;EACd,CAAC;AACH,CAAC;AAED,MAAMC,MAAM,GAAGpB,QAAQ,CAACqB,KAAK;AAC7BrB,QAAQ,CAACqB,KAAK,GAAIN,MAAc,IAAK;EACnCK,MAAM,CAACL,MAAM,CAAC;EACd,OAAOT,KAAK,CAACS,MAAM,CAAC;AACtB,CAAC;AAED,MAAMO,QAAQ,GAAGtB,QAAQ,CAACuB,OAAO;AACjCvB,QAAQ,CAACuB,OAAO,GAAG,CACjBR,MAAc,EACdS,KAAa,EACbC,MAA0B,KACV;EAChB,MAAMC,eAAe,GAAGD,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEE,GAAG,CAAEC,CAAC,IAAK;IACzC,IAAIC,WAAW,CAACC,MAAM,CAACF,CAAC,CAAC,EAAE;MACzB,OAAOA,CAAC,CAACG,MAAM;IACjB;IAEA,OAAOH,CAAC;EACV,CAAC,CAAC;EAEF,MAAMxB,MAAM,GAAGkB,QAAQ,CAACP,MAAM,EAAES,KAAK,EAAEE,eAAe,CAAC;EACvDnB,kBAAkB,CAACH,MAAM,CAAC;EAC1B,OAAOA,MAAM;AACf,CAAC;AAED,MAAM4B,aAAa,GAAGhC,QAAQ,CAACiC,YAAY;AAC3CjC,QAAQ,CAACiC,YAAY,GAAG,OACtBlB,MAAc,EACdS,KAAa,EACbC,MAA0B,KACD;EACzB,MAAMC,eAAe,GAAGD,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEE,GAAG,CAAEC,CAAC,IAAK;IACzC,IAAIC,WAAW,CAACC,MAAM,CAACF,CAAC,CAAC,EAAE;MACzB,OAAOA,CAAC,CAACG,MAAM;IACjB;IAEA,OAAOH,CAAC;EACV,CAAC,CAAC;EAEF,MAAMM,GAAG,GAAG,MAAMF,aAAa,CAACjB,MAAM,EAAES,KAAK,EAAEE,eAAe,CAAC;EAC/DnB,kBAAkB,CAAC2B,GAAG,CAAC;EACvB,OAAOA,GAAG;AACZ,CAAC;AAEDlC,QAAQ,CAACmC,WAAW,GAAG,OACrBpB,MAAc,EACdqB,EAAsC,KACpB;EAClB,IAAI,CAAC9B,KAAK,CAACS,MAAM,CAAC,EAAE;IAClB,MAAMd,KAAK,CAAE,sCAAqCc,MAAO,EAAC,CAAC;EAC7D;EAEA,IAAIsB,WAAW,GAAG,KAAK;;EAEvB;EACA,MAAMd,OAAO,GAAG,CAACC,KAAa,EAAEC,MAAc,KAAkB;IAC9D,IAAIY,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,gEAA+Dc,MAAO,EAAC,CACzE;IACH;IACA,OAAOf,QAAQ,CAACuB,OAAO,CAACR,MAAM,EAAES,KAAK,EAAEC,MAAM,CAAC;EAChD,CAAC;EAED,MAAMQ,YAAY,GAAG,CAACT,KAAa,EAAEC,MAA0B,KAAK;IAClE,IAAIY,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,gEAA+Dc,MAAO,EAAC,CACzE;IACH;IACA,OAAOf,QAAQ,CAACiC,YAAY,CAAClB,MAAM,EAAES,KAAK,EAAEC,MAAM,CAAC;EACrD,CAAC;EAED,MAAMa,MAAM,GAAG,MAAM;IACnB,IAAID,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,iEAAgEc,MAAO,EAAC,CAC1E;IACH;IACA,MAAMX,MAAM,GAAGJ,QAAQ,CAACuB,OAAO,CAACR,MAAM,EAAE,QAAQ,CAAC;IACjDsB,WAAW,GAAG,IAAI;IAClB,OAAOjC,MAAM;EACf,CAAC;EAED,MAAMmC,QAAQ,GAAG,MAAM;IACrB,IAAIF,WAAW,EAAE;MACf,MAAMpC,KAAK,CACR,mEAAkEc,MAAO,EAAC,CAC5E;IACH;IACA,MAAMX,MAAM,GAAGJ,QAAQ,CAACuB,OAAO,CAACR,MAAM,EAAE,UAAU,CAAC;IACnDsB,WAAW,GAAG,IAAI;IAClB,OAAOjC,MAAM;EACf,CAAC;EAED,eAAeoC,GAAG,GAAG;IACnB,IAAI;MACF,MAAMxC,QAAQ,CAACiC,YAAY,CAAClB,MAAM,EAAE,mBAAmB,CAAC;MAExD,MAAMqB,EAAE,CAAC;QACPE,MAAM;QACNf,OAAO;QACPU,YAAY;QACZM;MACF,CAAC,CAAC;MAEF,IAAI,CAACF,WAAW,EAAE;QAChBC,MAAM,EAAE;MACV;IACF,CAAC,CAAC,OAAOG,cAAc,EAAE;MACvB,IAAI,CAACJ,WAAW,EAAE;QAChB,IAAI;UACFE,QAAQ,EAAE;QACZ,CAAC,CAAC,OAAOG,aAAa,EAAE;UACtB,MAAMA,aAAa;QACrB;MACF;MAEA,MAAMD,cAAc;IACtB,CAAC,SAAS;MACRnC,KAAK,CAACS,MAAM,CAAC,CAACI,UAAU,GAAG,KAAK;MAChCkB,WAAW,GAAG,KAAK;MACnBM,oBAAoB,CAAC5B,MAAM,CAAC;IAC9B;EACF;EAEA,OAAO,MAAM,IAAI6B,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5C,MAAMC,EAAsB,GAAG;MAC7BC,KAAK,EAAE,MAAM;QACXR,GAAG,EAAE,CAACS,IAAI,CAACJ,OAAO,CAAC,CAACK,KAAK,CAACJ,MAAM,CAAC;MACnC;IACF,CAAC;IAEDxC,KAAK,CAACS,MAAM,CAAC,CAACG,KAAK,CAACiC,IAAI,CAACJ,EAAE,CAAC;IAC5BJ,oBAAoB,CAAC5B,MAAM,CAAC;EAC9B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM4B,oBAAoB,GAAI5B,MAAc,IAAK;EAC/C,IAAI,CAACT,KAAK,CAACS,MAAM,CAAC,EAAE;IAClB,MAAMd,KAAK,CAAE,0BAAyBc,MAAO,EAAC,CAAC;EACjD;EAEA,IAAIT,KAAK,CAACS,MAAM,CAAC,CAACI,UAAU,EAAE;IAC5B;IACA;EACF;EAEA,IAAIb,KAAK,CAACS,MAAM,CAAC,CAACG,KAAK,CAACR,MAAM,EAAE;IAC9BJ,KAAK,CAACS,MAAM,CAAC,CAACI,UAAU,GAAG,IAAI;IAC/B,MAAM4B,EAAE,GAAGzC,KAAK,CAACS,MAAM,CAAC,CAACG,KAAK,CAACkC,KAAK,EAAE;IAEtC,IAAI,CAACL,EAAE,EAAE;MACP,MAAM,IAAI9C,KAAK,CAAC,uCAAuC,CAAC;IAC1D;IAEAoD,YAAY,CAAC,MAAM;MACjBN,EAAE,CAACC,KAAK,EAAE;IACZ,CAAC,CAAC;EACJ;AACF,CAAC;AAyBD,OAAO,MAAMlC,IAAI,GAAIwC,OAIpB,IAAyB;EACxBtD,QAAQ,CAACc,IAAI,CAACwC,OAAO,CAACC,IAAI,EAAED,OAAO,CAACtC,QAAQ,EAAEsC,OAAO,CAACrC,QAAQ,CAAC;EAE/D,OAAO;IACLI,KAAK,EAAE,MAAMrB,QAAQ,CAACqB,KAAK,CAACiC,OAAO,CAACC,IAAI,CAAC;IACzCC,MAAM,EAAE,MAAMxD,QAAQ,CAACwD,MAAM,CAACF,OAAO,CAACC,IAAI,EAAED,OAAO,CAACtC,QAAQ,CAAC;IAC7DyC,MAAM,EAAE,CAACC,cAAsB,EAAEC,KAAa,EAAE3C,QAAiB,KAC/DhB,QAAQ,CAACyD,MAAM,CAACH,OAAO,CAACC,IAAI,EAAEG,cAAc,EAAEC,KAAK,EAAE3C,QAAQ,CAAC;IAChE4C,MAAM,EAAGD,KAAa,IAAK3D,QAAQ,CAAC4D,MAAM,CAACN,OAAO,CAACC,IAAI,EAAEI,KAAK,CAAC;IAC/DxB,WAAW,EAAGC,EAAsC,IAClDpC,QAAQ,CAACmC,WAAW,CAACmB,OAAO,CAACC,IAAI,EAAEnB,EAAE,CAAC;IACxCb,OAAO,EAAE,CAACC,KAAa,EAAEC,MAA0B,KACjDzB,QAAQ,CAACuB,OAAO,CAAC+B,OAAO,CAACC,IAAI,EAAE/B,KAAK,EAAEC,MAAM,CAAC;IAC/CQ,YAAY,EAAE,CACZT,KAAa,EACbC,MAA0B,KAE1BzB,QAAQ,CAACiC,YAAY,CAACqB,OAAO,CAACC,IAAI,EAAE/B,KAAK,EAAEC,MAAM,CAAC;IACpDoC,YAAY,EAAGC,QAAyB,IACtC9D,QAAQ,CAAC6D,YAAY,CAACP,OAAO,CAACC,IAAI,EAAEO,QAAQ,CAAC;IAC/CC,iBAAiB,EAAGD,QAAyB,IAC3C9D,QAAQ,CAAC+D,iBAAiB,CAACT,OAAO,CAACC,IAAI,EAAEO,QAAQ,CAAC;IACpDE,QAAQ,EAAGhD,QAAgB,IAAKhB,QAAQ,CAACgE,QAAQ,CAACV,OAAO,CAACC,IAAI,EAAEvC,QAAQ,CAAC;IACzEiD,UAAU,EAAGC,QAAQ,IAAKlE,QAAQ,CAACiE,UAAU,CAACX,OAAO,CAACC,IAAI,EAAEW,QAAQ,CAAC;IACrEC,UAAU,EAAGD,QAAQ,IAAKlE,QAAQ,CAACmE,UAAU,CAACb,OAAO,CAACC,IAAI,EAAEW,QAAQ,CAAC;IACrEE,YAAY,EAAGF,QAAQ,IAAKlE,QAAQ,CAACoE,YAAY,CAACd,OAAO,CAACC,IAAI,EAAEW,QAAQ;EAC1E,CAAC;AACH,CAAC"}
|
|
@@ -89,12 +89,14 @@ interface ISQLite {
|
|
|
89
89
|
executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult;
|
|
90
90
|
executeBatchAsync: (dbName: string, commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;
|
|
91
91
|
loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;
|
|
92
|
-
updateHook: (dbName: string, callback
|
|
92
|
+
updateHook: (dbName: string, callback?: ((params: {
|
|
93
93
|
table: string;
|
|
94
94
|
operation: UpdateHookOperation;
|
|
95
95
|
row?: any;
|
|
96
96
|
rowId: number;
|
|
97
|
-
}) => void) => void;
|
|
97
|
+
}) => void) | null) => void;
|
|
98
|
+
commitHook: (dbName: string, callback?: (() => void) | null) => void;
|
|
99
|
+
rollbackHook: (dbName: string, callback?: (() => void) | null) => void;
|
|
98
100
|
}
|
|
99
101
|
export type OPSQLiteConnection = {
|
|
100
102
|
close: () => void;
|
|
@@ -107,12 +109,14 @@ export type OPSQLiteConnection = {
|
|
|
107
109
|
executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult;
|
|
108
110
|
executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;
|
|
109
111
|
loadFile: (location: string) => Promise<FileLoadResult>;
|
|
110
|
-
updateHook: (callback: (params: {
|
|
112
|
+
updateHook: (callback: ((params: {
|
|
111
113
|
table: string;
|
|
112
114
|
operation: UpdateHookOperation;
|
|
113
115
|
row?: any;
|
|
114
116
|
rowId: number;
|
|
115
|
-
}) => void) => void;
|
|
117
|
+
}) => void) | null) => void;
|
|
118
|
+
commitHook: (callback: (() => void) | null) => void;
|
|
119
|
+
rollbackHook: (callback: (() => void) | null) => void;
|
|
116
120
|
};
|
|
117
121
|
export declare const open: (options: {
|
|
118
122
|
name: string;
|
package/op-sqlite.podspec
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require "json"
|
|
2
2
|
|
|
3
3
|
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
|
|
4
5
|
|
|
5
6
|
Pod::Spec.new do |s|
|
|
6
7
|
s.name = "op-sqlite"
|
|
@@ -30,7 +31,6 @@ Pod::Spec.new do |s|
|
|
|
30
31
|
'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
|
|
34
34
|
if ENV['OP_SQLITE_USE_PHONE_VERSION'] == '1' then
|
|
35
35
|
s.exclude_files = "cpp/sqlite3.c", "cpp/sqlite3.h"
|
|
36
36
|
s.library = "sqlite3"
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -161,13 +161,15 @@ interface ISQLite {
|
|
|
161
161
|
loadFile: (dbName: string, location: string) => Promise<FileLoadResult>;
|
|
162
162
|
updateHook: (
|
|
163
163
|
dbName: string,
|
|
164
|
-
callback
|
|
164
|
+
callback?: ((params: {
|
|
165
165
|
table: string;
|
|
166
166
|
operation: UpdateHookOperation;
|
|
167
167
|
row?: any;
|
|
168
168
|
rowId: number;
|
|
169
|
-
}) => void
|
|
169
|
+
}) => void) | null
|
|
170
170
|
) => void;
|
|
171
|
+
commitHook: (dbName: string, callback?: (() => void) | null) => void;
|
|
172
|
+
rollbackHook: (dbName: string, callback?: (() => void) | null) => void;
|
|
171
173
|
}
|
|
172
174
|
|
|
173
175
|
const locks: Record<
|
|
@@ -375,13 +377,15 @@ export type OPSQLiteConnection = {
|
|
|
375
377
|
executeBatchAsync: (commands: SQLBatchTuple[]) => Promise<BatchQueryResult>;
|
|
376
378
|
loadFile: (location: string) => Promise<FileLoadResult>;
|
|
377
379
|
updateHook: (
|
|
378
|
-
callback: (params: {
|
|
380
|
+
callback: ((params: {
|
|
379
381
|
table: string;
|
|
380
382
|
operation: UpdateHookOperation;
|
|
381
383
|
row?: any;
|
|
382
384
|
rowId: number;
|
|
383
|
-
}) => void
|
|
385
|
+
}) => void) | null
|
|
384
386
|
) => void;
|
|
387
|
+
commitHook: (callback: (() => void) | null) => void;
|
|
388
|
+
rollbackHook: (callback: (() => void) | null) => void;
|
|
385
389
|
};
|
|
386
390
|
|
|
387
391
|
export const open = (options: {
|
|
@@ -412,5 +416,7 @@ export const open = (options: {
|
|
|
412
416
|
OPSQLite.executeBatchAsync(options.name, commands),
|
|
413
417
|
loadFile: (location: string) => OPSQLite.loadFile(options.name, location),
|
|
414
418
|
updateHook: (callback) => OPSQLite.updateHook(options.name, callback),
|
|
419
|
+
commitHook: (callback) => OPSQLite.commitHook(options.name, callback),
|
|
420
|
+
rollbackHook: (callback) => OPSQLite.rollbackHook(options.name, callback),
|
|
415
421
|
};
|
|
416
422
|
};
|