|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > Netsim System Agent İstemci Protokolü Referansı > 7. IVEDI oturum protokolü (/ivedi) > 7.7 Durumsuz uç: POST /ivedi/execute |
Tek HTTP isteği = aç + çalıştır + commit + kapat; oturum ve imleç yoktur. Çok sayıda kısa istek için oturum açmak
yerine budur (her oturum bir işçi süreçtir). Gövde JSON (öndeğer) ya da BSON (Content-Type: application/bson);
yanıt aynı kodlamayla (application/json / application/bson). Kimlik Basic ya da gövdedeki login /
password; kimliksiz istek 401 + WWW-Authenticate, reddedilen kimlik 401 + ok: false (Basic sınaması
olmadan: tarayıcı kendi giriş penceresini açmaz).
| Alan | Anlamı |
|---|---|
sql |
tek deyim (öndeğer) ya da script: true ile çok deyimli betik (maxErrors; yönetim arayüzünün yazma kanalı) |
params |
execute ile aynı (dizi konumsal, nesne adlı); betik kipinde yok |
database, searchPath, timeZone |
open ile aynı |
maxRows |
sonuç kümesinin en fazla satırı (öndeğer conf fetchSize, conf maxRows > 0 ise onunla sınırlı); fazlası truncated: true |
metadata, statementTimeoutMs |
execute ile aynı |
Yanıt 200: ok, login, database, kind, affectedRows, results[] (execute ile aynı öğeler, cursorId
asla yok), timedOut?, elapsedMs; hata: ok: false + error (SQL hatası da 200dür - sonuçtur). Hatasız istek
commit edilir, hatalı istek geri alınır (betik kipinde bir deyim bile düşerse bütün betik geri alınır).
IVEDI)Motorun kendi istemci katmanı bu protokolü bir sağlayıcı olarak konuşur: ImpConnection::createConnection("IVEDI")
(IVEDI_Code/src/stor/ivd/StoIvdClient.cpp). Bağlantı dizesi: Server Name (zorunlu), Port (82), Path
(/ivedi), Database Name, User Name (zorunlu), Password, Use SSL (No), Encoding (BSON öndeğer / JSON),
Fetch Size (500), Statement Timeout (ms). Her ImpStatement çağrısı bir protokol komutudur (prepare /
executePrepared / fetch / closeCursor / free), işlem denetimi COMMIT / ROLLBACK deyimleriyle, {blob}
tutamacı istemcide saydam olarak satır içi akışa çevrilir. SQL'den: EXECUTE STATEMENT ... ON EXTERNAL
'ivedi:host[:port]/veritabanı' AS USER '...' PASSWORD '...' (COMMON / AUTONOMOUS, FOR EXECUTE STATEMENT dahil);
bağlantı ImpConnectionPool'da havuzlanır. Ölçüldü (2026-09-23): ajanın kendi /ivedi ucuna geri bağlanan bir
EXECUTE STATEMENT (ikinci işçi süreç) sayım, parametreli INSERT + commit, satır döngüsü ve kimlik reddi ile.
FireDAC.Phys.IVEDI, DriverID IVEDI)Delphi tarafı bir FireDAC fiziksel sürücüsüdür: LIB37\CORE\FireDAC.Phys.IVEDI.pas (Netsim.Core370 paketi;
{$I FireDAC.inc} için $(BDS)\source\data\firedac include yolunda). TFDConnection.DriverName = 'IVEDI' ile
TFDQuery / TFDCommand / TFDTable olduğu gibi çalışır. Bağlantı tanımı parametreleri: Server (127.0.0.1),
Port (82), Path (/ivedi), UseSSL, Database (MASTER kayıt adı), User_Name, Password, SearchPath,
StatementTimeout (ms), LoginTimeout (ms), Language (motor iletilerinin dili, open.language: tr, en; boş =
ajanın conf language'i), TimeZone (oturumun saat dilimi, open.timeZone, SET TIME ZONE biçimi: +03:00, UTC;
boş = sunucu), Encoding (json öndeğer / bson: çerçeve kodlaması, tipli özellik MessageEncoding). Taşıma katmanı
LIB37\CORE\NSIVEDIClient.pas (TNSIVEDIClient: Open / Execute / Script / Prepare / ExecutePrepared /
Fetch / CloseCursor / WriteBlob / ReadBlob / Subscribe / PollNotifications / Cancel; Encoding özelliği
json / bson - BSON'da ileti yine TJSONObject ağacıdır, gelen ikili değer base64 metne çözülür, BinaryValue ikili
alan yazar; TFDConnection.CliObj bu nesnedir; Language özelliği oturumun dilidir - open yanıtı).
Eşleme: FireDAC ön işlemcisi :ad parametrelerini ? yapar ve sürücü Markers sırasıyla konumsal params dizisi
gönderir; tek çalıştırma execute, Array DML prepare + executePrepared; sonuç kümesi ilk parça + fetch
(FetchOptions.RowsetSize = oturumun fetchSize'ı), TFDQuery.Close açık imleci closeCursor ile kapatır;
TxOptions.AutoCommit sunucunun autocommit ayarıdır, StartTransaction sunucuda kapatır, Commit / Rollback
SQL gönderip ayarı geri alır, CommitRetaining COMMIT RETAIN; iç içe StartTransaction kayıt noktasıdır (SAVEPOINT,
iç Commit RELEASE SAVEPOINT, iç Rollback ROLLBACK TO SAVEPOINT); blob parametresi writeBlob + {"blob": id}, satırdaki {"blob", "size"} tutamacı
readBlob ile okunur; AbortJob POST /ivedi/cancel; sunucu hatası EFDDBEngineException (Errors[0].ErrorCode
motor kodu, iletide AD [SQLSTATE]: ..., 57014 ekCmdAborted, 23505 ekUKViolated, ...). Kolon tipleri columns[]
tip adından (INTEGER -> dtInt32, NUMERIC(p,s) -> dtBCD/dtFmtBCD, TIMESTAMP -> dtDateTime, VARCHAR(charLen) ->
dtWideString, BLOB -> dtBlob, ...); tarih-saat değeri oturum saat dilimindeki duvar saatidir (metindeki ofset
istemci makinesinin dilimine çevrilmez). Kolon kökeni sunucudan gelir (relation / schema / baseName): tablo kolonuna
dayanan alanlar güncellenebilir, ifade kolonları salt okunurdur; TFDQuery Edit / Post için birincil anahtarı
metaveriden alır, UpdateOptions.UpdateTableName / KeyFields gerekmez (verilirse onlar kullanılır). Üretilen UPDATE
tablo adını oturum arama yolunun ilk şemasıyla niteler (CurrentSchema). Metaveri komutları IVEDI kataloğu üzerinden
SQL ile beslenir (TFDPhysIVEDICommandGenerator.GetSelectMetaInfo, sys.ivd$objects / sys.ivd$object_columns /
sys.ivd$index_columns): GetCatalogNames (MASTER'a kayıtlı veritabanları), GetSchemaNames, GetTableNames (tablo
+ görünüm, joker, AFullName öndeğeri şema nitelemeli), GetFieldNames, GetKeyFieldNames, GetIndexNames, yabancı
anahtarlar ve alanları, GetPackageNames, GetStoredProcNames (yordam + işlev; paket verilirse üyeleri),
GetGeneratorNames (SEQUENCE), katalog.şema.nesne nitelemeli adlar (MASTER.SYS.IVD$OBJECTS; katalog verilen
metaveri o veritabanının katalog tablolarından okunur, CATALOG_NAME veritabanının adıdır), yordam parametreleri (mkProcArgs: PARAMETER girdi, yordamın RETURNS'ü çıkış,
işlevin dönüşü Result), TFDTable.
Saklanmış yordam (TFDStoredProc, paket üyesi PackageName ile): parametreler katalogdan gelir; ExecProc yordamda
EXECUTE PROCEDURE p(?, ...) gönderir (motor çıkış değerlerini tek satırlık küme olarak döndürür, çıkış parametrelerine
yazılır), işlevde SELECT f(?, ...) FROM DUAL (Result); Open SELECT * FROM p(?, ...). UpdateOptions.GeneratorName
için dizi NEXT VALUE FOR / GEN_ID(ad, 0) ile okunur.
Olaylar (TFDEventAlerter, Kind Events): dinleyici bağlantının klonuyla ayrı bir oturum açar, her ad için
subscribe eder ve bir iş parçacığı notification: event çerçevelerini bekler (sessizlikte 2 sn'de bir ping);
OnAlert olay adını ve argümanı alır (params boşsa Null, tek öğe değer, çok öğe Variant dizisi). Olay motorun
POST_EVENT'iyle COMMIT'te gelir (ROLLBACK göndermez). Signal(ad, argüman) aynı oturumdan EXECUTE BLOCK ...
POST_EVENT '<ad>' USING (...) + COMMIT gönderir. Konsol uygulamasında Options.Synchronize := False (ana iş
parçacığının mesaj döngüsü yoksa OnAlert beklemede kalır).
Ölçüldü (2026-09-23): IVEDI_Code/sqltest/tools/ivedi_delphi_smoke.dpr (ivedi_api_test.py dcc64 ile derleyip
çalıştırır) - kimlik reddi, DDL, adlı parametreli ve NULL INSERT, Array DML 5 satır, ExecSQLScalar, RowsetSize 2 ile
açılan sorgunun FetchAll ile 7 satırı ve alan tipleri, erken Close, parametreli SELECT, 42601, StartTransaction /
Rollback / Commit, Edit / Post ile güncelleme (UpdateTableName ile ve kökenden), ifade kolonunun salt okunurluğu,
GetTableNames / GetFieldNames / GetKeyFieldNames / GetIndexNames / GetSchemaNames, TFDTable, blob parametre
ve geri okuma, CliObj üzerinden ping. Ölçüldü (2026-09-28): kayıt noktası (iç içe Rollback / Commit),
CommitRetaining, TFDStoredProc ile yordam çıkış parametreleri, işlev Result, seçilebilir yordam Open, paket
işlevi, yordam / paket / dizi / katalog listeleri, TFDEventAlerter (başka oturumun POST_EVENT'i, argümanlar,
ROLLBACK'te olay yok, Signal, Unregister), TimeZone, Encoding=bson ile ondalık 18,4, zaman damgası ve 300 KB blob.