Skip to content

Commit 23fc302

Browse files
authored
Merge pull request #304 from OP-Engineering/oscar/move-execute-batch-to-transaction-queue
Move execute batch to normal transaction queue
2 parents 8c5d66d + b997e14 commit 23fc302

File tree

7 files changed

+103
-75
lines changed

7 files changed

+103
-75
lines changed

c_sources/tokenizers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#define TOKENIZER_LIST opsqlite_wordtokenizer_init(db,&errMsg,nullptr);opsqlite_porter_init(db,&errMsg,nullptr);
55

6-
#include "sqlite3.h"
6+
#include <sqlite3.h>
77

88
namespace opsqlite {
99

cpp/bridge.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ opsqlite_execute_batch(sqlite3 *db,
850850
}
851851

852852
int affectedRows = 0;
853-
opsqlite_execute(db, "BEGIN EXCLUSIVE TRANSACTION", nullptr);
853+
// opsqlite_execute(db, "BEGIN EXCLUSIVE TRANSACTION", nullptr);
854854
for (int i = 0; i < commandCount; i++) {
855855
const auto &command = commands->at(i);
856856
// We do not provide a datastructure to receive query data because we
@@ -863,7 +863,7 @@ opsqlite_execute_batch(sqlite3 *db,
863863
throw exc;
864864
}
865865
}
866-
opsqlite_execute(db, "COMMIT", nullptr);
866+
// opsqlite_execute(db, "COMMIT", nullptr);
867867
return BatchResult{
868868
.affectedRows = affectedRows,
869869
.commands = static_cast<int>(commandCount),

cpp/libsql/bridge.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ opsqlite_libsql_execute_batch(DB const &db,
716716

717717
try {
718718
int affectedRows = 0;
719-
opsqlite_libsql_execute(db, "BEGIN EXCLUSIVE TRANSACTION", nullptr);
719+
// opsqlite_libsql_execute(db, "BEGIN EXCLUSIVE TRANSACTION", nullptr);
720720
for (int i = 0; i < commandCount; i++) {
721721
auto command = commands->at(i);
722722
// We do not provide a datastructure to receive query data because
@@ -725,13 +725,13 @@ opsqlite_libsql_execute_batch(DB const &db,
725725
opsqlite_libsql_execute(db, command.sql, &command.params);
726726
affectedRows += result.affectedRows;
727727
}
728-
opsqlite_libsql_execute(db, "COMMIT", nullptr);
728+
// opsqlite_libsql_execute(db, "COMMIT", nullptr);
729729
return BatchResult{
730730
.affectedRows = affectedRows,
731731
.commands = static_cast<int>(commandCount),
732732
};
733733
} catch (std::exception &exc) {
734-
opsqlite_libsql_execute(db, "ROLLBACK", nullptr);
734+
// opsqlite_libsql_execute(db, "ROLLBACK", nullptr);
735735
return BatchResult{
736736
.message = exc.what(),
737737
};

example/c_sources/tokenizers.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@
33

44
#define TOKENIZER_LIST opsqlite_wordtokenizer_init(db,&errMsg,nullptr);opsqlite_porter_init(db,&errMsg,nullptr);
55

6-
#ifdef __ANDROID__
7-
#include "sqlite3.h"
8-
#else
96
#include <sqlite3.h>
10-
#endif
117

128
namespace opsqlite {
139

example/ios/Podfile.lock

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,83 +1950,83 @@ EXTERNAL SOURCES:
19501950
:path: "../node_modules/react-native/ReactCommon/yoga"
19511951

19521952
SPEC CHECKSUMS:
1953-
boost: 1dca942403ed9342f98334bf4c3621f011aa7946
1954-
DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
1953+
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
1954+
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
19551955
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
19561956
FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975
19571957
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
19581958
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
1959-
glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
1959+
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
19601960
hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe
1961-
op-sqlite: d58de9322037133d8da81961b1cb49fc799e2e46
1961+
op-sqlite: cff3f4cfc5c6bfe963949d0c058984075bd1bad4
19621962
RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82
19631963
RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c
19641964
RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e
19651965
RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93
19661966
React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c
19671967
React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d
1968-
React-Core: 7150cf9b6a5af063b37003062689f1691e79c020
1969-
React-CoreModules: 15a85e6665d61678942da6ae485b351f4c699049
1970-
React-cxxreact: 74f9de59259ac951923f5726aa14f0398f167af9
1968+
React-Core: 10597593fdbae06f0089881e025a172e51d4a769
1969+
React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2
1970+
React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6
19711971
React-debug: e74e76912b91e08d580c481c34881899ccf63da9
1972-
React-defaultsnativemodule: 628285212bbd65417d40ad6a9f8781830fda6c98
1973-
React-domnativemodule: 185d9808198405c176784aaf33403d713bd24fb7
1974-
React-Fabric: c814804affbe1952e16149ddd20256e1bccae67e
1975-
React-FabricComponents: 81ef47d596966121784afec9924f9562a29b1691
1976-
React-FabricImage: f14f371d678aa557101def954ac3ba27e48948ff
1972+
React-defaultsnativemodule: 11f6ee2cf69bf3af9d0f28a6253def33d21b5266
1973+
React-domnativemodule: f940bbc4fa9e134190acbf3a4a9f95621b5a8f51
1974+
React-Fabric: 6f5c357bf3a42ff11f8844ad3fc7a1eb04f4b9de
1975+
React-FabricComponents: 10e0c0209822ac9e69412913a8af1ca33573379b
1976+
React-FabricImage: f582e764072dfa4715ae8c42979a5bace9cbcc12
19771977
React-featureflags: d5facceff8f8f6de430e0acecf4979a9a0839ba9
1978-
React-featureflagsnativemodule: 96f0ab285382d95c90f663e02526a5ceefa95a11
1979-
React-graphics: 1a66ee0a3f093b125b853f6370296fadcaf6f233
1980-
React-hermes: 8b86e5f54a65ecb69cdf22b3a00a11562eda82d2
1981-
React-idlecallbacksnativemodule: 5c25ab145c602264d00cb26a397ab52e0efa031c
1982-
React-ImageManager: 15e34bd5ef1ac4a18e96660817ef70a7f99ee8c2
1983-
React-jserrorhandler: 02cdf2cd45350108be1ffd2b164578936dbbdff7
1984-
React-jsi: 6af1987cfbb1b6621664fdbf6c7b62bd4d38c923
1985-
React-jsiexecutor: 51f372998e0303585cb0317232b938d694663cbd
1986-
React-jsinspector: 3539ad976d073bfaa8a7d2fa9bef35e70e55033e
1987-
React-jsinspectortracing: e8dbacaf67c201f23052ca1c2bae2f7b84dec443
1988-
React-jsitooling: 95a34f41e3c249d42181de13b4f8d854f178ca9f
1989-
React-jsitracing: 25b029cf5cad488252d46da19dd8c4c134fd5fe4
1990-
React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3
1991-
React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec
1992-
React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34
1993-
react-native-http-bridge-refurbished: e2e45508ec1573999ace69a0b880eee8f0e5bab2
1994-
react-native-restart: 7595693413fe3ca15893702f2c8306c62a708162
1995-
React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf
1978+
React-featureflagsnativemodule: a7dd141f1ef4b7c1331af0035689fbc742a49ff4
1979+
React-graphics: 36ae3407172c1c77cea29265d2b12b90aaef6aa0
1980+
React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12
1981+
React-idlecallbacksnativemodule: ae7f5ffc6cf2d2058b007b78248e5b08172ad5c3
1982+
React-ImageManager: 9daee0dc99ad6a001d4b9e691fbf37107e2b7b54
1983+
React-jserrorhandler: 1e6211581071edaf4ecd5303147328120c73f4dc
1984+
React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6
1985+
React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9
1986+
React-jsinspector: cfd27107f6d6f1076a57d88c932401251560fe5f
1987+
React-jsinspectortracing: 76a7d791f3c0c09a0d2bf6f46dfb0e79a4fcc0ac
1988+
React-jsitooling: 995e826570dd58f802251490486ebd3244a037ab
1989+
React-jsitracing: 094ae3d8c123cea67b50211c945b7c0443d3e97b
1990+
React-logger: 8edfcedc100544791cd82692ca5a574240a16219
1991+
React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468
1992+
React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6
1993+
react-native-http-bridge-refurbished: 1bd13b32a8e62abe61bab809c26e2dcf21256ed7
1994+
react-native-restart: 0bc732f4461709022a742bb29bcccf6bbc5b4863
1995+
React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e
19961996
React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c
1997-
React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0
1998-
React-performancetimeline: abf31259d794c9274b3ea19c5016186925eec6c4
1997+
React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d
1998+
React-performancetimeline: 5b0dfc0acba29ea0269ddb34cd6dd59d3b8a1c66
19991999
React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3
2000-
React-RCTAnimation: 2595dcb10a82216a511b54742f8c28d793852ac6
2001-
React-RCTAppDelegate: f03604b70f57c9469a84a159d8abecf793a5bcff
2002-
React-RCTBlob: e00f9b4e2f151938f4d9864cf33ebf24ac03328a
2003-
React-RCTFabric: 3945d116fd271598db262d4e6ed5691d431ed9e8
2004-
React-RCTFBReactNativeSpec: 0f4d4f0da938101f2ca9d5333a8f46e527ad2819
2005-
React-RCTImage: dac5e9f8ec476aefe6e60ee640ebc1dfaf1a4dbe
2006-
React-RCTLinking: 494b785a40d952a1dfbe712f43214376e5f0e408
2007-
React-RCTNetwork: b3d7c30cd21793e268db107dd0980cb61b3c1c44
2008-
React-RCTRuntime: a8ff419d437228e7b8a793b14f9d711e1cbb82af
2009-
React-RCTSettings: a060c7e381a3896104761b8eed7e284d95e37df3
2010-
React-RCTText: 4f272b72dbb61f390d8c8274528f9fdbff983806
2011-
React-RCTVibration: 0e5326220719aca12473d703aa46693e3b4ce67a
2000+
React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576
2001+
React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b
2002+
React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1
2003+
React-RCTFabric: 58590aa4fdb4ad546c06a7449b486cf6844e991f
2004+
React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338
2005+
React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29
2006+
React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360
2007+
React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170
2008+
React-RCTRuntime: 5ab904fd749aa52f267ef771d265612582a17880
2009+
React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7
2010+
React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e
2011+
React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343
20122012
React-rendererconsistency: 351fdbc5c1fe4da24243d939094a80f0e149c7a1
2013-
React-renderercss: d333f2ada83969591100d91ec6b23ca2e17e1507
2014-
React-rendererdebug: 039e5949b72ba63c703de020701e3fd152434c61
2013+
React-renderercss: 3438814bee838ae7840a633ab085ac81699fd5cf
2014+
React-rendererdebug: 0ac2b9419ad6f88444f066d4b476180af311fb1e
20152015
React-rncore: 57ed480649bb678d8bdc386d20fee8bf2b0c307c
2016-
React-RuntimeApple: 344a5e1105256000afabaa8df12c3e4cab880340
2017-
React-RuntimeCore: 0e48fb5e5160acc0334c7a723a42d42cef4b58b6
2016+
React-RuntimeApple: 8b7a9788f31548298ba1990620fe06b40de65ad7
2017+
React-RuntimeCore: e03d96fbd57ce69fd9bca8c925942194a5126dbc
20182018
React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2
2019-
React-RuntimeHermes: 064286a03871d932c99738e0f8ef854962ab4b99
2020-
React-runtimescheduler: e917ab17ae08c204af1ebf8f669b7e411b0220c8
2019+
React-RuntimeHermes: aab794755d9f6efd249b61f3af4417296904e3ba
2020+
React-runtimescheduler: c3cd124fa5db7c37f601ee49ca0d97019acd8788
20212021
React-timing: a90f4654cbda9c628614f9bee68967f1768bd6a5
2022-
React-utils: 51c4e71608b8133fecc9a15801d244ae7bdf3758
2023-
ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b
2024-
ReactCodegen: fda99a79c866370190e162083a35602fdc314e5d
2025-
ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461
2026-
RNShare: a21b3cdcf22b8aa699cd54aaec8ae1c1ca709559
2022+
React-utils: a612d50555b6f0f90c74b7d79954019ad47f5de6
2023+
ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
2024+
ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba
2025+
ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
2026+
RNShare: a9f1a356b3f46e5395d9885687c296b116699176
20272027
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
20282028
Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf
20292029

20302030
PODFILE CHECKSUM: 74b5ec2885cdfc97dce635b4ac32258ec9fa3179
20312031

2032-
COCOAPODS: 1.16.2
2032+
COCOAPODS: 1.15.2

example/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
"node": ">=18"
6464
},
6565
"op-sqlite": {
66-
"libsql": true,
66+
"libsql": false,
6767
"sqlcipher": false,
6868
"iosSqlite": false,
6969
"fts5": true,

src/index.ts

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export type FileLoadResult = BatchQueryResult & {
7979
export type Transaction = {
8080
commit: () => Promise<QueryResult>;
8181
execute: (query: string, params?: Scalar[]) => Promise<QueryResult>;
82-
rollback: () => Promise<QueryResult>;
82+
rollback: () => QueryResult;
8383
};
8484

8585
type PendingTransaction = {
@@ -412,7 +412,39 @@ function enhanceDB(db: InternalDB, options: DBParams): DB {
412412
return [query];
413413
});
414414

415-
return db.executeBatch(sanitizedCommands as any[]);
415+
async function run() {
416+
try {
417+
enhancedDb.executeSync('BEGIN TRANSACTION;');
418+
419+
let res = await db.executeBatch(sanitizedCommands as any[]);
420+
421+
enhancedDb.executeSync('COMMIT;');
422+
423+
return res;
424+
} catch (executionError) {
425+
try {
426+
enhancedDb.executeSync('ROLLBACK;');
427+
} catch (rollbackError) {
428+
throw rollbackError;
429+
}
430+
431+
throw executionError;
432+
} finally {
433+
lock.inProgress = false;
434+
startNextTransaction();
435+
}
436+
}
437+
438+
return await new Promise((resolve, reject) => {
439+
const tx: PendingTransaction = {
440+
start: () => {
441+
run().then(resolve).catch(reject);
442+
},
443+
};
444+
445+
lock.queue.push(tx);
446+
startNextTransaction();
447+
});
416448
},
417449
loadFile: db.loadFile,
418450
updateHook: db.updateHook,
@@ -555,30 +587,30 @@ function enhanceDB(db: InternalDB, options: DBParams): DB {
555587
}. Cannot execute query on finalized transaction`
556588
);
557589
}
558-
const result = await enhancedDb.execute('COMMIT;');
590+
const result = enhancedDb.executeSync('COMMIT;');
559591

560592
await db.flushPendingReactiveQueries();
561593

562594
isFinalized = true;
563595
return result;
564596
};
565597

566-
const rollback = async (): Promise<QueryResult> => {
598+
const rollback = (): QueryResult => {
567599
if (isFinalized) {
568600
throw Error(
569601
`OP-Sqlite Error: Database: ${
570602
options.name || options.url
571603
}. Cannot execute query on finalized transaction`
572604
);
573605
}
574-
const result = await enhancedDb.execute('ROLLBACK;');
606+
const result = enhancedDb.executeSync('ROLLBACK;');
575607
isFinalized = true;
576608
return result;
577609
};
578610

579611
async function run() {
580612
try {
581-
await enhancedDb.execute('BEGIN TRANSACTION;');
613+
enhancedDb.executeSync('BEGIN TRANSACTION;');
582614

583615
await fn({
584616
commit,
@@ -587,12 +619,12 @@ function enhanceDB(db: InternalDB, options: DBParams): DB {
587619
});
588620

589621
if (!isFinalized) {
590-
await commit();
622+
commit();
591623
}
592624
} catch (executionError) {
593625
if (!isFinalized) {
594626
try {
595-
await rollback();
627+
rollback();
596628
} catch (rollbackError) {
597629
throw rollbackError;
598630
}

0 commit comments

Comments
 (0)