11#include "../include/cmd.h"
22
3+ void get_file_name (char * file_name , const char * cmd_path )
4+ {
5+ int len = strlen (cmd_path );
6+ while (cmd_path [len ] != '/' && len != -1 )
7+ {
8+ len -- ;
9+ }
10+ len ++ ;
11+ int i = 0 ;
12+ while (cmd_path [len ] != '\0' )
13+ {
14+ file_name [i ++ ] = cmd_path [len ++ ];
15+ }
16+ file_name [i ] = '\0' ;
17+ }
18+
319char * convert_path (const char * path , MYSQL * conn , const char * root_id , const char * cur_dir_id )
420{
521 char * abs_path = (char * )malloc (RESULT_LEN );
622 MYSQL_RES * res ;
723 MYSQL_ROW row ;
824 if (path [0 ] == '/' ) //strat with user root dir
925 {
10- res = sql_select (conn , "file" , "id" , root_id );
26+ res = sql_select (conn , "file" , "id" , root_id , 0 );
1127 row = mysql_fetch_row (res );
1228 mysql_free_result (res );
1329 strcpy (abs_path , row [5 ]);
@@ -20,10 +36,10 @@ char* convert_path(const char* path, MYSQL* conn, const char* root_id, const cha
2036 }
2137 if (path [0 ] == '.' && path [1 ] == '.' ) //start with parent dir
2238 {
23- res = sql_select (conn , "file" , "id" , cur_dir_id );
39+ res = sql_select (conn , "file" , "id" , cur_dir_id , 0 );
2440 row = mysql_fetch_row (res );
2541 mysql_free_result (res );
26- res = sql_select (conn , "file" , "id" , row [1 ]);
42+ res = sql_select (conn , "file" , "id" , row [1 ], 0 );
2743 row = mysql_fetch_row (res );
2844 mysql_free_result (res );
2945 if (atoi (row [1 ]) == -1 )
@@ -49,7 +65,7 @@ char* convert_path(const char* path, MYSQL* conn, const char* root_id, const cha
4965 }
5066 else //start with cur dir
5167 {
52- res = sql_select (conn , "file" , "id" , cur_dir_id );
68+ res = sql_select (conn , "file" , "id" , cur_dir_id , 0 );
5369 row = mysql_fetch_row (res );
5470 mysql_free_result (res );
5571 if (strcmp (path , "./" ) == 0 || strcmp (path , "." ) == 0 )
@@ -81,7 +97,7 @@ int resolve_ls(char*** result, int *n, const char* path, MYSQL* conn, const char
8197 MYSQL_ROW row ;
8298 if (strlen (path ) == 0 ) //only ls
8399 {
84- res = sql_select (conn , "file" , "dir_id" , cur_dir_id );
100+ res = sql_select (conn , "file" , "dir_id" , cur_dir_id , 0 );
85101 if (res == NULL )
86102 {
87103 * n = 0 ;
@@ -96,7 +112,7 @@ int resolve_ls(char*** result, int *n, const char* path, MYSQL* conn, const char
96112 {
97113 return -1 ;
98114 }
99- res = sql_select (conn , "file" ,"file_path" , abs_path );
115+ res = sql_select (conn , "file" ,"file_path" , abs_path , 0 );
100116 free (abs_path );
101117 abs_path = NULL ;
102118 if (res == NULL )
@@ -108,7 +124,7 @@ int resolve_ls(char*** result, int *n, const char* path, MYSQL* conn, const char
108124 if (atoi (row [2 ]) == 0 ) //is dir
109125 {
110126 mysql_free_result (res );
111- res = sql_select (conn , "file" , "dir_id" , row [0 ]);
127+ res = sql_select (conn , "file" , "dir_id" , row [0 ], 0 );
112128 if (res == NULL ) //empty dir
113129 {
114130 * n = 0 ;
@@ -147,18 +163,30 @@ int resolve_ls(char*** result, int *n, const char* path, MYSQL* conn, const char
147163 return 1 ;
148164}
149165
150- int resolve_pwd (char * * * result , int * n , MYSQL * conn , const char * cur_dir_id )
166+ int resolve_pwd (char * * * result , int * n , MYSQL * conn , const char * cur_dir_id , int name_len )
151167{
152168 MYSQL_RES * res ;
153169 MYSQL_ROW row ;
154- res = sql_select (conn , "file" , "id" , cur_dir_id );
170+ res = sql_select (conn , "file" , "id" , cur_dir_id , 0 );
155171 row = mysql_fetch_row (res );
156172 * n = 1 ;
157173 * result = (char * * )malloc (sizeof (char * ));
158174 (* result )[0 ] = (char * )malloc (RESULT_LEN );
159- strcpy ((* result )[0 ], row [5 ]);
160- mysql_free_result (res );
175+ if (row [5 ][8 + name_len + 1 ] == '\0' )
176+ {
177+ mysql_free_result (res );
178+ strcpy ((* result )[0 ], "/" );
179+ return 1 ;
180+ }
181+ else
182+ {
183+ for (int i = 8 + name_len + 1 ; row [5 ][i - 1 ] != '\0' ; i ++ )
184+ {
185+ (* result )[0 ][i - 8 - name_len - 1 ] = row [5 ][i ];
186+ }
187+ mysql_free_result (res );
161188 return 1 ;
189+ }
162190}
163191
164192int resolve_cd (char * * * result , int * n , const char * cmd_path , MYSQL * conn , char * cur_dir_id , const char * root_id )
@@ -171,7 +199,7 @@ int resolve_cd(char*** result, int *n, const char* cmd_path, MYSQL* conn, char*
171199 {
172200 return -2 ;
173201 }
174- res = sql_select (conn , "file" , "file_path" , abs_path );
202+ res = sql_select (conn , "file" , "file_path" , abs_path , 0 );
175203 free (abs_path );
176204 abs_path = NULL ;
177205 if (res == NULL )
@@ -184,18 +212,50 @@ int resolve_cd(char*** result, int *n, const char* cmd_path, MYSQL* conn, char*
184212 if (atoi (row [2 ]) == 0 ) //is dir
185213 {
186214 strcpy (cur_dir_id , row [0 ]);
187- * n = 1 ;
188- * result = (char * * )malloc (sizeof (char * ));
189- (* result )[0 ] = (char * )malloc (RESULT_LEN );
190- strcpy ((* result )[0 ], row [5 ]);
191- return 2 ;
215+ int ret ;
216+ ret = resolve_ls (result , n , "" , conn , cur_dir_id , root_id );
217+ return ret ;
192218 }
193219 else //is file
194220 {
195221 return -2 ;
196222 }
197223}
198224
225+ int resolve_mkdir (char * * * result , int * n , const char * user_name , const char * cmd_path , MYSQL * conn , const char * cur_dir_id , const char * root_id )
226+ {
227+ int ret ;
228+ MYSQL_RES * res ;
229+
230+ char file_name [FILE_NAME_LEN ];
231+ get_file_name (file_name , cmd_path );
232+
233+ char * abs_path ;
234+ abs_path = convert_path (cmd_path , conn , root_id , cur_dir_id );
235+ if (abs_path == NULL )
236+ {
237+ return -4 ;
238+ }
239+ res = sql_select (conn , "file" , "file_path" , abs_path , 0 );
240+ free (abs_path );
241+ abs_path = NULL ;
242+ if (res == NULL )
243+ {
244+ ret = sql_insert_file_trans (conn , user_name , cur_dir_id , 0 , file_name , 0 , NULL );
245+ if (ret == -1 )
246+ {
247+ return -4 ;
248+ }
249+ ret = resolve_ls (result , n , "" , conn , cur_dir_id , root_id );
250+ return ret ;
251+ }
252+ else
253+ {
254+ mysql_free_result (res );
255+ return -4 ;
256+ }
257+ }
258+
199259int resolve_gets (char * file_md5 , char * file_name , char * file_size , const char * path , MYSQL * conn , const char * root_id , const char * cur_dir_id )
200260{
201261 char * abs_path ;
@@ -207,7 +267,7 @@ int resolve_gets(char* file_md5, char* file_name, char* file_size, const char* p
207267 {
208268 return -1 ;
209269 }
210- res = sql_select (conn , "file" , "file_path" , abs_path );
270+ res = sql_select (conn , "file" , "file_path" , abs_path , 0 );
211271 free (abs_path );
212272 abs_path = NULL ;
213273 if (res == NULL )
@@ -235,27 +295,16 @@ int resolve_puts(const char* cmd_path, MYSQL* conn, const char* root_id, const c
235295{
236296 MYSQL_RES * res ;
237297 char * abs_path ;
238- char file_name [FILE_NAME_LEN ];
239298
240- int len = strlen (cmd_path );
241- while (cmd_path [len ] != '/' && len != -1 )
242- {
243- len -- ;
244- }
245- len ++ ;
246- int i ;
247- while (cmd_path [len ] != '\0' )
248- {
249- file_name [i ++ ] = cmd_path [len ++ ];
250- }
251- file_name [i ] = '\0' ;
299+ char file_name [FILE_NAME_LEN ];
300+ get_file_name (file_name , cmd_path );
252301
253302 abs_path = convert_path (file_name , conn , root_id , cur_dir_id );
254303 if (abs_path == NULL )
255304 {
256305 return -1 ;
257306 }
258- res = sql_select (conn , "file" , "file_path" , abs_path );
307+ res = sql_select (conn , "file" , "file_path" , abs_path , 0 );
259308 free (abs_path );
260309 abs_path = NULL ;
261310 if (res == NULL )
@@ -272,18 +321,27 @@ int resolve_puts(const char* cmd_path, MYSQL* conn, const char* root_id, const c
272321 }
273322}
274323
275- int resolve_rm (const char * cmd_path , MYSQL * conn , const char * user_name , const char * root_id , const char * cur_dir_id )
324+ int resolve_rm (const char * cmd_path , int abs_flag , MYSQL * conn , const char * user_name , const char * root_id , const char * cur_dir_id )
276325{
277326 char * abs_path ;
327+ int ret , num ;
278328 MYSQL_RES * res ;
279329 MYSQL_ROW row ;
280330
281- abs_path = convert_path (cmd_path , conn , root_id , cur_dir_id );
331+ if (abs_flag == 0 )
332+ {
333+ abs_path = convert_path (cmd_path , conn , root_id , cur_dir_id );
334+ }
335+ else
336+ {
337+ abs_path = (char * )malloc (RESULT_LEN );
338+ strcpy (abs_path , cmd_path );
339+ }
282340 if (abs_path == NULL )
283341 {
284342 return -3 ;
285343 }
286- res = sql_select (conn , "file" , "file_path" , abs_path );
344+ res = sql_select (conn , "file" , "file_path" , abs_path , 0 );
287345 if (res == NULL )
288346 {
289347 return -3 ;
@@ -293,15 +351,36 @@ int resolve_rm(const char* cmd_path, MYSQL* conn, const char* user_name, const c
293351 mysql_free_result (res );
294352 if (atoi (row [2 ]) == 0 ) //is dir
295353 {
296- return -3 ;
354+ ret = sql_delete_file (conn , user_name , abs_path );
355+ if (ret == -1 )
356+ {
357+ return -3 ;
358+ }
359+ char regexp [QUERY_LEN ] = "^" ;
360+ strcat (regexp , abs_path );
361+ free (abs_path );
362+ abs_path = NULL ;
363+ res = sql_select (conn , "file" , "file_path" , regexp , 1 );
364+ if (res == NULL )
365+ {
366+ return 3 ;
367+ }
368+ num = mysql_num_rows (res );
369+ for (int i = 0 ; i < num ; i ++ )
370+ {
371+ row = mysql_fetch_row (res );
372+ resolve_rm (row [5 ], 1 , conn , user_name , root_id , cur_dir_id );
373+ }
374+ mysql_free_result (res );
375+ return 3 ;
297376 }
298377 else //is file
299378 {
300- int ret ;
301379 char file_md5 [MD5_LEN ];
302380 strcpy (file_md5 , row [6 ]);
303- res = sql_select (conn , "file" , "file_md5" , file_md5 );
304- int num = mysql_num_rows (res );
381+ res = sql_select (conn , "file" , "file_md5" , file_md5 , 0 );
382+ num = mysql_num_rows (res );
383+ mysql_free_result (res );
305384
306385 ret = sql_delete_file (conn , user_name , abs_path );
307386 free (abs_path );
0 commit comments