AmberDB
view release on metacpan or search on metacpan
docs/tr/AmberDB_Veritabani_Sistemi.md view on Meta::CPAN
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.
### 10.3 Å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.
### 10.4 Ã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",
id_type => "num",
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 ],
seo_block => [ 2, 4 ],
use_facet => 1,
facet_rules => [ [ 11, "eq", 1 ] ],
use_junk => 1,
junk_rules => [ [ 11, "eq", 0 ] ],
use_cache => 1,
cache_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" },
],
}
```
### 10.5 Å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. |
| `seo_block` | `ARRAY` | `[]` | `rwlink` | `.rwt` otomatik iki yönlü SEO slug (URL rewrite) ü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. |
### 10.6 Blok (Alan) Nitelikleri, Veri Tipleri, GiriÅ BileÅenleri ve DoÄrulama Referansı
Åema içerisindeki `blocks` dizisinde her bir veri alanı (sütun) için aÅaÄıdaki nitelikler tanımlanabilir:
#### 1. Temel Blok Nitelikleri
| Nitelik | Tip | Açıklama | Ãrnek |
| :--- | :--- | :--- | :--- |
| `id` | `string` | Alanın programatik benzersiz anahtar adı | `id => "email"` |
| `name` | `string` | Formlarda ve arayüzlerde görünen etiket adı | `name => "E-Posta Adresi"` |
| `type` | `string` | Alanın veri saklama ve indeksleme tipi | `type => "text"` |
| `input` | `string` | HTML/UI Form giriÅ bileÅeni tipi | `input => "select"` |
| `valid` | `string` | Otomatik veri doÄrulama kuralı | `valid => "not_null;email"` |
| `option` | `string` | `select`/`radio`/`checkbox` için hazır seçenekler listesi | `option => "1:Aktif,0:Pasif"` |
| `rdbm` | `string / HASH`| BaÅka bir tablodan ID $\rightarrow$ Metin eÅleme | `rdbm => "catalog_category;2"` |
| `extend` | `HASH` | 1:1 dikey geniÅleme tablosu baÄlama | `extend => { table => "catalog_price", join => "id" }` |
#### 2. Desteklenen Alan Tipleri (`type`)
| Tip (`type`) | Tanım | Açıklama ve Kullanım |
| :--- | :--- | :--- |
| `auto_id` | Otomatik ID | Otomatik artan 64-bit birincil anahtar (Blok 0 için zorunludur). |
| `text` | Metin | Standart tek satırlı UTF-8 metin veya alfanümerik dize. |
| `tinytext` | Kısa Metin | Kısa etiketler, kodlar veya bayraklar için optimize edilmiŠmetin. |
| `number` | Sayı | Sayısal deÄer (tamsayı veya ondalıklı para/miktar; `.srt` indeksinde sayısal olarak sıralanır). |
| `email` | E-posta | E-posta adresi formatındaki alanlar. |
| `ascii` | ASCII Metin | Yalnızca ASCII karakterler içeren kullanıcı adı, kod vb. veriler. |
| `password` | Åifre | Tek yönlü tuzlu hash olarak saklanan Åifre alanları. |
| `date_short` | Kısa Tarih | `YYYY-MM-DD` veya `YYYYMMDD` formatında kısa tarih dizesi. |
| `date_long` | Uzun Tarih | `YYYY-MM-DD HH:MM:SS` formatında zaman damgalı uzun tarih dizesi. |
| `html` | Zengin HTML | HTML gövdeleri (arama indeksine alınırken etiketler otomatik temizlenir). |
| `array` | Liste (Array) | İç içe dizi referansı (`[ "a", "b", "c" ]` veya virgüllü deÄerler). |
| `hash` | Liste (Hash) | İç içe sözlük referansı (`{ k1 => "v1", k2 => "v2" }`). |
| `binary` | Binary | Ham ikili (binary) veya pack edilmiÅ bayt verisi. |
| `base64` | Base64 | Base64 formatında kodlanmıŠveri blokları. |
| `extend` | Harici Tablo | 1:1 dikey geniÅleme tablosu (aynı ID'yi paylaÅır). |
| `tables` | BirleÅik Tablolar | Ãoklu tablo iliÅkileri ve agregasyon blokları. |
| `loop` / `repeat` | Son Blok Döngüsü | DeÄiÅken sayıda tekrarlayan alt döküman blokları (`repeat_start` ile kullanılır). |
#### 3. Form GiriÅ BileÅenleri (`input`)
| GiriÅ BileÅeni (`input`) | UI KarÅılıÄı | Açıklama |
| :--- | :--- | :--- |
| `text` | Text | Standart tek satırlık metin kutusu `<input type="text">`. |
| `textarea` | Textarea | Ãok satırlı düz metin alanı `<textarea>`. |
| `summernote` | Summernote | Zengin WYSIWYG HTML editörü (açıklama ve makale gövdeleri için). |
| `select` | Select | Tekli açılır liste kutusu `<select>`. |
| `checkbox` | Checkbox | Ãoklu seçim onay kutusu `<input type="checkbox">`. |
| `radio` | Radio | Tekli seçim radyo butonu `<input type="radio">`. |
| `file` | File | Dosya veya görsel yükleme bileÅeni `<input type="file">`. |
| `hidden` | Hidden | Gizli form alanı `<input type="hidden">` (ID alanları için). |
| `email` | Email | E-posta giriÅi `<input type="email">`. |
| `ascii` | Kullanıcı / ASCII | Kullanıcı adı veya kod giriÅi için ASCII kısıtlamalı metin kutusu. |
| `number` | Numara | Sayısal giriŠkutusu `<input type="number">`. |
| `date` | Tarih | Tarih seçici bileÅeni `<input type="date">`. |
| `password` | Password | ÅifrelenmiÅ giriÅ alanı `<input type="password">`. |
| `search_block` | Search | Arama destekli dinamik filtre giriÅ kutusu. |
| `selectbyfind` | SelectByFind | Arama ile dinamik veri getiren iliÅkili seçim kutusu. |
| `selectbylist` | SelectByList | Liste üzerinden çoklu eleman seçimine izin veren bileÅen. |
#### 4. 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. |
| `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 | O anki sistem tarih/zaman damgasını otomatik atar. |
| `auto_str` | Hazır Metin | Ãnceden tanımlı Åablon metnini otomatik uygular. |
### 10.7 CRUD İÅlemlerinde Åemanın Rolü
Bir kayıt `insert_id` veya `modify_id` ile kaydedilirken geçirilen dizi argümanları blok indeksleriyle birebir eÅleÅir. Motor bu tek iÅlemde Åemaya bakarak veriyi `.db` ana dosyasına yazar, `.inx` listesini günceller ve ilgili tüm `.fld`, ...
### 10.8 ÃalıÅma Zamanında Dinamik Åema Manipülasyonu (`table_attr`)
AmberDB Åemaları statik deÄildir. Veritabanını baÅtan oluÅturmaya veya migration çalıÅtırmaya gerek kalmadan çalıÅma zamanında (runtime) dinamik olarak güncellenebilir:
```perl
$adb->table_attr("catalog_product", { search_block => [ 4, 9 ] });
```
### 10.9 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.
```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)
]
}
```
#### 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:
( run in 1.681 second using v1.01-cache-2.11-cpan-0fb53d1c279 )