1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-05 15:55:57 +03:00

Add ability for the JS Worker1.exec() API to report the number of changes made to the caller, per request in [forum:d0b19483642e20dd | forum post d0b19483642e20dd].

FossilOrigin-Name: 6e79505df915612b60696e4eec5c9973175fe6ecf273eb3152b996e63ae54a07
This commit is contained in:
stephan
2023-05-25 16:49:06 +00:00
parent 4e8e33ba84
commit 39bd6a0d46
5 changed files with 47 additions and 20 deletions

View File

@@ -278,6 +278,19 @@
The arguments are in the same form accepted by oo1.DB.exec(), with The arguments are in the same form accepted by oo1.DB.exec(), with
the exceptions noted below. the exceptions noted below.
If the `countChanges` arguments property (added in version 3.43) is
truthy then the `result` property contained by the returned object
will have a `changeCount` property which holds the number of changes
made by the provided SQL. Because the SQL may contain an arbitrary
number of statements, the `changeCount` is calculated by calling
`sqlite3_total_changes()` before and after the SQL is evaluated. If
the value of `countChanges` is 64 then the `changeCount` property
will be returned as a 64-bit integer in the form of a BigInt (noting
that that will trigger an exception if used in a BigInt-incapable
build). In the latter case, the number of changes is calculated by
calling `sqlite3_total_changes64()` before and after the SQL is
evaluated.
A function-type args.callback property cannot cross A function-type args.callback property cannot cross
the window/Worker boundary, so is not useful here. If the window/Worker boundary, so is not useful here. If
args.callback is a string then it is assumed to be a args.callback is a string then it is assumed to be a
@@ -523,7 +536,13 @@ sqlite3.initWorker1API = function(){
} }
} }
try { try {
const changeCount = !!rc.countChanges
? db.changes(true,(64===rc.countChanges))
: undefined;
db.exec(rc); db.exec(rc);
if(undefined !== changeCount){
rc.changeCount = db.changes(true,64===rc.countChanges) - changeCount;
}
if(rc.callback instanceof Function){ if(rc.callback instanceof Function){
rc.callback = theCallback; rc.callback = theCallback;
/* Post a sentinel message to tell the client that the end /* Post a sentinel message to tell the client that the end

View File

@@ -196,10 +196,9 @@ globalThis.sqlite3Worker1Promiser = function callee(config = callee.defaultConfi
if(1===arguments.length){ if(1===arguments.length){
msg = arguments[0]; msg = arguments[0];
}else if(2===arguments.length){ }else if(2===arguments.length){
msg = { msg = Object.create(null);
type: arguments[0], msg.type = arguments[0];
args: arguments[1] msg.args = arguments[1];
};
}else{ }else{
toss("Invalid arugments for sqlite3Worker1Promiser()-created factory."); toss("Invalid arugments for sqlite3Worker1Promiser()-created factory.");
} }

View File

@@ -64,15 +64,17 @@
callback = msgArgs; callback = msgArgs;
msgArgs = undefined; msgArgs = undefined;
} }
const p = workerPromise({type: msgType, args:msgArgs}); const p = 1
? workerPromise({type: msgType, args:msgArgs})
: workerPromise(msgType, msgArgs);
return callback ? p.then(callback).finally(testCount) : p; return callback ? p.then(callback).finally(testCount) : p;
}; };
let sqConfig;
const runTests = async function(){ const runTests = async function(){
const dbFilename = '/testing2.sqlite3'; const dbFilename = '/testing2.sqlite3';
startTime = performance.now(); startTime = performance.now();
let sqConfig;
await wtest('config-get', (ev)=>{ await wtest('config-get', (ev)=>{
const r = ev.result; const r = ev.result;
log('sqlite3.config subset:', r); log('sqlite3.config subset:', r);
@@ -102,11 +104,15 @@
sql: ["create table t(a,b)", sql: ["create table t(a,b)",
"insert into t(a,b) values(1,2),(3,4),(5,6)" "insert into t(a,b) values(1,2),(3,4),(5,6)"
].join(';'), ].join(';'),
resultRows: [], columnNames: [] resultRows: [], columnNames: [],
countChanges: sqConfig.bigIntEnabled ? 64 : true
}, function(ev){ }, function(ev){
ev = ev.result; ev = ev.result;
T.assert(0===ev.resultRows.length) T.assert(0===ev.resultRows.length)
.assert(0===ev.columnNames.length); .assert(0===ev.columnNames.length)
.assert(sqConfig.bigIntEnabled
? (3n===ev.changeCount)
: (3===ev.changeCount));
}); });
await wtest('exec',{ await wtest('exec',{
@@ -124,12 +130,14 @@
await wtest('exec',{ await wtest('exec',{
sql: 'select a a, b b from t order by a', sql: 'select a a, b b from t order by a',
resultRows: [], columnNames: [], resultRows: [], columnNames: [],
rowMode: 'object' rowMode: 'object',
countChanges: true
}, function(ev){ }, function(ev){
ev = ev.result; ev = ev.result;
T.assert(3===ev.resultRows.length) T.assert(3===ev.resultRows.length)
.assert(1===ev.resultRows[0].a) .assert(1===ev.resultRows[0].a)
.assert(6===ev.resultRows[2].b) .assert(6===ev.resultRows[2].b)
.assert(0===ev.changeCount);
}); });
await wtest( await wtest(
@@ -142,12 +150,13 @@
await wtest('exec',{ await wtest('exec',{
sql:'select 1 union all select 3', sql:'select 1 union all select 3',
resultRows: [], resultRows: []
}, function(ev){ }, function(ev){
ev = ev.result; ev = ev.result;
T.assert(2 === ev.resultRows.length) T.assert(2 === ev.resultRows.length)
.assert(1 === ev.resultRows[0][0]) .assert(1 === ev.resultRows[0][0])
.assert(3 === ev.resultRows[1][0]); .assert(3 === ev.resultRows[1][0])
.assert(undefined === ev.changeCount);
}); });
const resultRowTest1 = function f(ev){ const resultRowTest1 = function f(ev){

View File

@@ -1,5 +1,5 @@
C Minor\scleanups\sin\sdemo\sJS\scode,\sper\sforum\sfeedback. C Add\sability\sfor\sthe\sJS\sWorker1.exec()\sAPI\sto\sreport\sthe\snumber\sof\schanges\smade\sto\sthe\scaller,\sper\srequest\sin\s[forum:d0b19483642e20dd\s|\sforum\spost\sd0b19483642e20dd].
D 2023-05-23T19:11:42.778 D 2023-05-25T16:49:06.244
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -496,14 +496,14 @@ F ext/wasm/api/sqlite3-api-cleanup.js cc21e3486da748463e02bbe51e2464c6ac136587cd
F ext/wasm/api/sqlite3-api-glue.js f1b2dcb944de5138bb5bd9a1559d2e76a4f3ec25260963d709e8237476688803 F ext/wasm/api/sqlite3-api-glue.js f1b2dcb944de5138bb5bd9a1559d2e76a4f3ec25260963d709e8237476688803
F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8 F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8
F ext/wasm/api/sqlite3-api-prologue.js 17f4ec398ba34c5c666fea8e8c4eb82064a35b302f2f2eb355283cd8d3f68ed5 F ext/wasm/api/sqlite3-api-prologue.js 17f4ec398ba34c5c666fea8e8c4eb82064a35b302f2f2eb355283cd8d3f68ed5
F ext/wasm/api/sqlite3-api-worker1.js 40a5b1813fcbe789f23ae196c833432c8c83e7054d660194ddfc51eab1c5b9bf F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b1738645c0134562bb84e88e2fec
F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
F ext/wasm/api/sqlite3-opfs-async-proxy.js 70914ae97784d3028150bbf252e07a423056c42cc345903c81b5fae661ce512f F ext/wasm/api/sqlite3-opfs-async-proxy.js 70914ae97784d3028150bbf252e07a423056c42cc345903c81b5fae661ce512f
F ext/wasm/api/sqlite3-v-helper.js e5c202a9ecde9ef818536d3f5faf26c03a1a9f5192b1ddea8bdabf30d75ef487 F ext/wasm/api/sqlite3-v-helper.js e5c202a9ecde9ef818536d3f5faf26c03a1a9f5192b1ddea8bdabf30d75ef487
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 89640e4874a60cb2d973306b272384ffb45c7915375c7bb0355c7586f88dc39c F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 89640e4874a60cb2d973306b272384ffb45c7915375c7bb0355c7586f88dc39c
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c 12a096d8e58a0af0589142bae5a3c27a0c7e19846755a1a37d2c206352fbedda F ext/wasm/api/sqlite3-wasm.c 12a096d8e58a0af0589142bae5a3c27a0c7e19846755a1a37d2c206352fbedda
F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 2710a06a59620c6bf7ce298ab1fb6c9ce825b9f9379728b74c486db6613beecc F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f
F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75 F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75
F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8 F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8
F ext/wasm/batch-runner.js 0dad6a02ad796f1003d3b7048947d275c4d6277f63767b8e685c27df8fdac93e F ext/wasm/batch-runner.js 0dad6a02ad796f1003d3b7048947d275c4d6277f63767b8e685c27df8fdac93e
@@ -518,7 +518,7 @@ F ext/wasm/demo-123.js ebae30756585bca655b4ab2553ec9236a87c23ad24fc8652115dcedb0
F ext/wasm/demo-jsstorage.html 409c4be4af5f207fb2877160724b91b33ea36a3cd8c204e8da1acb828ffe588e F ext/wasm/demo-jsstorage.html 409c4be4af5f207fb2877160724b91b33ea36a3cd8c204e8da1acb828ffe588e
F ext/wasm/demo-jsstorage.js 44e3ae7ec2483b6c511384c3c290beb6f305c721186bcf5398ca4e00004a06b8 F ext/wasm/demo-jsstorage.js 44e3ae7ec2483b6c511384c3c290beb6f305c721186bcf5398ca4e00004a06b8
F ext/wasm/demo-worker1-promiser.html 1de7c248c7c2cfd4a5783d2aa154bce62d74c6de98ab22f5786620b3354ed15f F ext/wasm/demo-worker1-promiser.html 1de7c248c7c2cfd4a5783d2aa154bce62d74c6de98ab22f5786620b3354ed15f
F ext/wasm/demo-worker1-promiser.js 85eec29b69ae9284ca8f92906649bad59c6e89ef8c8bef1c54534d198cd1f071 F ext/wasm/demo-worker1-promiser.js 5e5c7d7c91cd7aae9cc733afd02569ba9c6928292db413b550e8b842f4b75e87
F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d
F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef
F ext/wasm/dist.make 451fb1b732257849f6e898d2a862512a0401500ed369ef53bdfeddf9c77bc3b9 F ext/wasm/dist.make 451fb1b732257849f6e898d2a862512a0401500ed369ef53bdfeddf9c77bc3b9
@@ -2070,8 +2070,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 367b4cc549a14222d54530538e692e9d1a365002c1b8c4ef80ddc0523bfdb3a2 P 80c7c0360c08bea0733deccb8071920c60558b75df76b6afad093c82adf30ea6
R b5cd104f39e80fbc323dabc926386ff4 R e8fcc223cacf06d978c3812fcacaa2db
U stephan U stephan
Z 4cd5f002fb22229311c9795f8929c3b5 Z 4c26ba95f98d5f81d88f07b72f4945f7
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
80c7c0360c08bea0733deccb8071920c60558b75df76b6afad093c82adf30ea6 6e79505df915612b60696e4eec5c9973175fe6ecf273eb3152b996e63ae54a07