AmberDB
view release on metacpan or search on metacpan
docs/TR.AmberDB_Veritabani_Sistemi.md view on Meta::CPAN
{ 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ıÄı. |
| `id_type` | `string` | `"num"` | â | Birincil anahtar tipi: `"num"` (64-bit tamsayı) veya `"ascii"` (maks 8 bayt). |
| `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_cache` | `0 / 1 / 2` | `0` | `usecache` | `0`: Kapalı, `1`: Soft (.inx meta önbelleÄi), `2`: Hard (Tam RAM-Disk aynası). |
| `cache_ttl` | `integer` | `3600` | â | Tabloya özgü RAM önbellek geçerlilik süresi (saniye). |
| `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` | Kayıt birleÅtirmeleri ve eski ID yönlendirmeleri için `.lnk` alias 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 `modify_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.
- Ters indeks dosyası (`.fld`) içerisine **daima saf sayısal ID** yazılarak indekslerin hafif ve hızlı taranması saÄlanır.
---
### 9.8 CRUD İÅlemlerinde Tip DoÄrulama ve DönüÅümü (`enc_validate` & `dec_validate`)
AmberDB, veri tutarlılıÄını saÄlamak için iki yönlü Åema doÄrulama ve dönüÅüm mekanizması uygular:
1. **Yazma Anında DoÄrulama (`enc_validate`):**
- `insert_id`, `modify_id`, `insert_list` ve `modify_list` metotlarında veri diske ve ikincil indekslere yazılmadan **hemen önce** çalıÅır.
- `num` alanları için sayısal temizlik yapılır, boÅluklar ayıklanır ve boÅ deÄerlere `0` atanır.
- `ascii` alanlarında Türkçe ve özel karakterler `to_ascii` ile normalize edilir.
- `valid => "auto_date"` kuralı olan boŠtarih alanlarına otomatik güncel sistem tarihi atanır.
- `array` alanlarında virgüllü dizeler otomatik `ARRAY` referansına (`[ ... ]`), `hash` alanları `HASH` referansına (`{ ... }`) dönüÅtürülür.
2. **Okuma Anında DönüÅüm (`dec_validate`):**
- `read_id`, `read_list` ve `read_all` metotlarında diskten `db_decode` ile çözülen alanlar kullanıcıya dönmeden **hemen önce** çalıÅır.
- `num` alanları Perl'de `0 + $val` yapılarak sayısal skaler olarak döndürülür (`undef` uyarıları önlenir).
- `array` alanları boÅsa `[]`, `hash` alanları `{}` olarak garanti edilir.
3. **Simple Mod Uyumu:**
- Åemasız (`simple => 1`) modda veya `blocks` tanımlanmamıŠtablolarda `enc_validate` ve `dec_validate` hiçbir ek döngü çalıÅtırmadan veriyi doÄrudan döndürür (sıfır ek maliyet).
### 9.9 ÃalıÅma Zamanında Dinamik Åema Manipülasyonu (`table_attr`)
AmberDB Åemaları statik deÄildir. Åema dosyalarını diskte deÄiÅtirmeye veya migration çalıÅtırmaya gerek kalmadan, uygulama çalıÅma zamanında (runtime) tablo ayarlarını bellek üzerinde anlık olarak güncelleyebilir:
```perl
# Senaryo 1: Barkod POS cihazı veya hızlı kasa ekranı için arama kapsamını daraltma
# Tabloda normalde 2 (firma), 3 (yazar), 4 (baÅlık), 9 (barkod) aranırken,
# anlık olarak sadece BaÅlık (4) ve Barkod (9) bloklarında arama yaptırma:
$adb->table_attr("catalog_product", { search_block => [ 4, 9 ] });
# Senaryo 2: Silinecek kayıtların arÅivlenmesi için Åemadaki keep_deleted alanını aktif yapma
$adb->table_attr("catalog_product", { keep_deleted => 1 });
# Senaryo 3: Toplu raporlama sırasında önbelleÄi geçici olarak devre dıÅı bırakma
$adb->table_attr("catalog_product", { use_cache => 0 });
```
### 9.10 Dinamik GeniÅleyen Tablolar ve Tekrarlayan Bloklar (`repeat_ids` & `repeat_start`)
AmberDB, sabit sütun sınırlarını aÅarak tek bir ana döküman kaydının sonuna deÄiÅken sayıda alt eleman (sipariÅ kalemleri vb.) eklenmesine olanak tanır.
#### 9.10.1 Åema Yapılandırması (`order_active.table` ÃrneÄi)
```perl
# dbstore/schema/order_active.table
{
name => "Aktif SipariÅler",
record_index => 1,
match_block => [ 1, 2, 12, 14 ],
keep_deleted => 1,
log_owner => 1,
repeat_ids => 12,
repeat_start => 15,
blocks => [
{ id => "id", name => "ID", type => "auto_id" }, # 0
{ id => "member_id", name => "Ãye ID", type => "text" }, # 1
{ id => "invoice_no", name => "Fatura No", type => "text" }, # 2
{ id => "amounts", name => "Tutarlar", type => "array" }, # 3
{ id => "timestamps", name => "Tarihler", type => "array" }, # 4
{ id => "status", name => "Statü", type => "option" }, # 5
{ id => "session_id", name => "Session ID", type => "text" }, # 6
{ id => "delivery_address", name => "Teslim Adresi", type => "array" }, # 7
{ id => "invoice_address", name => "Fatura Adresi", type => "array" }, # 8
{ id => "cargo", name => "Kargo Bilgileri", type => "array" }, # 9
{ id => "payment_info", name => "Ãdeme Tipi", type => "array" }, # 10
{ id => "credit_card_info", name => "Kredi Kartı Bilgileri",type => "array" }, # 11
{ id => "product_ids", name => "Ãrün Döngüsü", type => "text" }, # 12 (repeat_ids)
{ id => "member_notes", name => "Ãye Notları", type => "array" }, # 13
{ id => "gift_products", name => "Hediye Ãrünler", type => "text" }, # 14
{ id => "products", name => "Ãrün Kalemleri", type => "repeat" }, # 15 (repeat_start)
]
}
```
#### 9.10.2 ÃalıÅma MantıÄı ve Otomatik İndeksleme (`repeat_fields`)
Her `insert_id`, `modify_id`, `insert_list` veya `modify_list` çaÄrısında motor, `repeat_start` (15) ve sonrasındaki tüm deÄiÅken blokları otomatik olarak iÅler:
1. Her ürün/kalem bloÄunun (dizi ise ilk elemanını `$_->[0]`, metin ise kendisini) çeker.
2. Bu ID'leri virgülle birleÅtirip (`"101,102,103"`) otomatik olarak `repeat_ids` (12) bloÄuna yazar (geliÅtiricinin bu alanı manuel doldurmasına gerek yoktur).
3. Blok 12 Åemada `match_block` içinde tanımlandıÄı için, motor `field_to_list` ile bu ID'lerin her birini `order_active_12.fld` eÅleÅtirme indeksine kaydeder.
( run in 0.801 second using v1.01-cache-2.11-cpan-d01c6094234 )