9.1 Paketler

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 9. Yerleşik kütüphane >

9.1 Paketler

9.1.1 Math — sayısal sınır sabitleri

Bu paket yalnızca sabit içerir, fonksiyonu yoktur; sabitler parantezsiz okunur (math.INT32_MAX).

SabitlerTip
INT8_MIN, INT8_MAX, UINT8_MAXinteger
INT16_MIN, INT16_MAX, UINT16_MAXinteger
INT32_MIN, INT32_MAXinteger
UINT32_MAX, INT64_MIN, INT64_MAXbigint
UINT64_MAX, INT128_MIN, INT128_MAXint128
UINT128_MAX, NUMBER_MIN, NUMBER_MAXnumber
NUMBER38_MIN, NUMBER38_MAXnumber(38)
DECIMAL_MIN, DECIMAL_MAXdecimal(18,2)
FLOAT_MIN, FLOAT_MAXfloat
DOUBLE_MIN, DOUBLE_MAXdouble

9.1.2 Console — süreç akışları

ÜyeNotlar
procedure Print(params args)
procedure PrintF(format string, params args){0}, {1} … yer tutucuları
function GetLine() returns stringuygulanmamış
Get/SetOutStream, Get/SetInStream, Get/SetErrorStreamStream

9.1.3 FileSystem — dosya işlemleri ve dosya akışı

Üye
function FileExists(Dir Directory, FileName string) returns boolean
function DeleteFile(Dir Directory, FileName string) returns boolean
function RenameFile(oldDir, oldFileName, newDir, newFileName) returns boolean
function MoveFile(oldDir, oldFileName, newDir, newFileName, overrd boolean = false) returns boolean

İç tip FileSystem.FileStream (Stream'den türer): alanlar Dir, FileName, mode, share; üyeler openFile(), openFile(Dir, FileName, mode, share), openTemp(). Sıralamalar: OpenMode (omRead, omWrite, omReadWrite), ShareMode (smExclusive, smRead, smWrite, smReadWrite, smDelete); öndeğerler omRead ve smExclusive.

9.1.4 Crypto

ÜyeDurum
base64_encode / base64_decodeçalışır (string/varbinary ve clob/blob aşırı yüklemeleri)
hex_encode / hex_decodeçalışır (aynı aşırı yüklemeler)
hash_crc32(data) returns bigintçalışır; imzasız 32-bit değer, bu yüzden bigint
hash_crc64(data) returns bigintçalışır; bugünkü gerçekleme CRC-32 değerini döndürür
hash_md5, hash_sha1, hash_sha2_224/256/384/512 çalışır; dönüş binary(16/20/28/32/48/64). Girdi: varbinary / binary ham bayt, blob, ya da dizge — dizge kendi karakter kümesinin baytlarıyla özetlenir (ISO-8859-9 için convert(s using 'ISO88599'))
hash(algo, len, data) returns varbinary çalışır; algo = MD5, SHA1, SHA224, SHA256, SHA384, SHA512, RIPEMD160; len > 0 özeti o kadar bayta kırpar
hmac_md5 / hmac_sha256 / hmac_sha512(hmacKey, data) çalışır (RFC 2104); anahtar ve veri yukarıdaki girdi kuralına uyar. hmacKey 'credential:<ad>' olabilir: o credential'ın PASSWORD'ü (her TYPE, USAGE denetimi) anahtar olur, sır PSQL'e gelmez
constant_time_equals(a, b) returns boolean bayt eşitliği, süresi farkın yerine bağlı değil — alınan imza / MAC ile hesaplananı böyle karşılaştırın
-- özet metni büyük harf onaltılık; banka imzası ISO-8859-9 baytlarıyla
hex = Crypto.hex_encode(Crypto.hash_sha2_256('abc'));                       -- BA7816BF…15AD
imza = Crypto.base64_encode(Crypto.hmac_sha512(convert(metin using 'ISO88599'), gizliAnahtar));
if (not Crypto.constant_time_equals(Crypto.base64_decode(gelenImza), beklenen)) then ...

9.1.5 WhatsApp — WhatsApp Business Cloud API istemcisi

Meta Graph API üzerinden mesaj gönderir. Asıl kullanım WhatsApp.Client tipidir:

execute block
as
  c WhatsApp.Client;
  id string;
begin
  --// anahtar CREDENTIAL'da: create credential wa type HTTP identity '<numara kimliği>' password '<anahtar>'
  c = WhatsApp.Client.FromCredential('wa');
  id = c.SendText('905551112233', 'Merhaba');
  id = c.SendTemplate('905551112233', 'hello_world', 'en_US');
  id = c.SendDocument('905551112233', 'https://.../fatura.pdf', 'fatura.pdf');
  c.MarkAsRead(id);
end;
ÜyeAçıklama
Client.FromCredential(ad) istemciyi bir TYPE HTTP credential'dan kurar: numara kimliği IDENTITY'den, apiVersion/baseUrl/timeoutSec etiketlerden gelir. Anahtar alana yalnızca credential:<ad> başvurusu olarak yazılır; gerçek anahtar istek anında çözülür, çağıranın credential üzerinde USAGE hakkı olmalıdır.
credential_info(ad)credential'ın gizli olmayan alanları (JSON); parola içermez (NET.credential_info + TYPE HTTP denetimi)
Client alanlarıaccessToken, phoneNumberId, businessAccountId, apiVersion (öndeğer v23.0), baseUrl, timeoutSec (30), maxDownloadBytes (100 MB); son isteğin lastStatus, lastResponse, lastRetryAfter ve lastMimeType değerleri
SendText, SendTemplate, SendImage, SendDocument, SendMediamesaj kimliğini (wamid...) döndürür
SendButtons(alıcı, metin, butonlar), SendList(alıcı, metin, buton, bölümler), SendLocation(alıcı, enlem, boylam, ad, adres), SendContacts(alıcı, kişiler), SendReaction(alıcı, wamid, emoji) etkileşimli butonlar ([{"id","title"}], 1–3), liste, konum, kişi kartı, tepki (boş emoji kaldırır)
son parametre replyTo Send* metotlarında isteğe bağlı: yanıtlanan mesajın wamid'i (context.message_id)
ListTemplates(maxCount), CreateTemplate(ad, dil, kategori, bileşenler), DeleteTemplate(ad) şablon yönetimi; businessAccountId (credential etiketi WABAID) gerekir. Ad [a-z0-9_], kategori MARKETING/UTILITY/AUTHENTICATION.
MarkAsRead(messageId), Post(govde json, replyTo)okundu bildirimi; herhangi bir gövdeyi gönderme
UploadMedia(fileName, mimeType, content Stream) medyayı yükler, medya kimliğini döndürür; akışın başından sonuna gönderilir, dosya belleğe alınmaz
DownloadMedia(mediaId) → blob, MediaInfo(mediaId), DeleteMedia(mediaId) indirme iki adımlıdır (bilgi + bağlantı); Meta'nın sha256 özeti doğrulanır, maxDownloadBytes aşılırsa indirmeden reddedilir; içerik türü lastMimeType'ta
BuildText, BuildTemplate, BuildMedia, BuildButtons, BuildList, BuildLocation, BuildContacts, BuildReaction, BuildRead, WithReply(gövde, replyTo) ağa çıkmaz, yalnızca istek gövdesini (json) üretir
MessageId(yanit), ErrorMessage(yanit), ErrorCode(yanit)yanıt okuyucuları
http_request(method, url, bearerToken, body, timeoutSec, out status, out retryAfter) alt düzey istek; GET, POST ya da DELETE; retryAfter yanıtın Retry-After başlığıdır (saniye; yoksa NULL). NET.http_send sarmalayıcısıdır: credential:<ad> anahtarı istek anında taşıma çözer. Üç alt düzey fonksiyon da NET.Http gibi yalnız SYSADMIN kodunda derlenir; Client ve Enqueue* herkese açıktır.
http_upload(url, bearerToken, fileName, mimeType, content Stream, timeoutSec, out status), http_download(url, bearerToken, expectedSha256, timeoutSec, out status, out mimeType, out errorBody) alt düzey multipart yükleme (NET.http_upload) ve ikili indirme (NET.http_send_binary; blob, sha256 özeti Crypto.hash_sha2_256 ile doğrulanır, uyuşmazlık hatadır)
EnqueueText(credential, alıcı, metin), EnqueueTemplate(...), Enqueue(credential, gövde) giden kutusuna (ivd$whatsapp_outbox) yazar, kayıt kimliğini döndürür; credential o anda denetlenir
ProcessOutbox(batchSize = 50, maxAttempts = 5, baseDelaySec = 30, maxDelaySec = 3600, pairDelaySec = 2) zamanı gelmiş bekleyen kayıtları gönderir ve işlenen kayıt sayısını döndürür: başarı SENT (wamid), geçici hata (ağ, 429, 5xx, Meta hız kodları; IsTransient) yeniden deneme (RetryDelay: Retry-After ya da 30 sn × 2n, en çok 1 saat), aksi FAILED. Her sonuç özerk işlemde yazılır; SQL depolu motorlarda özerk işlem bir kayıt noktasıdır. Aynı anda tek işleyici çalışır: NET.Cache'teki WhatsApp.ProcessOutbox kirası (120 sn) doluyken ikinci çağrı 0 döner; kira çağrı sonunda bırakılır, çağıran oturum COMMIT ile bitmelidir (ölü süreçten kalan kira kendiliğinden dolar). pairDelaySec: az önce başarıyla mesaj gönderilen alıcıya bu kadar saniye yeniden gönderilmez, kayıt sonraki tura kalır (Meta'nın alıcı başına hız sınırı; 0 kapatır). CancelOutbox(id) bekleyeni iptal eder: yalnız kaydın sahibi (ivd$created_by) ya da ayrıcalıklı kullanıcı (sahip, SYSDBA, SYSADMIN; is_privileged_user() = Metadata.is_privileged_user()).
OutboxJob Scheduler.Job alt tipi (alanlar batchSize, maxAttempts, baseDelaySec, maxDelaySec, pairDelaySec; OnExecute → ProcessOutbox). Scheduler.attachJob ile kaydedilir; veritabanının görev zamanlayıcısı açıkken (ALTER DATABASE … SET TASK SCHEDULER ON) iş zamanlayıcı sürecinde koşar. attachJob alanları saklamaz; yeniden kurulan tipte öndeğerler geçerlidir.
RecordEvent(eventKind, accountId, phoneNumberId, wamid, …, rawJson) webhook olayını (MESSAGE | STATUS) ivd$whatsapp_event tablosuna yazar; aynı (tür, wamid, durum) satırı varsa yazmaz ve NULL döndürür
WebhookVerify(request NET.HttpServerRequest), WebhookReceive(request) Meta webhook'unun ENDPOINT yordamları (aşağıdaki "Webhook" notu): doğrulama (hub.*) ve olay alma (imza denetimi, messages[] / statuses[] → RecordEvent, bildirim). WebhookTime(unix) / WebhookTimeText(unix) Meta'nın zaman damgasını tz'li zamana / ISO 8601 UTC metne çevirir.
Webhook

Meta'nın geri çağırması, olayların yazılacağı veritabanının iki ENDPOINT nesnesi ve bir credential ile kurulur; hizmetin conf'unda REST işlemcili bir uygulama (path /whatsapp, database = bu veritabanı) onları sunar, Meta'ya verilen adres https://<sunucu>/whatsapp/'tır:

create credential wa_webhook type CUSTOM identity '<doğrulama belirteci>' password '<App Secret>'
  tags (MQTOPIC = '/whatsapp/event');
create endpoint whatsapp_verify  method GET  path '/' as call WhatsApp.WebhookVerify;
create endpoint whatsapp_receive method POST path '/' as call WhatsApp.WebhookReceive;
commit;

Doğrulama belirteci credential'ın IDENTITY'si, App Secret PASSWORD'üdür; imza Crypto.hmac_sha256('credential:wa_webhook', gövde) ile sır PSQL'e gelmeden doğrulanır (tutmayan ya da credential'sız istek 403). Her yazılan olay MQTOPIC etiketindeki MessageQueue konusuna yayınlanır (etiket yoksa /whatsapp/event, '-' kapatır; MessageQueue.Publish). Yanıt {"result": true, "events": N, "duplicates": M}; bozuk JSON 400, WhatsApp dışı nesne 200 ile 0 olay, depo hatası 500 (Meta yeniden gönderir).

Haklar

ivd$whatsapp_event ve ivd$whatsapp_outbox kişisel veri taşıyan özel sistem tablolarıdır: öteki sistem tablolarının "herkese okunur" kuralının dışındadır. Sıradan bir kullanıcı ancak hak verilince okur ve kuyruğa yazar: grant select on sys.ivd$whatsapp_event to <rol>, grant select, insert, update on sys.ivd$whatsapp_outbox to <rol>; paket yordamları credential'da grant usage on credential wa to <rol> ister. Sahip, SYSDBA ve SYSADMIN için hak gerekmez. Depoda bu iki tabloya PUBLIC SELECT verilmez; UPGRADE eski bir sürümün verdiği hakkı geri alır.

--// dosyadan ya da tablodaki bir blob'dan medya yükleme
s Stream = Stream();
s.WriteRaw(icerik);                    --// icerik: blob / varbinary
mid = c.UploadMedia('fatura.pdf', 'application/pdf', s);
id = c.SendDocument('905551112233', mid, 'fatura.pdf');
b = c.DownloadMedia(mid);

Bir blob, yukarıdaki gibi Stream() + WriteRaw ile kopyalanarak ya da BlobStream(blob, omRead) ile kopyasız akışa alınır; dosya için FileSystem.FileStream doğrudan verilir.

Medya için mediaRef http:// ya da https:// ile başlıyorsa bağlantı, başlamıyorsa yüklenmiş medyanın kimliği sayılır. mediaType tam olarak image, document, audio, video ya da sticker yazılmalıdır.

Hatalar: WHATSAPP_NOT_CONFIGURED (anahtar ya da numara kimliği boş), WHATSAPP_INVALID_ARGUMENT (zorunlu argüman boş ya da tür geçersiz), WHATSAPP_API_ERROR (2xx dışı yanıt; ileti HTTP kodunu ve Meta'nın iletisini taşır).

Dikkat

TLS sertifikası her zaman doğrulanır ve yönlendirme izlenmez. Düz http yalnızca localhost için kabul edilir. Erişim anahtarı hiçbir günlük satırına ya da hata iletisine yazılmaz; anahtar kaynak koduna gömülmez, CREATE CREDENTIAL ile saklanır.

9.1.6 OS — makine, kullanıcı ve süreçler

Üye
GetDomainName(), GetComputerName(), GetUserName() → string
GetUserID(), GetGroupID() → integer; IsAdmin() → boolean
GetSystemGUID() → guid
GetOSType(), GetOSVersion() → string
GetLastErrorCode() → integer; GetStatusText(status) → string; RaiseLastOSError()
ErrorLevel() → integer: son #SHELL komutunun çıkış kodu (bkz. bölüm 10)
GetEnvironmentString(ad) → string; SetEnvironmentString(ad, değer) → boolean

İç tip OS.Command: alanlar Dir, Executable, Parameters, InStream, OutStream, ErrorStream; üyeler Run(), Wait(TimeoutMS), Terminate(ExitCode), GetExitCode(). Dir boş bırakılırsa Executable işletim sisteminin arama yolundan (PATH) bulunur. Firebird yedeği için OS.gbak (Command'dan türer) vardır: alanları (DatabaseFile, BackupFile, Restore, UserName, Password …) Run() sırasında gbak komut satırına çevrilir; gbak arama yolundan bulunur, Firebird'ün bin dizini PATH'te olmalıdır.

Not

OS.Command her iki platformda da çalışır. Kabuk çağrılmaz: Windows'ta CreateProcess, POSIX'te fork + execvp. Parameters POSIX'te motor tarafından bölünür: boşluk ve sekme ayırır, yalnız çift tırnak özeldir (açar/kapar, argümana girmez; a"b c"d tek argüman ab cd, "" boş argüman), tek tırnak ve ters bölü özel değildir. Windows'ta motor bölmez: "<Executable>" <Parameters> satırı olduğu gibi CreateProcess'e gider ve programın kendi çalışma zamanı Windows kuralıyla ayrıştırır. Joker genişletme, yönlendirme ve boru gibi kabuk özellikleri yoktur; gerekiyorsa kabuk açıkça çalıştırılır.

GetExitCode() sürecin çıkış kodunu verir. POSIX'te süreç bir sinyalle sonlandıysa çıkış kodu yoktur; o durumda kabukların kuralı uygulanır ve 128 + sinyal numarası döner, örneğin Terminate() sonrası 143 (128 + SIGTERM). POSIX'te execvp'nin her hatası (bulunamayan program dahil) 127 verir; Windows'ta bulunamayan program Run()'da hata fırlatır. Terminate(ExitCode)'un ExitCode parametresi Windows'ta TerminateProcess'e gider, POSIX'te karşılığı yoktur ve yok sayılır.

Not

GetUserID() ve GetGroupID() POSIX kimlikleridir ve Windows'ta -1 döner: Windows kimlikleri SID'dir, sayısal bir kullanıcı/grup kimliği kavramı yoktur. IsAdmin() her iki platformda çalışır (Windows'ta Administrators/Power Users üyeliği, POSIX'te etkin kullanıcının root olması).

Not

SetEnvironmentString ile yazılan bir değer GetEnvironmentString ile sağlıklı geri okunamaz.

9.1.7 Application — motor ve yapılandırma bilgisi

ÜyeNotlar
GetTitle(), GetVersion(), GetVersionDate()string; GetVersionDate bir derleme damgasıdır
GetStartTime()timestamp: sürecin başlangıç anı
GetLogFileName(), GetConfigFileName()string
GetConfigValue(ad)string
GetLogLevel()integer; salt okunur, SQL'den değiştirilemez
isDebugMode()boolean
GetCPUType()string
Get/SetOutStream, Get/SetInStream, Get/SetErrorStreamStream

9.1.8 DebugHelper

ÜyeDurum
procedure Assert(cond boolean, msg string = null)false ise ASSERT istisnası (yakalanabilir)
WriteDebugOut(msg), WriteDebugOutF(fmt, params)çalışır
WriteMemoryDump(fileName, flags), WriteProcessDump(fileName)çalışır
DumpObject(objectName, fileName, options)çalışır
GetCallStack(skipFirstN, depth, withParamValues)uygulanmamış

9.1.9 EventLog — geri alınamayan olay kaydı

EventLog.write(source, source_object_id, source_key, severity, event_type,
               result, message, extra = null, data = null)

Gövdesi kaydı in autonomous transaction do içinde yazar, yani çağıran geri alsa bile kayıt kalır. severity sıralaması (ivd$EventLogSeverity): Critical, Error, Warning, Information, Verbose. Kayıtlar ivd$event_log tablosundadır; zaman ve kullanıcı kimliği otomatik yazılır.

9.1.10 Scheduler — yinelenen PSQL işleri

Scheduler.Job tipinden türetip OnExecute() yordamını geçersiz kılarak bir iş tanımlanır; sonra:

Üye
attachJob(j Job) / detachJob(job_name)
enableJob(job_name) / disableJob(job_name)
startJob(job_name) / stopJob(job_name) / resetJob(job_name)
verifySchedule(schedule, out errorMsg) returns boolean
calcNextRuntime(in out runtime, firstRun, schedule, out errorMsg) returns boolean
jobCompleted(j Job, e Exception): koşucu her çalışmanın sonunda çağırır; sonucu ve bir sonraki zamanı ivd$scheduler_jobs'a yazar

Job alanları: job_name, job_type (varsayılan 'PSQL'), start_date, repeat_interval, schedule_limit, end_date, enabled, auto_disable ('N', 'A' her zaman, 'S' başarıda, 'F' hatada), auto_disable_after, comments, logging_level, execution_log_limit. Geçersiz zamanlama dizgisi invalid_job_schedule, bulunamayan iş job_not_found istisnası verir. Her işlem EventLog'a yazılır. Örnek zamanlama dizgisi: 'secondly; seconds=5,15,25,35,45,55'.

9.1.11 NET — e-posta, TCP ve HTTP

Paketin fonksiyonları HTTP taşıması ve JWT için (http_send, http_send_binary, http_upload, jwt_sign, jwt_verify); asıl kullanım iç tiplerdir.

Tipİçerik
NET.MailAddressmailAddr, friendlyName; kurucu MailAddress(mailAddr, friendlyName = null)
NET.MailAttachmentfileName, title, contentType, contentTransfer, charSet, contentDisposition, contentID, extraHeaders, content Stream
NET.MailMessageto/cc/bccRecipients, attachments, body (satır dizisi), fromAddr, subject, charSet ('UTF-8'), replyTo, receiptRecipient, priority (3), encoding (meDefault, meMIME, mePlainText)
NET.SMTPClienthost, port = 25, useSSL, timeout = 60, authType (auDefault, auLogin, auPlain, auPlainC, auCramMD5, auDigestMD5, auXOAUTH, auXOAUTH2; öndeğer auLogin); connect(), authenticate(user, pass), send(), send(msg), AddMessage(msg), disconnect()
NET.TCPClienthost, port, useSSL, zaman aşımları saniye cinsinden (sendtimeout ve recvtimeout öndeğer 60; bağlanma için connecttimeout öndeğer 10, 0 ise hizmetin yapılandırmasındaki değer kullanılır); connect(), connect(host, port, useSSL), Send(stream, len), Recv(stream, len), GetStream(), disconnect()

NET.Http — HTTP istemcisi

NET.HttpRequest nesnesi doldurulur, NET.Http.Send(r) gönderir, NET.HttpResponse döner. Kısayollar: Get(url, headers), PostJson(url, body json, headers), PostForm(url, form json, headers), PostXml(url, body, headers), Download(url, headers) returns blob (2xx dışında NET_HTTP_ERROR).

Tipİçerik
NET.HttpRequestmethod = 'GET' (GET, POST, PUT, PATCH, DELETE, HEAD), url, headers json ({"Ad": "değer"}), contentType, body string (metin: JSON, XML), bodyBlob blob (ikili), form json (application/x-www-form-urlencoded gövde), allowInsecure = false, timeoutSec = 30, maxResponseBytes = 16 MB, binaryResponse = false. contentType boşsa: body JSON ise application/json, değilse text/plain; form için x-www-form-urlencoded; blob için application/octet-stream. GET ve HEAD gövde taşıyamaz.
NET.HttpResponsestatus, headers json (yanıt başlıkları), contentType, body (metin) ya da bodyBlob (binaryResponse), retryAfter (saniye, yoksa NULL), elapsedMs
NET.Httpstatik Send, Get, PostJson, PostForm, PostXml, Download, Upload(url, headers, fields json, fileField, fileName, mimeType, content Stream, allowInsecure = false, timeoutSec = 30) (multipart/form-data: fields metin parçaları, ardından dosya parçası; içerik akıştan belleğe alınmadan gider; yanıtta status, body, retryAfter), JwtSign(claims json, secretKey, ttlSec = 300), JwtVerify(token, secretKey) returns json (HS256; geçersiz ya da süresi dolmuş belirteç NULL)
execute block
as
  r NET.HttpRequest = NET.HttpRequest();
  resp NET.HttpResponse;
begin
  r.method = 'POST';
  r.url = 'https://api.ornek.gov.tr/token';
  r.headers = json_object('X-ClientId', 'credential:turmob.identity', 'X-SecretKey', 'credential:turmob');
  r.form = json_object('grant_type', 'client_credentials', 'token', :mmAnahtari);
  resp = NET.Http.Send(r);

  if (resp.status <> 200) then
    exception net_http_error using (resp.status, left(resp.body, 200));

  resp = NET.Http.Get('https://api.ornek.gov.tr/MukellefBilgisi/' || :vkn,
    json_object('Authorization', 'Bearer ' || json_value(resp.body, '$.access_token')));
end;
  • Gizli bilgi credential'da kalır: başlık, form ve anahtar değerlerinde credential:<ad> istek anında o credential'ın PASSWORD'üne çözülür (CREATE CREDENTIAL … TYPE HTTP, çağıranın USAGE hakkı aranır); credential:<ad>.identity IDENTITY'ye, credential:<ad>.tag:<AD> bir etikete; değerin içinde {credential:<ad>} yazımı da geçerlidir ('Bearer {credential:wa}'). Sır PSQL'e, günlüğe ve hata iletisine girmez.
  • Güvenlik: TLS sertifikası her zaman doğrulanır, yönlendirme izlenmez; düz http yalnız localhost'a, allowInsecure = true ile yalnız özel ağ IPv4 adresine (10/8, 172.16/12, 192.168/16) gider. NET.Http üyeleri, http_send* / http_upload ve WhatsApp.http_* yalnız SYSADMIN kodunda derlenir (yukarıdaki Yetki notu); paketlerinizi SQL SECURITY DEFINER ile yazın.
  • JWT: JwtSign iat yoksa yazar, ttlSec > 0 ise exp ekler; anahtar 'credential:<ad>' olabilir (her TYPE). JwtVerify imzayı sabit süreli karşılaştırır ve exp'i denetler.
  • Hatalar: NET_HTTP_INVALID_ARGUMENT (boş istek), NET_HTTP_ERROR (Download 2xx dışı); taşıma hataları (adres, zaman aşımı, boyut sınırı) APPLICATION_ERROR olarak gelir.
Sınır

FTP istemci tipi yoktur; HTTP istemcisi sunucu sertifikası ister ama kendi istemci sertifikasını (mTLS) sunmaz.

9.1.12 MessageQueue, Metadata, Utils

MessageQueue bir zarf tipi (MessageQueue.Message: destination, messageText, MessageBody JSONType) ve tek bir fonksiyon bildirir: MessageQueue.Publish(konu, mesaj) returns integer mesajı sürecin bütün oturum yöneticilerindeki abonelere (/message uygulamasına SUBSCRIBE ile bağlananlar, başka bir işçi süreçte de olabilir) yayınlar ve abone sayısını döndürür; kalıcı değildir, abonesi yoksa düşer. Metadata paketi katalog okuyucusudur: Attribute, Attributes, AllAttributes, EffectiveAttribute, Description, Caption, ObjectInfo, Columns, Relations, Search, UpgradeReportText (bkz. 6.11) ve is_privileged_user() (çağıran bu veritabanında ayrıcalıklı mı: kimliksiz bağlantı, SYSDBA, SYSADMIN üyesi ya da sahip). Utils paketi boştur; üyesi yoktur.