pub const PROTOCOL_VERSION_3_0: i32 = 196608;
pub const PROTOCOL_VERSION_3_2: i32 = 196610;
#[derive(Debug, Clone)]
pub enum FrontendMessage {
Startup {
user: String,
database: String,
protocol_version: i32,
startup_params: Vec<(String, String)>,
},
PasswordMessage(String),
Query(String),
Parse {
name: String,
query: String,
param_types: Vec<u32>,
},
Bind {
portal: String,
statement: String,
params: Vec<Option<Vec<u8>>>,
},
Execute {
portal: String,
max_rows: i32,
},
Sync,
Terminate,
SASLInitialResponse {
mechanism: String,
data: Vec<u8>,
},
SASLResponse(Vec<u8>),
GSSResponse(Vec<u8>),
CopyFail(String),
Close {
is_portal: bool,
name: String,
},
}
#[derive(Debug, Clone)]
pub enum BackendMessage {
AuthenticationOk,
AuthenticationCleartextPassword,
AuthenticationMD5Password([u8; 4]),
AuthenticationKerberosV5,
AuthenticationGSS,
AuthenticationSCMCredential,
AuthenticationGSSContinue(Vec<u8>),
AuthenticationSSPI,
AuthenticationSASL(Vec<String>),
AuthenticationSASLContinue(Vec<u8>),
AuthenticationSASLFinal(Vec<u8>),
ParameterStatus {
name: String,
value: String,
},
BackendKeyData {
process_id: i32,
secret_key: Vec<u8>,
},
NegotiateProtocolVersion {
newest_minor_supported: i32,
unrecognized_protocol_options: Vec<String>,
},
ReadyForQuery(TransactionStatus),
RowDescription(Vec<FieldDescription>),
DataRow(Vec<Option<Vec<u8>>>),
CommandComplete(String),
ErrorResponse(ErrorFields),
ParseComplete,
BindComplete,
NoData,
PortalSuspended,
CopyInResponse {
format: u8,
column_formats: Vec<u8>,
},
CopyOutResponse {
format: u8,
column_formats: Vec<u8>,
},
CopyBothResponse {
format: u8,
column_formats: Vec<u8>,
},
CopyData(Vec<u8>),
CopyDone,
NotificationResponse {
process_id: i32,
channel: String,
payload: String,
},
EmptyQueryResponse,
NoticeResponse(ErrorFields),
ParameterDescription(Vec<u32>),
CloseComplete,
}
#[derive(Debug, Clone, Copy)]
pub enum TransactionStatus {
Idle,
InBlock,
Failed,
}
#[derive(Debug, Clone)]
pub struct FieldDescription {
pub name: String,
pub table_oid: u32,
pub column_attr: i16,
pub type_oid: u32,
pub type_size: i16,
pub type_modifier: i32,
pub format: i16,
}
#[derive(Debug, Clone, Default)]
pub struct ErrorFields {
pub severity: String,
pub code: String,
pub message: String,
pub detail: Option<String>,
pub hint: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FrontendEncodeError {
InteriorNul(&'static str),
MessageTooLarge(usize),
TooManyParams(usize),
InvalidMaxRows(i32),
InvalidStartupParam(String),
}
impl std::fmt::Display for FrontendEncodeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InteriorNul(field) => write!(f, "field `{}` contains interior NUL byte", field),
Self::MessageTooLarge(len) => write!(f, "message too large for wire length: {}", len),
Self::TooManyParams(n) => write!(f, "too many params for i16 wire count: {}", n),
Self::InvalidMaxRows(v) => write!(f, "invalid Execute max_rows (must be >= 0): {}", v),
Self::InvalidStartupParam(msg) => write!(f, "invalid startup parameter: {}", msg),
}
}
}
impl std::error::Error for FrontendEncodeError {}