use mysql::prelude::*;
use mysql::*;
let url = format!(
"mysql://{}:{}@{}:{}/{}",
config.db.user, config.db.password, config.db.host, config.db.port, config.db.database
);
println!("Connecting to database at {}.", url);
let pool = Pool::new(url.as_str()).expect("Unable to connect to database.");
if !does_table_exist(&pool) {
println!("Table does not exist. Creating them.");
create_table(&pool);
}
pool
} */
pub fn does_table_exist(pool: &Pool) -> bool {
let mut conn = pool.get_conn().unwrap();
let result: Vec<String> = conn
.exec_map(
r"
SELECT table_name FROM information_schema.tables WHERE table_schema = :database
",
params! {
"database" => "url_shortener"
},
|table_name| table_name,
)
.unwrap();
result.len() > 0
}
pub fn create_table(pool: &Pool) {
let mut conn = pool.get_conn().unwrap();
conn.query_drop(
r"
CREATE TABLE IF NOT EXISTS `urls` (
`id` INT NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL,
`shortened` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
",
)
.unwrap();
println!("Table created.");
}
pub fn insert_url(pool: &Pool, url: &str, shortened: &str) {
let mut conn = pool.get_conn().unwrap();
conn.exec_drop(
r"
INSERT INTO `urls` (`url`, `shortened`) VALUES (:url, :shortened)
",
params! {
"url" => url,
"shortened" => shortened
},
)
.unwrap();
}
pub fn get_url(pool: &Pool, shortened: &str) -> Option<String> {
let mut conn = pool.get_conn().unwrap();
let result: Vec<String> = conn
.exec_map(
r"
SELECT `url` FROM `urls` WHERE `shortened` = :shortened
",
params! {
"shortened" => shortened
},
|url| url,
)
.unwrap();
result.into_iter().next()
}
pub fn get_shortened(pool: &Pool, url: &str) -> Option<String> {
let mut conn = pool.get_conn().unwrap();
let result: Vec<String> = conn
.exec_map(
r"
SELECT `shortened` FROM `urls` WHERE `url` = :url
",
params! {
"url" => url
},
|shortened| shortened,
)
.unwrap();
result.into_iter().next()
}
pub fn url_exists(pool: &Pool, url: &str) -> bool {
let mut conn = pool.get_conn().unwrap();
let result: Vec<String> = conn
.exec_map(
r"
SELECT `url` FROM `urls` WHERE `url` = :url
",
params! {
"url" => url
},
|url| url,
)
.unwrap();
result.len() > 0
}
pub fn shortened_exists(pool: &Pool, shortened: &str) -> bool {
let mut conn = pool.get_conn().unwrap();
let result: Vec<String> = conn
.exec_map(
r"
SELECT `shortened` FROM `urls` WHERE `shortened` = :shortened
",
params! {
"shortened" => shortened
},
|shortened| shortened,
)
.unwrap();
result.len() > 0
}
pub fn count_urls(pool: &Pool) -> u64 {
let mut conn = pool.get_conn().unwrap();
let result: Vec<u64> = conn
.exec_map(
r"
SELECT COUNT(*) FROM `urls`
",
(),
|count| count,
)
.unwrap();
result.into_iter().next().unwrap()
}