@@ -4,6 +4,7 @@ mod users;
4
4
5
5
use clap:: Parser ;
6
6
use rayon:: prelude:: * ;
7
+ use crate :: models:: definitions:: DbModel ;
7
8
8
9
#[ derive( clap:: Parser , Default , Debug ) ]
9
10
#[ clap(
@@ -38,6 +39,29 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
38
39
return Err ( "Root directory does not exist" . into ( ) ) ;
39
40
}
40
41
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
+
41
65
walkdir:: WalkDir :: new ( root_dir)
42
66
. into_iter ( )
43
67
. par_bridge ( ) // Allows rayon to process entries in parallel
@@ -46,31 +70,47 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
46
70
// Check if file or directory
47
71
if entry. file_type ( ) . is_dir ( ) {
48
72
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 ) ;
50
75
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
+ } ) ;
51
90
52
91
let directory: models:: definitions:: Directory = models:: definitions:: Directory {
53
92
directory_id : dir_path. to_string_lossy ( ) . to_string ( ) ,
54
- owner_id : owner as i32 ,
93
+ owner_id : owner_i32 ,
55
94
parent_id : Some ( parent_dir. to_string_lossy ( ) . to_string ( ) ) ,
56
95
} ;
57
96
58
- log:: info!( "{:?}" , directory) ;
97
+ log:: info!( "directory: {:?}" , directory) ;
59
98
} else {
60
99
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 ) ;
62
102
let file_size = filesystem:: fetch:: file_size ( file_path) . unwrap_or_default ( ) ;
63
103
64
104
let parent_dir = file_path. parent ( ) . unwrap_or ( std:: path:: Path :: new ( "/" ) ) ;
65
105
let file: models:: definitions:: File = models:: definitions:: File {
66
106
file_id : file_path. to_string_lossy ( ) . to_string ( ) ,
67
107
name : file_path. file_name ( ) . unwrap ( ) . to_string_lossy ( ) . to_string ( ) ,
68
108
size : file_size as i64 ,
69
- owner_id : owner as i32 ,
109
+ owner_id : owner_i32 . unwrap_or_default ( ) ,
70
110
directory_id : parent_dir. to_string_lossy ( ) . to_string ( ) ,
71
111
} ;
72
112
73
- log:: info!( "{:?}" , file) ;
113
+ log:: info!( "file: {:?}" , file) ;
74
114
}
75
115
} ) ;
76
116
0 commit comments