KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
Schemat i trwały licznik
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.
# Tabela klucz→wartość: klucz główny + jedna kolumna.Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.database Counter {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.version = 1Pole tożsamości lub wersji w otaczającym bloku; zachowaj jego kontekst.Pusta linia oddziela fragmenty źródła.table counters {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.name: String primary keyOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.value: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.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/Byteswwhere(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
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.
database Tasks {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.version = 1Pole tożsamości lub wersji w otaczającym bloku; zachowaj jego kontekst.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | version N ≥ 1 |
| Wynik | — |
| Wymagania | obowiązkowe |
| Ograniczenia | — |
| Możliwe błędy | KCS-KDB-02xx |
| Wprowadzono | 1.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.
table tasks {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.id: Int primary keyOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.title: StringOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.done: Bool default falseOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.index by titleOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | klucz: Int64, Int32, String, UUID, bez ? |
| Wynik | wiersz = rekord KretS o nazwie tabeli |
| Wymagania | dokładnie jeden klucz główny |
| Ograniczenia | — |
| Możliwe błędy | KCS-KDB-0205, KCS-KDB-0206 |
| Wprowadzono | 1.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.
storage {Początek nazwanego bloku; jego pola odczytaj w powiązanej referencji.mode = "persistent"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.maxSize = 4MBOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | mode tylko "persistent"; maxSize ≥ 4KB (1 KB = 1000 B) |
| Wynik | — |
| Wymagania | opcjonalne |
| Ograniczenia | cached, temporary → KCS-KDB-0102 |
| Możliwe błędy | KCS-KDB-0308 |
| Wprowadzono | 1.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.
query Open() -> List<tasks> {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.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.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | parametry nazwa: Typ |
| Wynik | List<T>, T? albo Int (liczba wierszy) |
| Wymagania | kretdb.read |
| Ograniczenia | 10 000 wierszy; brak złączeń i agregacji |
| Możliwe błędy | KCS-KDB-0310 |
| Wprowadzono | 1.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.
query Add(id: Int, title: String) -> Unit {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.insert into tasks { id = :id, title = :title }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.query Finish(id: Int) -> Int {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.update tasks set done = true where id == :idOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | :parametr, literały, now() |
| Wynik | insert → Unit; update/delete → Int |
| Wymagania | kretdb.write |
| Ograniczenia | maxSize, limit pliku |
| Możliwe błędy | KCS-KDB-0308 |
| Wprowadzono | 1.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.
let n = db.getOr("counters", "runs", 0) + 1Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.db.set("counters", "runs", n)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | tabela, klucz[, wartość] |
| Wynik | wartość / Bool / liczba usuniętych |
| Wymagania | kretdb.open + read/write |
| Ograniczenia | tylko tabele klucz→wartość |
| Możliwe błędy | KCS-PERM-* |
| Wprowadzono | 1.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.
db.begin()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.db.set("balance", "a", 70)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.db.commit()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | — |
| Wynik | Unit |
| Wymagania | kretdb.write |
| Ograniczenia | zapis poza transakcją = osobna trwała transakcja |
| Możliwe błędy | KCS-KDB-0315 |
| Wprowadzono | 1.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.
migration from 1 {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.update tasks set done = false where done == nullOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | operacje update/insert/delete |
| Wynik | — |
| Wymagania | podniesienie version |
| Ograniczenia | delete zablokowane domyślnie (0322); dozwolone tylko dodanie tabeli/kolumny/indeksu; w Core PROVISIONAL (A14–A16, FB-08) |
| Możliwe błędy | KCS-KDB-0302, 0316–0324 |
| Wprowadzono | 1.0 (SDK) |
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):
kret check . --json— w wyniku:"succeeded": truekret run . --policy host-policy.json --data {DATA}— w wyniku:uruchomienie nr 1kret run . --policy host-policy.json --data {DATA}— w wyniku:uruchomienie nr 2
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
Ć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.
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 →