Fixing bug on collection deletion
Extending Admin Interface Adding cleanup procedure, that clears undeleted collection data
This commit is contained in:
@ -3,6 +3,7 @@ import Settings from "../settings";
|
||||
import getLevelDB, { LevelDB, deleteLevelDB } from "../storage";
|
||||
import DocumentLock from "./lock";
|
||||
import { DocumentQuery, CollectionQuery, Query } from "./query";
|
||||
import Logging from "@hibas123/nodelogging";
|
||||
|
||||
export class DatabaseManager {
|
||||
static databases = new Map<string, Database>();
|
||||
@ -116,4 +117,105 @@ export class Database {
|
||||
async stop() {
|
||||
await this.data.close();
|
||||
}
|
||||
|
||||
public async runCleanup() {
|
||||
const should = await new Promise<Set<string>>((yes, no) => {
|
||||
const stream = this.collections.iterator({
|
||||
keyAsBuffer: false,
|
||||
valueAsBuffer: false
|
||||
})
|
||||
|
||||
const collections = new Set<string>();
|
||||
const onValue = (err: Error, key: string, value: string) => {
|
||||
if (err) {
|
||||
Logging.error(err);
|
||||
stream.end((err) => Logging.error(err))
|
||||
no(err);
|
||||
}
|
||||
|
||||
if (!key && !value) {
|
||||
yes(collections);
|
||||
} else {
|
||||
collections.add(value)
|
||||
stream.next(onValue);
|
||||
}
|
||||
}
|
||||
|
||||
stream.next(onValue);
|
||||
})
|
||||
|
||||
const existing = await new Promise<Set<string>>((yes, no) => {
|
||||
const stream = this.data.iterator({
|
||||
keyAsBuffer: false,
|
||||
values: false
|
||||
})
|
||||
|
||||
const collections = new Set<string>();
|
||||
const onValue = (err: Error, key: string, value: Buffer) => {
|
||||
if (err) {
|
||||
Logging.error(err);
|
||||
stream.end((err) => Logging.error(err))
|
||||
no(err);
|
||||
}
|
||||
|
||||
if (!key && !value) {
|
||||
yes(collections);
|
||||
} else {
|
||||
let coll = key.split("/")[0];
|
||||
collections.add(coll)
|
||||
stream.next(onValue);
|
||||
}
|
||||
}
|
||||
|
||||
stream.next(onValue);
|
||||
})
|
||||
|
||||
const toDelete = new Set<string>();
|
||||
existing.forEach(collection => {
|
||||
if (!should.has(collection))
|
||||
toDelete.add(collection);
|
||||
})
|
||||
|
||||
for (let collection of toDelete) {
|
||||
const batch = this.data.batch();
|
||||
|
||||
let gt = Buffer.from(collection + "/ ");
|
||||
gt[gt.length - 1] = 0;
|
||||
|
||||
let lt = Buffer.alloc(gt.length);
|
||||
lt.set(gt);
|
||||
lt[gt.length - 1] = 0xFF;
|
||||
|
||||
await new Promise<void>((yes, no) => {
|
||||
const stream = this.data.iterator({
|
||||
keyAsBuffer: false,
|
||||
values: false,
|
||||
gt,
|
||||
lt
|
||||
})
|
||||
|
||||
const onValue = (err: Error, key: string, value: Buffer) => {
|
||||
if (err) {
|
||||
Logging.error(err);
|
||||
stream.end((err) => Logging.error(err))
|
||||
no(err);
|
||||
}
|
||||
|
||||
if (!key && !value) {
|
||||
yes();
|
||||
} else {
|
||||
batch.del(key);
|
||||
stream.next(onValue);
|
||||
}
|
||||
}
|
||||
|
||||
stream.next(onValue);
|
||||
})
|
||||
|
||||
await batch.write();
|
||||
}
|
||||
|
||||
return Array.from(toDelete.values());
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user