postgresql_protocol
This library parses and generates packages for the PostgreSQL Binary Protocol It also provides a basic connection abstraction, but this hasn’t been used outside of tests.
Types
Messages originating from the PostgreSQL backend (server)
pub type BackendMessage {
BeBindComplete
BeCloseComplete
BeCommandComplete(Command, Int)
BeCopyData(data: BitArray)
BeCopyDone
BeAuthenticationOk
BeAuthenticationKerberosV5
BeAuthenticationCleartextPassword
BeAuthenticationMD5Password(salt: BitArray)
BeAuthenticationGSS
BeAuthenticationGSSContinue(auth_data: BitArray)
BeAuthenticationSSPI
BeAuthenticationSASL(mechanisms: List(String))
BeAuthenticationSASLContinue(data: BitArray)
BeAuthenticationSASLFinal(data: BitArray)
BeReadyForQuery(TransactionStatus)
BeRowDescriptions(List(RowDescriptionField))
BeMessageDataRow(List(BitArray))
BeBackendKeyData(process_id: Int, secret_key: Int)
BeParameterStatus(name: String, value: String)
BeCopyResponse(
direction: CopyDirection,
overall_format: Format,
codes: List(Format),
)
BeNegotiateProtocolVersion(
newest_minor: Int,
unrecognized_options: List(String),
)
BeNoData
BeNoticeResponse(set.Set(ErrorOrNoticeField))
BeNotificationResponse(
process_id: Int,
channel: String,
payload: String,
)
BeParameterDescription(List(Int))
BeParseComplete
BePortalSuspended
BeErrorResponse(set.Set(ErrorOrNoticeField))
}
Constructors
-
BeBindComplete -
BeCloseComplete -
BeCommandComplete(Command, Int) -
BeCopyData(data: BitArray) -
BeCopyDone -
BeAuthenticationOk -
BeAuthenticationKerberosV5 -
BeAuthenticationCleartextPassword -
BeAuthenticationMD5Password(salt: BitArray) -
BeAuthenticationGSS -
BeAuthenticationGSSContinue(auth_data: BitArray) -
BeAuthenticationSSPI -
BeAuthenticationSASL(mechanisms: List(String)) -
BeAuthenticationSASLContinue(data: BitArray) -
BeAuthenticationSASLFinal(data: BitArray) -
BeReadyForQuery(TransactionStatus) -
BeRowDescriptions(List(RowDescriptionField)) -
BeMessageDataRow(List(BitArray)) -
BeBackendKeyData(process_id: Int, secret_key: Int) -
BeParameterStatus(name: String, value: String) -
BeCopyResponse( direction: CopyDirection, overall_format: Format, codes: List(Format), ) -
BeNegotiateProtocolVersion( newest_minor: Int, unrecognized_options: List(String), ) -
BeNoData -
BeNoticeResponse(set.Set(ErrorOrNoticeField)) -
BeNotificationResponse( process_id: Int, channel: String, payload: String, ) -
BeParameterDescription(List(Int)) -
BeParseComplete -
BePortalSuspended -
BeErrorResponse(set.Set(ErrorOrNoticeField))
pub type Command {
Insert
Delete
Update
Merge
Select
Move
Fetch
Copy
}
Constructors
-
Insert -
Delete -
Update -
Merge -
Select -
Move -
Fetch -
Copy
pub type Connection {
Connection(socket: mug.Socket, buffer: BitArray, timeout: Int)
}
Constructors
-
Connection(socket: mug.Socket, buffer: BitArray, timeout: Int)
Direction of a BeCopyResponse
pub type CopyDirection {
In
Out
Both
}
Constructors
-
In -
Out -
Both
pub type ErrorOrNoticeField {
Code(String)
Detail(String)
File(String)
Hint(String)
Line(String)
Message(String)
Position(String)
Routine(String)
SeverityLocalized(String)
Severity(String)
Where(String)
Column(String)
DataType(String)
Constraint(String)
InternalPosition(String)
InternalQuery(String)
Schema(String)
Table(String)
Unknown(key: BitArray, value: String)
}
Constructors
-
Code(String) -
Detail(String) -
File(String) -
Hint(String) -
Line(String) -
Message(String) -
Position(String) -
Routine(String) -
SeverityLocalized(String) -
Severity(String) -
Where(String) -
Column(String) -
DataType(String) -
Constraint(String) -
InternalPosition(String) -
InternalQuery(String) -
Schema(String) -
Table(String) -
Unknown(key: BitArray, value: String)
pub type FeAmbigous {
FeGssResponse(data: BitArray)
FeSaslInitialResponse(name: String, data: BitArray)
FeSaslResponse(data: BitArray)
FePasswordMessage(password: String)
}
Constructors
-
FeGssResponse(data: BitArray) -
FeSaslInitialResponse(name: String, data: BitArray) -
FeSaslResponse(data: BitArray) -
FePasswordMessage(password: String)
Indicates encoding of column values
pub type Format {
Text
Binary
}
Constructors
-
Text -
Binary
Lists of parameters can have different encodings.
pub type FormatValue {
FormatAllText
FormatAll(Format)
Formats(List(Format))
}
Constructors
-
FormatAllText -
FormatAll(Format) -
Formats(List(Format))
pub type FrontendMessage {
FeBind(
portal: String,
statement_name: String,
parameter_format: FormatValue,
parameters: ParameterValues,
result_format: FormatValue,
)
FeCancelRequest(process_id: Int, secret_key: Int)
FeClose(what: What, name: String)
FeCopyData(data: BitArray)
FeCopyDone
FeCopyFail(error: String)
FeDescribe(what: What, name: String)
FeExecute(portal: String, return_row_count: Int)
FeFlush
FeFunctionCall(
object_id: Int,
argument_format: FormatValue,
arguments: ParameterValues,
result_format: Format,
)
FeGssEncRequest
FeParse(
name: String,
query: String,
parameter_object_ids: List(Int),
)
FeQuery(query: String)
FeStartupMessage(params: List(#(String, String)))
FeSslRequest
FeTerminate
FeSync
FeAmbigous(FeAmbigous)
}
Constructors
-
FeBind( portal: String, statement_name: String, parameter_format: FormatValue, parameters: ParameterValues, result_format: FormatValue, ) -
FeCancelRequest(process_id: Int, secret_key: Int) -
FeClose(what: What, name: String) -
FeCopyData(data: BitArray) -
FeCopyDone -
FeCopyFail(error: String) -
FeDescribe(what: What, name: String) -
FeExecute(portal: String, return_row_count: Int) -
FeFlush -
FeFunctionCall( object_id: Int, argument_format: FormatValue, arguments: ParameterValues, result_format: Format, ) -
FeGssEncRequest -
FeParse( name: String, query: String, parameter_object_ids: List(Int), ) -
FeQuery(query: String) -
FeStartupMessage(params: List(#(String, String))) -
FeSslRequest -
FeTerminate -
FeSync -
FeAmbigous(FeAmbigous)
pub type MessageDecodingError {
MessageDecodingError(String)
MessageIncomplete(BitArray)
UnknownMessage(data: BitArray)
}
Constructors
-
MessageDecodingError(String) -
MessageIncomplete(BitArray) -
UnknownMessage(data: BitArray)
pub type ParameterValue {
Parameter(BitArray)
Null
}
Constructors
-
Parameter(BitArray) -
Null
pub type ParameterValues =
List(ParameterValue)
pub type ReadError {
SocketError(mug.Error)
ReadDecodeError(MessageDecodingError)
}
Constructors
-
SocketError(mug.Error) -
ReadDecodeError(MessageDecodingError)
pub type RowDescriptionField {
RowDescriptionField(
name: String,
table_oid: Int,
attr_number: Int,
data_type_oid: Int,
data_type_size: Int,
type_modifier: Int,
format_code: Int,
)
}
Constructors
-
RowDescriptionField( name: String, table_oid: Int, attr_number: Int, data_type_oid: Int, data_type_size: Int, type_modifier: Int, format_code: Int, )
pub type StartupFailed {
StartupFailedWithUnexpectedMessage(BackendMessage)
StartupFailedWithError(ReadError)
}
Constructors
-
StartupFailedWithUnexpectedMessage(BackendMessage) -
StartupFailedWithError(ReadError)
pub type State {
State(
process_id: Int,
secret_key: Int,
parameters: dict.Dict(String, String),
oids: dict.Dict(Int, fn(BitArray) -> Result(Int, Nil)),
)
}
Constructors
-
State( process_id: Int, secret_key: Int, parameters: dict.Dict(String, String), oids: dict.Dict(Int, fn(BitArray) -> Result(Int, Nil)), )
pub type StateInitial {
StateInitial(parameters: dict.Dict(String, String))
}
Constructors
-
StateInitial(parameters: dict.Dict(String, String))
pub type TransactionStatus {
TransactionStatusIdle
TransactionStatusInTransaction
TransactionStatusFailed
}
Constructors
-
TransactionStatusIdle -
TransactionStatusInTransaction -
TransactionStatusFailed
Constants
pub const protocol_version: BitArray = <<
protocol_version_major:bits,
protocol_version_minor:bits,
>>
pub const protocol_version_major: BitArray = <<3:16>>
pub const protocol_version_minor: BitArray = <<0:16>>
Functions
pub fn decode_backend_message(
binary: BitArray,
) -> Result(BackendMessage, MessageDecodingError)
pub fn decode_backend_packet(
packet: BitArray,
) -> Result(#(BackendMessage, BitArray), MessageDecodingError)
pub fn decode_frontend_message(
binary: BitArray,
) -> Result(FrontendMessage, MessageDecodingError)
decode a frontend message (also see decode_frontend_packet for messages that can’t be decoded here)
pub fn decode_frontend_packet(
packet: BitArray,
) -> Result(#(FrontendMessage, BitArray), MessageDecodingError)
decode a single message from the packet buffer. note that FeCancelRequest, FeSslRequest, FeGssEncRequest, and FeStartupMessage messages can only be decoded here because they don’t follow the standard message format.
pub fn encode_backend_message(
message: BackendMessage,
) -> BitArray
pub fn encode_frontend_message(
message: FrontendMessage,
) -> BitArray
pub fn receive(
conn: Connection,
) -> Result(#(Connection, BackendMessage), ReadError)
Receive a single message from the backend
pub fn send(
conn: Connection,
message: BitArray,
) -> Result(Connection, Error)
Send a message to the database
pub fn send_builder(
conn: Connection,
message: BytesBuilder,
) -> Result(Connection, Error)
Send a message to the database