diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index d76743250..47e6bc89f 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.32.12", + "version": "2.32.13", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/entry/common.ts b/packages/hydrooj/src/entry/common.ts index 323e8baf4..d8f22a642 100644 --- a/packages/hydrooj/src/entry/common.ts +++ b/packages/hydrooj/src/entry/common.ts @@ -31,6 +31,7 @@ export const builtinHandler = [ export const builtinScript = [ 'rating', 'problemStat', 'blacklist', 'deleteUser', 'updateFilelist', + 'storageUsage', ]; function getFiles(folder: string, base = ''): string[] { diff --git a/packages/hydrooj/src/script/storageUsage.ts b/packages/hydrooj/src/script/storageUsage.ts new file mode 100644 index 000000000..a4b165214 --- /dev/null +++ b/packages/hydrooj/src/script/storageUsage.ts @@ -0,0 +1,41 @@ +/* eslint-disable no-await-in-loop */ +import { STATUS } from '../model/builtin'; +import storage from '../model/storage'; + +export const description = 'Calculate storage usage'; + +export async function run(_: {}, report: Function) { + const cursor = storage.coll.find({ path: { $regex: /^problem\//i } }).sort({ path: 1 }); + const count = await cursor.count(); + report({ message: `Total ${count} files` }); + let current: string; + let memory = 0; + let start = new Date().getTime(); + // eslint-disable-next-line no-constant-condition + while (true) { + const doc = await cursor.next(); + const id = doc?.path.split('problem/')[1].split('/')[0]!; + if (!current) current = id; + if (!doc || current !== id) { + const end = new Date().getTime(); + report({ + case: { + message: current, + memory: Math.floor(memory / 102.4) / 10, + time: end - start, + status: STATUS.STATUS_ACCEPTED, + score: 0, + }, + }); + start = end; + memory = 0; + current = id; + if (!doc) break; + } + memory += doc.size || 0; + } +} + +export const validate = {}; + +global.Hydro.script.storageUsage = { run, description, validate };