Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | JS: add a mechanism to the Worker1 exec API to fetch the last_insert_rowid(), as requested in forum post 56bc353901. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
c22c48360756b1c7e2f5a9c01aff799b |
User & Date: | stephan 2025-02-09 02:41:35 |
Context
2025-02-09
| ||
03:24 | wasm: when building in -O0 mode (typical dev mode), use -sASSERTIONS=2, else -sASSERTIONS=0, in response Emscripten checkin 7e3e35cbff9, which adds assertions to check for the condition reported in Emscripten ticket 23420. Update some unrelated JS-side internal docs. (check-in: 1f554610 user: stephan tags: trunk) | |
02:41 | JS: add a mechanism to the Worker1 exec API to fetch the last_insert_rowid(), as requested in forum post 56bc353901. (check-in: c22c4836 user: stephan tags: trunk) | |
01:25 | configure: when transfering ENABLE/OMIT flags from CFLAGS to OPT_FEATURE_FLAGS, also do the same for CPPFLAGS and remove those ENABLE/OMIT flags from CFLAGS/CPPFLAGS to mimic legacy build behavior. Strip ENABLE/OMIT flags from BUILD_CFLAGS but do not transfer those to OPT_FEATURE_FLAGS, also to mimic legacy behavior. This is the second part of a fix discussed at forum post 9801e54665afd728. (check-in: 16d307cc user: stephan tags: trunk) | |
Changes
Changes to ext/wasm/api/sqlite3-api-worker1.c-pp.js.
︙ | ︙ | |||
275 276 277 278 279 280 281 | } } ``` The arguments are in the same form accepted by oo1.DB.exec(), with the exceptions noted below. | | | | | | > > > > > > > > > | 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | } } ``` The arguments are in the same form accepted by oo1.DB.exec(), with the exceptions noted below. If `args.countChanges` (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. If the `args.lastInsertRowId` (added in version 3.50.0) is truthy then the `result` property contained by the returned object will have a `lastInsertRowId` will hold a BigInt-type value corresponding to the result of sqlite3_last_insert_rowid(). This value is only fetched once, after the SQL is run, regardless of how many statements the SQL contains. This API has no idea whether the SQL contains any INSERTs, so it is up to the client to apply/rely on this property only when it makes sense to do so. A function-type args.callback property cannot cross the window/Worker boundary, so is not useful here. If args.callback is a string then it is assumed to be a message type key, in which case a callback function will be applied which posts each row result via: |
︙ | ︙ | |||
537 538 539 540 541 542 543 544 545 546 547 548 549 550 | try { const changeCount = !!rc.countChanges ? db.changes(true,(64===rc.countChanges)) : undefined; db.exec(rc); if(undefined !== changeCount){ rc.changeCount = db.changes(true,64===rc.countChanges) - changeCount; } if(rc.callback instanceof Function){ rc.callback = theCallback; /* Post a sentinel message to tell the client that the end of the result set has been reached (possibly with zero rows). */ wState.post({ | > > > > > > | 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 | try { const changeCount = !!rc.countChanges ? db.changes(true,(64===rc.countChanges)) : undefined; db.exec(rc); if(undefined !== changeCount){ rc.changeCount = db.changes(true,64===rc.countChanges) - changeCount; } const lastInsertRowId = !!rc.lastInsertRowId ? sqlite3.capi.sqlite3_last_insert_rowid(db) : undefined; if( undefined!==lastInsertRowId ){ rc.lastInsertRowId = lastInsertRowId; } if(rc.callback instanceof Function){ rc.callback = theCallback; /* Post a sentinel message to tell the client that the end of the result set has been reached (possibly with zero rows). */ wState.post({ |
︙ | ︙ |
Changes to ext/wasm/demo-worker1-promiser.c-pp.js.
︙ | ︙ | |||
111 112 113 114 115 116 117 118 119 120 121 122 123 124 | const mustNotReach = ()=>toss("This is not supposed to be reached."); await wtest('exec',{ sql: ["create table t(a,b)", "insert into t(a,b) values(1,2),(3,4),(5,6)" ].join(';'), resultRows: [], columnNames: [], countChanges: sqConfig.bigIntEnabled ? 64 : true }, function(ev){ ev = ev.result; T.assert(0===ev.resultRows.length) .assert(0===ev.columnNames.length) .assert(sqConfig.bigIntEnabled ? (3n===ev.changeCount) | > | > > | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | const mustNotReach = ()=>toss("This is not supposed to be reached."); await wtest('exec',{ sql: ["create table t(a,b)", "insert into t(a,b) values(1,2),(3,4),(5,6)" ].join(';'), resultRows: [], columnNames: [], lastInsertRowId: true, countChanges: sqConfig.bigIntEnabled ? 64 : true }, function(ev){ ev = ev.result; T.assert(0===ev.resultRows.length) .assert(0===ev.columnNames.length) .assert(sqConfig.bigIntEnabled ? (3n===ev.changeCount) : (3===ev.changeCount)) .assert('bigint'===typeof ev.lastInsertRowId) .assert(ev.lastInsertRowId>=3); }); await wtest('exec',{ sql: 'select a a, b b from t order by a', resultRows: [], columnNames: [], }, function(ev){ ev = ev.result; |
︙ | ︙ |
Changes to ext/wasm/demo-worker1.js.
︙ | ︙ | |||
152 153 154 155 156 157 158 159 160 161 162 | const mustNotReach = ()=>{ throw new Error("This is not supposed to be reached."); }; runOneTest('exec',{ sql: ["create table t(a,b);", "insert into t(a,b) values(1,2),(3,4),(5,6)" ], resultRows: [], columnNames: [] }, function(ev){ ev = ev.result; T.assert(0===ev.resultRows.length) | > | > > | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | const mustNotReach = ()=>{ throw new Error("This is not supposed to be reached."); }; runOneTest('exec',{ sql: ["create table t(a,b);", "insert into t(a,b) values(1,2),(3,4),(5,6)" ], lastInsertRowId: true, resultRows: [], columnNames: [] }, function(ev){ ev = ev.result; T.assert(0===ev.resultRows.length) .assert(0===ev.columnNames.length) .assert('bigint'===typeof ev.lastInsertRowId) .assert(ev.lastInsertRowId>=3); }); runOneTest('exec',{ sql: 'select a a, b b from t order by a', resultRows: [], columnNames: [], saveSql:[] }, function(ev){ ev = ev.result; T.assert(3===ev.resultRows.length) |
︙ | ︙ |