Switch auto-backup to indexedDB

This commit is contained in:
JannisX11 2024-03-02 20:05:30 +01:00
parent 90634b07cc
commit 8a524bd776
5 changed files with 123 additions and 20 deletions

View File

@ -655,6 +655,7 @@ async function closeBlockbenchWindow() {
for (let project of ModelProject.all.slice()) {
project.closeOnQuit();
}
AutoBackup.removeAllBackups();
if (Blockbench.hasFlag('update_downloaded')) {
await new Promise(resolve => {
Blockbench.showMessageBox({

View File

@ -129,7 +129,7 @@ function addStartScreenSection(id, data) {
}
}
onVueSetup(function() {
onVueSetup(async function() {
StateMemory.init('start_screen_list_type', 'string')
let slideshow_timer = 0;
@ -495,8 +495,8 @@ onVueSetup(function() {
}
//Backup Model
if (localStorage.getItem('backup_model') && (!isApp || !currentwindow.webContents.second_instance) && localStorage.getItem('backup_model').length > 40) {
var backup_models = localStorage.getItem('backup_model')
let has_backups = await AutoBackup.hasBackups();
if (has_backups && (!isApp || !currentwindow.webContents.second_instance)) {
let section = addStartScreenSection({
color: 'var(--color-back)',
@ -506,18 +506,11 @@ onVueSetup(function() {
{type: 'h2', text: tl('message.recover_backup.title')},
{text: tl('message.recover_backup.message')},
{type: 'button', text: tl('message.recover_backup.recover'), click: (e) => {
let parsed_backup_models = JSON.parse(backup_models);
for (let uuid in parsed_backup_models) {
AutoBackupModels[uuid] = parsed_backup_models[uuid];
let model = parsed_backup_models[uuid];
setupProject(Formats[model.meta.model_format] || Formats.free, uuid);
Codecs.project.parse(model, 'backup.bbmodel')
}
AutoBackup.recoverAllBackups();
section.delete();
}},
{type: 'button', text: tl('dialog.discard'), click: (e) => {
localStorage.removeItem('backup_model');
AutoBackup.removeAllBackups();
section.delete();
}}
]

View File

@ -349,8 +349,6 @@ class ModelProject {
} catch (err) {
console.error(err);
}
delete AutoBackupModels[this.uuid];
localStorage.setItem('backup_model', JSON.stringify(AutoBackupModels));
if (this.EditSession) {
this.EditSession.quit();
}
@ -431,8 +429,7 @@ class ModelProject {
delete ProjectData[this.uuid];
Project = 0;
delete AutoBackupModels[this.uuid];
localStorage.setItem('backup_model', JSON.stringify(AutoBackupModels));
await AutoBackup.removeBackup(this.uuid);
if (last_selected && last_selected !== this) {
last_selected.select();

View File

@ -232,14 +232,124 @@ function unselectAll() {
}
//Backup
const AutoBackupModels = {};
const AutoBackup = {
/**
* IndexedDB Database
* @type {IDBDatabase}
*/
db: null,
initialize() {
let request = indexedDB.open('auto_backups', 1);
request.onerror = function(e) {
console.error('Failed to load backup database', e);
}
request.onblocked = function(e) {
console.error('Another instance of Blockbench is opened, the backup database cannot be upgraded at the moment');
}
request.onupgradeneeded = function() {
let db = request.result;
let store = db.createObjectStore('projects', {keyPath: 'uuid'});
// Legacy system
let backup_models = localStorage.getItem('backup_model')
if (backup_models) {
let parsed_backup_models = JSON.parse(backup_models);
for (let uuid in parsed_backup_models) {
let model = JSON.stringify(parsed_backup_models[uuid]);
store.put({uuid, data: model});
}
console.log(`Upgraded ${Object.keys(parsed_backup_models).length} project back-ups to indexedDB`);
}
}
request.onsuccess = function() {
AutoBackup.db = request.result;
}
},
async backupOpenProject() {
if (!Project) return;
let transaction = AutoBackup.db.transaction('projects', 'readwrite');
let store = transaction.objectStore('projects');
let model = Codecs.project.compile({compressed: false, backup: true, raw: false});
store.put({uuid: Project.uuid, data: model});
await new Promise((resolve) => {
transaction.oncomplete = resolve;
})
},
async hasBackups() {
let transaction = AutoBackup.db.transaction('projects', 'readonly');
let store = transaction.objectStore('projects');
return await new Promise(resolve => {
let request = store.count();
request.onsuccess = function() {
resolve(!!request.result);
}
request.onerror = function(e) {
console.error(e);
resolve(false);
}
})
},
recoverAllBackups() {
let transaction = AutoBackup.db.transaction('projects', 'readonly');
let store = transaction.objectStore('projects');
let request = store.getAll();
request.onsuccess = function() {
let projects = request.result;
for (let project of projects) {
let parsed_content = JSON.parse(project.data);
setupProject(Formats[parsed_content.meta.model_format] || Formats.free, project.uuid);
Codecs.project.parse(parsed_content, 'backup.bbmodel')
}
}
request.onerror = function(e) {
console.error(e);
}
/*var backup_models = localStorage.getItem('backup_model')
let parsed_backup_models = JSON.parse(backup_models);
for (let uuid in parsed_backup_models) {
AutoBackupModels[uuid] = parsed_backup_models[uuid];
let model = parsed_backup_models[uuid];
setupProject(Formats[model.meta.model_format] || Formats.free, uuid);
Codecs.project.parse(model, 'backup.bbmodel')
}*/
},
async removeBackup(uuid) {
let transaction = AutoBackup.db.transaction('projects', 'readwrite');
let store = transaction.objectStore('projects');
let request = store.delete(uuid);
return await new Promise((resolve, reject) => {
request.onsuccess = resolve;
request.onerror = function(e) {
reject();
}
});
},
async removeAllBackups() {
let transaction = AutoBackup.db.transaction('projects', 'readwrite');
let store = transaction.objectStore('projects');
let request = store.clear();
return await new Promise((resolve, reject) => {
request.onsuccess = resolve;
request.onerror = function(e) {
console.error(e);
reject();
}
});
}
}
AutoBackup.initialize();
setInterval(function() {
if (Project && (Outliner.root.length || Project.textures.length)) {
Validator.validate();
try {
var model = Codecs.project.compile({compressed: false, backup: true, raw: true});
AutoBackupModels[Project.uuid] = model;
localStorage.setItem('backup_model', JSON.stringify(AutoBackupModels));
AutoBackup.backupOpenProject();
} catch (err) {
console.error('Unable to create backup. ', err)
}

View File

@ -127,7 +127,9 @@ class Plugin {
if (!isApp && this.new_repository_format) {
path = `${Plugins.path}${scope.id}/${scope.id}.js`;
}
console.log('get script', path, this.id)
$.getScript(path, () => {
console.log('got script', path, this.id)
if (cb) cb.bind(scope)()
scope.bindGlobalData(first)
if (first && scope.oninstall) {