@itwin/core-backend 5.8.0-dev.11 → 5.8.0-dev.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +0 -3
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +17 -10
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +126 -28
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +2 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -3
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +4 -250
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +13 -11
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +4 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +7 -5
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +3 -1
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +4 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +2 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +0 -3
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +17 -10
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +127 -29
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.js +2 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -3
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +5 -251
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +13 -11
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +177 -7
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +100 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.js +95 -2
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.d.ts +4 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +6 -4
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +3 -1
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +4 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +2 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +13 -13
package/lib/cjs/LocalHub.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GuidString, Id64String } from "@itwin/core-bentley";
|
|
2
2
|
import { BriefcaseId, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps, ChangesetRange, LocalDirName, LocalFileName, LockState } from "@itwin/core-common";
|
|
3
|
-
import { LockMap, LockProps } from "./BackendHubAccess";
|
|
3
|
+
import { BriefcaseIdArg, LockMap, LockProps } from "./BackendHubAccess";
|
|
4
4
|
/** @internal */
|
|
5
5
|
interface MockBriefcaseIdProps {
|
|
6
6
|
id: BriefcaseId;
|
|
@@ -17,27 +17,27 @@ interface LocalHubProps {
|
|
|
17
17
|
readonly version0?: string;
|
|
18
18
|
readonly noLocks?: true;
|
|
19
19
|
}
|
|
20
|
-
interface
|
|
20
|
+
interface LockLastReleaseChangesetIndices {
|
|
21
|
+
lastExclusiveReleaseChangesetIndex?: ChangesetIndex;
|
|
22
|
+
lastSharedReleaseChangesetIndex?: ChangesetIndex;
|
|
23
|
+
}
|
|
24
|
+
interface LocksEntry extends LockLastReleaseChangesetIndices {
|
|
21
25
|
id: Id64String;
|
|
22
26
|
level: LockState;
|
|
23
|
-
lastCsIndex?: ChangesetIndex;
|
|
24
27
|
briefcaseId?: BriefcaseId;
|
|
25
28
|
}
|
|
26
|
-
interface LockStatusNone {
|
|
29
|
+
interface LockStatusNone extends LockLastReleaseChangesetIndices {
|
|
27
30
|
state: LockState.None;
|
|
28
|
-
lastCsIndex?: ChangesetIndex;
|
|
29
31
|
}
|
|
30
32
|
/** @internal exported for tests. */
|
|
31
|
-
export interface LockStatusExclusive {
|
|
33
|
+
export interface LockStatusExclusive extends LockLastReleaseChangesetIndices {
|
|
32
34
|
state: LockState.Exclusive;
|
|
33
35
|
briefcaseId: BriefcaseId;
|
|
34
|
-
lastCsIndex?: ChangesetIndex;
|
|
35
36
|
}
|
|
36
37
|
/** @internal exported for tests. */
|
|
37
|
-
export interface LockStatusShared {
|
|
38
|
+
export interface LockStatusShared extends LockLastReleaseChangesetIndices {
|
|
38
39
|
state: LockState.Shared;
|
|
39
40
|
sharedBy: Set<BriefcaseId>;
|
|
40
|
-
lastCsIndex?: ChangesetIndex;
|
|
41
41
|
}
|
|
42
42
|
interface BriefcaseIdAndChangeset {
|
|
43
43
|
changeset: ChangesetIdWithIndex;
|
|
@@ -131,11 +131,16 @@ export declare class LocalHub {
|
|
|
131
131
|
private querySharedLockHolders;
|
|
132
132
|
queryAllLocks(briefcaseId: BriefcaseId): LockProps[];
|
|
133
133
|
queryLockStatus(elementId: Id64String): LockStatus;
|
|
134
|
+
private doesBriefcaseRequirePullBeforeLock;
|
|
135
|
+
private addSharedLockRecord;
|
|
134
136
|
private reserveLock;
|
|
137
|
+
private downgradeExclusiveLockToShared;
|
|
135
138
|
private clearLock;
|
|
136
|
-
private
|
|
139
|
+
private updateLockExclusiveChangeset;
|
|
140
|
+
private updateLockSharedChangeset;
|
|
137
141
|
private requestLock;
|
|
138
142
|
private removeSharedLock;
|
|
143
|
+
private abandonLock;
|
|
139
144
|
private releaseLock;
|
|
140
145
|
/** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */
|
|
141
146
|
acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset): void;
|
|
@@ -144,10 +149,12 @@ export declare class LocalHub {
|
|
|
144
149
|
briefcaseId: BriefcaseId;
|
|
145
150
|
changesetIndex: ChangesetIndex;
|
|
146
151
|
}): void;
|
|
152
|
+
abandonLocks(locks: LockMap, arg: BriefcaseIdArg): void;
|
|
147
153
|
releaseAllLocks(arg: {
|
|
148
154
|
briefcaseId: BriefcaseId;
|
|
149
155
|
changesetIndex: ChangesetIndex;
|
|
150
156
|
}): void;
|
|
157
|
+
abandonAllLocks(arg: BriefcaseIdArg): void;
|
|
151
158
|
private countTable;
|
|
152
159
|
countSharedLocks(): number;
|
|
153
160
|
countLocks(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalHub.d.ts","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"LocalHub.d.ts","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/LocalHub.js
CHANGED
|
@@ -44,7 +44,7 @@ class LocalHub {
|
|
|
44
44
|
FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))");
|
|
45
45
|
db.executeSQL("CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)");
|
|
46
46
|
db.executeSQL("CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))");
|
|
47
|
-
db.executeSQL("CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,
|
|
47
|
+
db.executeSQL("CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastExclusiveReleaseChangesetIndex INTEGER,lastSharedReleaseChangesetIndex INTEGER,briefcaseId INTEGER)");
|
|
48
48
|
db.executeSQL("CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))");
|
|
49
49
|
db.executeSQL("CREATE INDEX LockIdx ON locks(briefcaseId)");
|
|
50
50
|
db.executeSQL("CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)");
|
|
@@ -383,21 +383,23 @@ class LocalHub {
|
|
|
383
383
|
return locks;
|
|
384
384
|
}
|
|
385
385
|
queryLockStatus(elementId) {
|
|
386
|
-
return this.db.withPreparedSqliteStatement("SELECT
|
|
386
|
+
return this.db.withPreparedSqliteStatement("SELECT lastSharedReleaseChangesetIndex,lastExclusiveReleaseChangesetIndex,level,briefcaseId FROM locks WHERE id=?", (stmt) => {
|
|
387
387
|
stmt.bindId(1, elementId);
|
|
388
388
|
const rc = stmt.step();
|
|
389
389
|
if (core_bentley_1.DbResult.BE_SQLITE_ROW !== rc)
|
|
390
390
|
return { state: core_common_1.LockState.None };
|
|
391
|
-
const
|
|
391
|
+
const lastSharedCsVal = stmt.getValue(0);
|
|
392
|
+
const lastExclusiveCsVal = stmt.getValue(1);
|
|
392
393
|
const lock = {
|
|
393
|
-
|
|
394
|
-
|
|
394
|
+
lastSharedReleaseChangesetIndex: lastSharedCsVal.isNull ? undefined : lastSharedCsVal.getInteger(),
|
|
395
|
+
lastExclusiveReleaseChangesetIndex: lastExclusiveCsVal.isNull ? undefined : lastExclusiveCsVal.getInteger(),
|
|
396
|
+
state: stmt.getValueInteger(2),
|
|
395
397
|
};
|
|
396
398
|
switch (lock.state) {
|
|
397
399
|
case core_common_1.LockState.None:
|
|
398
400
|
return lock;
|
|
399
401
|
case core_common_1.LockState.Exclusive:
|
|
400
|
-
return { ...lock, briefcaseId: stmt.getValueInteger(
|
|
402
|
+
return { ...lock, briefcaseId: stmt.getValueInteger(3) };
|
|
401
403
|
case core_common_1.LockState.Shared:
|
|
402
404
|
return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };
|
|
403
405
|
default:
|
|
@@ -405,9 +407,37 @@ class LocalHub {
|
|
|
405
407
|
}
|
|
406
408
|
});
|
|
407
409
|
}
|
|
410
|
+
doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase) {
|
|
411
|
+
if (props.state === core_common_1.LockState.None)
|
|
412
|
+
return false;
|
|
413
|
+
const briefcaseChangesetIndex = this.getIndexFromChangeset(briefcase.changeset);
|
|
414
|
+
const exclusiveIndexIsNewer = currStatus.lastExclusiveReleaseChangesetIndex !== undefined &&
|
|
415
|
+
currStatus.lastExclusiveReleaseChangesetIndex > briefcaseChangesetIndex;
|
|
416
|
+
if (props.state === core_common_1.LockState.Shared) {
|
|
417
|
+
// To acquire a shared lock, the briefcase must at least at the latest exclusive changeset index
|
|
418
|
+
return exclusiveIndexIsNewer;
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
(0, core_bentley_1.assert)(props.state === core_common_1.LockState.Exclusive);
|
|
422
|
+
const sharedIndexIsNewer = currStatus.lastSharedReleaseChangesetIndex !== undefined &&
|
|
423
|
+
currStatus.lastSharedReleaseChangesetIndex > briefcaseChangesetIndex;
|
|
424
|
+
// To acquire the exclusive lock the briefcase must be at least at the greater of the two last-indexes
|
|
425
|
+
return exclusiveIndexIsNewer || sharedIndexIsNewer;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
addSharedLockRecord(lockId, briefcaseId) {
|
|
429
|
+
this.db.withPreparedSqliteStatement("INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?) ON CONFLICT(lockId,briefcaseId) DO NOTHING", (stmt) => {
|
|
430
|
+
stmt.bindId(1, lockId);
|
|
431
|
+
stmt.bindInteger(2, briefcaseId);
|
|
432
|
+
const rc = stmt.step();
|
|
433
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
434
|
+
throw new core_common_1.IModelError(rc, "cannot insert shared lock");
|
|
435
|
+
});
|
|
436
|
+
}
|
|
408
437
|
reserveLock(currStatus, props, briefcase) {
|
|
409
|
-
if (
|
|
438
|
+
if (this.doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase)) {
|
|
410
439
|
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.PullIsRequired, "pull is required to obtain lock");
|
|
440
|
+
}
|
|
411
441
|
const wantShared = props.state === core_common_1.LockState.Shared;
|
|
412
442
|
if (wantShared && (currStatus.state === core_common_1.LockState.Exclusive))
|
|
413
443
|
throw new Error("cannot acquire shared lock because an exclusive lock is already held");
|
|
@@ -420,15 +450,26 @@ class LocalHub {
|
|
|
420
450
|
throw new core_common_1.IModelError(rc, "cannot insert lock");
|
|
421
451
|
});
|
|
422
452
|
if (wantShared) {
|
|
423
|
-
this.
|
|
424
|
-
stmt.bindId(1, props.id);
|
|
425
|
-
stmt.bindInteger(2, briefcase.briefcaseId);
|
|
426
|
-
const rc = stmt.step();
|
|
427
|
-
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
428
|
-
throw new core_common_1.IModelError(rc, "cannot insert shared lock");
|
|
429
|
-
});
|
|
453
|
+
this.addSharedLockRecord(props.id, briefcase.briefcaseId);
|
|
430
454
|
}
|
|
431
455
|
}
|
|
456
|
+
downgradeExclusiveLockToShared(lockId, briefcaseId) {
|
|
457
|
+
this.db.withPreparedSqliteStatement("UPDATE locks SET level=1,briefcaseId=NULL WHERE id=? AND briefcaseId=? AND level=2", (stmt) => {
|
|
458
|
+
stmt.bindId(1, lockId);
|
|
459
|
+
stmt.bindInteger(2, briefcaseId);
|
|
460
|
+
const rc = stmt.step();
|
|
461
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
462
|
+
throw new core_common_1.IModelError(rc, "can't downgrade lock");
|
|
463
|
+
});
|
|
464
|
+
// Verify that the above actually updated a row. If it didn't, something has gone wrong with the downgrade.
|
|
465
|
+
// This shouldn't happen.
|
|
466
|
+
this.db.withPreparedSqliteStatement("SELECT CHANGES()", (stmt) => {
|
|
467
|
+
stmt.step();
|
|
468
|
+
if (stmt.getValueInteger(0) !== 1)
|
|
469
|
+
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase or lock is not exclusive");
|
|
470
|
+
});
|
|
471
|
+
this.addSharedLockRecord(lockId, briefcaseId);
|
|
472
|
+
}
|
|
432
473
|
clearLock(id) {
|
|
433
474
|
this.db.withPreparedSqliteStatement("UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?", (stmt) => {
|
|
434
475
|
stmt.bindId(1, id);
|
|
@@ -437,15 +478,26 @@ class LocalHub {
|
|
|
437
478
|
throw new core_common_1.IModelError(rc, "can't release lock");
|
|
438
479
|
});
|
|
439
480
|
}
|
|
440
|
-
|
|
481
|
+
updateLockExclusiveChangeset(id, index) {
|
|
441
482
|
if (index <= 0)
|
|
442
483
|
return;
|
|
443
|
-
this.db.withPreparedSqliteStatement("UPDATE locks SET
|
|
484
|
+
this.db.withPreparedSqliteStatement("UPDATE locks SET lastExclusiveReleaseChangesetIndex=? WHERE id=?", (stmt) => {
|
|
444
485
|
stmt.bindInteger(1, index);
|
|
445
486
|
stmt.bindId(2, id);
|
|
446
487
|
const rc = stmt.step();
|
|
447
488
|
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
448
|
-
throw new core_common_1.IModelError(rc, "can't update lock changeSetId");
|
|
489
|
+
throw new core_common_1.IModelError(rc, "can't update lock exclusive changeSetId");
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
updateLockSharedChangeset(id, index) {
|
|
493
|
+
if (index <= 0)
|
|
494
|
+
return;
|
|
495
|
+
this.db.withPreparedSqliteStatement("UPDATE locks SET lastSharedReleaseChangesetIndex=? WHERE id=?", (stmt) => {
|
|
496
|
+
stmt.bindInteger(1, index);
|
|
497
|
+
stmt.bindId(2, id);
|
|
498
|
+
const rc = stmt.step();
|
|
499
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
500
|
+
throw new core_common_1.IModelError(rc, "can't update lock shared changeSetId");
|
|
449
501
|
});
|
|
450
502
|
}
|
|
451
503
|
requestLock(props, briefcase) {
|
|
@@ -485,23 +537,58 @@ class LocalHub {
|
|
|
485
537
|
throw new core_common_1.IModelError(rc, "can't remove shared lock");
|
|
486
538
|
});
|
|
487
539
|
}
|
|
488
|
-
|
|
540
|
+
abandonLock(props, briefcase) {
|
|
541
|
+
// When abandoning (but not when releasing), props.state indicates which
|
|
542
|
+
// state we're abandoning _to_. Specifically, an Exclusive lock can be
|
|
543
|
+
// abandoned to either Shared or None.
|
|
544
|
+
// It makes no sense to abandon a lock _to_ the Exclusive state.
|
|
545
|
+
if (props.state === core_common_1.LockState.Exclusive)
|
|
546
|
+
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.InvalidArgumentError, "must specify Shared or None when abandoning a lock");
|
|
489
547
|
const lockId = props.id;
|
|
490
|
-
const
|
|
491
|
-
switch (
|
|
548
|
+
const previousLockStatus = this.queryLockStatus(lockId);
|
|
549
|
+
switch (previousLockStatus.state) {
|
|
550
|
+
case core_common_1.LockState.None:
|
|
551
|
+
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "lock not held");
|
|
552
|
+
case core_common_1.LockState.Exclusive:
|
|
553
|
+
if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)
|
|
554
|
+
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase");
|
|
555
|
+
if (props.state === core_common_1.LockState.Shared) {
|
|
556
|
+
// Exclusive -> Shared
|
|
557
|
+
this.downgradeExclusiveLockToShared(lockId, briefcase.briefcaseId);
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
// Exclusive -> None
|
|
561
|
+
this.clearLock(lockId);
|
|
562
|
+
}
|
|
563
|
+
break;
|
|
564
|
+
case core_common_1.LockState.Shared:
|
|
565
|
+
if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))
|
|
566
|
+
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "shared lock not held by this briefcase");
|
|
567
|
+
this.removeSharedLock(lockId, briefcase.briefcaseId);
|
|
568
|
+
if (previousLockStatus.sharedBy.size === 1)
|
|
569
|
+
this.clearLock(lockId);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
releaseLock(props, briefcase) {
|
|
573
|
+
// Unlike abandonLock above, release always releases the lock all the way back to the None state.
|
|
574
|
+
// So we ignore props.state. There's no such thing as a "downgrade" here.
|
|
575
|
+
const lockId = props.id;
|
|
576
|
+
const previousLockStatus = this.queryLockStatus(lockId);
|
|
577
|
+
switch (previousLockStatus.state) {
|
|
492
578
|
case core_common_1.LockState.None:
|
|
493
579
|
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "lock not held");
|
|
494
580
|
case core_common_1.LockState.Exclusive:
|
|
495
|
-
if (
|
|
581
|
+
if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)
|
|
496
582
|
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase");
|
|
497
|
-
this.
|
|
583
|
+
this.updateLockExclusiveChangeset(lockId, briefcase.changesetIndex);
|
|
498
584
|
this.clearLock(lockId);
|
|
499
585
|
break;
|
|
500
586
|
case core_common_1.LockState.Shared:
|
|
501
|
-
if (!
|
|
587
|
+
if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))
|
|
502
588
|
throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "shared lock not held by this briefcase");
|
|
503
|
-
this.
|
|
504
|
-
|
|
589
|
+
this.updateLockSharedChangeset(lockId, briefcase.changesetIndex);
|
|
590
|
+
this.removeSharedLock(lockId, briefcase.briefcaseId);
|
|
591
|
+
if (previousLockStatus.sharedBy.size === 1)
|
|
505
592
|
this.clearLock(lockId);
|
|
506
593
|
}
|
|
507
594
|
}
|
|
@@ -527,10 +614,20 @@ class LocalHub {
|
|
|
527
614
|
this.releaseLock(props, arg);
|
|
528
615
|
this.db.saveChanges();
|
|
529
616
|
}
|
|
617
|
+
abandonLocks(locks, arg) {
|
|
618
|
+
for (const props of locks)
|
|
619
|
+
this.abandonLock({ id: props[0], state: props[1] }, arg);
|
|
620
|
+
this.db.saveChanges();
|
|
621
|
+
}
|
|
530
622
|
releaseAllLocks(arg) {
|
|
531
623
|
const locks = this.queryAllLocks(arg.briefcaseId);
|
|
532
624
|
this.releaseLocks(locks, arg);
|
|
533
625
|
}
|
|
626
|
+
abandonAllLocks(arg) {
|
|
627
|
+
const locks = new Map();
|
|
628
|
+
this.queryAllLocks(arg.briefcaseId).forEach(lock => locks.set(lock.id, core_common_1.LockState.None));
|
|
629
|
+
this.abandonLocks(locks, arg);
|
|
630
|
+
}
|
|
534
631
|
countTable(tableName) {
|
|
535
632
|
return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {
|
|
536
633
|
stmt.step();
|
|
@@ -553,13 +650,14 @@ class LocalHub {
|
|
|
553
650
|
// for debugging
|
|
554
651
|
queryLocks() {
|
|
555
652
|
const locks = [];
|
|
556
|
-
this.db.withPreparedSqliteStatement("SELECT id,level,
|
|
653
|
+
this.db.withPreparedSqliteStatement("SELECT id,level,lastExclusiveReleaseChangesetIndex,lastSharedReleaseChangesetIndex,briefcaseId FROM locks", (stmt) => {
|
|
557
654
|
while (core_bentley_1.DbResult.BE_SQLITE_ROW === stmt.step())
|
|
558
655
|
locks.push({
|
|
559
656
|
id: stmt.getValueId(0),
|
|
560
657
|
level: stmt.getValueInteger(1),
|
|
561
|
-
|
|
562
|
-
|
|
658
|
+
lastExclusiveReleaseChangesetIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),
|
|
659
|
+
lastSharedReleaseChangesetIndex: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),
|
|
660
|
+
briefcaseId: stmt.getValue(4).isNull ? undefined : stmt.getValueInteger(4),
|
|
563
661
|
});
|
|
564
662
|
});
|
|
565
663
|
return locks;
|