Skip to main content

firebird_wire/wire/
consts.rs

1//! Constantes do protocolo de comunicação (wire protocol) do Firebird.
2//!
3//! Estas espelham os cabeçalhos public/impl distribuídos com o Firebird
4//! (`firebird/impl/consts_pub.h`, `iberror_c.h`, `Protocol.h`, `sqlda_pub.h`).
5//! Apenas o subconjunto necessário para este driver é reproduzido. Os valores são estáveis
6//! ao longo do wire protocol e não devem ser alterados.
7
8#![allow(dead_code)]
9#![allow(missing_docs)]
10
11// ---------------------------------------------------------------------------
12// Operações (Protocol.h `P_OP`)
13// ---------------------------------------------------------------------------
14
15pub mod op {
16    pub const VOID: i32 = 0;
17    pub const CONNECT: i32 = 1;
18    pub const EXIT: i32 = 2;
19    pub const ACCEPT: i32 = 3;
20    pub const REJECT: i32 = 4;
21    pub const DISCONNECT: i32 = 6;
22    pub const RESPONSE: i32 = 9;
23
24    pub const ATTACH: i32 = 19;
25    pub const CREATE: i32 = 20;
26    pub const DETACH: i32 = 21;
27
28    pub const TRANSACTION: i32 = 29;
29    pub const COMMIT: i32 = 30;
30    pub const ROLLBACK: i32 = 31;
31    pub const PREPARE: i32 = 32;
32
33    pub const INFO_DATABASE: i32 = 40;
34    pub const INFO_TRANSACTION: i32 = 42;
35
36    // Eventos do banco (canal auxiliar).
37    pub const QUE_EVENTS: i32 = 48;
38    pub const CANCEL_EVENTS: i32 = 49;
39    pub const COMMIT_RETAINING: i32 = 50;
40    pub const EVENT: i32 = 52;
41    pub const CONNECT_REQUEST: i32 = 53;
42
43    // Op codes de blob. A faixa baixa (34-43) é a clássica; os *_blob2 ficam na
44    // faixa alta, logo antes de op_allocate_statement(62), e a enum é sequencial:
45    // op_ddl=55, op_open_blob2=56, op_create_blob2=57, op_get_slice=58,
46    // op_put_slice=59, op_slice=60, op_seek_blob=61.
47    pub const CREATE_BLOB: i32 = 34;
48    pub const OPEN_BLOB: i32 = 35;
49    pub const GET_SEGMENT: i32 = 36;
50    pub const PUT_SEGMENT: i32 = 37;
51    pub const CANCEL_BLOB: i32 = 38;
52    pub const CLOSE_BLOB: i32 = 39;
53    pub const INFO_BLOB: i32 = 43;
54    pub const OPEN_BLOB2: i32 = 56;
55    pub const CREATE_BLOB2: i32 = 57;
56    pub const GET_SLICE: i32 = 58;
57    pub const PUT_SLICE: i32 = 59;
58    pub const SLICE: i32 = 60;
59    pub const SEEK_BLOB: i32 = 61;
60
61    pub const ALLOCATE_STATEMENT: i32 = 62;
62    pub const EXECUTE: i32 = 63;
63    pub const EXEC_IMMEDIATE: i32 = 64;
64    pub const FETCH: i32 = 65;
65    pub const FETCH_RESPONSE: i32 = 66;
66    pub const FREE_STATEMENT: i32 = 67;
67    pub const PREPARE_STATEMENT: i32 = 68;
68    pub const SET_CURSOR: i32 = 69;
69    pub const INFO_SQL: i32 = 70;
70
71    pub const DUMMY: i32 = 71;
72
73    pub const EXEC_IMMEDIATE2: i32 = 75;
74    pub const EXECUTE2: i32 = 76;
75    pub const SQL_RESPONSE: i32 = 78;
76
77    pub const DROP_DATABASE: i32 = 81;
78
79    pub const SERVICE_ATTACH: i32 = 82;
80    pub const SERVICE_DETACH: i32 = 83;
81    pub const SERVICE_INFO: i32 = 84;
82    pub const SERVICE_START: i32 = 85;
83
84    pub const ROLLBACK_RETAINING: i32 = 86;
85
86    pub const TRUSTED_AUTH: i32 = 90;
87    pub const CANCEL: i32 = 91;
88    pub const CONT_AUTH: i32 = 92;
89    pub const PING: i32 = 93;
90    pub const ACCEPT_DATA: i32 = 94;
91    pub const ABORT_AUX_CONNECTION: i32 = 95;
92    pub const CRYPT: i32 = 96;
93    pub const CRYPT_KEY_CALLBACK: i32 = 97;
94    pub const COND_ACCEPT: i32 = 98;
95
96    // Batch (FB4+) — o recurso principal de DML em array.
97    pub const BATCH_CREATE: i32 = 99;
98    pub const BATCH_MSG: i32 = 100;
99    pub const BATCH_EXEC: i32 = 101;
100    pub const BATCH_RLS: i32 = 102;
101    pub const BATCH_CS: i32 = 103;
102    pub const BATCH_REGBLOB: i32 = 104;
103    pub const BATCH_BLOB_STREAM: i32 = 105;
104    pub const BATCH_SET_BPB: i32 = 106;
105
106    pub const REPL_DATA: i32 = 107;
107    pub const REPL_REQ: i32 = 108;
108
109    pub const BATCH_CANCEL: i32 = 109;
110    pub const BATCH_SYNC: i32 = 110;
111    pub const INFO_BATCH: i32 = 111;
112
113    // FB5
114    pub const FETCH_SCROLL: i32 = 112;
115    pub const INFO_CURSOR: i32 = 113;
116}
117
118// ---------------------------------------------------------------------------
119// Versões de protocolo e negociação de conexão
120// ---------------------------------------------------------------------------
121
122/// Bit alto setado em toda versão de protocolo oferecida/aceita no Firebird moderno.
123pub const FB_PROTOCOL_FLAG: i32 = 0x8000;
124/// Máscara usada para recuperar a versão base a partir de um valor de protocolo aceito.
125pub const FB_PROTOCOL_MASK: i32 = !FB_PROTOCOL_FLAG;
126
127pub const PROTOCOL_VERSION10: i32 = 10;
128pub const PROTOCOL_VERSION11: i32 = FB_PROTOCOL_FLAG | 11;
129pub const PROTOCOL_VERSION12: i32 = FB_PROTOCOL_FLAG | 12;
130pub const PROTOCOL_VERSION13: i32 = FB_PROTOCOL_FLAG | 13;
131pub const PROTOCOL_VERSION14: i32 = FB_PROTOCOL_FLAG | 14;
132pub const PROTOCOL_VERSION15: i32 = FB_PROTOCOL_FLAG | 15;
133pub const PROTOCOL_VERSION16: i32 = FB_PROTOCOL_FLAG | 16; // FB4: batch, timeout de stmt
134pub const PROTOCOL_VERSION17: i32 = FB_PROTOCOL_FLAG | 17; // FB4: cancel, etc.
135pub const PROTOCOL_VERSION18: i32 = FB_PROTOCOL_FLAG | 18; // FB5: fetch scroll, info batch
136pub const PROTOCOL_VERSION19: i32 = FB_PROTOCOL_FLAG | 19; // FB5.0.x
137
138/// `p_cnct_cversion` — versão do bloco connect (CONNECT_VERSION3 carrega info de crypt).
139pub const CONNECT_VERSION3: i32 = 3;
140
141/// Identificador de arquitetura (`arch_generic`).
142pub const ARCH_GENERIC: i32 = 1;
143
144/// `ptype_*` — *tipo* de protocolo mínimo/máximo aceitável por versão oferecida.
145pub const PTYPE_PAGE: i32 = 1; // page-server (não usado)
146pub const PTYPE_RPC: i32 = 2; // chamada de procedimento remoto simples
147pub const PTYPE_BATCH_SEND: i32 = 3; // envios em batch, sem assincronia
148pub const PTYPE_OUT_OF_BAND: i32 = 4; // envios em batch com notificação out-of-band
149pub const PTYPE_LAZY_SEND: i32 = 5; // entrega de pacotes adiada
150
151/// Bit feito OR em `p_acpt_type` para indicar compressão e arquitetura, específico do FB.
152pub const PFLAG_COMPRESS: i32 = 0x100;
153
154// ---------------------------------------------------------------------------
155// Tags de clumplet CNCT (bloco connect, identificação de usuário)
156// ---------------------------------------------------------------------------
157
158pub mod cnct {
159    pub const USER: u8 = 1; // nome de usuário do SO
160    pub const PASSWD: u8 = 2;
161    pub const HOST: u8 = 4; // nome do host do cliente
162    pub const GROUP: u8 = 5; // id efetivo do grupo Unix
163    pub const USER_VERIFICATION: u8 = 6;
164    pub const SPECIFIC_DATA: u8 = 7; // dados do plugin de autenticação, em chunks
165    pub const PLUGIN_NAME: u8 = 8; // plugin que produziu specific_data
166    pub const LOGIN: u8 = 9; // login moderno (igual a isc_dpb_user_name)
167    pub const PLUGIN_LIST: u8 = 10; // plugins disponíveis no cliente
168    pub const CLIENT_CRYPT: u8 = 11; // nível de wire-crypt desejado
169}
170
171/// Valores para `cnct::CLIENT_CRYPT` (e nível de wire-crypt do DPB).
172pub mod wire_crypt {
173    pub const DISABLED: i32 = 0;
174    pub const ENABLED: i32 = 1;
175    pub const REQUIRED: i32 = 2;
176}
177
178// ---------------------------------------------------------------------------
179// DPB — Buffer de Parâmetros de Banco de Dados (consts_pub.h `isc_dpb_*`)
180// ---------------------------------------------------------------------------
181
182/// Byte de versão do DPB que prefixa o buffer.
183pub const DPB_VERSION1: u8 = 1;
184pub const DPB_VERSION2: u8 = 2; // strings em UTF-8, comprimentos em 4 bytes
185
186pub mod dpb {
187    pub const PAGE_SIZE: u8 = 4;
188    pub const NUM_BUFFERS: u8 = 5;
189    pub const DBKEY_SCOPE: u8 = 13;
190    pub const SQL_DIALECT: u8 = 63;
191    pub const SET_DB_CHARSET: u8 = 68;
192    pub const FORCE_WRITE: u8 = 24;
193    pub const NO_RESERVE: u8 = 27;
194    pub const USER_NAME: u8 = 28;
195    pub const PASSWORD: u8 = 29;
196    pub const PASSWORD_ENC: u8 = 30;
197    pub const LC_CTYPE: u8 = 48; // charset da conexão
198    pub const ROLE_NAME: u8 = 60;
199    pub const CONNECT_TIMEOUT: u8 = 57;
200    pub const PROCESS_ID: u8 = 71;
201    pub const PROCESS_NAME: u8 = 112;
202    pub const TRUSTED_AUTH: u8 = 111;
203    pub const UTF8_FILENAME: u8 = 77;
204    pub const SPECIFIC_AUTH_DATA: u8 = 84;
205    pub const AUTH_PLUGIN_LIST: u8 = 85;
206    pub const AUTH_PLUGIN_NAME: u8 = 86;
207    pub const CONFIG: u8 = 87;
208    pub const NOLINGER: u8 = 88;
209    pub const RESET_ICU: u8 = 89;
210    pub const MAP_ATTACH: u8 = 90;
211    pub const SESSION_TIME_ZONE: u8 = 91;
212    pub const SET_DB_REPLICA: u8 = 92;
213    pub const SET_BIND: u8 = 93;
214    pub const DECFLOAT_ROUND: u8 = 94;
215    pub const DECFLOAT_TRAPS: u8 = 95;
216    pub const CLIENT_VERSION: u8 = 80;
217    pub const PARALLEL_WORKERS: u8 = 100; // FB5
218}
219
220// ---------------------------------------------------------------------------
221// SPB — Buffer de Parâmetros de Serviço (`isc_spb_*`, gerenciador de serviços)
222// ---------------------------------------------------------------------------
223
224/// O cabeçalho do SPB de attach é DOIS bytes: `isc_spb_version` seguido de
225/// `isc_spb_current_version`, ambos `2` (confirmado por strace do `fbsvcmgr`).
226pub const SPB_VERSION: u8 = 2;
227pub const SPB_CURRENT_VERSION: u8 = 2;
228
229pub mod spb {
230    // Itens de autenticação / identificação no attach (espelham os do DPB).
231    pub const USER_NAME: u8 = 28; // = isc_dpb_user_name
232    pub const PASSWORD: u8 = 29; // = isc_dpb_password
233    pub const SQL_ROLE_NAME: u8 = 60;
234    pub const CONNECT_TIMEOUT: u8 = 57;
235    pub const COMMAND_LINE: u8 = 105;
236    pub const DBNAME: u8 = 106;
237    pub const VERBOSE: u8 = 107;
238    pub const OPTIONS: u8 = 108;
239    pub const PROCESS_ID: u8 = 110;
240    pub const PROCESS_NAME: u8 = 112;
241    pub const TRUSTED_AUTH: u8 = 111;
242    /// O `isc_spb_specific_auth_data` (a prova SRP) divide o tag com `trusted_auth`.
243    pub const SPECIFIC_AUTH_DATA: u8 = 111;
244    pub const AUTH_BLOCK: u8 = 115;
245    pub const AUTH_PLUGIN_NAME: u8 = 116;
246    pub const AUTH_PLUGIN_LIST: u8 = 117;
247    pub const UTF8_FILENAME: u8 = 118;
248    pub const CLIENT_VERSION: u8 = 119;
249    pub const EXPECTED_DB: u8 = 124;
250}
251
252/// Códigos de ação para `op_service_start` (`isc_action_svc_*`); o primeiro byte
253/// do SPB de start é o código da ação.
254pub mod svc_action {
255    pub const BACKUP: u8 = 1;
256    pub const RESTORE: u8 = 2;
257    pub const REPAIR: u8 = 3;
258    pub const ADD_USER: u8 = 4;
259    pub const DELETE_USER: u8 = 5;
260    pub const MODIFY_USER: u8 = 6;
261    pub const DISPLAY_USER: u8 = 7;
262    pub const PROPERTIES: u8 = 8;
263    pub const DB_STATS: u8 = 11;
264    pub const GET_FB_LOG: u8 = 12;
265    pub const NBAK: u8 = 20;
266    pub const NREST: u8 = 21;
267    pub const TRACE_START: u8 = 22;
268    pub const TRACE_STOP: u8 = 23;
269    pub const TRACE_SUSPEND: u8 = 24;
270    pub const TRACE_RESUME: u8 = 25;
271    pub const TRACE_LIST: u8 = 26;
272    pub const VALIDATE: u8 = 30;
273}
274
275/// Argumentos de SPB para `isc_action_svc_nbak`/`nrest` (`isc_spb_nbk_*`).
276pub mod svc_nbk {
277    pub const LEVEL: u8 = 5; // inteiro: nível do backup incremental
278    pub const FILE: u8 = 6; // string: arquivo de backup
279    pub const DIRECT: u8 = 7; // string: "ON"/"OFF" (I/O direto)
280    pub const GUID: u8 = 8; // string: GUID em vez de nível
281    pub const CLEAN_HISTORY: u8 = 9;
282    pub const KEEP_DAYS: u8 = 10;
283    pub const KEEP_ROWS: u8 = 11;
284
285    // Bits de opção em `isc_spb_options` (108).
286    pub const NO_TRIGGERS: u32 = 0x01;
287    pub const IN_PLACE: u32 = 0x02;
288    pub const SEQUENCE: u32 = 0x04;
289}
290
291/// Argumentos de SPB para as ações de trace (`isc_spb_trc_*`).
292pub mod svc_trc {
293    pub const ID: u8 = 1; // inteiro: id da sessão (stop/suspend/resume)
294    pub const NAME: u8 = 2; // string: nome da sessão
295    pub const CFG: u8 = 3; // string: texto de configuração do trace
296}
297
298/// Argumentos de SPB para `isc_action_svc_validate` (`isc_spb_val_*`).
299pub mod svc_val {
300    pub const TAB_INCL: u8 = 1; // string: regex de tabelas a validar
301    pub const TAB_EXCL: u8 = 2; // string: regex de tabelas a excluir
302    pub const IDX_INCL: u8 = 3; // string: regex de índices a validar
303    pub const IDX_EXCL: u8 = 4; // string: regex de índices a excluir
304    pub const LOCK_TIMEOUT: u8 = 5; // inteiro: espera pelo lock da tabela (s)
305}
306
307/// Bits de opção (em `isc_spb_options`) para `isc_action_svc_repair`
308/// (`isc_spb_rpr_*`), combináveis com `|`.
309pub mod svc_rpr {
310    pub const VALIDATE_DB: u32 = 0x01;
311    pub const SWEEP_DB: u32 = 0x02;
312    pub const MEND_DB: u32 = 0x04;
313    pub const LIST_LIMBO_TRANS: u32 = 0x08;
314    pub const CHECK_DB: u32 = 0x10;
315    pub const IGNORE_CHECKSUM: u32 = 0x20;
316    pub const KILL_SHADOWS: u32 = 0x40;
317    pub const FULL: u32 = 0x80;
318    pub const ICU: u32 = 0x0800;
319    pub const UPGRADE_DB: u32 = 0x1000;
320}
321
322/// Argumentos e valores de SPB para `isc_action_svc_properties` (`isc_spb_prp_*`).
323pub mod svc_prp {
324    pub const PAGE_BUFFERS: u8 = 5; // inteiro
325    pub const SWEEP_INTERVAL: u8 = 6; // inteiro
326    pub const SHUTDOWN_DB: u8 = 7; // inteiro: timeout (legado)
327    pub const DENY_NEW_ATTACHMENTS: u8 = 9; // inteiro: timeout (legado)
328    pub const DENY_NEW_TRANSACTIONS: u8 = 10; // inteiro: timeout (legado)
329    pub const RESERVE_SPACE: u8 = 11; // byte: RES_USE_FULL / RES
330    pub const WRITE_MODE: u8 = 12; // byte: WM_ASYNC / WM_SYNC
331    pub const ACCESS_MODE: u8 = 13; // byte: AM_READONLY / AM_READWRITE
332    pub const SET_SQL_DIALECT: u8 = 14; // inteiro
333    pub const FORCE_SHUTDOWN: u8 = 41; // inteiro: timeout
334    pub const ATTACHMENTS_SHUTDOWN: u8 = 42; // inteiro: timeout
335    pub const TRANSACTIONS_SHUTDOWN: u8 = 43; // inteiro: timeout
336    pub const SHUTDOWN_MODE: u8 = 44; // byte: SM_*
337    pub const ONLINE_MODE: u8 = 45; // byte: SM_*
338
339    // Bits de opção em `isc_spb_options` (108).
340    pub const ACTIVATE: u32 = 0x0100;
341    pub const DB_ONLINE: u32 = 0x0200;
342    pub const NOLINGER: u32 = 0x0400;
343
344    // Valores para SHUTDOWN_MODE / ONLINE_MODE.
345    pub const SM_NORMAL: u8 = 0;
346    pub const SM_MULTI: u8 = 1;
347    pub const SM_SINGLE: u8 = 2;
348    pub const SM_FULL: u8 = 3;
349
350    // Valores para RESERVE_SPACE.
351    pub const RES_USE_FULL: u8 = 35;
352    pub const RES: u8 = 36;
353
354    // Valores para WRITE_MODE.
355    pub const WM_ASYNC: u8 = 37;
356    pub const WM_SYNC: u8 = 38;
357
358    // Valores para ACCESS_MODE.
359    pub const AM_READONLY: u8 = 39;
360    pub const AM_READWRITE: u8 = 40;
361}
362
363/// Itens de info de serviço para `op_service_info` (`isc_info_svc_*`).
364pub mod svc_info {
365    pub const SVR_DB_INFO: u8 = 50;
366    pub const VERSION: u8 = 54;
367    pub const SERVER_VERSION: u8 = 55;
368    pub const IMPLEMENTATION: u8 = 56;
369    pub const CAPABILITIES: u8 = 57;
370    pub const USER_DBPATH: u8 = 58;
371    pub const GET_ENV: u8 = 59;
372    pub const GET_ENV_LOCK: u8 = 60;
373    pub const GET_ENV_MSG: u8 = 61;
374    /// Uma linha de saída do serviço por chamada.
375    pub const LINE: u8 = 62;
376    /// Tanta saída do serviço quanto couber no buffer.
377    pub const TO_EOF: u8 = 63;
378    pub const TIMEOUT: u8 = 64;
379    pub const LIMBO_TRANS: u8 = 66;
380    /// Indica se uma ação ainda está em execução nesta conexão (0/1).
381    pub const RUNNING: u8 = 67;
382    pub const GET_USERS: u8 = 68;
383    pub const STDIN: u8 = 78;
384}
385
386/// Argumentos de SPB para `isc_action_svc_backup`/`restore` (`isc_spb_bkp_*`).
387pub mod svc_bkp {
388    pub const FILE: u8 = 5;
389    pub const FACTOR: u8 = 6;
390    pub const LENGTH: u8 = 7;
391    pub const STAT: u8 = 15;
392
393    // Bits de opção carregados em `isc_spb_options` (108), combináveis com `|`.
394    pub const IGNORE_CHECKSUMS: u32 = 0x01;
395    pub const IGNORE_LIMBO: u32 = 0x02;
396    pub const METADATA_ONLY: u32 = 0x04;
397    pub const NO_GARBAGE_COLLECT: u32 = 0x08;
398    pub const OLD_DESCRIPTIONS: u32 = 0x10;
399    pub const NON_TRANSPORTABLE: u32 = 0x20;
400    pub const CONVERT: u32 = 0x40;
401    pub const EXPAND: u32 = 0x80;
402    pub const NO_TRIGGERS: u32 = 0x8000;
403    pub const ZIP: u32 = 0x0001_0000;
404}
405
406/// Argumentos de SPB para `isc_action_svc_restore` (`isc_spb_res_*`).
407pub mod svc_res {
408    pub const BUFFERS: u8 = 9;
409    pub const PAGE_SIZE: u8 = 10;
410    pub const LENGTH: u8 = 11;
411    pub const ACCESS_MODE: u8 = 12;
412
413    // Bits de opção carregados em `isc_spb_options` (108), combináveis com `|`.
414    pub const METADATA_ONLY: u32 = 0x04;
415    pub const DEACTIVATE_IDX: u32 = 0x0100;
416    pub const NO_SHADOW: u32 = 0x0200;
417    pub const NO_VALIDITY: u32 = 0x0400;
418    pub const ONE_AT_A_TIME: u32 = 0x0800;
419    /// Sobrescreve um banco existente (em vez de criar do zero).
420    pub const REPLACE: u32 = 0x1000;
421    /// Cria um banco novo (falha se já existir). É o padrão do gbak.
422    pub const CREATE: u32 = 0x2000;
423    pub const USE_ALL_SPACE: u32 = 0x4000;
424    pub const NO_TRIGGERS: u32 = 0x8000;
425}
426
427/// Bits de opção (em `isc_spb_options`) para `isc_action_svc_db_stats`
428/// (`isc_spb_sts_*`), combináveis com `|`.
429pub mod svc_sts {
430    pub const DATA_PAGES: u32 = 0x01;
431    pub const HDR_PAGES: u32 = 0x04;
432    pub const IDX_PAGES: u32 = 0x08;
433    pub const SYS_RELATIONS: u32 = 0x10;
434    pub const RECORD_VERSIONS: u32 = 0x20;
435    pub const TABLE: u32 = 0x40;
436    pub const NOCREATION: u32 = 0x80;
437    pub const ENCRYPTION: u32 = 0x0100;
438}
439
440/// Argumentos de SPB para gestão de usuários (`isc_spb_sec_*`).
441pub mod svc_sec {
442    pub const USERID: u8 = 5;
443    pub const GROUPID: u8 = 6;
444    pub const USERNAME: u8 = 7;
445    pub const PASSWORD: u8 = 8;
446    pub const GROUPNAME: u8 = 9;
447    pub const FIRSTNAME: u8 = 10;
448    pub const MIDDLENAME: u8 = 11;
449    pub const LASTNAME: u8 = 12;
450    pub const ADMIN: u8 = 13;
451}
452
453// ---------------------------------------------------------------------------
454// TPB — Buffer de Parâmetros de Transação (`isc_tpb_*`)
455// ---------------------------------------------------------------------------
456
457pub const TPB_VERSION3: u8 = 3;
458
459pub mod tpb {
460    pub const CONSISTENCY: u8 = 1;
461    pub const CONCURRENCY: u8 = 2;
462    pub const SHARED: u8 = 3;
463    pub const PROTECTED: u8 = 4;
464    pub const EXCLUSIVE: u8 = 5;
465    pub const WAIT: u8 = 6;
466    pub const NOWAIT: u8 = 7;
467    pub const READ: u8 = 8;
468    pub const WRITE: u8 = 9;
469    pub const LOCK_READ: u8 = 10;
470    pub const LOCK_WRITE: u8 = 11;
471    pub const VERB_TIME: u8 = 12;
472    pub const COMMIT_TIME: u8 = 13;
473    pub const IGNORE_LIMBO: u8 = 14;
474    pub const READ_COMMITTED: u8 = 15;
475    pub const AUTOCOMMIT: u8 = 16;
476    pub const REC_VERSION: u8 = 17;
477    pub const NO_REC_VERSION: u8 = 18;
478    pub const RESTART_REQUESTS: u8 = 19;
479    pub const NO_AUTO_UNDO: u8 = 20;
480    pub const LOCK_TIMEOUT: u8 = 21;
481    pub const READ_CONSISTENCY: u8 = 22; // FB4+
482    pub const AT_SNAPSHOT_NUMBER: u8 = 23; // FB4+
483}
484
485// ---------------------------------------------------------------------------
486// Itens de informação SQL (`isc_info_sql_*`) usados após o prepare
487// ---------------------------------------------------------------------------
488
489pub mod isql {
490    pub const SELECT: u8 = 4;
491    pub const BIND: u8 = 5;
492    pub const NUM_VARIABLES: u8 = 6;
493    pub const DESCRIBE_VARS: u8 = 7;
494    pub const DESCRIBE_END: u8 = 8;
495    pub const SQLDA_SEQ: u8 = 9;
496    pub const MESSAGE_SEQ: u8 = 10;
497    pub const TYPE: u8 = 11;
498    pub const SUB_TYPE: u8 = 12;
499    pub const SCALE: u8 = 13;
500    pub const LENGTH: u8 = 14;
501    pub const NULL_IND: u8 = 15;
502    pub const FIELD: u8 = 16;
503    pub const RELATION: u8 = 17;
504    // Atenção: a ordem real do Firebird é owner=18, alias=19 (confirmado por
505    // captura do describe-info: tag 0x12 carrega o owner, 0x13 carrega o alias).
506    pub const OWNER: u8 = 18;
507    pub const ALIAS: u8 = 19;
508    pub const RELATION_ALIAS: u8 = 20;
509    pub const STMT_TYPE: u8 = 21;
510    pub const BATCH_FETCH: u8 = 22;
511    pub const RECORDS: u8 = 23;
512    pub const AFFECTED_RECORDS: u8 = 24;
513    pub const EXPLAIN_PLAN: u8 = 25;
514    pub const FLAGS: u8 = 26;
515}
516
517/// Contadores de registros retornados dentro de `isc_info_sql_records`
518/// (`isc_info_req_*`): o número de linhas que cada tipo de operação afetou.
519pub mod info_req {
520    pub const SELECT_COUNT: u8 = 13;
521    pub const INSERT_COUNT: u8 = 14;
522    pub const UPDATE_COUNT: u8 = 15;
523    pub const DELETE_COUNT: u8 = 16;
524}
525
526/// Tipos de instrução (statement) retornados por `isc_info_sql_stmt_type`.
527pub mod stmt_type {
528    pub const SELECT: i32 = 1;
529    pub const INSERT: i32 = 2;
530    pub const UPDATE: i32 = 3;
531    pub const DELETE: i32 = 4;
532    pub const DDL: i32 = 5;
533    pub const GET_SEGMENT: i32 = 6;
534    pub const PUT_SEGMENT: i32 = 7;
535    pub const EXEC_PROCEDURE: i32 = 8;
536    pub const START_TRANS: i32 = 9;
537    pub const COMMIT: i32 = 10;
538    pub const ROLLBACK: i32 = 11;
539    pub const SELECT_FOR_UPD: i32 = 12;
540    pub const SET_GENERATOR: i32 = 13;
541    pub const SAVEPOINT: i32 = 14;
542}
543
544/// Modos de `op_free_statement`.
545pub mod free {
546    pub const CLOSE: i32 = 1;
547    pub const DROP: i32 = 2;
548    pub const UNPREPARE: i32 = 4;
549}
550
551/// Flags de cursor enviados em `op_execute` (campo `cursor_flags`).
552pub mod cursor_type {
553    /// Abre um cursor rolável (equivale a `IStatement::CURSOR_TYPE_SCROLLABLE`).
554    pub const SCROLLABLE: i32 = 0x1;
555}
556
557/// Direções de `op_fetch_scroll` (FB5).
558pub mod scroll {
559    pub const NEXT: i32 = 0;
560    pub const PRIOR: i32 = 1;
561    pub const FIRST: i32 = 2;
562    pub const LAST: i32 = 3;
563    pub const ABSOLUTE: i32 = 4;
564    pub const RELATIVE: i32 = 5;
565}
566
567// ---------------------------------------------------------------------------
568// Terminadores / status genéricos de info-buffer
569// ---------------------------------------------------------------------------
570
571pub const INFO_END: u8 = 1;
572pub const INFO_TRUNCATED: u8 = 2;
573pub const INFO_ERROR: u8 = 3;
574pub const INFO_DATA_NOT_READY: u8 = 4;
575
576// ---------------------------------------------------------------------------
577// Tags do vetor de status (`isc_arg_*`)
578// ---------------------------------------------------------------------------
579
580pub mod arg {
581    pub const END: i32 = 0;
582    pub const GDS: i32 = 1; // código de erro do Firebird
583    pub const STRING: i32 = 2;
584    pub const CSTRING: i32 = 3;
585    pub const NUMBER: i32 = 4;
586    pub const INTERPRETED: i32 = 5;
587    pub const VMS: i32 = 6;
588    pub const UNIX: i32 = 7;
589    pub const DOMAIN: i32 = 8;
590    pub const DOS: i32 = 9;
591    pub const MPEXL: i32 = 10;
592    pub const WARNING: i32 = 18;
593    pub const SQL_STATE: i32 = 19; // string SQLSTATE (FB2.5+)
594}
595
596// ---------------------------------------------------------------------------
597// Tipos de dados SQL (`SQL_*`, sqlda_pub.h). Bit baixo = flag anulável.
598// ---------------------------------------------------------------------------
599
600pub mod sql_type {
601    pub const TEXT: i32 = 452;
602    pub const VARYING: i32 = 448;
603    pub const SHORT: i32 = 500;
604    pub const LONG: i32 = 496;
605    pub const FLOAT: i32 = 482;
606    pub const DOUBLE: i32 = 480;
607    pub const D_FLOAT: i32 = 530;
608    pub const TIMESTAMP: i32 = 510;
609    pub const BLOB: i32 = 520;
610    pub const ARRAY: i32 = 540;
611    pub const QUAD: i32 = 550;
612    pub const TYPE_TIME: i32 = 560;
613    pub const TYPE_DATE: i32 = 570;
614    pub const INT64: i32 = 580;
615    pub const INT128: i32 = 32752; // FB4+
616    pub const TIMESTAMP_TZ_EX: i32 = 32748;
617    pub const TIME_TZ_EX: i32 = 32750;
618    pub const TIMESTAMP_TZ: i32 = 32754; // FB4+
619    pub const TIME_TZ: i32 = 32756; // FB4+
620    pub const DEC16: i32 = 32760; // DECFLOAT(16), FB4+
621    pub const DEC34: i32 = 32762; // DECFLOAT(34), FB4+
622    pub const BOOLEAN: i32 = 32764; // FB3+
623    pub const NULL: i32 = 32766;
624
625    /// Remove o bit baixo de anulável para obter o tipo base.
626    #[inline]
627    pub const fn base(t: i32) -> i32 {
628        t & !1
629    }
630    /// Verdadeiro quando o bit baixo do tipo o marca como anulável.
631    #[inline]
632    pub const fn is_nullable(t: i32) -> bool {
633        t & 1 != 0
634    }
635}
636
637// ---------------------------------------------------------------------------
638// Códigos BLR (Binary Language Representation) para descrições de mensagens
639// ---------------------------------------------------------------------------
640
641pub mod blr {
642    pub const VERSION5: u8 = 5;
643    pub const BEGIN: u8 = 2;
644    pub const MESSAGE: u8 = 4;
645    pub const END: u8 = 255;
646    pub const EOC: u8 = 76; // fim de comando
647
648    pub const TEXT: u8 = 14; // + length(2)
649    pub const TEXT2: u8 = 15; // + charset(2) + length(2)
650    pub const SHORT: u8 = 7; // + scale(1)
651    pub const LONG: u8 = 8; // + scale(1)
652    pub const QUAD: u8 = 9; // + scale(1) — também id de blob
653    pub const BLOB2: u8 = 17; // + sub_type(2 LE) + charset(2 LE) — campo BLOB na mensagem
654    pub const FLOAT: u8 = 10;
655    pub const DOUBLE: u8 = 27;
656    pub const D_FLOAT: u8 = 11;
657    pub const TIMESTAMP: u8 = 35;
658    pub const VARYING: u8 = 37; // + length(2)
659    pub const VARYING2: u8 = 38; // + charset(2) + length(2)
660    pub const SQL_DATE: u8 = 12;
661    pub const SQL_TIME: u8 = 13;
662    pub const INT64: u8 = 16; // + scale(1)
663    pub const BOOL: u8 = 23;
664    pub const DEC64: u8 = 24;
665    pub const DEC128: u8 = 25;
666    pub const INT128: u8 = 26; // + scale(1)
667    pub const SQL_TIME_TZ: u8 = 28;
668    pub const TIMESTAMP_TZ: u8 = 29;
669    pub const EX_TIME_TZ: u8 = 30; // formato estendido: inclui o offset resolvido
670    pub const EX_TIMESTAMP_TZ: u8 = 31;
671}
672
673// ---------------------------------------------------------------------------
674// SDL (Slice Description Language): o bytecode que descreve a fatia de um ARRAY
675// pedida em op_get_slice/op_put_slice. Verbos de `isc_sdl_*` (consts_pub.h).
676// O descritor do elemento dentro de `struct` usa códigos BLR (módulo `blr`).
677// ---------------------------------------------------------------------------
678
679pub mod sdl {
680    pub const VERSION1: u8 = 1;
681    pub const EOC: u8 = 255; // fim da cláusula
682    pub const RELATION: u8 = 2; // + len(1) + nome
683    pub const FIELD: u8 = 4; // + len(1) + nome
684    pub const STRUCT: u8 = 6; // + count(1) + (descritor BLR do elemento)×count
685    pub const VARIABLE: u8 = 7; // + n(1): referência à variável de laço n
686    pub const SCALAR: u8 = 8; // + elem(1) + ndims(1) + (subscrito)×ndims
687    pub const TINY_INTEGER: u8 = 9; // + valor(1)
688    pub const SHORT_INTEGER: u8 = 10; // + valor(2 LE)
689    pub const LONG_INTEGER: u8 = 11; // + valor(4 LE)
690    pub const DO2: u8 = 34; // + var(1) + limite_inf(literal) + limite_sup(literal)
691    pub const DO1: u8 = 35; // + var(1) + limite_sup(literal); limite_inf implícito = 1
692    pub const ELEMENT: u8 = 36; // + n(1): nº de elementos do struct atribuídos
693}
694
695// ---------------------------------------------------------------------------
696// Buffer de parâmetros de blob (`isc_bpb_*`) e info de blob
697// ---------------------------------------------------------------------------
698
699pub const BPB_VERSION1: u8 = 1;
700
701pub mod bpb {
702    pub const SOURCE_TYPE: u8 = 1;
703    pub const TARGET_TYPE: u8 = 2;
704    pub const TYPE: u8 = 3;
705    pub const STORAGE: u8 = 7;
706
707    /// Valores do clumplet [`TYPE`] (`isc_bpb_type_*`).
708    pub const TYPE_SEGMENTED: u8 = 0;
709    pub const TYPE_STREAM: u8 = 1;
710}
711
712/// Subtipos de blob.
713pub mod blob_type {
714    pub const SEGMENTED: i32 = 0;
715    pub const STREAM: i32 = 1;
716}
717
718// ---------------------------------------------------------------------------
719// Buffer de parâmetros de batch (tags de `IBatch`) e itens de info (FB4+)
720// ---------------------------------------------------------------------------
721
722/// Tags para o buffer de parâmetros de criação de batch (`Firebird::IBatch::TAG_*`).
723pub mod batch_tag {
724    pub const MULTIERROR: u8 = 1; // continua após erros por linha
725    pub const RECORD_COUNTS: u8 = 2; // reporta contagens afetadas por mensagem
726    pub const BUFFER_BYTES_SIZE: u8 = 3; // limite do buffer do lado do servidor
727    pub const BLOB_POLICY: u8 = 4;
728    pub const DETAILED_ERRORS: u8 = 5;
729}
730
731/// Valores para `batch_tag::BLOB_POLICY`.
732pub mod blob_policy {
733    pub const NONE: u8 = 0;
734    pub const ID_ENGINE: u8 = 1; // o engine atribui ids
735    pub const ID_USER: u8 = 2; // o chamador atribui ids
736    pub const STREAM: u8 = 3;
737}
738
739/// Itens de info de batch (info de `IBatch`, FB4+) retornados por `op_info_batch`.
740pub mod batch_info {
741    pub const VERSION: u8 = 1;
742    pub const BLOB_ALIGNMENT: u8 = 2;
743    pub const BLOB_HEADER: u8 = 3;
744    pub const ROW_SIZE: u8 = 4;
745    pub const BUFFER_BYTES_SIZE: u8 = 5;
746}
747
748/// Códigos de estado de conclusão de `op_batch_cs` (`IBatchCompletionState`).
749/// Valores confirmados via wire: numa entrada do vetor de contagens, `>= 0` é o
750/// número de linhas afetadas; `EXECUTE_FAILED` marca a mensagem que falhou.
751pub mod batch_cs {
752    /// Aquela mensagem falhou ao executar (o detalhe vem no vetor de erros).
753    pub const EXECUTE_FAILED: i32 = -1;
754    /// Sucesso, mas o servidor não reportou a contagem de linhas afetadas.
755    pub const SUCCESS_NO_INFO: i32 = -2;
756    /// Sentinela de `findError`: não há mais posições com erro (posição `u32`).
757    pub const NO_MORE_ERRORS: u32 = u32::MAX;
758}