| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 810929b commit e2f952f
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1005,7 +1005,8 @@ wrapper around [`sqlite3session_patchset()`][]. | |||
| 1005 | 1005 | ||
| 1006 | 1006 | ### `session.close()` | |
| 1007 | 1007 | ||
| 1008 | - Closes the session. An exception is thrown if the database or the session is not open. This method is a | ||
| 1008 | + Closes the session. An exception is thrown if the database or the session is not open, | ||
| 1009 | + or if the session is currently generating a changeset or patchset. This method is a | ||
| 1009 | 1010 | wrapper around [`sqlite3session_delete()`][]. | |
| 1010 | 1011 | ||
| 1011 | 1012 | ### `session[Symbol.dispose]()` | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4299,6 +4299,10 @@ void Session::Changeset(const FunctionCallbackInfo<Value>& args) { | |||
| 4299 | 4299 | env, session->session_ == nullptr, "session is not open"); | |
| 4300 | 4300 | THROW_AND_RETURN_IF_IN_AUTHORIZER(env, session->database_.get()); | |
| 4301 | 4301 | ||
| 4302 | + session->is_generating_changeset_ = true; | ||
| 4303 | + auto changeset_guard = | ||
| 4304 | + OnScopeLeave([&] { session->is_generating_changeset_ = false; }); | ||
| 4305 | + | ||
| 4302 | 4306 | int nChangeset; | |
| 4303 | 4307 | void* pChangeset; | |
| 4304 | 4308 | int r = sqliteChangesetFunc(session->session_, &nChangeset, &pChangeset); | |
@@ -4324,6 +4328,8 @@ void Session::Close(const FunctionCallbackInfo<Value>& args) { | |||
| 4324 | 4328 | env, !session->database_->IsOpen(), "database is not open"); | |
| 4325 | 4329 | THROW_AND_RETURN_ON_BAD_STATE( | |
| 4326 | 4330 | env, session->session_ == nullptr, "session is not open"); | |
| 4331 | + THROW_AND_RETURN_ON_BAD_STATE( | ||
| 4332 | + env, session->is_generating_changeset_, "session is currently in use"); | ||
| 4327 | 4333 | ||
| 4328 | 4334 | session->Delete(); | |
| 4329 | 4335 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -458,6 +458,7 @@ class Session : public BaseObject { | |||
| 458 | 458 | void Delete(); | |
| 459 | 459 | sqlite3_session* session_; | |
| 460 | 460 | BaseObjectPtr<DatabaseSync> database_; // The Parent Database | |
| 461 | + bool is_generating_changeset_ = false; | ||
| 461 | 462 | ||
| 462 | 463 | friend class DatabaseSync; | |
| 463 | 464 | }; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -612,6 +612,28 @@ test('session.close() - closing twice', (t) => { | |||
| 612 | 612 | }); | |
| 613 | 613 | }); | |
| 614 | 614 | ||
| 615 | + test('session.close() - while generating changes throws exception', (t) => { | ||
| 616 | + for (const method of ['changeset', 'patchset']) { | ||
| 617 | + const database = new DatabaseSync(':memory:'); | ||
| 618 | + database.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)'); | ||
| 619 | + | ||
| 620 | + const session = database.createSession({ table: 'data' }); | ||
| 621 | + database.exec("INSERT INTO data VALUES (1, 'a'), (2, 'b'), (3, 'c')"); | ||
| 622 | + database.setAuthorizer(() => { | ||
| 623 | + session.close(); | ||
| 624 | + return constants.SQLITE_OK; | ||
| 625 | + }); | ||
| 626 | + | ||
| 627 | + t.assert.throws(() => session[method](), { | ||
| 628 | + code: 'ERR_INVALID_STATE', | ||
| 629 | + message: 'session is currently in use', | ||
| 630 | + }); | ||
| 631 | + | ||
| 632 | + database.setAuthorizer(null); | ||
| 633 | + t.assert.notStrictEqual(session[method]().length, 0); | ||
| 634 | + } | ||
| 635 | + }); | ||
| 636 | + | ||
| 615 | 637 | test('session - keeps its database alive after the db handle is dropped', async (t) => { | |
| 616 | 638 | const { gcUntil, onGC } = require('../common/gc'); | |
| 617 | 639 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments