PrivateSky / tutorial-workspace

MIT License
0 stars 4 forks source link

Ssapp - import storage strategy #6

Closed SalazarRiva closed 3 years ago

SalazarRiva commented 3 years ago

Am incercat aseara sa imi faca o instanta de basicDB, dar din ce vad pe documentatie trebuie sa ii dau argument un Storage strategy. M-am uitat prin codul de privatesky, unde se mai folosesc basicDB-uri si am vazut ca ceva de genul asta trebuie:

    let MemoryStorageStrategy = require("../../../db/storageStrategies/MemoryStorageStrategy");
    let storageStrategy = new MemoryStorageStrategy();
    let mydb = db.getBasicDB(storageStrategy);

Dar din ce vad - acest MemoryStorageStrategy - e din openDSU. Asa ca am incercat si eu in aplicatia mea sa dau let MemoryStorageStrategy = require("MemoryStorageStrategy");, dar imi da eroare. Asa ca am luat fisierul de MemoryStorageStrategy.js din openDSU si l-am pus in bundles la ssapp-ul meu si am facut refference din index.html asa:

    <script src="scripts/bundles/pskruntime.js"></script>
 ---->   <script src="scripts/bundles/MemoryStorageStrategy.js"></script> <----

    <!-- local imports -->

Tot primeasc o eroare de genul:

p-df4c668a.entry.js:1 Error while loading controller "ExampleController" Error: Failed to load module MemoryStorageStrategy
    at tryRequireSequence (iframeBoot.js:26001)
    at global.require (iframeBoot.js:26019)
    at new ExampleController (ExampleController.js:25)
    at m.loadController (VM12572 p-9b0f394c.entry.js:1)
    at async m.componentWillLoad (VM12572 p-9b0f394c.entry.js:1)

Ma puteti ajuta cu un hint pentru a importa un strategy de storage din ssapp-ul meu - cat sa pot sa am un obiect de basic db? Intuiesc ca un shared db ar fi fost mai ok pentru tema, dar din ce vad overheadul de a crea unul e un pic mai mare si ma voi multumi cu un basic db pentru moment - sa stochez calendar events.

asaccool commented 3 years ago

Salut recomand sa mergi pe varianta accesibila si sa folosesti direct api-ul getSharedDB.

SalazarRiva commented 3 years ago

Buna seara -

Am reusit sa obtin un db object cu getWalletDB - care dupa ce m-am uitat in cod este un alias pentru getSharedDB:

        let storageSSI = keyssispace.createSeedSSI("default");

        let mydb = db.getWalletDB(storageSSI, "mydb");

        // mydb.insertRecord("mytable", "key", "recordding");
        //

        setTimeout(function () {
            console.log(mydb.getRecord("mytable", "key", function (err, record) {
                console.log("the record is", record)}
            ));

        }, 2000);

Daca fac readul imediat dupa write imi tot dadea undefined - a trebuit sa las o pauza de 2 secunde ca altfel nu merge. Am reusit sa scriu si sa citesc entry-uri, dar daca dau build la aplicatie si dupa o pornesc iar in browser (un refresh/ un nou incognito window etc) nu persista nimic.

Q: De ce nu se salveaza datele? - am incercat sa comentez insertul - si dupa cand da read again, da undefined.

asaccool commented 3 years ago

Folosesti acelasi keyssi la initializare ? Sau faci de fiecare data cate unul nou, astfel fortand db-ul sa foloseasca cate un dsu nou?

SalazarRiva commented 3 years ago

Fac de fiecare data unul nou - cred - nu asa obtin SSI let storageSSI = keyssispace.createSeedSSI("default"); ?

asaccool commented 3 years ago

Exact, tu faci cate un keyssi nou de fiecare data de asta “nu se persista” datele. Keyssiurile pot fi serializate si deserializate. Vezi functia de getIdentifier() de pe keyssi si poti vedea si functia de parse din loadApi(“keyssi”)

SalazarRiva commented 3 years ago

Am printat ssi-ul serial generat automat de

        let storageSSI = keyssispace.createSeedSSI("default");

        console.log(storageSSI.getIdentifier());

L-am copiat din consola de la browser, si acuma am ceva de genul in cod

        let storageSSI = keyssispace.parse("BBudGH6ySHG2G5ffNrTWs9R4cplozWmqnViwH83w4oppnmwvdzw8w8cv5txGO6GPY9E7x24T5UrtvRetVrSuDK");

        let mydb = db.getWalletDB(storageSSI, "mydb");

si pare sa mearga, in sensul ca persista datele - nu stiu daca e cea mai buna abordare, dar functioneaza :) - daca aveti alta sugestie - nu ezitati sa imi spuneti.

Va multumesc ca m-ati indrumat si ca am reusit sa ajung pana aici - documentatia m-a bagat putin in ceata.

O seara buna.

asaccool commented 3 years ago

Sunt foarte multe concepte si metode de lucru noi, trebuie sa acorzi rabdare un pic mai mult. Sper ca ti-a fost de folos experienta.

SalazarRiva commented 3 years ago

Revin - sper ca pentru ultima oara - Am intampinat o neclaritate cand fac retrieve la date din db. Eu am un json in care stochez perechi de forma data:event. pentru inceput ma rezum la doar prima luna din calendar si o sa am ceva de genul: 1: 'First event'. Acest JSON il serializez si il scriu sub o cheie in db.

Ce nu inteleg este de ce atunci cand fac retrieve cu getRecord() primesc un json de forma:

0: "{", 1: """, 2: "1", 3: """, 4: ":", 5: """, 6: "F", 7: "i", 8: "r", 9: "s", 10: "t", 11: " ", 12: "e", 13: "v", 14: "e", 15: "n", 16: "t", 17: """, 18: "}", __version: 0, pk: "events", __timestamp: 1622581079850}
0: "{"
1: "\""
2: "1"
3: "\""
4: ":"
5: "\""
6: "F"
7: "i"
8: "r"
9: "s"
10: "t"
11: " "
12: "e"
13: "v"
14: "e"
15: "n"
16: "t"
17: "\""
18: "}"
pk: "events"
__timestamp: 1622581079850
__version: 0
__proto__: Object

Din ce inteleg, eu practic trebuie sa iterez peste atributele obiectului sa vad care sunt de tip int si sa concatenez valoarea la un master string pe care dupa sa il deserializez (lucru care sunt sigur ca nu trebuie sa il fac si gresesc ceva) - dar nu vad ce.

Am incercat sa fac asta:

        setTimeout(function () {
            console.log(mydb.getRecord("eventsTable", "events", function (err, record) {
                let res = '';

                for (let prop in record) {
                    if (typeof prop === 'number') {
                        res += record[prop];
                    }

                    console.log(prop, typeof prop);
                }

                console.log("thes res is ", res);
                console.log("the record is", record)}
            ));

Dar strategia cu typeof nu merge pentru ca 0, 1, 2, ..18 sunt defapt strings

0 string
ExampleController.js:48 1 string
ExampleController.js:48 2 string
ExampleController.js:48 3 string
ExampleController.js:48 4 string
ExampleController.js:48 5 string
ExampleController.js:48 6 string
ExampleController.js:48 7 string
ExampleController.js:48 8 string
ExampleController.js:48 9 string
ExampleController.js:48 10 string
ExampleController.js:48 11 string
ExampleController.js:48 12 string
ExampleController.js:48 13 string
ExampleController.js:48 14 string
ExampleController.js:48 15 string
ExampleController.js:48 16 string
ExampleController.js:48 17 string
ExampleController.js:48 18 string
ExampleController.js:48 __version string
ExampleController.js:48 pk string
ExampleController.js:48 __timestamp string

Din ce inteleg acuma in loc de typeof trebuie sa fac un regex match sa vad care contine numere si pe ele sa le concatenez, si nu am garantia ca le concatenez in ordinea in care trebuie. Nu e cam mare overheadul pentru a citi un record? Fac eu ceva gresit?

SalazarRiva commented 3 years ago

Am gasit alta metoda cu readkey si writekey, dar tot sunt confuz de cum se stocheaza datele.

asaccool commented 3 years ago

Cred ca problema ta este la scrierea in baza de date, nu la citire. Uitate in testele din opendsu/tests/db cum sunt facute apelurile de scriere si citire.

asaccool commented 3 years ago

Intararile in baza de date pot fi direct obiecte nu trebuie tu sa faci la mana json.stringify pe ele, se face automat serializarea dupa ce in prealabil se injecteaza meta info pe recorduri, etc.