let mut jb = JsonBuilder::new_object();
// User is a mandatory field in a pgsql message
jb.set_string_from_bytes("user", ¶ms.user.value)?;
- if let Some(PgsqlParameter { name: _, value }) = ¶ms.database {
- jb.set_string_from_bytes("database", value)?;
- }
-
if let Some(parameters) = ¶ms.optional_params {
jb.open_array("optional_parameters")?;
for parameter in parameters {
#[derive(Debug, PartialEq, Eq)]
pub struct PgsqlStartupParameters {
pub user: PgsqlParameter,
- pub database: Option<PgsqlParameter>,
pub optional_params: Option<Vec<PgsqlParameter>>,
}
}
pub fn pgsql_parse_startup_parameters(i: &[u8]) -> IResult<&[u8], PgsqlStartupParameters> {
- let (i, optional) = opt(terminated(many1(pgsql_parse_generic_parameter), tag("\x00")))(i)?;
- if let Some(ref params) = optional {
+ let (i, mut optional) = opt(terminated(many1(pgsql_parse_generic_parameter), tag("\x00")))(i)?;
+ if let Some(ref mut params) = optional {
let mut user = PgsqlParameter{name: PgsqlParameters::User, value: Vec::new() };
- let mut database = None;
+ let mut index: usize = 0;
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);
+ index = j;
}
}
+ params.remove(index);
if user.value.len() == 0 {
return Err(Err::Error(make_error(i, ErrorKind::Tag)));
}
return Ok((i, PgsqlStartupParameters{
user,
- database,
- optional_params: optional,
+ optional_params: if !params.is_empty() {
+ optional
+ } else { None },
}));
}
return Err(Err::Error(make_error(i, ErrorKind::Tag)));
name: PgsqlParameters::Database,
value: br#"mailstore"#.to_vec(),
};
+ let mut database_param: Vec<PgsqlParameter> = Vec::new();
+ database_param.push(database);
let params = PgsqlStartupParameters {
user,
- database: Some(database),
- optional_params: None,
+ optional_params: Some(database_param),
};
let expected_result = PgsqlFEMessage::StartupMessage(StartupPacket {
length: 38,
};
let params = PgsqlStartupParameters {
user,
- database: None,
optional_params: None,
};
let expected_result = PgsqlFEMessage::StartupMessage(StartupPacket {