use crate::common::nom7::take_until_and_consume;
use nom7::branch::alt;
-use nom7::bytes::streaming::{tag, tag_no_case, take, take_until, take_until1};
+use nom7::bytes::streaming::{tag, take, take_until, take_until1};
use nom7::character::streaming::{alphanumeric1, char};
use nom7::combinator::{all_consuming, cond, eof, map_parser, opt, peek, rest, verify};
use nom7::error::{make_error, ErrorKind};
}
}
-fn parse_user_param(i: &[u8]) -> IResult<&[u8], PgsqlParameter> {
- let (i, param_name) = tag_no_case("user")(i)?;
- let (i, _) = tag("\x00")(i)?;
- let (i, param_value) = take_until1("\x00")(i)?;
- let (i, _) = tag("\x00")(i)?;
- Ok((i, PgsqlParameter {
- name: PgsqlParameters::from(param_name),
- value: param_value.to_vec(),
- }))
-}
-
-fn parse_database_param(i: &[u8]) -> IResult<&[u8], PgsqlParameter> {
- let (i, param_name) = tag_no_case("database")(i)?;
- let (i, _) = tag("\x00")(i)?;
- let (i, param_value) = take_until1("\x00")(i)?;
- let (i, _) = tag("\x00")(i)?;
- Ok((i, PgsqlParameter {
- name: PgsqlParameters::from(param_name),
- value: param_value.to_vec(),
- }))
-}
-
// Currently the set of parameters that could trigger a ParameterStatus message is fixed:
// server_version
// server_encoding
}
pub fn pgsql_parse_startup_parameters(i: &[u8]) -> IResult<&[u8], PgsqlStartupParameters> {
- let (i, user) = parse_user_param(i)?;
- let (i, database) = opt(parse_database_param)(i)?;
let (i, optional) = opt(terminated(many1(pgsql_parse_generic_parameter), tag("\x00")))(i)?;
- Ok((i, PgsqlStartupParameters{
- user,
- database,
- optional_params: optional,
- }))
+ if let Some(ref params) = optional {
+ let mut user = PgsqlParameter{name: PgsqlParameters::User, value: Vec::new() };
+ let mut database = None;
+ for j in 0..params.len() {
+ if params[j].name == PgsqlParameters::User {
+ user.value.extend_from_slice(¶ms[j].value);
+ } else if params[j].name == PgsqlParameters::Database {
+ let mut d1 = PgsqlParameter{name: PgsqlParameters::Database, value: Vec::new() };
+ d1.value.extend_from_slice(¶ms[j].value);
+ database = Some(d1);
+ }
+ }
+ if user.value.len() == 0 {
+ return Err(Err::Error(make_error(i, ErrorKind::Tag)));
+ }
+ return Ok((i, PgsqlStartupParameters{
+ user,
+ database,
+ optional_params: optional,
+ }));
+ }
+ return Err(Err::Error(make_error(i, ErrorKind::Tag)));
}
fn parse_sasl_initial_response_payload(i: &[u8]) -> IResult<&[u8], (SASLAuthenticationMechanism, u32, Vec<u8>)> {