AmberDB
view release on metacpan or search on metacpan
docs/TR.AmberDB_Veritabani_Sistemi.md view on Meta::CPAN
### 9.3 Åema Tanımlama ve Okuma Yöntemleri (`table_info` & `table_attr`)
AmberDB'de Åema iki Åekilde tanımlanabilir ve programatik olarak okunabilir:
1. **Fiziksel Dosya Tabanlı Åema (Ãnerilen):**
Tablo Åemaları `dbstore/schema/<tablo_adi>.table` dosyasına yerleÅtirilir. AmberDB ilk eriÅimde bu dosyayı otomatik olarak okur ve ayrıÅtırır.
2. **Bellek İçi Dinamik Åema (Programmatic / In-Memory):**
Disk dosyasına gerek kalmadan doÄrudan `$adb->table_attr("tablo_adi", { ... })` metoduyla çalıÅma zamanında tanımlanır.
3. **Yüklü Åemayı Okuma (`table_info`):**
Tanımlı bir tablonun tüm Åema konfigürasyonunu bellekten veya diskten hash referansı olarak almak için `$adb->table_info($tablo_adi)` kullanılır:
```perl
my $schema = $adb->table_info("catalog_product");
print "Tablo Adı: $schema->{name}\n";
print "Arama Blokları: " . join(", ", @{ $schema->{search_block} || [] }) . "\n";
```
> [!IMPORTANT]
> **Åema Dosyaları (`.table` ve `.dbase`) DoÄal Perl Kodudur (Hash Reference)**
> AmberDB'de `.table` ve `.dbase` dosyaları JSON veya YAML deÄil, doÄrudan Perl sözdizimiyle (`{ ... }`) yazılmıŠdoÄal Perl hash referansı yapılarıdır. Motor bu dosyaları çalıÅma zamanında Perl'in yerel `do` ifadesi ile dinamik olar...
>
> * **Sözdizimi Hatası Koruması:** Dosyada eksik virgül (`,`), kapatılmamıŠparantez (`}` veya `]`), hatalı tırnak iÅareti veya geçersiz bir Perl karakteri bulunursa `do` iÅlemi `undef` döner ve motor Åemayı **kesinlikle yükleyemez** ...
> * **DoÄrulama İpucu:** Åema dosyalarınızı kaydettikten sonra terminalden `perl -c dbstore/schema/tablo.table` komutuyla derleme kontrolü yaparak sözdizimi hatalarını anında görebilirsiniz.
### 9.4 Åema Dosyası EÅleÅme Kuralları
AmberDB, tablo adını ayrıÅtırarak hangi Åema dosyasını ve veritabanı ayarlarını yükleyeceÄini otomatik belirler:
* **Veritabanı Ãn Eki:** Tablo adında ilk alt çizgiden (`_`) önceki kısım veritabanı / mantıksal grup adıdır.
* **Åema Dosyası EÅleÅmesi:** ÃrneÄin `catalog_product` tablosunun Åeması `dbstore/schema/catalog_product.table` dosyasında, grup ayarları ise `dbstore/schema/catalog.dbase` dosyasında saklanır.
### 9.5 Ãrnek Tablo Åeması (`catalog_product.table`)
AÅaÄıda e-ticaret ürün kataloÄu için kapsamlı bir `.table` Åema örneÄi verilmiÅtir:
```perl
# dbstore/schema/catalog_product.table
{
name => "Ãrün KataloÄu",
record_index => 1,
match_block => [ 1, 2, 3, 11 ],
search_block => [ 4, 5, 7, 9 ],
sort_block => [ 4, { blk => 10, type => 'num' } ],
facet_block => [ 1, 2, 3, 11 ],
slug_block => [ 2, 4 ],
use_facet => 1,
facet_rules => [ [ 11, "eq", 1 ] ],
use_junk => 1,
junk_rules => [ [ 11, "eq", 0 ] ],
use_ramdisk => 1,
ramdisk_ttl => 3600,
keep_deleted => 1,
log_owner => 1,
min_char => 2,
blocks => [
{ id => "id", name => "Ãrün ID", type => "auto_id", input => "hidden" },
{ id => "category_id", name => "Kategori", type => "text", input => "select", rdbm => "catalog_category;2" },
{ id => "brand_id", name => "Marka", type => "text", input => "select", rdbm => "catalog_brand;2" },
{ id => "author_id", name => "Yazar", type => "text", input => "text" },
{ id => "title", name => "Ãrün Adı", type => "text", input => "text", valid => "not_null" },
{ id => "subtitle", name => "Alt BaÅlık", type => "text", input => "text" },
{ id => "supplier", name => "Tedarikçi", type => "text", input => "text" },
{ id => "description", name => "Açıklama", type => "html", input => "textarea" },
{ id => "stock", name => "Stok Adedi", type => "num", input => "text" },
{ id => "barcode", name => "Barkod", type => "text", input => "text" },
{ id => "price", name => "Fiyat", type => "num", input => "text" },
{ id => "status", name => "SatıŠDurumu",type => "option", input => "select", option => "1:SatıÅta,0:Pasif" },
],
}
```
### 9.6 Åema Parametreleri ve Konfigürasyon Referansı (Tablo Düzeyi)
AÅaÄıdaki tablo, bir `.table` dosyasında kullanılabilecek tüm üst düzey parametreleri, veri tiplerini, varsayılan deÄerlerini ve geriye dönük uyumluluk (eski sistem) karÅılıklarını listeler:
| Parametre | Tip | Varsayılan | Eski / Alternatif Adı | Açıklama |
| :--- | :--- | :--- | :--- | :--- |
| `name` | `string` | `"Tablo"` | - | Tablonun insan tarafından okunabilir adı/baÅlıÄı. |
| `use_simple` | `0 / 1` | `0` | `simple` | `1` ise 255 bayta kadar serbest metin anahtarlarla (UUID, slug vb.) çalıÅan basit anahtar-deÄer modunu açar; `.inx` ikili indeksi üretilmez. |
| `record_index` | `0 / 1` | `0` | `readall` | `1` ise `.inx` birincil indeksini, `table_count`, `table_lastid` ve otomatik sayaç desteÄini aktif eder. |
| `search_block` | `ARRAY` | `[]` | - | `.src` tam metin arama (inverted keyword) indeksine dahil edilecek blok numaraları. |
| `match_block` | `ARRAY` | `[]` | `fields` | `.fld` birebir eÅleÅme / filtrelenmiÅ okuma indeksine dahil edilecek blok numaraları. |
| `sort_block` | `ARRAY` | `[]` | - | `.srt` önceden sıralanmıŠbinary ID indeksleri oluÅturulacak bloklar (`[ 4, { blk => 10, type => 'num' } ]`). |
| `facet_block` | `ARRAY` | `[]` | `filter_block` | `.fac` çok boyutlu dinamik kategori/ürün filtreleme indeksine dahil edilecek bloklar. |
| `slug_block` | `ARRAY` | `[]` | `rwlink` | `.slg` otomatik iki yönlü URL slug üretimi için birleÅtirilecek bloklar. |
| `use_facet` | `0 / 1` | `0` | - | Tabloda facet sayım motorunu ve `field_fltkeys` / `facet_menu` altyapısını aktif eder. |
| `facet_rules` | `ARRAY` | `[]` | - | Facet menüsünde sadece belirli Åarta uyan (örn: stokta olan) kayıtları saymak için filtre kuralları. |
| `use_junk` | `0 / 1` | `0` | - | Pasif/arÅiv kayıtları ana tablodan ayırarak iki katmanlı (Hot/Cold) indeksleme saÄlar. |
| `junk_rules` | `ARRAY` | `[]` | - | Hangi kayıtların otomatik olarak Junk katmanına (`.jinx`, `.jsrc`, `.jfld`) taÅınacaÄını belirleyen kurallar. |
| `use_ramdisk` | `0 / 1 / 2 / 3` | `0` | - | `0`: Kapalı, `1`: RAM'de sadece indeksler, `2`: Tam RAM-Disk aynası (Dual-write), `3`: Uçucu RAM-disk (salt .db, indexesiz basit mod). |
| `ramdisk_ttl` | `integer` | `300` | - | Yalnızca `use_ramdisk => 3` modunda geçerli olan zaman aÅımı süresi (saniye). |
| `table_dir` | `string` | `""` | - | Tablonun saklanacaÄı özel alt dizin (örn: `table_dir => 'siparis'`, `table_dir => ''` ile doÄrudan kök dizin). |
| `keep_deleted` | `0 / 1` | `0` | `nodelete` | Silinen kayıtları yok etmek yerine `.del` arÅiv dosyasında saklar (Soft-delete). |
| `log_owner` | `0 / 1` | `0` | `authority` | Kaydı ekleyen, düzenleyen ve silen kullanıcıları `.aut` denetim izinde saklar. |
| `use_alias` | `0 / 1` | `0` | `uselnk` | Mükerrer kayıtların silinip birleÅtirildiÄi tablolarda `.lnk` alias yönlendirme tablosunu aktif eder. |
| `use_counter` | `0 / 1` | `0` | `usecnt` | `.cnt` dosyasında kayıt okuma/görüntülenme sayaçlarını otomatik artırır. |
| `parent_table` | `string` | `""` | - | Dikey bölümlemede üst tablo adı. BaÄlı tablo aynı ID'yi paylaÅarak ana tabloyu hafif tutar. |
| `force` | `0 / 1` | `0` | - | `1` ise `insert_id` çaÄrısında kayıt zaten varsa hata vermek yerine üstüne yazar (Replace modu). |
| `min_char` | `integer` | `2` | `minchar` | Arama indeksine (`.src`) alınacak kelimeler için asgari karakter uzunluÄu (1, 2 veya 3). |
| `stop_word` | `string` | `""` | `nextkey` | Arama indeksine dahil edilmeyecek durak kelimeler (örn: `"bu ve ile için de da"`). |
| `repeat_ids` | `integer` | `undef` | - | Tekrarlayan alt blokların ID listesinin otomatik toplanacaÄı hedef blok indeksi. |
| `repeat_start` | `integer` | `undef` | - | Dinamik deÄiÅken alt elemanların (sipariÅ kalemleri vb.) baÅladıÄı blok indeksi. |
| `view_block` | `ARRAY` | `[]` | - | Arayüz (Dbapp / CMS) listeleme ekranında gösterilecek öncelikli blok numaraları. |
| `use_menu` | `0 / 1` | `1` | - | Arayüz yönetim panelinde tablo için menü sekmesi gösterilip gösterilmeyeceÄi. |
| `no_transact` | `0 / 1` | `0` | - | `1` ise tablo transaction hata zincirinden ve otomatik rollback iÅleminden muaf tutulur. |
### 9.7 Blok (Alan) Nitelikleri, 8 Ãekirdek Veri Tipi, GiriÅ BileÅenleri ve DoÄrulama Referansı
Åema içindeki `blocks` dizisinde tanımlanan her bir alan bloÄu Åu nitelikleri alabilir:
#### 9.7.1 Temel Blok Nitelikleri
| Nitelik | Tip | Açıklama | Ãrnek |
| :--- | :--- | :--- | :--- |
| `id` | `string` | Alanın programatik anahtar adı | `id => "email"` |
| `name` | `string` | Formlarda ve tablolarda gösterilecek etiket adı | `name => "E-Posta Adresi"` |
| `type` | `string` | Veri depolama, tip doÄrulama ve indeksleme veri tipi | `type => "text"` |
| `input` | `string` | Form giriÅ bileÅeni (UI) tipi | `input => "select"` |
| `valid` | `string` | Otomatik doÄrulama kuralı | `valid => "not_null;email"` |
| `option` | `string` | Seçenek listesi (`deÄer:etiket` çiftleri) | `option => "1:Aktif,0:Pasif"` |
| `rdbm` | `string / HASH`| BaÅka tablodan veri çekme (`hedef_tablo;gösterilecek_blok`) | `rdbm => "catalog_category;2"` |
| `extend` | `HASH` | 1:1 dikey geniÅletme tablosu | `extend => { table => "catalog_price", join => "id" }` |
#### 9.7.2 Desteklenen 8 Ãekirdek Veri Tipi (`type`)
AmberDB motoru, serileÅtirme (`db_encode`/`db_decode`), indeksleme ve sıralama katmanlarında **8 temel çekirdek veri tipi** kullanır:
| Veri Tipi (`type`) | Tanım | `enc_validate` (Yazma Anı) | `dec_validate` (Okuma Anı) | İndeks ve Sıralama DavranıÅı |
| :--- | :--- | :--- | :--- | :--- |
| **`auto_id`** | Otomatik artan ID (Blok 0) | ID format kontrolü ve sıralama | ID skaler dönüŠ| Birincil anahtar dizini (`.inx`) |
| **`text`** | Standart UTF-8 Metin | UTF-8 kaçıŠ/ metin doÄrulaması | Dize (`$val // ''`) | `.src` ters indeksinde aranır, `.str` sözlüÄü |
| **`num`** / **`number`** | Sayısal (Tamsayı / Ondalık / Boolean) | Sayısal doÄrulama (`^[+-]?[0-9]+(?:\.[0-9]+)?$`), boÅsa `0` | Sayı dönüÅümü (`0 + $val`) | `.srt` sayısal (`<=>`) sıralama, `.fld` filtre |
| **`ascii`** | Salt ASCII karakterli metin | `to_ascii` ile ASCII normalizasyonu | ASCII metin | `.slg` slug haritası, `.srt` ASCII sıralama |
| **`date`** | Tarih ve Zaman | `auto_date` ise sistem tarihi atama | Tarih dizesi | `str2dateid` ile tarihsel kronolojik sıralama |
| **`array`** / **`repeat`** | Dizi / Tekrarlayan Satırlar | ARRAY ref veya `[split /,/]` | Perl `ARRAY` ref (`[]`) | Ãoklu deÄer eÅleÅmesi (`field_fetch` multi-value) |
| **`hash`** | Sözlük / Nesne (HASH ref) | HASH ref kontrolü | Perl `HASH` ref (`{}`) | İç içe Åemasız nesne saklama |
| **`binary`** | İkili Veri / Base64 | Ham binary bayt veya Base64 | Ham / Base64 skaler | DoÄrudan dosya depolaması |
> [!NOTE]
> **Sayı ve Boolean Yönetimi:** `num` (veya `number`) tipi hem pozitif (`150`, `+25`), negatif (`-50`, `-12.75`), ondalıklı sayıları hem de `0 / 1` boolean bayraklarını yönetir. HTML formlarında iÅaretlenmeyen (`checkbox`) alanlar veya boÅ...
#### 9.7.3 Form GiriÅ BileÅenleri (`input`)
UI ve yönetim paneli katmanında form elemanının nasıl görüntüleneceÄini belirler:
| BileÅen (`input`) | UI Elemanı | Açıklama |
| :--- | :--- | :--- |
| `text` | Metin Kutusu | Standart tek satırlık metin alanı `<input type="text">`. |
| `textarea` | Metin Alanı | Ãok satırlı düz metin kutusu `<textarea>`. |
| `summernote` | Summernote | Zengin WYSIWYG görsel HTML editörü. |
| `select` | Açılır Menü | Tekli seçim kutusu `<select>`. |
| `checkbox` | Onay Kutusu | Ãoklu seçim onay kutuları `<input type="checkbox">` (Boolean için `type => "num"`). |
| `radio` | Radyo Butonu | Tekli seçim radyo butonları `<input type="radio">`. |
| `file` | Dosya Yükleme | Dosya veya görsel yükleme bileÅeni `<input type="file">`. |
| `hidden` | Gizli Alan | Gizli form elemanı `<input type="hidden">` (birincil ID için). |
| `email` | E-Posta Kutusu | HTML5 e-posta giriŠalanı `<input type="email">`. |
| `ascii` | ASCII Alanı | Yalnızca ASCII karakterlere izin veren metin kutusu. |
| `number` | Sayı Kutusu | Sayısal giriŠkutusu `<input type="number">`. |
| `date` | Tarih Seçici | EtkileÅimli takvim tarih seçici `<input type="date">`. |
| `password` | Åifre Kutusu | Maskeli Åifre giriÅ alanı `<input type="password">`. |
| `repeat` / `repeats` | Tekrarlayan Tablo | Dinamik alt satır ekleme/çıkarma formu (SipariŠkalemleri, fatura satırları). |
| `search_block` | Arama Kutusu | Arama destekli dinamik filtre giriŠalanı. |
| `selectbyfind` | Arayarak Seç | İliÅkili tablodan dinamik arama ile seçim bileÅeni. |
| `selectbylist` | Listeden Seç | Listeden çoklu seçim bileÅeni. |
#### 9.7.4 Tekrarlayan Alt Satır Blokları (`repeat_start` ve `repeat_ids`)
AmberDB, iliÅkisel alt tablolara (child table) ve `JOIN` sorgularına ihtiyaç duymadan, ana kayıt içerisine gömülü tekrarlayan dinamik alt satırları (örn. sipariÅ kalemleri, fatura ürün satırları) yatay düzende doÄrudan destekler:
- **Yatay Dizi Yapısı (`@record[15..$#record]`):** Tekrarlayan alt satırlar, sabit bloklardan sonra gelen her bir indeks (`$record[15]`, `$record[16]`, `$record[17]`, ...), baÄımsız birer alt satır kaydıdır (örn: `[ 101, 'Kitap', 2, 150.00 ...
- **`repeat_start`**: Tekrarlayan dinamik blokların baÅladıÄı blok indeksini belirtir (örn. `repeat_start => 15`). Åemada 15. blok Åablon olarak tanımlanır ve 15 ve sonraki tüm alanlar bu Åablonun tip kurallarıyla doÄrulanır.
- **`repeat_ids`**: Motor (`repeat_fields`), `@record[15..$#record]` dilimindeki tüm alt satırların birinci elemanını (sayısal ürün ID'si) otomatik olarak toplayıp virgülle birleÅtirir (`"101,102,103"`) ve `repeat_ids` (örn. 12) bloÄuna ...
```perl
# Åema Tanımı ÃrneÄi (SipariÅ Tablosu):
repeat_ids => 12, # Alt ürün ID'lerinin toplanacaÄı indeks bloÄu (Ãrn: "101,102,103")
repeat_start => 15, # 15. bloktan itibaren baÅlayan tekrarlayan satırlar
blocks => [
{ id => "id", name => "SipariÅ No", type => "auto_id", input => "hidden" }, # 0
# ... sabit sipariŠüst bilgileri (tarih, müÅteri, adres vb.) ...
{ id => "prod_ids", name => "Ãrün Listesi", type => "text", input => "hidden" }, # 12 (repeat_ids hedefi)
# ...
{ id => "products", name => "Ãrün Kalemleri",type => "repeat", input => "repeats" }, # 15 (repeat_start Åablonu)
];
# Veri Satırı Yapısı (Kayıt ÃrneÄi):
# $record[0] = 1001; # SipariŠID (Sayısal anahtar)
# $record[12] = "101,102,103"; # Motor tarafından repeat_fields ile otomatik üretilir
# $record[15] = [ 101, 'Kitap', 2, '150.00' ]; # 1. Ãrün
# $record[16] = [ 102, 'Defter', 1, '85.00' ]; # 2. Ãrün
# $record[17] = [ 103, 'Kalem', 5, '20.00' ]; # 3. Ãrün
```
#### 9.7.5 Otomatik DoÄrulama Kuralları (`valid`)
Birden fazla doÄrulama kuralı noktalı virgül (`;`) ile zincirlenebilir (örn: `valid => "not_null;email"`):
| DoÄrulama Kuralı (`valid`) | Tanım | Kontrol ve DavranıŠ|
| :--- | :--- | :--- |
| `none` | DoÄrulama Yok | Herhangi bir kural uygulanmaz (varsayılan). |
| `not_null` | BoŠOlamaz | Alanın boŠ(`undef` veya `""`) geçilmesini engeller. |
| `unique` | Benzersiz | DeÄerin tabloda baÅka hiçbir kayıtta bulunmadıÄını doÄrular. |
| `email` | E-posta | Geçerli bir RFC e-posta deseni kontrolü yapar. |
| `telefon` | Telefon | Geçerli sabit/GSM telefon numarası formatı kontrolü yapar. |
| `ascii` | ASCII | DeÄerin yalnızca ASCII karakterler içermesini zorunlu kılar. |
| `numeric` | Sayısal | DeÄerin geçerli bir sayı olmasını zorunlu kılar. |
| `regex` | Regex | Ãzel tanımlı düzenli ifade desenine uyumu denetler. |
| `auto_num` | Otomatik Sayı | DeÄeri otomatik artan sayı olarak üretir. |
| `auto_pass` | Otomatik Åifre | Rastgele güvenli Åifre üretir ve tuzlu hash olarak kaydeder. |
| `auto_date` | Otomatik Tarih | DeÄer boÅsa o anki sistem tarih/zaman damgasını otomatik atar. |
| `auto_str` | Hazır Metin | Ãnceden tanımlı Åablon metnini otomatik uygular. |
#### 9.7.6 Benzersizlik ve Dize/ID Sözlük İndeksi (`.unq`)
AmberDB'de `.unq` (Unique) dizini, hem **tekillik güvencesini** hem de **iliÅkisel metin $\leftrightarrow$ sayısal ID dönüÅümünü** $O(1)$ disk arama hızında yöneten çift yönlü bir sözlük dosyasıdır (`${tablo}_${blok}.unq`):
1. **İsimlendirme NetliÄi:** `.srt` (Sort / Sıralama) ile eski `.str` (String) karıÅıklıÄını önlemek için tekillik ve sözlük dosyaları `.unq` uzantısıyla tutulur.
2. **$O(1)$ Tekillik Denetimi (`valid => "unique"`):**
- Bir alanda `valid => "unique"` tanımlandıÄında (örn. `username`, `email`, `barkod`), motor `insert_id` veya `update_id` anında `.unq` dosyasından `s:$deÄer` anahtarını kontrol eder.
- DeÄer baÅka bir kayda aitse iÅlem anında durdurulur ve hata fırlatılır.
- BaÅarılı ekleme ve güncellemelerde çift yönlü anahtarlar (`s:$deÄer => $rid` ve `n:$rid => $deÄer`) kaydedilir. Kayıt silindiÄinde bu anahtarlar `.unq` dosyasından temizlenir.
3. **RDBM ve `match_block` Metin $\leftrightarrow$ Sayısal ID DönüÅümü:**
- İliÅkisel bir alana (`rdbm => "catalog_brand;1"`) veya metin filtre bloÄuna string geldiÄinde (örn. `"Can Yayınları"`), motor hedef tablonun `catalog_brand_1.unq` dosyasından `s:Can Yayınları` anahtarını sorgular.
- Kayıtlıysa mevcut sayısal ID'yi alır; kayıtlı deÄilse yeni otomatik ID üreterek `.unq` sözlüÄüne ve hedef tabloya ekler.
( run in 0.823 second using v1.01-cache-2.11-cpan-e623d60df62 )