aboutsummaryrefslogtreecommitdiff
path: root/src/api/utils/rehashDatabase.js
blob: c8640ae18ef87d72bd71ad5d92f5e795549dc4ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
require('dotenv').config();
const blake3 = require('blake3');
const path = require('path');
const fs = require('fs');
const db = require('knex')({
	client: 'sqlite3',
	connection: {
		filename: path.join(__dirname, '../../../database/', 'database.sqlite')
	}
});

const start = async () => {
	const hrstart = process.hrtime();
	const uploads = await db.table('files')
		.select('id', 'name', 'hash');
	console.log(`Uploads : ${uploads.length}`);


	let done = 0;
	const printProgress = () => {
		console.log(`PROGRESS: ${done}/${uploads.length}`);
		if (done >= uploads.length) clearInterval(progressInterval); // eslint-disable-line no-use-before-define
	};
	const progressInterval = setInterval(printProgress, 1000);
	printProgress();

	for (const upload of uploads) {
		await new Promise((resolve, reject) => {
			fs.createReadStream(path.join(__dirname, '../../../uploads', upload.name))
				.on('error', reject)
				.pipe(blake3.createHash())
				.on('error', reject)
				.on('data', async source => {
					const hash = source.toString('hex');
					console.log(`${upload.name}: ${hash}`);
					await db.table('files')
						.update('hash', hash)
						.where('id', upload.id);
					done++;
					resolve();
				});
		}).catch(error => {
			console.log(`${upload.name}: ${error.toString()}`);
		});
	}

	clearInterval(progressInterval);
	printProgress();

	const hrend = process.hrtime(hrstart);
	console.log(`Done in : ${(hrend[0] + (hrend[1] / 1e9)).toFixed(4)}s`);
	process.exit(0);
};

start();