[feat] database backups

This commit is contained in:
kwaroran
2023-05-25 21:32:06 +09:00
parent 3246a4511c
commit a585ce8ea6

View File

@@ -206,15 +206,48 @@ export async function saveDb(){
await forageStorage.setItem('database/database.bin', dbData)
await forageStorage.setItem(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData)
}
await getDbBackups()
}
await sleep(500)
}
}
async function getDbBackups() {
if(isTauri){
const keys = await readDir('database', {dir: BaseDirectory.AppData})
let backups:number[] = []
for(const key of keys){
if(key.name.startsWith("dbbackup-")){
let da = key.name.substring(9)
da = da.substring(0,da.length-4)
backups.push(parseInt(da))
}
}
backups.sort((a, b) => b - a)
while(backups.length > 20){
const last = backups.pop()
await removeFile(`database/dbbackup-${last}.bin`,{dir: BaseDirectory.AppData})
}
return backups
}
else{
const keys = await forageStorage.keys()
let backups:number[] = []
for(const key of keys){
if(key.startsWith("database/dbbackup-")){
let da = key.substring(18)
da = da.substring(0,da.length-4)
backups.push(parseInt(da))
}
}
console.log(backups)
while(backups.length > 20){
const last = backups.pop()
await forageStorage.removeItem(`database/dbbackup-${last}.bin`)
}
return backups
}
}
let usingSw = false
@@ -239,9 +272,26 @@ export async function loadData() {
pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8'))
,{dir: BaseDirectory.AppData})
}
setDatabase(
JSON.parse(Buffer.from(pako.inflate(Buffer.from(await readBinaryFile('database/database.bin',{dir: BaseDirectory.AppData})))).toString('utf-8'))
)
try {
setDatabase(
JSON.parse(Buffer.from(pako.inflate(Buffer.from(await readBinaryFile('database/database.bin',{dir: BaseDirectory.AppData})))).toString('utf-8'))
)
} catch (error) {
const backups = await getDbBackups()
let backupLoaded = false
for(const backup of backups){
try {
const backupData = await readBinaryFile(`database/dbbackup-${backup}.bin`,{dir: BaseDirectory.AppData})
setDatabase(
JSON.parse(Buffer.from(pako.inflate(Buffer.from(backupData))).toString('utf-8'))
)
backupLoaded = true
} catch (error) {}
}
if(!backupLoaded){
throw "Your save file is corrupted"
}
}
await checkUpdate()
await changeFullscreen()
@@ -252,9 +302,26 @@ export async function loadData() {
gotStorage = pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8'))
await forageStorage.setItem('database/database.bin', gotStorage)
}
setDatabase(
JSON.parse(Buffer.from(pako.inflate(Buffer.from(gotStorage))).toString('utf-8'))
)
try {
setDatabase(
JSON.parse(Buffer.from(pako.inflate(Buffer.from(gotStorage))).toString('utf-8'))
)
} catch (error) {
const backups = await getDbBackups()
let backupLoaded = false
for(const backup of backups){
try {
const backupData:Uint8Array = await forageStorage.getItem(`database/dbbackup-${backup}.bin`)
setDatabase(
JSON.parse(Buffer.from(pako.inflate(Buffer.from(backupData))).toString('utf-8'))
)
backupLoaded = true
} catch (error) {}
}
if(!backupLoaded){
throw "Your save file is corrupted"
}
}
const isDriverMode = await checkDriverInit()
if(isDriverMode){
return