Skip to content

Commit 8c8ec9e

Browse files
committed
feat.: Impl. auto user insertion
Signed-off-by: Dheshan Mohandass <dmohandass@mgh.harvard.edu>
1 parent 727326f commit 8c8ec9e

File tree

3 files changed

+134
-9
lines changed

3 files changed

+134
-9
lines changed

src/bin/diskusage/main.rs

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod users;
44

55
use clap::Parser;
66
use rayon::prelude::*;
7+
use crate::models::definitions::DbModel;
78

89
#[derive(clap::Parser, Default, Debug)]
910
#[clap(
@@ -38,6 +39,29 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
3839
return Err("Root directory does not exist".into());
3940
}
4041

42+
// get the database url from the environment
43+
let database_url = match std::env::var("DATABASE_URL") {
44+
Ok(url) => url,
45+
Err(_) => {
46+
log::error!("DATABASE_URL environment variable not set.");
47+
return Err("DATABASE_URL environment variable not set.".into());
48+
}
49+
};
50+
51+
let pool_result = sqlx::postgres::PgPoolOptions::new().connect(&database_url).await;
52+
let handle = tokio::runtime::Handle::current();
53+
54+
let pool = match pool_result {
55+
Ok(pool) => {
56+
log::info!("Connected to database: {}", database_url);
57+
pool
58+
}
59+
Err(e) => {
60+
log::error!("Failed to connect to database: {}", e);
61+
return Err(e.into());
62+
}
63+
};
64+
4165
walkdir::WalkDir::new(root_dir)
4266
.into_iter()
4367
.par_bridge() // Allows rayon to process entries in parallel
@@ -46,31 +70,47 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
4670
// Check if file or directory
4771
if entry.file_type().is_dir() {
4872
let dir_path = entry.path();
49-
let owner = filesystem::fetch::owner(dir_path).unwrap_or_default();
73+
let owner: Option<u32> = filesystem::fetch::owner(dir_path);
74+
let owner_i32: Option<i32> = owner.map(|x| x as i32);
5075
let parent_dir = dir_path.parent().unwrap_or(std::path::Path::new("/") );
76+
77+
let handle = handle.clone();
78+
let select_user_where_clause = format!("WHERE user_id = {}", owner_i32.unwrap_or_default());
79+
let pool_c = pool.clone();
80+
handle.block_on(async move {
81+
let user = models::definitions::User::select_where(&pool_c, &select_user_where_clause).await.unwrap_or_default();
82+
if user.is_empty() {
83+
let user = models::definitions::User {
84+
user_id: owner_i32.unwrap_or_default(),
85+
username: users::username::get_username(owner.unwrap_or_default())
86+
};
87+
user.insert(&pool_c).await.unwrap_or_default();
88+
}
89+
});
5190

5291
let directory: models::definitions::Directory = models::definitions::Directory {
5392
directory_id: dir_path.to_string_lossy().to_string(),
54-
owner_id: owner as i32,
93+
owner_id: owner_i32,
5594
parent_id: Some(parent_dir.to_string_lossy().to_string()),
5695
};
5796

58-
log::info!("{:?}", directory);
97+
log::info!("directory: {:?}", directory);
5998
} else {
6099
let file_path = entry.path();
61-
let owner = filesystem::fetch::owner(file_path).unwrap_or_default();
100+
let owner: Option<u32> = filesystem::fetch::owner(file_path);
101+
let owner_i32: Option<i32> = owner.map(|x| x as i32);
62102
let file_size = filesystem::fetch::file_size(file_path).unwrap_or_default();
63103

64104
let parent_dir = file_path.parent().unwrap_or(std::path::Path::new("/") );
65105
let file: models::definitions::File = models::definitions::File {
66106
file_id: file_path.to_string_lossy().to_string(),
67107
name: file_path.file_name().unwrap().to_string_lossy().to_string(),
68108
size: file_size as i64,
69-
owner_id: owner as i32,
109+
owner_id: owner_i32.unwrap_or_default(),
70110
directory_id: parent_dir.to_string_lossy().to_string(),
71111
};
72112

73-
log::info!("{:?}", file);
113+
log::info!("file: {:?}", file);
74114
}
75115
});
76116

src/bin/diskusage/models/definitions.rs

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub struct User {
1111
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
1212
pub struct Directory {
1313
pub directory_id: String,
14-
pub owner_id: i32,
14+
pub owner_id: Option<i32>,
1515
pub parent_id: Option<String>,
1616
}
1717

@@ -112,3 +112,80 @@ impl DbModel for User {
112112
Ok(users)
113113
}
114114
}
115+
116+
#[async_trait::async_trait]
117+
impl DbModel for Directory {
118+
async fn insert(&self, pool: &sqlx::Pool<sqlx::postgres::Postgres>) -> Result<(), sqlx::Error> {
119+
sqlx::query!(
120+
"INSERT INTO directories (directory_id, owner_id, parent_id) VALUES ($1, $2, $3)",
121+
self.directory_id,
122+
self.owner_id,
123+
self.parent_id
124+
)
125+
.execute(pool)
126+
.await?;
127+
Ok(())
128+
}
129+
130+
async fn update(&self, pool: &sqlx::Pool<sqlx::postgres::Postgres>) -> Result<(), sqlx::Error> {
131+
sqlx::query!(
132+
"UPDATE directories SET owner_id = $2, parent_id = $3 WHERE directory_id = $1",
133+
self.directory_id,
134+
self.owner_id,
135+
self.parent_id
136+
)
137+
.execute(pool)
138+
.await?;
139+
Ok(())
140+
}
141+
142+
async fn delete(&self, pool: &sqlx::Pool<sqlx::postgres::Postgres>) -> Result<(), sqlx::Error> {
143+
sqlx::query!(
144+
"DELETE FROM directories WHERE directory_id = $1",
145+
self.directory_id
146+
)
147+
.execute(pool)
148+
.await?;
149+
Ok(())
150+
}
151+
152+
async fn select(&self, pool: &sqlx::Pool<sqlx::postgres::Postgres>) -> Result<Box<Self>, sqlx::Error> {
153+
let directory = sqlx::query_as!(
154+
Directory,
155+
"SELECT directory_id, owner_id, parent_id FROM directories WHERE directory_id = $1",
156+
self.directory_id
157+
)
158+
.fetch_one(pool)
159+
.await?;
160+
Ok(Box::new(directory))
161+
}
162+
163+
async fn select_all(pool: &sqlx::Pool<sqlx::postgres::Postgres>) -> Result<Vec<Box<Self>>, sqlx::Error> {
164+
let directories = sqlx::query_as!(
165+
Directory,
166+
"SELECT directory_id, owner_id, parent_id FROM directories"
167+
)
168+
.fetch_all(pool)
169+
.await?;
170+
Ok(directories.into_iter().map(|d| Box::new(d)).collect())
171+
}
172+
173+
async fn select_where(pool: &sqlx::Pool<sqlx::postgres::Postgres>, where_clause: &str) -> Result<Vec<Box<Directory>>, sqlx::Error> {
174+
let query_string = format!("SELECT directory_id, owner_id, parent_id FROM directories WHERE {}", where_clause);
175+
let rows = sqlx::query(&query_string)
176+
.fetch_all(pool)
177+
.await?;
178+
179+
let directories: Vec<Box<Directory>> = rows.into_iter()
180+
.map(|row| {
181+
Box::new(Directory {
182+
directory_id: row.get("directory_id"),
183+
owner_id: row.get("owner_id"),
184+
parent_id: row.get("parent_id"),
185+
})
186+
})
187+
.collect();
188+
189+
Ok(directories)
190+
}
191+
}

src/bin/init_db/main.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
2626

2727
let debug = args.debug;
2828

29-
let database_url = "postgres://pipeline:piedpiper@localhost:5432/test";
30-
let pool_result = sqlx::postgres::PgPoolOptions::new().connect(database_url).await;
29+
// get the database url from the environment
30+
let database_url = match std::env::var("DATABASE_URL") {
31+
Ok(url) => url,
32+
Err(_) => {
33+
log::error!("DATABASE_URL environment variable not set.");
34+
return Err("DATABASE_URL environment variable not set.".into());
35+
}
36+
};
37+
38+
let pool_result = sqlx::postgres::PgPoolOptions::new().connect(&database_url).await;
3139

3240
let pool = match pool_result {
3341
Ok(pool) => {

0 commit comments

Comments
 (0)