İçeriğe geç
NarDBv0.2.0-dev

LexerLang ile

use nardb — bağlantı biçimleri, kimlik (credentials), NarQL zincirinin LexerLang'deki karşılığı, tipler, güvenlik.

NarDB, LexerLang ikilisine gömülüdür. use nardb yazan bir LexerLang uygulaması ayrı bir sunucu kurmadan veritabanını açar; zincir NarQL'in kendisidir.

LexerLang
use nardb, env_parser

$env = new env_parser(path.pwd + "/.env")
$db  = nardb.connect('data/app.ndbc').credentials({user: 'root', pass: $env.require('NARDB_PASS')})

$uyeler = $db.from('uyeler').where({'age': {gte: 18}}).order({'name': 'asc'}).to_array()
$uye    = $db.from('uyeler').where({'id': 123}).fetch_one().to_object()
$json   = $db.from('uyeler').fields('id', 'name').limit(10).to_json()

NarQL → LexerLang#

Her adım aynı adı taşır. Fark yalnızca sonunda: NarQL .get(); ile biter, LexerLang'de sonucu hangi biçimde istediğinizi söylersiniz.

NarQLLexerLang
from('uyeler', 'u')$db.from('uyeler', 'u')
.where({'id': 1245, 'age': {gte: 18}}).where({'id': 1245, 'age': {gte: 18}})
.fields('id', 'name').fields('id', 'name')
.fields(CAST('u.name', 'ad'), FORMAT('birthday', 'dd.mm.yyyy')).fields(nardb.cast('u.name', 'ad'), nardb.format('birthday', 'dd.mm.yyyy'))
.order({'name': 'asc'}).limit(10).offset(20)aynı
.get();.to_array() · .to_json() · .to_object() · .fetch_one() · .fetch_all() · .count()
.insert_one({...}).get();.insert_one({...}) — eklenen satırı döner
.insert_many([...]);.insert_many([...])
.where({...}).update({...}).commit();.where({...}).update({...})
.where({...}).delete();.where({...}).delete()

Yazmalar çağrıldığı anda çalışır. .commit() yazılabilir ama NarQL'de olduğu gibi ek bir şey yapmaz — her ifade zaten tek işlemdir.

Herhangi bir NarQL betiği doğrudan da çalıştırılabilir:

LexerLang
$r = $db.query("from('uyeler').where({'email': $1}).fields('id').get();", $eposta)

Bağlantı#

İki kip vardır; zincir ikisinde de aynıdır.

GömülüSunucu
Veriuygulamanın yanındaki .ndbc klasörünardb serve'ün veri dizini (~/.nardb/data)
Portyok7070
Ne zamantek uygulama, geliştirmebirden fazla süreç; uygulama çalışırken shell de açılacaksa
LexerLang
# gömülü
$db = nardb.connect('data/app.ndbc').credentials({user: 'root', pass: $parola})
$db = nardb.connect({path: 'data/app.ndbc', user: 'root', pass: $parola})

# sunucu
$db = nardb.connect('nardb://root@localhost:7070/magaza').credentials({pass: $parola})
$db = nardb.connect({host: 'localhost', port: 7070, user: 'root', pass: $parola, db: 'magaza'})
SeçenekNot
pathgömülü veritabanının yolu; uygulama dizinine göre. Yoksa data/app.ndbc
create: falsegömülü veritabanı yoksa hata
encryption, passphraseyeni gömülü veritabanını şifreler
host, portsunucu; port verilmezse 7070
dbveritabanının sunucudaki adı (magaza → ~/.nardb/data/magaza.ndbc); yol değil
user, passkimlik; ya burada ya .credentials() ile
ca, cert, keybaşka makinedeki sunucu için sertifika dosyaları

Kimlik zorunlu#

Kimliği verilmemiş bir $db ile sorgu çalışmaz:

Metin
nardb: once kimlik verin: $db.credentials({user: 'root', pass: ...})

Her ifade bağlanan kullanıcının yetkisiyle çalışır, gömülü kipte de. root bütün şemalarda yöneticidir; uygulama için daha dar bir kullanıcı açmak iyi bir alışkanlıktır:

Terminal
nardb user add ./data/app.ndbc web
nardb grant ./data/app.ndbc web uyeler write
  • İlk çalıştırma: kullanıcısı olmayan yeni bir gömülü veritabanında root, ilk .credentials({user: 'root', pass: ...}) çağrısındaki parolayla oluşur. Önceden kurmak için: nardb create ./data/app.ndbc.
  • Hız: parola süreç başına bir kez Argon2id ile doğrulanır; aynı süreçteki sonraki istekler bellekteki tuzlu özetle karşılaştırılır.
  • Parola adreste olmaz: nardb://root:parola@... ve ?pass= hata verir; adresler kayıtlara ve hata mesajlarına yazılır.
  • Sertifika: aynı makinedeki sunucuya sertifika dosyası gerekmez; bağlantı yine TLS'tir. Başka makine için ca, cert, key verilir (bkz. Sunucu).

Süreç boyu tek açılış#

Gömülü veritabanı süreç boyunca bir kez açılır. LexerLang sayfaları her istekte yeniden çalışır; nardb.connect aynı yol için aynı açık veritabanını döner ve veritabanı süreç kapanırken kapanır. Bir .ndbc'yi aynı anda tek bir süreç açabildiği için uygulama çalışırken NarDB Shell ya da nardb user ... aynı kapsayıcıyı açamaz; o durumda veritabanını nardb serve ile sunun.

Tipler#

Sonuçlar tipli gelir (Go API'de Result.Values):

AlanLexerLang
tamsayılarint
float32 / float64float
boolbool
string, text, decimalstring
date, datetime, time, timestampşemadaki biçimle string
boş alannull
password_hash() alanı"••••••"

Güvenlik#

Değerler NarQL metnine yazılmaz; $1, $2 parametresi olarak ayrı gider. Alan adları tırnaklanıp kaçışlanır. Bir formdan gelen x'}).delete().all(); from('... gibi bir değer yalnızca aranan bir metin olarak kalır.

LexerLang tarafının ayrıntıları: lexer.gurerlabs.com — NarDB.