Tietokannan automaattinen tallentaminen ja lataaminen

This commit is contained in:
Juhani Krekelä 2024-05-19 18:51:53 +03:00
parent c94bc35573
commit 09207e98f9
3 changed files with 45 additions and 6 deletions

View File

@ -31,11 +31,8 @@
<script src="tietokanta.js"></script>
<script src="käyttöliittymä.js"></script>
<script>
suorita(_tietokanta.transaktio((t) => {t.lisää(taulut.luokat, '1B')}));
suorita(_tietokanta.transaktio((t) => {t.lisää(taulut.luokat, '1A')}));
suorita(_tietokanta.transaktio((t) => {t.lisää(taulut.luokat, '1C')}));
suorita(_tietokanta.transaktio((t) => {t.poista(taulut.luokat, 0)}));
suorita(_tietokanta.transaktio((t) => {t.lisää(taulut.luokat, '1Å'); t.peru();}));
let _tietokanta = new Tietokanta;
lataaTietokanta();
</script>
</body>
</html>

View File

@ -19,6 +19,7 @@ function suorita([tietokanta, muutokset]) {
for (const muutos of muutokset) {
suoritaMuutos(tietokanta, muutos);
}
tallennaTietokanta(tietokanta);
}
function suoritaMuutos(tietokanta, muutos) {

View File

@ -73,6 +73,23 @@ class Tietokanta {
historia = [];
static serialisoidusta(serialisoitu) {
const parsittu = JSON.parse(serialisoitu);
const tietokanta = new this;
tietokanta.seuraavaId = parsittu.seuraavaId;
const muutokset = [];
for (const taulu in parsittu.taulut) {
tietokanta.taulut.set(taulu, new Map);
for (let id in parsittu.taulut[taulu]) {
id = Number.parseInt(id);
const sisältö = parsittu.taulut[taulu][id];
tietokanta.taulut.get(taulu).set(id, sisältö);
muutokset.push({taulu, id, uusi: sisältö});
}
}
return [tietokanta, muutokset];
}
constructor() {
this.taulut.set(taulut.luokat, new Map);
}
@ -154,6 +171,30 @@ class Tietokanta {
});
return taulukko.map(([id, _]) => id);
}
serialisoi() {
return JSON.stringify(this, (avain, arvo) => {
if (avain === 'historia') {
return undefined;
}
if (arvo instanceof Map) {
return Object.fromEntries(arvo.entries());
}
return arvo;
});
}
}
const _tietokanta = new Tietokanta;
function tallennaTietokanta(tietokanta) {
window.localStorage.setItem('tietokanta', tietokanta.serialisoi());
}
function lataaTietokanta() {
const serialisoitu = window.localStorage.getItem('tietokanta');
if (serialisoitu === null) {
return;
}
let [tietokanta, muutokset] = Tietokanta.serialisoidusta(serialisoitu);
_tietokanta = tietokanta;
suorita([tietokanta, muutokset]);
}