sqlite: add support for SQLite Session Extension
We were talking about adding support for the Session Extension of SQLite in #53752. This is not a run-time extension but rather a feature built in to the SQLite amalgamation. It can be enabled with a compile flag and is enabled by default on some platforms.
I have never contributed to Node.js before so I will probably need some help to bring this to a conclusion.
TODO:
-
Make sure sessions are deleted before the database they are attached to is closed -
Consensus on API -
Documentation -
Allow custom conflict handler -
Throw with specific (documented) exception in case of conflict when applying changesetsince SQLite doesn't consider this to be an error I returnfalse
when applying the changeset is aborted due to a conflict -
Allow generating a patchset as well -
Allow specifying table name when creating session (to only track that table) -
Implement Session.close()
Example usage:
const database1 = new DatabaseSync(':memory:');
const database2 = new DatabaseSync(':memory:');
database1.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
database2.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
const session = database1.createSession();
const insert = database1.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
insert.run(1, 'hello');
insert.run(2, 'world');
const changeset = session.changeset();
database2.applyChangeset(changeset);
// Now database2 contains the same data as database1