From e548326977cee6a49343a1313c4c677e7a2d40e5 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Fri, 12 Jul 2024 01:11:32 +0800 Subject: [PATCH] update: logic of loading data --- src/lib/server/database/loadData.ts | 32 ++++++++++++++----------- src/lib/server/dirHash.ts | 36 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 src/lib/server/dirHash.ts diff --git a/src/lib/server/database/loadData.ts b/src/lib/server/database/loadData.ts index e00f4bb..ad1848a 100644 --- a/src/lib/server/database/loadData.ts +++ b/src/lib/server/database/loadData.ts @@ -1,33 +1,39 @@ import fs from 'fs'; import { globalMemoryStorage, songData, songNameCache } from '$lib/server/cache.js'; +import { getDirectoryHash } from '../dirHash'; + +const dataPath = './data/song/'; export async function loadData() { - const LastLoaded: number | undefined = globalMemoryStorage.get("lastLoadData"); + const LastLoaded: number | undefined = globalMemoryStorage.get('lastLoadData'); + const LastHash: string | undefined = globalMemoryStorage.get('lastDataDirHash'); const currentTime = new Date().getTime(); + const currentHash = getDirectoryHash(dataPath); // Already loaded. - if (LastLoaded && currentTime - LastLoaded < 3600) { + if (LastLoaded && LastHash && currentTime - LastLoaded < 120 * 1000 && currentHash === LastHash) { return; } - const dataPath = "./data/song/"; - const songList = fs.readdirSync(dataPath) - .map(fileName => { - if (fileName.endsWith(".json")) - return fileName.slice(0, fileName.length - 5); + const songList = fs + .readdirSync(dataPath) + .map((fileName) => { + if (fileName.endsWith('.json')) return fileName.slice(0, fileName.length - 5); else return null; }) - .filter(fileName => fileName !== null); + .filter((fileName) => fileName !== null); + songData.flushAll(); + songNameCache.flushAll(); for (const songID of songList) { try { - const fileContentString = fs.readFileSync(dataPath + songID + ".json").toString(); + const fileContentString = fs.readFileSync(dataPath + songID + '.json').toString(); const data = JSON.parse(fileContentString); songData.set(songID, data); const metadata: MusicMetadata = data; songNameCache.set(metadata.name, metadata); - } - catch { + } catch { console.error(`[load-song-data] Could not load song ID ${songID}`); } } - globalMemoryStorage.set("lastLoadData", new Date().getTime()); -} \ No newline at end of file + globalMemoryStorage.set('lastLoadData', new Date().getTime()); + globalMemoryStorage.set('lastDataDirHash', getDirectoryHash(dataPath)); +} diff --git a/src/lib/server/dirHash.ts b/src/lib/server/dirHash.ts new file mode 100644 index 0000000..856ca5c --- /dev/null +++ b/src/lib/server/dirHash.ts @@ -0,0 +1,36 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as crypto from 'crypto'; + +// Function to get hash for a given directory +export function getDirectoryHash(dir: string): string { + const fileDetails: string[] = []; + + // Recursive function to traverse the directory + function traverseDirectory(currentDir: string): void { + const files = fs.readdirSync(currentDir); + + files.forEach(file => { + const filePath = path.join(currentDir, file); + const stats = fs.statSync(filePath); + + if (stats.isDirectory()) { + traverseDirectory(filePath); + } else { + // Collect file path and last modification time + fileDetails.push(`${filePath}:${stats.mtimeMs}`); + } + }); + } + + traverseDirectory(dir); + + // Sort file details to ensure consistent hash + fileDetails.sort(); + + // Create hash from file details + const hash = crypto.createHash('sha256'); + hash.update(fileDetails.join('|')); + + return hash.digest('hex'); +} \ No newline at end of file