Add ensureConsistency to DB
This commit is contained in:
parent
dc31afd907
commit
453f33817b
1 changed files with 27 additions and 0 deletions
|
|
@ -17,6 +17,7 @@ export interface StoredDatabase {
|
||||||
|
|
||||||
export class Database {
|
export class Database {
|
||||||
private documents = new Map<RelativePath, DocumentMetadata>();
|
private documents = new Map<RelativePath, DocumentMetadata>();
|
||||||
|
|
||||||
private lastSeenUpdateId: VaultUpdateId | undefined;
|
private lastSeenUpdateId: VaultUpdateId | undefined;
|
||||||
|
|
||||||
public constructor(
|
public constructor(
|
||||||
|
|
@ -32,6 +33,8 @@ export class Database {
|
||||||
this.documents.set(relativePath, metadata);
|
this.documents.set(relativePath, metadata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.ensureConsistency();
|
||||||
|
|
||||||
this.logger.debug(`Loaded ${this.documents.size} documents`);
|
this.logger.debug(`Loaded ${this.documents.size} documents`);
|
||||||
|
|
||||||
this.lastSeenUpdateId = initialState.lastSeenUpdateId;
|
this.lastSeenUpdateId = initialState.lastSeenUpdateId;
|
||||||
|
|
@ -128,9 +131,33 @@ export class Database {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async save(): Promise<void> {
|
private async save(): Promise<void> {
|
||||||
|
this.ensureConsistency();
|
||||||
await this.saveData({
|
await this.saveData({
|
||||||
documents: Object.fromEntries(this.documents.entries()),
|
documents: Object.fromEntries(this.documents.entries()),
|
||||||
lastSeenUpdateId: this.lastSeenUpdateId
|
lastSeenUpdateId: this.lastSeenUpdateId
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ensureConsistency(): void {
|
||||||
|
const allMetadata = Array.from(this.documents.entries());
|
||||||
|
const idToPath = new Map<string, Array<string>>();
|
||||||
|
|
||||||
|
allMetadata.forEach(([name, metadata]) => {
|
||||||
|
idToPath.set(metadata.documentId, [
|
||||||
|
...(idToPath.get(metadata.documentId) ?? []),
|
||||||
|
name
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
const duplicates = Array.from(idToPath.entries())
|
||||||
|
.filter(([_, paths]) => paths.length > 1)
|
||||||
|
.map(([id, paths]) => `${id} (${paths.join(", ")})`);
|
||||||
|
|
||||||
|
if (duplicates.length > 0) {
|
||||||
|
throw new Error(
|
||||||
|
"Document IDs are not unique, found duplicates: " +
|
||||||
|
duplicates.join("; ")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue