Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

Schemat i trwały licznik

BASIC20 min
Postęp nauki 0 / 3
Zaloguj się na konto użytkownika, aby zachować postęp.

Czego się nauczysz

  • Prześledź źródła i wyjaśnij opisany kontrakt.
  • W PersistentCounter połącz definicję kolumny z operacją w KretS. Wyjaśnij, dlaczego ponowne użycie tego samego katalogu danych różni się od uruchomienia z pustym katalogiem.
Wymagania wstępne
  • Ukończ Podstawy i wcześniejszy poziom tej ścieżki.

Wyjaśnienie krok po kroku

Disk/Schema.kdb opisuje bazę pluginu. database/version identyfikuje schemat; table zawiera kolumny z dokładnie jednym kluczem głównym. Broker jest właścicielem bazy SQLite. Plugin korzysta z kontraktu KretDB, bez SQL i bez uchwytu do bazy kont witryny.

Praca z kodem źródłowym

Trwały licznik (tabela klucz→wartość)

Schemat `Disk/Schema.kdb` z jedną tabelą klucz→wartość. Kod używa `db.getOr` i `db.set`. Dwa uruchomienia z tym samym katalogiem danych pokazują trwałość: drugie uruchomienie widzi wynik pierwszego. Baza należy do brokera — plugin nie widzi SQL ani pliku bazy.

# Tabela klucz→wartość: klucz główny + jedna kolumna.
database Counter {
    version = 1

    table counters {
        name: String primary key
        value: Int
    }
}

Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. # Tabela klucz→wartość: klucz główny + jedna kolumna.Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. database Counter {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. version = 1Pole tożsamości lub wersji w otaczającym bloku; zachowaj jego kontekst.
  4. Pusta linia oddziela fragmenty źródła.
  5. table counters {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. name: String primary keyOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. value: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  9. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  10. Pusta linia oddziela fragmenty źródła.

Oczekiwany wynik: „uruchomienie nr 1”, potem „uruchomienie nr 2”.

Typowy błąd: Użycie `db.*` bez pliku `Disk/Schema.kdb` albo bez `kretdb.open/read/write` w manifeście — błąd kompilacji; bez przyznania w polityce hosta — odmowa brokera.

Instrukcja, wersje i zapisane wyniki →

Materiały źródłowe do tego tematu

Przeczytaj powiązane rozdziały. Kod i kontrakty zachowano z importu; historia źródeł jest dostępna przy każdym rozdziale.

KretDB — wprowadzenie

KretDB — wprowadzenie

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretdb-1.0. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.

Czym jest

KretDB to własny interfejs bazy danych pluginu: schemat w Disk/Schema.kdb, nazwane zapytania typowane względem KretS, transakcje, izolowana baza należąca do brokera (backend SQLite — decyzja R-11). Plugin nigdy nie widzi SQL ani uchwytu bazy.

Dla początkujących

Opisujesz tabele (kolumny i typy) oraz nazwane zapytania („dodaj zadanie”, „pokaż otwarte”). W KretS wołasz je jak funkcje: db.Add(1, "tytuł"). Proste pary klucz→wartość obsługujesz przez db.get/set. Dane zostają między uruchomieniami.

Dla zaawansowanych programistów

Zapytanie jest strukturą danych; SqlBuilder tworzy SQL wyłącznie z identyfikatorów sprawdzonych wzorcem i wiąże każdą wartość (sqlite3_bind_*). Wynik select deterministyczny (klucz główny rozstrzyga remisy), limit 10 000 wierszy. Niezatwierdzona transakcja jest wycofywana przez brokera. maxSize tabeli liczony w bajtach wartości. Właściciel bazy = tożsamość pluginu (w Core dodatkowo SID, KretProfileID, InstallationID, wydawca, digest). Migracja schematu, kopia i odtwarzanie istnieją w SDK, ale w Core są PROVISIONAL. SFI-B01: odmowa autoryzacji w transakcji → wycofanie (zwykły błąd skryptu nie wycofuje).

Jakie problemy rozwiązuje

Trwałe dane pluginu bez SQL injection, bez dostępu do cudzych baz i bez wycieku uchwytów; spójność przez transakcje; przewidywalne wyniki.

Kiedy używać

  • notatnik, zadania, ustawienia lokalne pluginu
  • liczniki i historia operacji
  • pamięć agenta KretAI
  • dane prezentowane w KretUI

Kiedy nie używać

  • złączenia tabel, agregacje inne niż liczba wierszy, zapytania składane z tekstu (nie istnieją)
  • porównania kolumn Decimal/Bytes w where (KCS-KDB-0102)
  • dostęp do bazy z C# pluginu (tylko zaufany adapter Core / KretBridge)
  • produkcyjne użycie w Core przed decyzją D-KCS-01 (kretdb.* PROVISIONAL)

Współpraca z innymi technologiami

KretS (use Kret.DB as db), KretL (kretdb.open/read/write, runtimeData.database), KretUI (dane przez komendy KretS), KretAI (pamięć agenta), Core (Disk/ = przestrzeń KretDB).

Obecny status

FROZEN_SUPPORTED_SUBSET — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0.

Dalej: ARCHITECTURE.md · SYNTAX_REFERENCE.md · ../Tutorials/BASIC/TUTORIAL_PL.md

Otwórz cały rozdział ze źródłem →
KretDB — referencja składni

KretDB — referencja składni

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretdb-1.0. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.

Opisane są wyłącznie konstrukcje potwierdzone implementacją SDK (i, gdzie zaznaczono, testami tej rundy).

database / version

Baza pluginu i wersja schematu.

database Tasks {
    version = 1
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. database Tasks {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. version = 1Pole tożsamości lub wersji w otaczającym bloku; zachowaj jego kontekst.
  3. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typyversion N ≥ 1
Wynik—
Wymaganiaobowiązkowe
Ograniczenia—
Możliwe błędyKCS-KDB-02xx
Wprowadzono1.0

table / column / primary key / default / index

Tabela z kolumnami, kluczem głównym, domyślnymi wartościami i indeksem.

table tasks {
    id: Int primary key
    title: String
    done: Bool default false
    index by title
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. table tasks {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. id: Int primary keyOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. title: StringOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. done: Bool default falseOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  5. index by titleOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typyklucz: Int64, Int32, String, UUID, bez ?
Wynikwiersz = rekord KretS o nazwie tabeli
Wymaganiadokładnie jeden klucz główny
Ograniczenia—
Możliwe błędyKCS-KDB-0205, KCS-KDB-0206
Wprowadzono1.0

storage { mode maxSize }

Tryb przechowywania i limit bajtów wartości tabeli.

storage {
    mode = "persistent"
    maxSize = 4MB
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. storage {Początek nazwanego bloku; jego pola odczytaj w powiązanej referencji.
  2. mode = "persistent"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. maxSize = 4MBOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typymode tylko "persistent"; maxSize ≥ 4KB (1 KB = 1000 B)
Wynik—
Wymaganiaopcjonalne
Ograniczeniacached, temporary → KCS-KDB-0102
Możliwe błędyKCS-KDB-0308
Wprowadzono1.0 (maxSize per tabela od 2026-10-17)

query … select

Nazwane zapytanie odczytu.

query Open() -> List<tasks> {
    select tasks where done == false sort by id desc limit 100
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. query Open() -> List<tasks> {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. select tasks where done == false sort by id desc limit 100Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typyparametry nazwa: Typ
WynikList<T>, T? albo Int (liczba wierszy)
Wymaganiakretdb.read
Ograniczenia10 000 wierszy; brak złączeń i agregacji
Możliwe błędyKCS-KDB-0310
Wprowadzono1.0

query … insert / update / delete

Nazwane zapytania zapisu.

query Add(id: Int, title: String) -> Unit {
    insert into tasks { id = :id, title = :title }
}
query Finish(id: Int) -> Int {
    update tasks set done = true where id == :id
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. query Add(id: Int, title: String) -> Unit {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. insert into tasks { id = :id, title = :title }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  4. query Finish(id: Int) -> Int {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  5. update tasks set done = true where id == :idOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typy:parametr, literały, now()
Wynikinsert → Unit; update/delete → Int
Wymaganiakretdb.write
OgraniczeniamaxSize, limit pliku
Możliwe błędyKCS-KDB-0308
Wprowadzono1.0

db.get / getOr / set / delete / exists

Operacje na tabeli klucz→wartość (klucz + jedna kolumna).

let n = db.getOr("counters", "runs", 0) + 1
db.set("counters", "runs", n)
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. let n = db.getOr("counters", "runs", 0) + 1Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  2. db.set("counters", "runs", n)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typytabela, klucz[, wartość]
Wynikwartość / Bool / liczba usuniętych
Wymaganiakretdb.open + read/write
Ograniczeniatylko tabele klucz→wartość
Możliwe błędyKCS-PERM-*
Wprowadzono1.0

db.begin / commit / rollback

Transakcja; niezatwierdzona do końca handlera jest wycofywana.

db.begin()
db.set("balance", "a", 70)
db.commit()
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. db.begin()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. db.set("balance", "a", 70)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. db.commit()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typy—
WynikUnit
Wymaganiakretdb.write
Ograniczeniazapis poza transakcją = osobna trwała transakcja
Możliwe błędyKCS-KDB-0315
Wprowadzono1.0

migration from N (SDK; Core PROVISIONAL)

Krok danych przy przejściu wersji schematu; wykonuje go wyłącznie zaufany host.

migration from 1 {
    update tasks set done = false where done == null
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. migration from 1 {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. update tasks set done = false where done == nullOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typyoperacje update/insert/delete
Wynik—
Wymaganiapodniesienie version
Ograniczeniadelete zablokowane domyślnie (0322); dozwolone tylko dodanie tabeli/kolumny/indeksu; w Core PROVISIONAL (A14–A16, FB-08)
Możliwe błędyKCS-KDB-0302, 0316–0324
Wprowadzono1.0 (SDK)
Otwórz cały rozdział ze źródłem →
KretDB — samouczek BASIC

KretDB — samouczek BASIC

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretdb-1.0. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.

Cel: pierwszy plik, podstawowa struktura, najprostszy działający przykład, najczęstszy błąd, sposób uruchomienia.

Narzędzia: kret = <SDK>\Compiler\kret.exe (SDK 1.0.0-rc.3+kret.local.3), kretui-host = <SDK>\UiHost\kretui-host.exe. {DATA}/{OUT} = nowe, puste katalogi.

1. Trwały licznik (tabela klucz→wartość) (KRETDB-B01-PersistentCounter)

Projekt: ../../Examples/BASIC_PersistentCounter/ · klasyfikacja RUNNABLE_LOCAL · Playground LOCAL_EXECUTE

Kroki (katalog roboczy: katalog przykładu):

  1. kret check . --json — w wyniku: "succeeded": true
  2. kret run . --policy host-policy.json --data {DATA} — w wyniku: uruchomienie nr 1
  3. kret run . --policy host-policy.json --data {DATA} — w wyniku: uruchomienie nr 2

Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.

Otwórz cały rozdział ze źródłem →

Ćwiczenie i sprawdzenie wiedzy

W PersistentCounter połącz definicję kolumny z operacją w KretS. Wyjaśnij, dlaczego ponowne użycie tego samego katalogu danych różni się od uruchomienia z pustym katalogiem.

Szkic nie jest wysyłany na serwer i znika po opuszczeniu lekcji. Przed wyjściem możesz go skopiować.
Podpowiedzi
  • KretDB to własny interfejs bazy danych pluginu: schemat w `Disk/Schema.kdb`, nazwane zapytania typowane względem KretS, transakcje, izolowana baza należąca do brokera (backend SQLite — decyzja R-11). Plugin nigdy nie widzi SQL ani uchwytu bazy.
  • Odczytaj ograniczenia i oczekiwane błędy z dostarczonego samouczka; check i run są oddzielnymi krokami.
Omówienie rozwiązania

Odpowiedź oprzyj na pokazanym kodzie i rozdziale źródłowym. Disk/Schema.kdb opisuje bazę pluginu. database/version identyfikuje schemat; table zawiera kolumny z dokładnie jednym kluczem głównym. Broker jest właścicielem bazy SQLite. Plugin korzysta z kontraktu KretDB, bez SQL i bez uchwytu do bazy kont witryny.

Porównujemy zapis z referencją. To ćwiczenie nie jest walidatorem programu.
Które podsumowanie jest zgodne z lekcją?

To quiz o opisanym kontrakcie. Nie kompiluje kodu, nie potwierdza wykonania programu i nie przyznaje nagród.

Podsumowanie i następny krok

Disk/Schema.kdb opisuje bazę pluginu. database/version identyfikuje schemat; table zawiera kolumny z dokładnie jednym kluczem głównym. Broker jest właścicielem bazy SQLite. Plugin korzysta z kontraktu KretDB, bez SQL i bez uchwytu do bazy kont witryny.

Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →

Wybierz, co możemy zapamiętać w tej przeglądarce. Możesz zmienić decyzję w każdej chwili.

Polityka prywatności