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

Go API

NarDB'yi bir Go programına gömmek; Exec, parametreler ve hata değerleri.

NarDB Shell, ileride gelecek sunucu ve LexerLang connector'ı aynı Go paketini kullanır. Hiçbiri depolama katmanına doğrudan erişmez.

Go
import "nardb"

db, err := nardb.Open("./veri/magaza.ndbc", nardb.Options{})
if err != nil {
    return err
}
defer db.Close()

res, err := db.Exec(ctx, `
    from('uyeler')
        .where({'email': $1})
        .fields('name', FORMAT('birth_date', 'dd-mm-yyyy'));
`, "osman@example.com")
if err != nil {
    return err
}
for _, row := range res[0].Rows {
    fmt.Println(row[0], row[1])
}

Açma kipleri#

Options.ModeDosya varsaDosya yoksa
nardb.OpenOrCreate (varsayılan)açaroluşturur
nardb.CreateNewfs.ErrExistoluşturur
nardb.OpenExistingaçarfs.ErrNotExist

Aynı dosyayı ikinci kez açmak, aynı süreç içinde bile nardb.ErrLocked döndürür. Bir süreçte tek bir *nardb.DB paylaşılmalıdır; DB eşzamanlı kullanıma uygundur.

Exec#

Go
func (db *DB) Exec(ctx context.Context, script string, args ...any) ([]Result, error)
  • İfadeleri sırayla çalıştırır ve ilk hatada durur. Dönen sonuçlar hataya kadar çalışmış ifadelerindir.
  • $1, $2 yerine args değerleri konur; değerler sorgu metnine gömülmez.
  • Aynı anda en fazla max_concurrent_queries kadar Exec çalışır. query_timeout, ctx'e ek bir süre sınırı koyar.
Go
type Result struct {
    Statement    string
    Message      string
    Columns      []string
    Rows         [][]string
    RowsAffected int
}

Satırlar şimdilik metin olarak döner. Tarihler alanın biçimiyle, parola alanları •••••• olarak gelir. Türlü değerler döndüren bir API ilerleyen sürümlerde eklenecek.

Hatalar konum taşır: line 2, col 17: 'int' is ambiguous: ....

Diğer metotlar#

MetotNe yapar
Schemas() · DescribeSchema(ad)Şemaları ve bir şemanın alanlarını, indekslerini ve dağıtımını döndürür
CreateUser(ad, parola) · VerifyUser · Users()Kullanıcılar
Pool() · SetPool(p)Havuz ayarları
Stats()Dosya ve sayfa istatistikleri, DatabaseID

Hata değerleri#

errors.Is ile karşılaştırılır: ErrNotDatabase, ErrCorrupt, ErrFormatVersion, ErrUnsupportedFeature, ErrLocked, ErrUnsupportedPlatform, ErrClosed, ErrNotImplemented.

LexerLang#

LexerLang connector'ı henüz yazılmadı. Planlanan kullanım şu:

LexerLang
use nardb

$db = $app.services.once("nardb", func()
    return new nardb({path: path.pwd + "/data/app.ndbc"})
end func)

$uye = $db.query("from('uyeler').where({'email': $1}).fields('name').limit(1);", $eposta)

services.once kullanılmasının sebebi şu: LexerLang sayfaları her istekte yeniden çalışır. Veritabanı dosyasını istek başına açıp kapatmak hem yavaş olur hem de "dosyanın tek sahibi" kuralıyla çakışır.