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}