#![feature(proc_macro_hygiene, decl_macro)] #[macro_use] extern crate rocket; #[macro_use] extern crate lazy_static; mod serve; use postgres::{Client, NoTls}; use std::sync::{Arc, Mutex}; lazy_static! { static ref CLIENT: Arc> = Arc::new(Mutex::new( Client::connect("host=track_db user=postgres password=example", NoTls).unwrap() )); } fn main() { initialize_db().unwrap(); //setup_db().unwrap(); println!("connected with db"); rocket::ignite() .mount("/", routes![serve::token, serve::get_tracks]) .launch(); } fn setup_db() -> Result<(), postgres::Error> { let name = "Ferris"; let data = None::<&[u8]>; let mut client = CLIENT.lock().unwrap(); client.execute( "INSERT INTO person (name, data) VALUES ($1, $2)", &[&name, &data], )?; for row in client.query("SELECT id, name, data FROM person", &[])? { let id: i32 = row.get(0); let name: &str = row.get(1); let data: Option<&[u8]> = row.get(2); println!("found person: {} {} {:?}", id, name, data); } Ok(()) } fn initialize_db() -> Result<(), postgres::Error> { let mut client = CLIENT.lock().unwrap(); let _ = client.batch_execute( "DROP TABLE user_track; DROP TABLE suser; DROP TABLE track;" ); client.batch_execute( " CREATE TABLE track ( track_id SERIAL PRIMARY KEY, track_code TEXT NOT NULL UNIQUE, name TEXT NOT NULL, artist TEXT NOT NULL, popularity int DEFAULT 50 ); CREATE TABLE suser ( user_id SERIAL PRIMARY KEY, user_name TEXT NOT NULL UNIQUE ); CREATE TABLE user_track ( track_id int REFERENCES track (track_id) ON UPDATE CASCADE ON DELETE CASCADE, user_id int REFERENCES suser (user_id) ON UPDATE CASCADE ON DELETE CASCADE, count int NOT NULL DEFAULT 1, CONSTRAINT track_user_pkey PRIMARY KEY (track_id, user_id) ); ", )?; Ok(()) }