@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.
Files changed (71) hide show
  1. package/lib/cjs/IModelDb.d.ts.map +1 -1
  2. package/lib/cjs/IModelDb.js +0 -3
  3. package/lib/cjs/IModelDb.js.map +1 -1
  4. package/lib/cjs/LocalHub.d.ts +17 -10
  5. package/lib/cjs/LocalHub.d.ts.map +1 -1
  6. package/lib/cjs/LocalHub.js +126 -28
  7. package/lib/cjs/LocalHub.js.map +1 -1
  8. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
  9. package/lib/cjs/internal/workspace/SettingsDbImpl.js +2 -0
  10. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -1
  11. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  12. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  13. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  14. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  15. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -3
  16. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  17. package/lib/cjs/internal/workspace/SettingsImpl.js +4 -250
  18. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  19. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  20. package/lib/cjs/internal/workspace/WorkspaceImpl.js +13 -11
  21. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  22. package/lib/cjs/workspace/SettingsEditor.d.ts +4 -0
  23. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
  24. package/lib/cjs/workspace/SettingsEditor.js +7 -5
  25. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  26. package/lib/cjs/workspace/Workspace.d.ts +3 -1
  27. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  28. package/lib/cjs/workspace/Workspace.js.map +1 -1
  29. package/lib/cjs/workspace/WorkspaceEditor.d.ts +4 -1
  30. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  31. package/lib/cjs/workspace/WorkspaceEditor.js +2 -0
  32. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  33. package/lib/esm/IModelDb.d.ts.map +1 -1
  34. package/lib/esm/IModelDb.js +0 -3
  35. package/lib/esm/IModelDb.js.map +1 -1
  36. package/lib/esm/LocalHub.d.ts +17 -10
  37. package/lib/esm/LocalHub.d.ts.map +1 -1
  38. package/lib/esm/LocalHub.js +127 -29
  39. package/lib/esm/LocalHub.js.map +1 -1
  40. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
  41. package/lib/esm/internal/workspace/SettingsDbImpl.js +2 -0
  42. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -1
  43. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  44. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  45. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  46. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  47. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -3
  48. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  49. package/lib/esm/internal/workspace/SettingsImpl.js +5 -251
  50. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  51. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  52. package/lib/esm/internal/workspace/WorkspaceImpl.js +13 -11
  53. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  54. package/lib/esm/test/standalone/HubMock.test.js +177 -7
  55. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  56. package/lib/esm/test/standalone/Workspace.test.js +100 -0
  57. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  58. package/lib/esm/test/workspace/SettingsDb.test.js +95 -2
  59. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  60. package/lib/esm/workspace/SettingsEditor.d.ts +4 -0
  61. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
  62. package/lib/esm/workspace/SettingsEditor.js +6 -4
  63. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  64. package/lib/esm/workspace/Workspace.d.ts +3 -1
  65. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  66. package/lib/esm/workspace/Workspace.js.map +1 -1
  67. package/lib/esm/workspace/WorkspaceEditor.d.ts +4 -1
  68. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  69. package/lib/esm/workspace/WorkspaceEditor.js +2 -0
  70. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  71. package/package.json +13 -13
@@ -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 LocksEntry {
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 updateLockChangeset;
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":"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"}
1
+ {"version":3,"file":"LocalHub.d.ts","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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"}
@@ -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,lastCSetIndex INTEGER,briefcaseId INTEGER)");
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 lastCSetIndex,level,briefcaseId FROM locks WHERE id=?", (stmt) => {
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 lastCsVal = stmt.getValue(0);
391
+ const lastSharedCsVal = stmt.getValue(0);
392
+ const lastExclusiveCsVal = stmt.getValue(1);
392
393
  const lock = {
393
- lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),
394
- state: stmt.getValueInteger(1),
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(2) };
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 (props.state === core_common_1.LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))
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.db.withPreparedSqliteStatement("INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)", (stmt) => {
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
- updateLockChangeset(id, index) {
481
+ updateLockExclusiveChangeset(id, index) {
441
482
  if (index <= 0)
442
483
  return;
443
- this.db.withPreparedSqliteStatement("UPDATE locks SET lastCSetIndex=? WHERE id=?", (stmt) => {
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
- releaseLock(props, arg) {
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 lockStatus = this.queryLockStatus(lockId);
491
- switch (lockStatus.state) {
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 (lockStatus.briefcaseId !== arg.briefcaseId)
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.updateLockChangeset(lockId, arg.changesetIndex);
583
+ this.updateLockExclusiveChangeset(lockId, briefcase.changesetIndex);
498
584
  this.clearLock(lockId);
499
585
  break;
500
586
  case core_common_1.LockState.Shared:
501
- if (!lockStatus.sharedBy.has(arg.briefcaseId))
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.removeSharedLock(lockId, arg.briefcaseId);
504
- if (lockStatus.sharedBy.size === 1)
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,lastCSetIndex,briefcaseId FROM locks", (stmt) => {
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
- lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),
562
- briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),
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;