Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
562
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. extern crate regex;
  2. #[macro_use] extern crate lazy_static;
  3.  
  4. use regex::Regex;
  5.  
  6. lazy_static! {
  7. static ref RE_PG: Regex = Regex::new(r"(?P<type>mysql|postgresql)://(?P<user>[^:]+):(?P<password>[^@]+)@(?P<host>[\w\.]+)(:(?P<port>[0-9]+))*(/(?P<db_name>[\w]+))*(\?(?P<extra_params>[\w=\w&]+))*").unwrap();
  8. static ref RE_MY: Regex = Regex::new(r"(?P<type>mysql|postgresql)://(?P<user>[^:]+):(?P<password>[^@]+)@(?P<host>[\w\.]+)(:(?P<port>[0-9]+))*(/(?P<db_name>.*))*").unwrap();
  9. }
  10.  
  11. #[derive(Debug)]
  12. struct ConnectParams {
  13. backend: String, // use database::Backend enum instead
  14. user: String,
  15. password: String,
  16. host: String,
  17. port: Option<String>,
  18. db_name: Option<String>,
  19. extra_params: Option<String>,
  20. }
  21.  
  22. pub fn main() {
  23. let conn_strs = [
  24. "mysql://user:paS-sw1!w??..ord@host",
  25. "mysql://user:password@localhost/database_name",
  26. "mysql://user:password@host:1000/naughty-da?tabase_na??me",
  27. "postgresql://user:password@127.0.0.1:2222",
  28. "postgresql://user:pass##word@host:3200/dbname?param1=value1&p2=v2",
  29. ];
  30. for s in conn_strs.iter() {
  31. let caps = RE_PG.captures(s).unwrap();
  32. let caps = if caps["type"].to_lowercase() == "mysql" { RE_MY.captures(s).unwrap() } else { caps };
  33. let conn_params = ConnectParams {
  34. backend: caps["type"].into(),
  35. user: caps["user"].into(),
  36. password: caps["password"].into(),
  37. host: caps["host"].into(),
  38. port: caps.name("port").map(|m| m.as_str().into()),
  39. db_name: caps.name("db_name").map(|m| m.as_str().into()),
  40. extra_params: caps.name("extra_params").map(|m| m.as_str().into()),
  41. };
  42. println!("{:?}", conn_params);
  43. }
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement