Version 22.59: Nov 06, 2022 New module swad_browser_size.

This commit is contained in:
acanas 2022-11-06 22:07:49 +01:00
parent 46cab63cba
commit 0f6686f7a1
12 changed files with 796 additions and 646 deletions

View File

@ -33,8 +33,8 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_action_list.o \
swad_assignment_database.o swad_assignment_resource.o swad_attendance.o \ swad_assignment_database.o swad_assignment_resource.o swad_attendance.o \
swad_attendance_database.o swad_attendance_resource.o swad_autolink.o \ swad_attendance_database.o swad_attendance_resource.o swad_autolink.o \
swad_banner.o swad_banner_database.o swad_box.o swad_browser.o \ swad_banner.o swad_banner_database.o swad_box.o swad_browser.o \
swad_browser_database.o swad_browser_resource.o swad_building.o \ swad_browser_database.o swad_browser_resource.o swad_browser_size.o \
swad_building_database.o swad_button.o \ swad_building.o swad_building_database.o swad_button.o \
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_resource.o \ swad_calendar.o swad_call_for_exam.o swad_call_for_exam_resource.o \
swad_call_for_exam_database.o swad_center.o swad_center_config.o \ swad_call_for_exam_database.o swad_center.o swad_center_config.o \
swad_center_database.o swad_chat.o swad_chat_database.o swad_config.o \ swad_center_database.o swad_chat.o swad_chat_database.o swad_config.o \

File diff suppressed because it is too large Load Diff

View File

@ -147,23 +147,13 @@ struct Brw_FileMetadata
unsigned NumLoggedUsrs; unsigned NumLoggedUsrs;
}; };
struct Brw_SizeOfFileZones
{
int NumCrss; // -1 stands for not aplicable
int NumGrps; // -1 stands for not aplicable
int NumUsrs; // -1 stands for not aplicable
unsigned MaxLevels;
unsigned long NumFolders;
unsigned long NumFiles;
unsigned long long int Size; // Total size in bytes
};
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Brw_MAX_DIR_LEVELS 10 // Maximum number of subdirectory levels in file browsers #define BrwSiz_MAX_DIR_LEVELS 10 // Maximum number of subdirectory levels in file browsers
#define Brw_MAX_ROW_ID ((1 + Brw_MAX_DIR_LEVELS) * (10 + 1))
#define Brw_MAX_ROW_ID ((1 + BrwSiz_MAX_DIR_LEVELS) * (10 + 1))
#define Brw_MAX_BYTES_MIME_TYPE (128 - 1) // 127: maximum size in bytes of "image/jpeg", "text/html", etc. #define Brw_MAX_BYTES_MIME_TYPE (128 - 1) // 127: maximum size in bytes of "image/jpeg", "text/html", etc.
@ -248,15 +238,13 @@ void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod,
long *CrsCod, long *CrsCod,
long *GrpCod); long *GrpCod);
bool Prj_CheckIfICanViewProjectFiles (long PrjCod); bool Brw_CheckIfFileBrowserIsEditable (Brw_FileBrowser_t FileBrowser);
long Brw_GetCodForFileBrowser (void); long Brw_GetCodForFileBrowser (void);
long Brw_GetZoneUsrCodForFileBrowser (void); long Brw_GetZoneUsrCodForFileBrowser (void);
void Brw_DB_RemoveExpiredExpandedFolders (void); void Brw_DB_RemoveExpiredExpandedFolders (void);
void Brw_CalcSizeOfDir (char *Path);
void Brw_SetFullPathInTree (void); void Brw_SetFullPathInTree (void);
void Brw_PutIconFile (const char *FileName, void Brw_PutIconFile (const char *FileName,

View File

@ -2845,12 +2845,11 @@ void Brw_DB_RemoveAffectedClipboards (Brw_FileBrowser_t FileBrowser,
/*********************** Store size of a file zone ***************************/ /*********************** Store size of a file zone ***************************/
/*****************************************************************************/ /*****************************************************************************/
void Brw_DB_StoreSizeOfFileZone (void) void Brw_DB_StoreSizeOfFileBrowser (const struct BrwSiz_BrowserSize *Size)
{ {
long Cod = Brw_GetCodForFileBrowser (); long Cod = Brw_GetCodForFileBrowser ();
long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser ();
/***** Update size of the file browser in database *****/
DB_QueryREPLACE ("can not store the size of a file zone", DB_QueryREPLACE ("can not store the size of a file zone",
"REPLACE INTO brw_sizes" "REPLACE INTO brw_sizes"
" (FileBrowser,Cod,ZoneUsrCod," " (FileBrowser,Cod,ZoneUsrCod,"
@ -2860,10 +2859,10 @@ void Brw_DB_StoreSizeOfFileZone (void)
"%u,'%lu','%lu','%llu')", "%u,'%lu','%lu','%llu')",
(unsigned) Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type], (unsigned) Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type],
Cod,ZoneUsrCod, Cod,ZoneUsrCod,
Gbl.FileBrowser.Size.NumLevls, Size->NumLevls,
Gbl.FileBrowser.Size.NumFolds, Size->NumFolds,
Gbl.FileBrowser.Size.NumFiles, Size->NumFiles,
Gbl.FileBrowser.Size.TotalSiz); Size->TotalSiz);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -30,6 +30,7 @@
#include <mysql/mysql.h> // To access MySQL databases #include <mysql/mysql.h> // To access MySQL databases
#include "swad_browser.h" #include "swad_browser.h"
#include "swad_browser_size.h"
#include "swad_search.h" #include "swad_search.h"
/*****************************************************************************/ /*****************************************************************************/
@ -121,7 +122,7 @@ void Brw_DB_RemoveAffectedClipboards (Brw_FileBrowser_t FileBrowser,
long MyUsrCod,long WorksUsrCod); long MyUsrCod,long WorksUsrCod);
//-------------------------- Size of file zones ------------------------------- //-------------------------- Size of file zones -------------------------------
void Brw_DB_StoreSizeOfFileZone (void); void Brw_DB_StoreSizeOfFileBrowser (const struct BrwSiz_BrowserSize *Size);
void Brw_DB_GetSizeOfFileBrowser (MYSQL_RES **mysql_res, void Brw_DB_GetSizeOfFileBrowser (MYSQL_RES **mysql_res,
Brw_FileBrowser_t FileBrowser); Brw_FileBrowser_t FileBrowser);

487
swad_browser_size.c Normal file
View File

@ -0,0 +1,487 @@
// swad_browser_size.c: file browser size
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2022 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/*********************************** Headers *********************************/
/*****************************************************************************/
#include <dirent.h> // For scandir, etc.
#include <string.h> // For string functions
#include <sys/stat.h> // For lstat
#include "swad_alert.h"
#include "swad_browser_database.h"
#include "swad_browser_size.h"
#include "swad_database.h"
#include "swad_error.h"
#include "swad_global.h"
/*****************************************************************************/
/**************************** Private constants ******************************/
/*****************************************************************************/
/* All quotas must be multiple of 1 GiB (Gibibyte)*/
#define BrwSiz_GiB (1024ULL * 1024ULL * 1024ULL)
/* Maximum quotas for each type of file browser */
#define BrwSiz_MAX_QUOTA_DOCUM_INS (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_DOCUM_INS 5000
#define BrwSiz_MAX_FOLDS_DOCUM_INS 1000
#define BrwSiz_MAX_QUOTA_DOCUM_CTR (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_DOCUM_CTR 5000
#define BrwSiz_MAX_FOLDS_DOCUM_CTR 1000
#define BrwSiz_MAX_QUOTA_DOCUM_DEG (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_DOCUM_DEG 5000
#define BrwSiz_MAX_FOLDS_DOCUM_DEG 1000
#define BrwSiz_MAX_QUOTA_DOCUM_CRS (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_DOCUM_CRS 5000
#define BrwSiz_MAX_FOLDS_DOCUM_CRS 1000
#define BrwSiz_MAX_QUOTA_DOCUM_GRP ( 1ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_DOCUM_GRP 1000
#define BrwSiz_MAX_FOLDS_DOCUM_GRP 500
#define BrwSiz_MAX_QUOTA_TEACH_CRS BrwSiz_MAX_QUOTA_DOCUM_CRS
#define BrwSiz_MAX_FILES_TEACH_CRS BrwSiz_MAX_FILES_DOCUM_CRS
#define BrwSiz_MAX_FOLDS_TEACH_CRS BrwSiz_MAX_FOLDS_DOCUM_CRS
#define BrwSiz_MAX_QUOTA_TEACH_GRP BrwSiz_MAX_QUOTA_DOCUM_GRP
#define BrwSiz_MAX_FILES_TEACH_GRP BrwSiz_MAX_FILES_DOCUM_GRP
#define BrwSiz_MAX_FOLDS_TEACH_GRP BrwSiz_MAX_FOLDS_DOCUM_GRP
#define BrwSiz_MAX_QUOTA_SHARE_INS (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_SHARE_INS 5000
#define BrwSiz_MAX_FOLDS_SHARE_INS 1000 // Many, because every student can create his own directories
#define BrwSiz_MAX_QUOTA_SHARE_CTR (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_SHARE_CTR 5000
#define BrwSiz_MAX_FOLDS_SHARE_CTR 1000 // Many, because every student can create his own directories
#define BrwSiz_MAX_QUOTA_SHARE_DEG (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_SHARE_DEG 5000
#define BrwSiz_MAX_FOLDS_SHARE_DEG 1000 // Many, because every student can create his own directories
#define BrwSiz_MAX_QUOTA_SHARE_CRS (64ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_SHARE_CRS 5000
#define BrwSiz_MAX_FOLDS_SHARE_CRS 1000 // Many, because every student can create his own directories
#define BrwSiz_MAX_QUOTA_SHARE_GRP ( 1ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_SHARE_GRP 1000
#define BrwSiz_MAX_FOLDS_SHARE_GRP 500 // Many, because every student can create his own directories
#define BrwSiz_MAX_QUOTA_ASSIG_PER_STD ( 2ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_ASSIG_PER_STD 500
#define BrwSiz_MAX_FOLDS_ASSIG_PER_STD 50
#define BrwSiz_MAX_QUOTA_WORKS_PER_STD ( 2ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_WORKS_PER_STD 500
#define BrwSiz_MAX_FOLDS_WORKS_PER_STD 50
#define BrwSiz_MAX_QUOTA_DOC_PRJ ( 1ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_DOC_PRJ 500
#define BrwSiz_MAX_FOLDS_DOC_PRJ 50
#define BrwSiz_MAX_QUOTA_ASS_PRJ ( 1ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_ASS_PRJ 200
#define BrwSiz_MAX_FOLDS_ASS_PRJ 20
#define BrwSiz_MAX_QUOTA_MARKS_CRS ( 1ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_MARKS_CRS 500
#define BrwSiz_MAX_FOLDS_MARKS_CRS 50
#define BrwSiz_MAX_QUOTA_MARKS_GRP ( 1ULL*BrwSiz_GiB)
#define BrwSiz_MAX_FILES_MARKS_GRP 200
#define BrwSiz_MAX_FOLDS_MARKS_GRP 20
static const unsigned long long BrwSiz_MAX_QUOTA_BRIEF[Rol_NUM_ROLES] = // MaxRole is used
{
[Rol_STD] = 32ULL*BrwSiz_GiB,
[Rol_NET] = 32ULL*BrwSiz_GiB,
[Rol_TCH] = 64ULL*BrwSiz_GiB,
};
#define BrwSiz_MAX_FILES_BRIEF 5000
#define BrwSiz_MAX_FOLDS_BRIEF 1000
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************* Private global variables **************************/
/*****************************************************************************/
struct BrwSiz_BrowserSize Brw_Size;
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static void BrwSiz_CalcSizeOfDirRecursive (struct BrwSiz_BrowserSize *Size,
unsigned Level,char *Path);
/*****************************************************************************/
/********************* Get pointer to browser size struct ********************/
/*****************************************************************************/
struct BrwSiz_BrowserSize *BrwSiz_GetSize (void)
{
return &Brw_Size;
}
/*****************************************************************************/
/*** Initialize maximum quota of current file browser and check if exceded ***/
/*****************************************************************************/
void BrwSiz_SetAndCheckQuota (struct BrwSiz_BrowserSize *Size)
{
extern const char *Txt_Quota_exceeded;
/***** Check the quota *****/
BrwSiz_SetMaxQuota (Size);
BrwSiz_CalcSizeOfDir (Size,Gbl.FileBrowser.Priv.PathRootFolder);
if (BrwSiz_CheckIfQuotaExceded (Size))
Ale_ShowAlert (Ale_WARNING,Txt_Quota_exceeded);
}
/*****************************************************************************/
/************ Initialize maximum quota of current file browser ***************/
/*****************************************************************************/
void BrwSiz_SetMaxQuota (struct BrwSiz_BrowserSize *Size)
{
switch (Gbl.FileBrowser.Type)
{
case Brw_SHOW_DOC_INS:
case Brw_ADMI_DOC_INS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_DOCUM_INS;
Size->MaxFiles = BrwSiz_MAX_FILES_DOCUM_INS;
Size->MaxFolds = BrwSiz_MAX_FOLDS_DOCUM_INS;
break;
case Brw_ADMI_SHR_INS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_SHARE_INS;
Size->MaxFiles = BrwSiz_MAX_FILES_SHARE_INS;
Size->MaxFolds = BrwSiz_MAX_FOLDS_SHARE_INS;
break;
case Brw_SHOW_DOC_CTR:
case Brw_ADMI_DOC_CTR:
Size->MaxQuota = BrwSiz_MAX_QUOTA_DOCUM_CTR;
Size->MaxFiles = BrwSiz_MAX_FILES_DOCUM_CTR;
Size->MaxFolds = BrwSiz_MAX_FOLDS_DOCUM_CTR;
break;
case Brw_ADMI_SHR_CTR:
Size->MaxQuota = BrwSiz_MAX_QUOTA_SHARE_CTR;
Size->MaxFiles = BrwSiz_MAX_FILES_SHARE_CTR;
Size->MaxFolds = BrwSiz_MAX_FOLDS_SHARE_CTR;
break;
case Brw_SHOW_DOC_DEG:
case Brw_ADMI_DOC_DEG:
Size->MaxQuota = BrwSiz_MAX_QUOTA_DOCUM_DEG;
Size->MaxFiles = BrwSiz_MAX_FILES_DOCUM_DEG;
Size->MaxFolds = BrwSiz_MAX_FOLDS_DOCUM_DEG;
break;
case Brw_ADMI_SHR_DEG:
Size->MaxQuota = BrwSiz_MAX_QUOTA_SHARE_DEG;
Size->MaxFiles = BrwSiz_MAX_FILES_SHARE_DEG;
Size->MaxFolds = BrwSiz_MAX_FOLDS_SHARE_DEG;
break;
case Brw_SHOW_DOC_CRS:
case Brw_ADMI_DOC_CRS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_DOCUM_CRS;
Size->MaxFiles = BrwSiz_MAX_FILES_DOCUM_CRS;
Size->MaxFolds = BrwSiz_MAX_FOLDS_DOCUM_CRS;
break;
case Brw_SHOW_DOC_GRP:
case Brw_ADMI_DOC_GRP:
Size->MaxQuota = BrwSiz_MAX_QUOTA_DOCUM_GRP;
Size->MaxFiles = BrwSiz_MAX_FILES_DOCUM_GRP;
Size->MaxFolds = BrwSiz_MAX_FOLDS_DOCUM_GRP;
break;
case Brw_ADMI_TCH_CRS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_TEACH_CRS;
Size->MaxFiles = BrwSiz_MAX_FILES_TEACH_CRS;
Size->MaxFolds = BrwSiz_MAX_FOLDS_TEACH_CRS;
break;
case Brw_ADMI_TCH_GRP:
Size->MaxQuota = BrwSiz_MAX_QUOTA_TEACH_GRP;
Size->MaxFiles = BrwSiz_MAX_FILES_TEACH_GRP;
Size->MaxFolds = BrwSiz_MAX_FOLDS_TEACH_GRP;
break;
case Brw_ADMI_SHR_CRS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_SHARE_CRS;
Size->MaxFiles = BrwSiz_MAX_FILES_SHARE_CRS;
Size->MaxFolds = BrwSiz_MAX_FOLDS_SHARE_CRS;
break;
case Brw_ADMI_SHR_GRP:
Size->MaxQuota = BrwSiz_MAX_QUOTA_SHARE_GRP;
Size->MaxFiles = BrwSiz_MAX_FILES_SHARE_GRP;
Size->MaxFolds = BrwSiz_MAX_FOLDS_SHARE_GRP;
break;
case Brw_ADMI_ASG_USR:
case Brw_ADMI_ASG_CRS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_ASSIG_PER_STD;
Size->MaxFiles = BrwSiz_MAX_FILES_ASSIG_PER_STD;
Size->MaxFolds = BrwSiz_MAX_FOLDS_ASSIG_PER_STD;
break;
case Brw_ADMI_WRK_USR:
case Brw_ADMI_WRK_CRS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_WORKS_PER_STD;
Size->MaxFiles = BrwSiz_MAX_FILES_WORKS_PER_STD;
Size->MaxFolds = BrwSiz_MAX_FOLDS_WORKS_PER_STD;
break;
case Brw_ADMI_DOC_PRJ:
Size->MaxQuota = BrwSiz_MAX_QUOTA_DOC_PRJ;
Size->MaxFiles = BrwSiz_MAX_FILES_DOC_PRJ;
Size->MaxFolds = BrwSiz_MAX_FOLDS_DOC_PRJ;
break;
case Brw_ADMI_ASS_PRJ:
Size->MaxQuota = BrwSiz_MAX_QUOTA_ASS_PRJ;
Size->MaxFiles = BrwSiz_MAX_FILES_ASS_PRJ;
Size->MaxFolds = BrwSiz_MAX_FOLDS_ASS_PRJ;
break;
case Brw_SHOW_MRK_CRS:
case Brw_ADMI_MRK_CRS:
Size->MaxQuota = BrwSiz_MAX_QUOTA_MARKS_CRS;
Size->MaxFiles = BrwSiz_MAX_FILES_MARKS_CRS;
Size->MaxFolds = BrwSiz_MAX_FOLDS_MARKS_CRS;
break;
case Brw_SHOW_MRK_GRP:
case Brw_ADMI_MRK_GRP:
Size->MaxQuota = BrwSiz_MAX_QUOTA_MARKS_GRP;
Size->MaxFiles = BrwSiz_MAX_FILES_MARKS_GRP;
Size->MaxFolds = BrwSiz_MAX_FOLDS_MARKS_GRP;
break;
case Brw_ADMI_BRF_USR:
Size->MaxQuota = BrwSiz_MAX_QUOTA_BRIEF[Gbl.Usrs.Me.Role.Max];
Size->MaxFiles = BrwSiz_MAX_FILES_BRIEF;
Size->MaxFolds = BrwSiz_MAX_FOLDS_BRIEF;
break;
default:
break;
}
}
/*****************************************************************************/
/********************** Check if quota has been exceeded *********************/
/*****************************************************************************/
bool BrwSiz_CheckIfQuotaExceded (const struct BrwSiz_BrowserSize *Size)
{
return (Size->NumLevls > BrwSiz_MAX_DIR_LEVELS ||
Size->NumFolds > Size->MaxFolds ||
Size->NumFiles > Size->MaxFiles ||
Size->TotalSiz > Size->MaxQuota);
}
/*****************************************************************************/
/********************* Reset the size of a file browser **********************/
/*****************************************************************************/
void BrwSiz_ResetFileBrowserSize (struct BrwSiz_BrowserSize *Size)
{
Size->NumLevls = 0;
Size->NumFolds =
Size->NumFiles = 0L;
Size->TotalSiz = 0ULL;
}
/*****************************************************************************/
/********************** Compute the size of a directory **********************/
/*****************************************************************************/
void BrwSiz_CalcSizeOfDir (struct BrwSiz_BrowserSize *Size,char *Path)
{
BrwSiz_ResetFileBrowserSize (Size);
BrwSiz_CalcSizeOfDirRecursive (Size,1,Path);
}
/*****************************************************************************/
/**************** Compute the size of a directory recursively ****************/
/*****************************************************************************/
static void BrwSiz_CalcSizeOfDirRecursive (struct BrwSiz_BrowserSize *Size,
unsigned Level,char *Path)
{
struct dirent **FileList;
int NumFile;
int NumFiles;
char PathFileRel[PATH_MAX + 1];
struct stat FileStatus;
/***** Scan the directory *****/
if ((NumFiles = scandir (Path,&FileList,NULL,NULL)) >= 0) // No error
{
/***** Compute recursively the total number and size of the files and folders *****/
for (NumFile = 0;
NumFile < NumFiles;
NumFile++)
{
if (strcmp (FileList[NumFile]->d_name,".") &&
strcmp (FileList[NumFile]->d_name,"..")) // Skip directories "." and ".."
{
/* There are files in this directory ==> update level */
if (Level > Size->NumLevls)
Size->NumLevls++;
/* Update counters depending on whether it's a directory or a regular file */
snprintf (PathFileRel,sizeof (PathFileRel),"%s/%s",
Path,FileList[NumFile]->d_name);
if (lstat (PathFileRel,&FileStatus)) // On success ==> 0 is returned
Err_ShowErrorAndExit ("Can not get information about a file or folder.");
else if (S_ISDIR (FileStatus.st_mode)) // It's a directory
{
Size->NumFolds++;
Size->TotalSiz += (unsigned long long) FileStatus.st_size;
BrwSiz_CalcSizeOfDirRecursive (Size,Level + 1,PathFileRel);
}
else if (S_ISREG (FileStatus.st_mode)) // It's a regular file
{
Size->NumFiles++;
Size->TotalSiz += (unsigned long long) FileStatus.st_size;
}
}
free (FileList[NumFile]);
}
free (FileList);
}
else
Err_ShowErrorAndExit ("Error while scanning directory.");
}
/*****************************************************************************/
/**************** Get the size of a file zone from database ******************/
/*****************************************************************************/
void BrwSiz_GetSizeOfFileZone (Brw_FileBrowser_t FileBrowser,
struct BrwSiz_SizeOfFileZone *SizeOfFileZone)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
/***** Get the size of a file browser *****/
/* Query database */
Brw_DB_GetSizeOfFileBrowser (&mysql_res,FileBrowser);
/* Get row */
row = mysql_fetch_row (mysql_res);
/* Reset default values to zero */
SizeOfFileZone->NumCrss =
SizeOfFileZone->NumUsrs = 0;
SizeOfFileZone->MaxLevels = 0;
SizeOfFileZone->NumFolders =
SizeOfFileZone->NumFiles = 0;
SizeOfFileZone->Size = 0;
/* Get number of courses (row[0]) */
if (row[0])
if (sscanf (row[0],"%d",&(SizeOfFileZone->NumCrss)) != 1)
Err_ShowErrorAndExit ("Error when getting number of courses.");
/* Get number of groups (row[1]) */
if (row[1])
if (sscanf (row[1],"%d",&(SizeOfFileZone->NumGrps)) != 1)
Err_ShowErrorAndExit ("Error when getting number of groups.");
/* Get number of users (row[2]) */
if (row[2])
if (sscanf (row[2],"%d",&(SizeOfFileZone->NumUsrs)) != 1)
Err_ShowErrorAndExit ("Error when getting number of users.");
/* Get maximum number of levels (row[3]) */
if (row[3])
if (sscanf (row[3],"%u",&(SizeOfFileZone->MaxLevels)) != 1)
Err_ShowErrorAndExit ("Error when getting maximum number of levels.");
/* Get number of folders (row[4]) */
if (row[4])
if (sscanf (row[4],"%lu",&(SizeOfFileZone->NumFolders)) != 1)
Err_ShowErrorAndExit ("Error when getting number of folders.");
/* Get number of files (row[5]) */
if (row[5])
if (sscanf (row[5],"%lu",&(SizeOfFileZone->NumFiles)) != 1)
Err_ShowErrorAndExit ("Error when getting number of files.");
/* Get total size (row[6]) */
if (row[6])
if (sscanf (row[6],"%llu",&(SizeOfFileZone->Size)) != 1)
Err_ShowErrorAndExit ("Error when getting toal size.");
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
/************************* Show size of a file browser ***********************/
/*****************************************************************************/
void BrwSiz_ShowAndStoreSizeOfFileBrowser (const struct BrwSiz_BrowserSize *Size)
{
extern const char *Txt_level;
extern const char *Txt_levels;
extern const char *Txt_folder;
extern const char *Txt_folders;
extern const char *Txt_file;
extern const char *Txt_files;
extern const char *Txt_of_PART_OF_A_TOTAL;
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
HTM_DIV_Begin ("class=\"CM DAT_%s\"",The_GetSuffix ());
if (Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type))
{
Fil_WriteFileSizeFull ((double) Size->TotalSiz,FileSizeStr);
HTM_TxtF ("%u %s; %lu %s; %lu %s; %s",
Size->NumLevls,
Size->NumLevls == 1 ? Txt_level :
Txt_levels ,
Size->NumFolds,
Size->NumFolds == 1 ? Txt_folder :
Txt_folders,
Size->NumFiles,
Size->NumFiles == 1 ? Txt_file :
Txt_files,
FileSizeStr);
if (Size->MaxQuota)
{
Fil_WriteFileSizeBrief ((double) Size->MaxQuota,FileSizeStr);
HTM_TxtF (" (%.1f%% %s %s)",
100.0 * ((double) Size->TotalSiz /
(double) Size->MaxQuota),
Txt_of_PART_OF_A_TOTAL,
FileSizeStr);
}
Brw_DB_StoreSizeOfFileBrowser (Size);
}
else
HTM_NBSP (); // Blank to occupy the same space as the text for the browser size
HTM_DIV_End ();
}

77
swad_browser_size.h Normal file
View File

@ -0,0 +1,77 @@
// swad_browser_size.h: file browser size
#ifndef _SWAD_BRW_SIZ
#define _SWAD_BRW_SIZ
/*
SWAD (Shared Workspace At a Distance in Spanish),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2022 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_browser.h"
/*****************************************************************************/
/******************************* Public types ********************************/
/*****************************************************************************/
struct BrwSiz_SizeOfFileZone
{
int NumCrss; // -1 stands for not aplicable
int NumGrps; // -1 stands for not aplicable
int NumUsrs; // -1 stands for not aplicable
unsigned MaxLevels;
unsigned long NumFolders;
unsigned long NumFiles;
unsigned long long int Size; // Total size in bytes
};
struct BrwSiz_BrowserSize
{
unsigned long MaxFiles;
unsigned long MaxFolds;
unsigned long long int MaxQuota;
unsigned NumLevls;
unsigned long NumFolds;
unsigned long NumFiles;
unsigned long long int TotalSiz;
};
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
struct BrwSiz_BrowserSize *BrwSiz_GetSize (void);
void BrwSiz_SetAndCheckQuota (struct BrwSiz_BrowserSize *Size);
void BrwSiz_SetMaxQuota (struct BrwSiz_BrowserSize *Size);
bool BrwSiz_CheckIfQuotaExceded (const struct BrwSiz_BrowserSize *Size);
void BrwSiz_ResetFileBrowserSize (struct BrwSiz_BrowserSize *Size);
void BrwSiz_CalcSizeOfDir (struct BrwSiz_BrowserSize *Size,char *Path);
void BrwSiz_GetSizeOfFileZone (Brw_FileBrowser_t FileBrowser,
struct BrwSiz_SizeOfFileZone *SizeOfFileZone);
void BrwSiz_ShowAndStoreSizeOfFileBrowser (const struct BrwSiz_BrowserSize *Size);
#endif

View File

@ -615,6 +615,7 @@ Que al subir un fichero por defecto est
Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes... Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes...
Exportar listas en CSV. Exportar listas en CSV.
Version 22.59: Nov 06, 2022 New module swad_browser_size. (334067 lines)
Version 22.58: Nov 06, 2022 New module swad_action_list for list of actions. (333958 lines) Version 22.58: Nov 06, 2022 New module swad_action_list for list of actions. (333958 lines)
Version 22.57.1: Oct 29, 2022 Change in layout of heading title. (333789 lines) Version 22.57.1: Oct 29, 2022 Change in layout of heading title. (333789 lines)
Version 22.57: Oct 29, 2022 Code refactoring in search. (333762 lines) Version 22.57: Oct 29, 2022 Code refactoring in search. (333762 lines)

View File

@ -257,16 +257,6 @@ struct Globals
bool FullTree; // Show full tree? bool FullTree; // Show full tree?
bool ShowOnlyPublicFiles; // Show only public files? bool ShowOnlyPublicFiles; // Show only public files?
bool UploadingWithDropzone; bool UploadingWithDropzone;
struct
{
unsigned long MaxFiles;
unsigned long MaxFolds;
unsigned long long int MaxQuota;
unsigned NumLevls;
unsigned long NumFolds;
unsigned long NumFiles;
unsigned long long int TotalSiz;
} Size;
struct struct
{ {
char PathAboveRootFolder[PATH_MAX + 1]; char PathAboveRootFolder[PATH_MAX + 1];
@ -291,7 +281,7 @@ struct Globals
char L[2 + 1]; // Left directory: 2 first chars char L[2 + 1]; // Left directory: 2 first chars
char R[NAME_MAX + 1]; // Right directory: rest of chars char R[NAME_MAX + 1]; // Right directory: rest of chars
} TmpPubDir; } TmpPubDir;
bool HiddenLevels[1 + Brw_MAX_DIR_LEVELS]; bool HiddenLevels[1 + BrwSiz_MAX_DIR_LEVELS];
char TxtStyle[64]; char TxtStyle[64];
const char *InputStyle; const char *InputStyle;
struct Asg_Assignment Asg; // Data of assignment when browsing level 1 or an assignment zone. struct Asg_Assignment Asg; // Data of assignment when browsing level 1 or an assignment zone.

View File

@ -177,6 +177,8 @@ static void Prj_ShowFormToFilterByWarning (const struct Prj_Projects *Projects);
static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects); static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects);
static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects); static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects);
static bool Prj_CheckIfICanViewProjectFiles (long PrjCod);
static void Prj_PutCurrentParams (void *Projects); static void Prj_PutCurrentParams (void *Projects);
static void Prj_PutHiddenParamAssign (unsigned Assign); static void Prj_PutHiddenParamAssign (unsigned Assign);
static void Prj_PutHiddenParamHidden (unsigned Hidden); static void Prj_PutHiddenParamHidden (unsigned Hidden);
@ -841,6 +843,66 @@ static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects)
HTM_DIV_End (); HTM_DIV_End ();
} }
/*****************************************************************************/
/******************** Can I view files of a given project? *******************/
/*****************************************************************************/
static bool Prj_CheckIfICanViewProjectFiles (long PrjCod)
{
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
case Rol_NET:
return (Prj_GetMyRolesInProject (PrjCod) != 0); // Am I a member?
case Rol_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM:
return true;
default:
return false;
}
}
/*****************************************************************************/
/******** Check if I have permission to view project documents zone **********/
/*****************************************************************************/
bool Prj_CheckIfICanViewProjectDocuments (long PrjCod)
{
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
case Rol_NET:
return (Prj_GetMyRolesInProject (PrjCod) != 0); // Am I a member?
case Rol_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM:
return true;
default:
return false;
}
return false;
}
/*****************************************************************************/
/******** Check if I have permission to view project assessment zone *********/
/*****************************************************************************/
bool Prj_CheckIfICanViewProjectAssessment (long PrjCod)
{
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
case Rol_NET:
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor...
1 << Prj_ROLE_EVL)) != 0); // ...or evaluator
case Rol_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM:
return true;
default:
return false;
}
return false;
}
/*****************************************************************************/ /*****************************************************************************/
/********************** Put parameters used in projects **********************/ /********************** Put parameters used in projects **********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -213,6 +213,9 @@ void Prj_SeeProjects (void);
void Prj_ShowProjects (struct Prj_Projects *Projects); void Prj_ShowProjects (struct Prj_Projects *Projects);
void Prj_ShowTableSelectedPrjs (void); void Prj_ShowTableSelectedPrjs (void);
bool Prj_CheckIfICanViewProjectDocuments (long PrjCod);
bool Prj_CheckIfICanViewProjectAssessment (long PrjCod);
void Prj_PutParams (struct Prj_Filter *Filter, void Prj_PutParams (struct Prj_Filter *Filter,
Prj_Order_t Order, Prj_Order_t Order,
unsigned NumPage, unsigned NumPage,

View File

@ -41,6 +41,10 @@
/************** External global variables from others modules ****************/ /************** External global variables from others modules ****************/
/*****************************************************************************/ /*****************************************************************************/
/*****************************************************************************/
/************************** Public global variables **************************/
/*****************************************************************************/
/*****************************************************************************/ /*****************************************************************************/
/************************* Private global variables **************************/ /************************* Private global variables **************************/
/*****************************************************************************/ /*****************************************************************************/