7.7 Durumsuz uç: POST /ivedi/execute

<< İç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).

7.7.1 C++ istemci sağlayıcısı (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.

7.7.2 Delphi: FireDAC sürücüsü (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 '&lt;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.