Skip to main content

firebird_wire/
lib.rs

1//! # fdb_driver
2//!
3//! Um driver síncrono, puramente em Rust, para o **Firebird 5+**, que fala o
4//! protocolo de comunicação nativo (wire protocol) diretamente sobre TCP — sem
5//! dependência do `libfbclient`.
6//!
7//! ## Por onde começar
8//!
9//! Se você só quer usar o banco, comece por estes tipos:
10//!
11//! - [`ConnectConfig`]: dados de host, banco, usuário e senha.
12//! - [`Connection`]: a conexão aberta com o Firebird.
13//! - [`Transaction`]: o bloco de trabalho confirmado por `commit` ou desfeito
14//!   por `rollback`.
15//! - [`Statement`]: um SQL preparado para executar e buscar linhas.
16//! - [`Value`]: valores enviados como parâmetros ou recebidos em linhas.
17//!
18//! Um primeiro uso costuma seguir esta ordem:
19//!
20//! ```no_run
21//! use fdb_driver::{ConnectConfig, Connection, Value};
22//!
23//! fn main() -> fdb_driver::Result<()> {
24//!     let cfg = ConnectConfig::new()
25//!         .host("127.0.0.1")
26//!         .port(3050)
27//!         .database("/dados/app.fdb")
28//!         .user("SYSDBA")
29//!         .password("masterkey");
30//!
31//!     let mut conn = Connection::connect(&cfg)?;
32//!     let tx = conn.begin()?;
33//!
34//!     let mut stmt = conn.prepare(&tx, "SELECT ? FROM RDB$DATABASE")?;
35//!     stmt.execute(&mut conn, &tx, &[Value::Int(42)])?;
36//!     if let Some(row) = stmt.fetch(&mut conn)? {
37//!         println!("{:?}", row[0]);
38//!     }
39//!     stmt.drop_statement(&mut conn)?;
40//!
41//!     tx.commit(&mut conn)?;
42//!     conn.close()?;
43//!     Ok(())
44//! }
45//! ```
46//!
47//! Para uma explicação mais didática, leia `COMECE-AQUI.md` no repositório.
48//!
49//! Destaques:
50//! - API bloqueante baseada na biblioteca padrão.
51//! - Autenticação SRP / Srp256 com criptografia de comunicação opcional ARC4 / ChaCha20.
52//! - Prepared statements, cursores roláveis (FB5), transações.
53//! - **DML em lote / array** via o protocolo de batch do FB4+ (`op_batch_*`).
54//! - Pool de conexões.
55//! - **Gerenciador de serviços** (`op_service_*`): versão do servidor, log, etc.
56//!
57//! A crate é construída em camadas. Os módulos `wire`, `auth`, `blr`, `message`
58//! e similares são implementação de baixo nível; para uso comum prefira os tipos
59//! reexportados no topo da crate.
60//! Isto é um trabalho em andamento — veja o README da crate para a superfície já implementada.
61
62#![forbid(unsafe_code)]
63
64pub mod array;
65pub mod auth;
66pub mod batch;
67pub mod blob;
68pub mod blr;
69pub mod charset;
70pub mod config;
71pub mod connection;
72pub mod decfloat;
73pub mod dos;
74pub mod error;
75pub mod events;
76pub mod message;
77pub mod pool;
78pub mod service;
79pub mod statement;
80pub mod transaction;
81pub mod tz;
82pub mod value;
83pub mod wire;
84
85pub use array::{ArrayDesc, Dimension};
86pub use batch::{Batch, BatchError, BatchOptions, BatchResult};
87pub use blob::{Blob, BlobWriter};
88pub use charset::Charset;
89pub use config::{ConnectConfig, WireCrypt};
90pub use connection::Connection;
91pub use decfloat::{DecFloat, ParseDecFloatError};
92pub use error::{DatabaseError, Error, Result, StatusArg, StatusVector};
93pub use events::EventListener;
94pub use pool::{Pool, PoolConfig, PooledConnection};
95pub use service::{ServiceManager, UserInfo, UserParams};
96pub use statement::{RowStream, RowsAffected, Statement};
97pub use transaction::{
98    AccessMode, IsolationLevel, LockResolution, Transaction, TransactionBuilder,
99};
100pub use value::{CivilDate, CivilTime, CivilTimestamp, ColumnMeta, TimeTz, TimestampTz, Value};
101
102/// Emite um aviso (apenas em builds de debug) quando um recurso com estado no
103/// servidor (`Statement`, `Transaction`, `Blob`, `BlobWriter`) é solto sem ser
104/// liberado explicitamente. O handle permanece alocado no servidor até o
105/// `detach`; este aviso ajuda a localizar vazamentos durante o desenvolvimento.
106/// Em builds de release é um no-op (sem custo).
107#[inline]
108pub(crate) fn warn_unclosed(kind: &str, handle: i32) {
109    if cfg!(debug_assertions) {
110        eprintln!(
111            "[fdb] aviso: {kind} (handle {handle}) foi descartado sem fechar/liberar; \
112             o estado fica no servidor até o detach. Chame o método de fechamento adequado."
113        );
114    }
115}