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="tietokanta.js"></script>
<script src="käyttöliittymä.js"></script> <script src="käyttöliittymä.js"></script>
<script> <script>
suorita(_tietokanta.transaktio((t) => {t.lisää(taulut.luokat, '1B')})); let _tietokanta = new Tietokanta;
suorita(_tietokanta.transaktio((t) => {t.lisää(taulut.luokat, '1A')})); lataaTietokanta();
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();}));
</script> </script>
</body> </body>
</html> </html>

View File

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

View File

@ -73,6 +73,23 @@ class Tietokanta {
historia = []; 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() { constructor() {
this.taulut.set(taulut.luokat, new Map); this.taulut.set(taulut.luokat, new Map);
} }
@ -154,6 +171,30 @@ class Tietokanta {
}); });
return taulukko.map(([id, _]) => id); 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]);
}