-
-
Notifications
You must be signed in to change notification settings - Fork 33.8k
sqlite: add support for SQLite Session Extension #54181
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
d3c9c6e
210f947
bae7f67
fd64575
ed2851f
bf9db72
c4c8147
351c34e
a98e5b0
6876522
7362f4e
fb91628
f15f1b0
763da58
40837f2
b70d41c
56131e8
3202fbb
df83e4b
8addc58
d31b038
4e62d6a
7918a6c
f4b814d
14ba002
1d8da20
80725c5
c3cf3f3
6f08540
8776af6
092a28c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -164,6 +164,70 @@ added: v22.5.0 | |
| Compiles a SQL statement into a [prepared statement][]. This method is a wrapper | ||
| around [`sqlite3_prepare_v2()`][]. | ||
|
|
||
| ### `database.createSession([options])` | ||
|
|
||
| * `options` {Object} The configuration options for the session. | ||
| * `table` {string} A specific table to track changes for. By default, changes to all tables are tracked. | ||
| * `db` {string} Name of the database to track. This is useful when multiple databases have been added using [`ATTACH DATABASE`][]. **Default**: `'main'`. | ||
| * Returns: {Session} A session handle. | ||
|
|
||
| Creates and attaches a session to the database. This method is a wrapper around [`sqlite3session_create()`][] and [`sqlite3session_attach()`][]. | ||
|
|
||
| ### `database.applyChangeset(changeset[, options])` | ||
|
|
||
| * `changeset` {Uint8Array} A binary changeset or patchset. | ||
| * `options` {Object} The configuration options for how the changes will be applied. | ||
| * `filter` {Function} Skip changes that, when targeted table name is supplied to this function, return a truthy value. | ||
| By default, all changes are attempted. | ||
| * `onConflict` {number} Determines how conflicts are handled. **Default**: `SQLITE_CHANGESET_ABORT`. | ||
| * `SQLITE_CHANGESET_OMIT`: conflicting changes are omitted. | ||
| * `SQLITE_CHANGESET_REPLACE`: conflicting changes replace existing values. | ||
| * `SQLITE_CHANGESET_ABORT`: abort on conflict and roll back databsase. | ||
| * Returns: {boolean} Whether the changeset was applied succesfully without being aborted. | ||
|
|
||
| An exception is thrown if the database is not | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What kind of exception?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I used the same wording as elsewhere in the document. For consistency we should either keep it the same here or update it everywhere.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. But we just use plain |
||
| open. This method is a wrapper around [`sqlite3changeset_apply()`][]. | ||
|
|
||
| ```js | ||
| const sourceDb = new DatabaseSync(':memory:'); | ||
| const targetDb = new DatabaseSync(':memory:'); | ||
|
|
||
| sourceDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)'); | ||
| targetDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)'); | ||
|
|
||
| const session = sourceDb.createSession(); | ||
|
|
||
| const insert = sourceDb.prepare('INSERT INTO data (key, value) VALUES (?, ?)'); | ||
| insert.run(1, 'hello'); | ||
| insert.run(2, 'world'); | ||
|
|
||
| const changeset = session.changeset(); | ||
| targetDb.applyChangeset(changeset); | ||
| // Now that the changeset has been applied, targetDb contains the same data as sourceDb. | ||
| ``` | ||
|
|
||
| ## Class: `Session` | ||
|
|
||
| ### `session.changeset()` | ||
|
|
||
| * Returns: {Uint8Array} Binary changeset that can be applied to other databases. | ||
|
|
||
| Retrieves a changeset containing all changes since the changeset was created. Can be called multiple times. | ||
| An exception is thrown if the database or the session is not open. This method is a wrapper around [`sqlite3session_changeset()`][]. | ||
|
|
||
| ### `session.patchset()` | ||
|
|
||
| * Returns: {Uint8Array} Binary patchset that can be applied to other databases. | ||
|
|
||
| Similar to the method above, but generates a more compact patchset. See [Changesets and Patchsets][] | ||
| in the documentation of SQLite. An exception is thrown if the database or the session is not open. This method is a | ||
| wrapper around [`sqlite3session_patchset()`][]. | ||
|
|
||
| ### `session.close()`. | ||
|
|
||
| Closes the session. An exception is thrown if the database or the session is not open. This method is a | ||
| wrapper around [`sqlite3session_delete()`][]. | ||
|
|
||
| ## Class: `StatementSync` | ||
|
|
||
| <!-- YAML | ||
|
|
@@ -326,8 +390,39 @@ exception. | |
| | `TEXT` | {string} | | ||
| | `BLOB` | {Uint8Array} | | ||
|
|
||
| ## SQLite constants | ||
|
|
||
| The following constants are exported by the `node:sqlite` module. | ||
|
|
||
| ### SQLite Session constants | ||
|
|
||
| #### Conflict-resolution constants | ||
|
|
||
| The following constants are meant for use with [`database.applyChangeset()`](#databaseapplychangesetchangeset-options). | ||
|
|
||
| <table> | ||
| <tr> | ||
| <th>Constant</th> | ||
| <th>Description</th> | ||
| </tr> | ||
| <tr> | ||
| <td><code>SQLITE_CHANGESET_OMIT</code></td> | ||
| <td>Conflicting changes are omitted.</td> | ||
| </tr> | ||
| <tr> | ||
| <td><code>SQLITE_CHANGESET_REPLACE</code></td> | ||
| <td>Conflicting changes replace existing values.</td> | ||
| </tr> | ||
| <tr> | ||
| <td><code>SQLITE_CHANGESET_ABORT</code></td> | ||
| <td>Abort when a change encounters a conflict and roll back databsase.</td> | ||
| </tr> | ||
| </table> | ||
|
|
||
| [Changesets and Patchsets]: https://www.sqlite.org/sessionintro.html#changesets_and_patchsets | ||
| [SQL injection]: https://en.wikipedia.org/wiki/SQL_injection | ||
| [`--experimental-sqlite`]: cli.md#--experimental-sqlite | ||
| [`ATTACH DATABASE`]: https://www.sqlite.org/lang_attach.html | ||
| [`PRAGMA foreign_keys`]: https://www.sqlite.org/pragma.html#pragma_foreign_keys | ||
| [`sqlite3_changes64()`]: https://www.sqlite.org/c3ref/changes.html | ||
| [`sqlite3_close_v2()`]: https://www.sqlite.org/c3ref/close.html | ||
|
|
@@ -336,6 +431,12 @@ exception. | |
| [`sqlite3_last_insert_rowid()`]: https://www.sqlite.org/c3ref/last_insert_rowid.html | ||
| [`sqlite3_prepare_v2()`]: https://www.sqlite.org/c3ref/prepare.html | ||
| [`sqlite3_sql()`]: https://www.sqlite.org/c3ref/expanded_sql.html | ||
| [`sqlite3changeset_apply()`]: https://www.sqlite.org/session/sqlite3changeset_apply.html | ||
| [`sqlite3session_attach()`]: https://www.sqlite.org/session/sqlite3session_attach.html | ||
| [`sqlite3session_changeset()`]: https://www.sqlite.org/session/sqlite3session_changeset.html | ||
| [`sqlite3session_create()`]: https://www.sqlite.org/session/sqlite3session_create.html | ||
| [`sqlite3session_delete()`]: https://www.sqlite.org/session/sqlite3session_delete.html | ||
| [`sqlite3session_patchset()`]: https://www.sqlite.org/session/sqlite3session_patchset.html | ||
| [connection]: https://www.sqlite.org/c3ref/sqlite3.html | ||
| [data types]: https://www.sqlite.org/datatype3.html | ||
| [double-quoted string literals]: https://www.sqlite.org/quirks.html#dblquote | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.