diff --git a/swad_browser.c b/swad_browser.c index bd1cc6c4..9bb84dd9 100644 --- a/swad_browser.c +++ b/swad_browser.c @@ -1330,10 +1330,7 @@ static void Brw_WriteSmallLinkToDownloadFile (const char *URL, static bool Brw_GetParamPublicFile (void); static Brw_License_t Brw_GetParLicense (void); static void Brw_GetFileViewsFromLoggedUsrs (struct FileMetadata *FileMetadata); -static unsigned Brw_DB_GetFileViewsFromNonLoggedUsrs (long FilCod); static unsigned Brw_GetFileViewsFromMe (long FilCod); -static void Brw_UpdateFileViews (unsigned NumViews,long FilCod); -static bool Brw_GetIfFolderHasPublicFiles (const char Path[PATH_MAX + 1]); static void Brw_ChangeFileOrFolderHiddenInDB (const char Path[PATH_MAX + 1],bool IsHidden); @@ -4513,8 +4510,8 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId, /***** Is this row public or private? *****/ if (SeeDocsZone || AdminDocsZone || SharedZone) { - RowSetAsPublic = (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER) ? Brw_GetIfFolderHasPublicFiles (Gbl.FileBrowser.FilFolLnk.Full) : - FileMetadata.IsPublic; + RowSetAsPublic = (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER) ? Brw_DB_GetIfFolderHasPublicFiles (Gbl.FileBrowser.FilFolLnk.Full) : + FileMetadata.IsPublic; if (Gbl.FileBrowser.ShowOnlyPublicFiles && !RowSetAsPublic) return false; } @@ -8244,24 +8241,24 @@ void Brw_ShowFileMetadata (void) case Brw_ADMI_DOC_CRS: case Brw_ADMI_DOC_GRP: Ntf_DB_MarkNotifAsRemoved (Ntf_EVENT_DOCUMENT_FILE, - FileMetadata.FilCod); + FileMetadata.FilCod); break; case Brw_ADMI_TCH_CRS: case Brw_ADMI_TCH_GRP: Ntf_DB_MarkNotifAsRemoved (Ntf_EVENT_TEACHERS_FILE, - FileMetadata.FilCod); + FileMetadata.FilCod); break; case Brw_ADMI_SHR_CRS: case Brw_ADMI_SHR_GRP: Ntf_DB_MarkNotifAsRemoved (Ntf_EVENT_SHARED_FILE, - FileMetadata.FilCod); + FileMetadata.FilCod); break; case Brw_SHOW_MRK_CRS: case Brw_SHOW_MRK_GRP: case Brw_ADMI_MRK_CRS: case Brw_ADMI_MRK_GRP: Ntf_DB_MarkNotifAsRemoved (Ntf_EVENT_MARKS_FILE, - FileMetadata.FilCod); + FileMetadata.FilCod); break; default: break; @@ -8784,34 +8781,6 @@ static Brw_License_t Brw_GetParLicense (void) (unsigned long) Brw_LICENSE_UNKNOWN); } -/*****************************************************************************/ -/*********************** Get file code using its path ************************/ -/*****************************************************************************/ -// Path is the full path in tree -// Example: descarga/folder/file.pdf - -long Brw_GetFilCodByPath (const char *Path,bool OnlyIfPublic) - { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - - /***** Get code of a file from database *****/ - return DB_QuerySELECTCode ("can not get file code", - "SELECT FilCod" - " FROM brw_files" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND Path='%s'" - "%s", - (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], - Cod, - ZoneUsrCod, - Path, - OnlyIfPublic ? " AND Public='Y'" : - ""); - } - /*****************************************************************************/ /********************* Get file metadata using its path **********************/ /*****************************************************************************/ @@ -8820,32 +8789,12 @@ long Brw_GetFilCodByPath (const char *Path,bool OnlyIfPublic) void Brw_GetFileMetadataByPath (struct FileMetadata *FileMetadata) { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned UnsignedNum; /***** Get metadata of a file from database *****/ - if (DB_QuerySELECT (&mysql_res,"can not get file metadata", - "SELECT FilCod," // row[0] - "FileBrowser," // row[1] - "Cod," // row[2] - "ZoneUsrCod," // row[3] - "PublisherUsrCod," // row[4] - "FileType," // row[5] - "Path," // row[6] - "Hidden," // row[7] - "Public," // row[8] - "License" // row[9] - " FROM brw_files" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND Path='%s'", - (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], - Cod,ZoneUsrCod, - Gbl.FileBrowser.FilFolLnk.Full)) + if (Brw_DB_GetFileMetadataByPath (&mysql_res,Gbl.FileBrowser.FilFolLnk.Full)) { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -8969,20 +8918,7 @@ void Brw_GetFileMetadataByCod (struct FileMetadata *FileMetadata) unsigned UnsignedNum; /***** Get metadata of a file from database *****/ - if (DB_QuerySELECT (&mysql_res,"can not get file metadata", - "SELECT FilCod," // row[0] - "FileBrowser," // row[1] - "Cod," // row[2] - "ZoneUsrCod," // row[3] - "PublisherUsrCod," // row[4] - "FileType," // row[5] - "Path," // row[6] - "Hidden," // row[7] - "Public," // row[8] - "License" // row[9] - " FROM brw_files" - " WHERE FilCod=%ld", - FileMetadata->FilCod)) + if (Brw_DB_GetFileMetadataByCod (&mysql_res,FileMetadata->FilCod)) { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -9160,7 +9096,7 @@ void Brw_GetAndUpdateFileViews (struct FileMetadata *FileMetadata) FileMetadata->NumMyViews = FileMetadata->NumPublicViews; /***** Update number of my views *****/ - Brw_UpdateFileViews (FileMetadata->NumMyViews,FileMetadata->FilCod); + Brw_DB_UpdateFileViews (FileMetadata->NumMyViews,FileMetadata->FilCod); /***** Increment number of file views in my user's figures *****/ if (Gbl.Usrs.Me.Logged) @@ -9180,21 +9116,7 @@ void Brw_GetAndUpdateFileViews (struct FileMetadata *FileMetadata) void Brw_UpdateMyFileViews (long FilCod) { /***** Update number of my views *****/ - Brw_UpdateFileViews (Brw_GetFileViewsFromMe (FilCod),FilCod); - } - -/*****************************************************************************/ -/******************** Get number of file views from a user *******************/ -/*****************************************************************************/ - -unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod) - { - /***** Get number of filw views *****/ - return DB_QuerySELECTUnsigned ("can not get number of file views", - "SELECT SUM(NumViews)" - " FROM brw_views" - " WHERE UsrCod=%ld", - UsrCod); + Brw_DB_UpdateFileViews (Brw_GetFileViewsFromMe (FilCod),FilCod); } /*****************************************************************************/ @@ -9211,14 +9133,7 @@ static void Brw_GetFileViewsFromLoggedUsrs (struct FileMetadata *FileMetadata) MYSQL_ROW row; /***** Get number total of views from logged users *****/ - if (DB_QuerySELECT (&mysql_res,"can not get number of views of a file" - " from logged users", - "SELECT COUNT(DISTINCT UsrCod)," // row[0] - "SUM(NumViews)" // row[1] - " FROM brw_views" - " WHERE FilCod=%ld" - " AND UsrCod>0", - FileMetadata->FilCod)) + if (Brw_DB_GetFileViewsFromLoggedUsrs (&mysql_res,FileMetadata->FilCod)) { row = mysql_fetch_row (mysql_res); @@ -9242,21 +9157,6 @@ static void Brw_GetFileViewsFromLoggedUsrs (struct FileMetadata *FileMetadata) DB_FreeMySQLResult (&mysql_res); } -/*****************************************************************************/ -/******************** Get number of public views of a file *******************/ -/*****************************************************************************/ - -static unsigned Brw_DB_GetFileViewsFromNonLoggedUsrs (long FilCod) - { - return - DB_QuerySELECTUnsigned ("can not get number of public views of a file", - "SELECT SUM(NumViews)" - " FROM brw_views" - " WHERE FilCod=%ld" - " AND UsrCod<=0", - FilCod); - } - /*****************************************************************************/ /************************** Get file views from me ***************************/ /*****************************************************************************/ @@ -9268,12 +9168,7 @@ static unsigned Brw_GetFileViewsFromMe (long FilCod) unsigned NumMyViews; /***** Get number of my views *****/ - if (DB_QuerySELECT (&mysql_res,"can not get your number of views of a file", - "SELECT NumViews" // row[0] - " FROM brw_views" - " WHERE FilCod=%ld" - " AND UsrCod=%ld", - FilCod,Gbl.Usrs.Me.UsrDat.UsrCod)) + if (Brw_DB_GetFileViewsFromMe (&mysql_res,FilCod)) { /* Get number of my views */ row = mysql_fetch_row (mysql_res); @@ -9289,91 +9184,6 @@ static unsigned Brw_GetFileViewsFromMe (long FilCod) return NumMyViews; } -/*****************************************************************************/ -/*************************** Update file views *******************************/ -/*****************************************************************************/ - -static void Brw_UpdateFileViews (unsigned NumViews,long FilCod) - { - if (NumViews) - /* Update number of views in database */ - DB_QueryUPDATE ("can not update number of views of a file", - "UPDATE brw_views" - " SET NumViews=NumViews+1" - " WHERE FilCod=%ld" - " AND UsrCod=%ld", - FilCod,Gbl.Usrs.Me.UsrDat.UsrCod); - else // NumViews == 0 - /* Insert number of views in database */ - DB_QueryINSERT ("can not insert number of views of a file", - "INSERT INTO brw_views" - " (FilCod,UsrCod,NumViews)" - " VALUES" - " (%ld,%ld,1)", - FilCod, - Gbl.Usrs.Me.UsrDat.UsrCod); - } - -/*****************************************************************************/ -/*********** Check if a folder contains file(s) marked as public *************/ -/*****************************************************************************/ - -static bool Brw_GetIfFolderHasPublicFiles (const char Path[PATH_MAX + 1]) - { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - - /***** Get if a file or folder is public from database *****/ - return (DB_QueryCOUNT ("can not check if a folder contains public files", - "SELECT COUNT(*)" - " FROM brw_files" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND Path LIKE '%s/%%'" - " AND Public='Y'", - (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], - Cod,ZoneUsrCod, - Path) != 0); - } - -/*****************************************************************************/ -/*********************** Get number of files from a user *********************/ -/*****************************************************************************/ - -unsigned Brw_DB_GetNumFilesUsr (long UsrCod) - { - /***** Get current number of files published by a user from database *****/ - return (unsigned) - DB_QueryCOUNT ("can not get number of files from a user", - "SELECT COUNT(*)" - " FROM brw_files" - " WHERE PublisherUsrCod=%ld" - " AND FileType IN (%u,%u)", - UsrCod, - (unsigned) Brw_IS_FILE, - (unsigned) Brw_IS_UNKNOWN); // Unknown entries are counted as files - } - -/*****************************************************************************/ -/******************* Get number of public files from a user ******************/ -/*****************************************************************************/ - -unsigned Brw_DB_GetNumPublicFilesUsr (long UsrCod) - { - /***** Get current number of public files published by a user from database *****/ - return (unsigned) - DB_QueryCOUNT ("can not get number of public files from a user", - "SELECT COUNT(*)" - " FROM brw_files" - " WHERE PublisherUsrCod=%ld" - " AND FileType IN (%u,%u)" - " AND Public='Y'", - UsrCod, - (unsigned) Brw_IS_FILE, - (unsigned) Brw_IS_UNKNOWN); // Unknown entries are counted as files - } - /*****************************************************************************/ /***************** Change hiddeness of file in the database ******************/ /*****************************************************************************/ diff --git a/swad_browser.h b/swad_browser.h index 5a216750..17cf2911 100644 --- a/swad_browser.h +++ b/swad_browser.h @@ -211,15 +211,11 @@ void Brw_ShowFileMetadata (void); void Brw_DownloadFile (void); void Brw_GetLinkToDownloadFile (const char *PathInTree,const char *FileName,char *URL); void Brw_ChgFileMetadata (void); -long Brw_GetFilCodByPath (const char *Path,bool OnlyIfPublic); void Brw_GetFileMetadataByPath (struct FileMetadata *FileMetadata); void Brw_GetFileMetadataByCod (struct FileMetadata *FileMetadata); bool Brw_GetFileTypeSizeAndDate (struct FileMetadata *FileMetadata); void Brw_GetAndUpdateFileViews (struct FileMetadata *FileMetadata); void Brw_UpdateMyFileViews (long FilCod); -unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod); -unsigned Brw_DB_GetNumFilesUsr (long UsrCod); -unsigned Brw_DB_GetNumPublicFilesUsr (long UsrCod); long Brw_GetZoneUsrCodForFileBrowser (void); void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod, diff --git a/swad_browser_database.c b/swad_browser_database.c index 18e262e2..b52c7ef8 100644 --- a/swad_browser_database.c +++ b/swad_browser_database.c @@ -166,36 +166,109 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders[Brw_NUM_TYP /*****************************************************************************/ /*****************************************************************************/ -/*********************** Get folders of assignments **************************/ +/*********************** Get file code using its path ************************/ /*****************************************************************************/ -// Get folder of an assignment when: -// 1. The assignment is visible (not hidden) -// 2. ...and the folder name is not empty (the teacher has set that the user must send work(s) for that assignment) -// 3. ...the assignment is not restricted to groups or (if restricted to groups), the owner of zone belong to any of the groups +// Path is the full path in tree +// Example: descarga/folder/file.pdf -unsigned Brw_DB_GetFoldersAssignments (MYSQL_RES **mysql_res,long ZoneUsrCod) +long Brw_DB_GetFilCodByPath (const char *Path,bool OnlyIfPublic) + { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFileBrowser (); + long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); + + return DB_QuerySELECTCode ("can not get file code", + "SELECT FilCod" + " FROM brw_files" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND Path='%s'" + "%s", + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, + ZoneUsrCod, + Path, + OnlyIfPublic ? " AND Public='Y'" : + ""); + } + +/*****************************************************************************/ +/********************* Get file metadata using its path **********************/ +/*****************************************************************************/ +// This function only gets metadata stored in table files, +// does not get size, time, numviews... + +unsigned Brw_DB_GetFileMetadataByPath (MYSQL_RES **mysql_res,const char *Path) + { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFileBrowser (); + long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); + + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get file metadata", + "SELECT FilCod," // row[0] + "FileBrowser," // row[1] + "Cod," // row[2] + "ZoneUsrCod," // row[3] + "PublisherUsrCod," // row[4] + "FileType," // row[5] + "Path," // row[6] + "Hidden," // row[7] + "Public," // row[8] + "License" // row[9] + " FROM brw_files" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND Path='%s'", + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, + ZoneUsrCod, + Path); + } + +/*****************************************************************************/ +/********************* Get file metadata using its code **********************/ +/*****************************************************************************/ +// FileMetadata.FilCod must be filled +// This function only gets metadata stored in table files, +// does not get size, time, numviews... + +unsigned Brw_DB_GetFileMetadataByCod (MYSQL_RES **mysql_res,long FilCod) { return (unsigned) - DB_QuerySELECT (mysql_res,"can not get folders of assignments", - "SELECT Folder" // row[0] - " FROM asg_assignments" - " WHERE CrsCod=%ld" - " AND Hidden='N'" - " AND Folder<>''" - " AND (" - "AsgCod NOT IN" - " (SELECT AsgCod" - " FROM asg_groups)" - " OR " - "AsgCod IN" - " (SELECT asg_groups.AsgCod" - " FROM grp_users," - "asg_groups" - " WHERE grp_users.UsrCod=%ld" - " AND asg_groups.GrpCod=grp_users.GrpCod)" - ")", - Gbl.Hierarchy.Crs.CrsCod, - ZoneUsrCod); + DB_QuerySELECT (mysql_res,"can not get file metadata", + "SELECT FilCod," // row[0] + "FileBrowser," // row[1] + "Cod," // row[2] + "ZoneUsrCod," // row[3] + "PublisherUsrCod," // row[4] + "FileType," // row[5] + "Path," // row[6] + "Hidden," // row[7] + "Public," // row[8] + "License" // row[9] + " FROM brw_files" + " WHERE FilCod=%ld", + FilCod); + } + +/*****************************************************************************/ +/************ Get current number of files published by a user ****************/ +/*****************************************************************************/ + +unsigned Brw_DB_GetNumFilesUsr (long UsrCod) + { + return (unsigned) + DB_QueryCOUNT ("can not get number of files from a user", + "SELECT COUNT(*)" + " FROM brw_files" + " WHERE PublisherUsrCod=%ld" + " AND FileType IN (%u,%u)", + UsrCod, + (unsigned) Brw_IS_FILE, + (unsigned) Brw_IS_UNKNOWN); // Unknown entries are counted as files } /*****************************************************************************/ @@ -1015,6 +1088,195 @@ void Brw_DB_RemoveUsrFiles (long UsrCod) UsrCod); } +/*****************************************************************************/ +/*********** Check if a folder contains file(s) marked as public *************/ +/*****************************************************************************/ + +bool Brw_DB_GetIfFolderHasPublicFiles (const char Path[PATH_MAX + 1]) + { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFileBrowser (); + long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); + + /***** Get if a file or folder is public from database *****/ + return (DB_QueryCOUNT ("can not check if a folder contains public files", + "SELECT COUNT(*)" + " FROM brw_files" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND Path LIKE '%s/%%'" + " AND Public='Y'", + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, + ZoneUsrCod, + Path) != 0); + } + +/*****************************************************************************/ +/********** Get current number of public files published by a user ***********/ +/*****************************************************************************/ + +unsigned Brw_DB_GetNumPublicFilesUsr (long UsrCod) + { + return (unsigned) + DB_QueryCOUNT ("can not get number of public files from a user", + "SELECT COUNT(*)" + " FROM brw_files" + " WHERE PublisherUsrCod=%ld" + " AND FileType IN (%u,%u)" + " AND Public='Y'", + UsrCod, + (unsigned) Brw_IS_FILE, + (unsigned) Brw_IS_UNKNOWN); // Unknown entries are counted as files + } + +/*****************************************************************************/ +/***************** Get number of OERs depending on license *******************/ +/*****************************************************************************/ + +unsigned Brw_DB_GetNumberOfPublicFiles (MYSQL_RES **mysql_res,Brw_License_t License) + { + switch (Gbl.Scope.Current) + { + case HieLvl_SYS: + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of OERs", + "SELECT Public," // row[0] + "COUNT(*)" // row[1] + " FROM brw_files" + " WHERE License=%u" + " GROUP BY Public", + (unsigned) License); + case HieLvl_CTY: + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of OERs", + "SELECT brw_files.Public," // row[0] + "COUNT(*)" // row[1] + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "brw_files" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=brw_files.Cod" + " AND brw_files.FileBrowser IN (%u,%u)" + " AND brw_files.License=%u" + " GROUP BY brw_files.Public", + Gbl.Hierarchy.Cty.CtyCod, + (unsigned) Brw_ADMI_DOC_CRS, + (unsigned) Brw_ADMI_SHR_CRS, + (unsigned) License); + case HieLvl_INS: + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of OERs", + "SELECT brw_files.Public," // row[0] + "COUNT(*)" // row[1] + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "brw_files" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=brw_files.Cod" + " AND brw_files.FileBrowser IN (%u,%u)" + " AND brw_files.License=%u" + " GROUP BY brw_files.Public", + Gbl.Hierarchy.Ins.InsCod, + (unsigned) Brw_ADMI_DOC_CRS, + (unsigned) Brw_ADMI_SHR_CRS, + (unsigned) License); + case HieLvl_CTR: + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of OERs", + "SELECT brw_files.Public," // row[0] + "COUNT(*)" // row[1] + " FROM deg_degrees," + "crs_courses," + "brw_files" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=brw_files.Cod" + " AND brw_files.FileBrowser IN (%u,%u)" + " AND brw_files.License=%u" + " GROUP BY brw_files.Public", + Gbl.Hierarchy.Ctr.CtrCod, + (unsigned) Brw_ADMI_DOC_CRS, + (unsigned) Brw_ADMI_SHR_CRS, + (unsigned) License); + case HieLvl_DEG: + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of OERs", + "SELECT brw_files.Public," // row[0] + "COUNT(*)" // row[1] + " FROM crs_courses," + "brw_files" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=brw_files.Cod" + " AND brw_files.FileBrowser IN (%u,%u)" + " AND brw_files.License=%u" + " GROUP BY brw_files.Public", + Gbl.Hierarchy.Deg.DegCod, + (unsigned) Brw_ADMI_DOC_CRS, + (unsigned) Brw_ADMI_SHR_CRS, + (unsigned) License); + case HieLvl_CRS: + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of OERs", + "SELECT Public," // row[0] + "COUNT(*)" // row[1] + " FROM brw_files" + " WHERE Cod=%ld" + " AND FileBrowser IN (%u,%u)" + " AND License=%u" + " GROUP BY Public", + Gbl.Hierarchy.Crs.CrsCod, + (unsigned) Brw_ADMI_DOC_CRS, + (unsigned) Brw_ADMI_SHR_CRS, + (unsigned) License); + default: + Err_WrongScopeExit (); + return 0; // Not reached + } + } + +/*****************************************************************************/ +/*********************** Get folders of assignments **************************/ +/*****************************************************************************/ +// Get folder of an assignment when: +// 1. The assignment is visible (not hidden) +// 2. ...and the folder name is not empty (the teacher has set that the user must send work(s) for that assignment) +// 3. ...the assignment is not restricted to groups or (if restricted to groups), the owner of zone belong to any of the groups + +unsigned Brw_DB_GetFoldersAssignments (MYSQL_RES **mysql_res,long ZoneUsrCod) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get folders of assignments", + "SELECT Folder" // row[0] + " FROM asg_assignments" + " WHERE CrsCod=%ld" + " AND Hidden='N'" + " AND Folder<>''" + " AND (" + "AsgCod NOT IN" + " (SELECT AsgCod" + " FROM asg_groups)" + " OR " + "AsgCod IN" + " (SELECT asg_groups.AsgCod" + " FROM grp_users," + "asg_groups" + " WHERE grp_users.UsrCod=%ld" + " AND asg_groups.GrpCod=grp_users.GrpCod)" + ")", + Gbl.Hierarchy.Crs.CrsCod, + ZoneUsrCod); + } + /*****************************************************************************/ /************ Update the date of my last access to file browser **************/ /*****************************************************************************/ @@ -1072,6 +1334,94 @@ unsigned Brw_DB_GetGrpLastAccFileBrowser (MYSQL_RES **mysql_res,const char *Fiel Gbl.Hierarchy.Crs.CrsCod); } +/*****************************************************************************/ +/*************************** Update file views *******************************/ +/*****************************************************************************/ + +void Brw_DB_UpdateFileViews (unsigned NumViews,long FilCod) + { + if (NumViews) + /* Update number of views in database */ + DB_QueryUPDATE ("can not update number of views of a file", + "UPDATE brw_views" + " SET NumViews=NumViews+1" + " WHERE FilCod=%ld" + " AND UsrCod=%ld", + FilCod, + Gbl.Usrs.Me.UsrDat.UsrCod); + else // NumViews == 0 + /* Insert number of views in database */ + DB_QueryINSERT ("can not insert number of views of a file", + "INSERT INTO brw_views" + " (FilCod,UsrCod,NumViews)" + " VALUES" + " (%ld,%ld,1)", + FilCod, + Gbl.Usrs.Me.UsrDat.UsrCod); + } + +/*****************************************************************************/ +/************************** Get file views from me ***************************/ +/*****************************************************************************/ + +unsigned Brw_DB_GetFileViewsFromMe (MYSQL_RES **mysql_res,long FilCod) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get your number of views of a file", + "SELECT NumViews" // row[0] + " FROM brw_views" + " WHERE FilCod=%ld" + " AND UsrCod=%ld", + FilCod, + Gbl.Usrs.Me.UsrDat.UsrCod); + } + +/*****************************************************************************/ +/******************** Get file views from logged users ***********************/ +/*****************************************************************************/ + +unsigned Brw_DB_GetFileViewsFromLoggedUsrs (MYSQL_RES **mysql_res,long FilCod) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get number of views of a file" + " from logged users", + "SELECT COUNT(DISTINCT UsrCod)," // row[0] + "SUM(NumViews)" // row[1] + " FROM brw_views" + " WHERE FilCod=%ld" + " AND UsrCod>0", + FilCod); + } + +/*****************************************************************************/ +/******************** Get number of public views of a file *******************/ +/*****************************************************************************/ + +unsigned Brw_DB_GetFileViewsFromNonLoggedUsrs (long FilCod) + { + return + DB_QuerySELECTUnsigned ("can not get number of public views of a file", + "SELECT SUM(NumViews)" + " FROM brw_views" + " WHERE FilCod=%ld" + " AND UsrCod<=0", + FilCod); + } + +/*****************************************************************************/ +/******************** Get number of file views from a user *******************/ +/*****************************************************************************/ + +unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod) + { + return + DB_QuerySELECTUnsigned ("can not get number of file views", + "SELECT SUM(NumViews)" + " FROM brw_views" + " WHERE UsrCod=%ld", + UsrCod); + } + /*****************************************************************************/ /************** Check if a file / folder from is set as hidden ***************/ /*****************************************************************************/ @@ -2540,116 +2890,3 @@ void Brw_DB_GetSizeOfFileBrowser (MYSQL_RES **mysql_res, break; } } - -/*****************************************************************************/ -/***************** Get number of OERs depending on license *******************/ -/*****************************************************************************/ - -unsigned Brw_DB_GetNumberOfOERs (MYSQL_RES **mysql_res,Brw_License_t License) - { - switch (Gbl.Scope.Current) - { - case HieLvl_SYS: - return (unsigned) - DB_QuerySELECT (mysql_res,"can not get number of OERs", - "SELECT Public," // row[0] - "COUNT(*)" // row[1] - " FROM brw_files" - " WHERE License=%u" - " GROUP BY Public", - (unsigned) License); - case HieLvl_CTY: - return (unsigned) - DB_QuerySELECT (mysql_res,"can not get number of OERs", - "SELECT brw_files.Public," // row[0] - "COUNT(*)" // row[1] - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "brw_files" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=brw_files.Cod" - " AND brw_files.FileBrowser IN (%u,%u)" - " AND brw_files.License=%u" - " GROUP BY brw_files.Public", - Gbl.Hierarchy.Cty.CtyCod, - (unsigned) Brw_ADMI_DOC_CRS, - (unsigned) Brw_ADMI_SHR_CRS, - (unsigned) License); - case HieLvl_INS: - return (unsigned) - DB_QuerySELECT (mysql_res,"can not get number of OERs", - "SELECT brw_files.Public," // row[0] - "COUNT(*)" // row[1] - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "brw_files" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=brw_files.Cod" - " AND brw_files.FileBrowser IN (%u,%u)" - " AND brw_files.License=%u" - " GROUP BY brw_files.Public", - Gbl.Hierarchy.Ins.InsCod, - (unsigned) Brw_ADMI_DOC_CRS, - (unsigned) Brw_ADMI_SHR_CRS, - (unsigned) License); - case HieLvl_CTR: - return (unsigned) - DB_QuerySELECT (mysql_res,"can not get number of OERs", - "SELECT brw_files.Public," // row[0] - "COUNT(*)" // row[1] - " FROM deg_degrees," - "crs_courses," - "brw_files" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=brw_files.Cod" - " AND brw_files.FileBrowser IN (%u,%u)" - " AND brw_files.License=%u" - " GROUP BY brw_files.Public", - Gbl.Hierarchy.Ctr.CtrCod, - (unsigned) Brw_ADMI_DOC_CRS, - (unsigned) Brw_ADMI_SHR_CRS, - (unsigned) License); - case HieLvl_DEG: - return (unsigned) - DB_QuerySELECT (mysql_res,"can not get number of OERs", - "SELECT brw_files.Public," // row[0] - "COUNT(*)" // row[1] - " FROM crs_courses," - "brw_files" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=brw_files.Cod" - " AND brw_files.FileBrowser IN (%u,%u)" - " AND brw_files.License=%u" - " GROUP BY brw_files.Public", - Gbl.Hierarchy.Deg.DegCod, - (unsigned) Brw_ADMI_DOC_CRS, - (unsigned) Brw_ADMI_SHR_CRS, - (unsigned) License); - case HieLvl_CRS: - return (unsigned) - DB_QuerySELECT (mysql_res,"can not get number of OERs", - "SELECT Public," // row[0] - "COUNT(*)" // row[1] - " FROM brw_files" - " WHERE Cod=%ld" - " AND FileBrowser IN (%u,%u)" - " AND License=%u" - " GROUP BY Public", - Gbl.Hierarchy.Crs.CrsCod, - (unsigned) Brw_ADMI_DOC_CRS, - (unsigned) Brw_ADMI_SHR_CRS, - (unsigned) License); - default: - Err_WrongScopeExit (); - return 0; // Not reached - } - } diff --git a/swad_browser_database.h b/swad_browser_database.h index 71f02fa4..b0ea10ab 100644 --- a/swad_browser_database.h +++ b/swad_browser_database.h @@ -47,10 +47,11 @@ /***************************** Public prototypes *****************************/ /*****************************************************************************/ -//------------------------------- Assignments --------------------------------- -unsigned Brw_DB_GetFoldersAssignments (MYSQL_RES **mysql_res,long ZoneUsrCod); - //---------------------------------- Files ------------------------------------ +long Brw_DB_GetFilCodByPath (const char *Path,bool OnlyIfPublic); +unsigned Brw_DB_GetFileMetadataByPath (MYSQL_RES **mysql_res,const char *Path); +unsigned Brw_DB_GetFileMetadataByCod (MYSQL_RES **mysql_res,long FilCod); +unsigned Brw_DB_GetNumFilesUsr (long UsrCod); void Brw_DB_RemoveInsFiles (long InsCod); void Brw_DB_RemoveCtrFiles (long CtrCod); void Brw_DB_RemoveDegFiles (long DegCod); @@ -61,11 +62,26 @@ void Brw_DB_RemoveSomeInfoAboutCrsUsrFiles (long UsrCod,long CrsCod); void Brw_DB_RemoveWrkFiles (long CrsCod,long UsrCod); void Brw_DB_RemoveUsrFiles (long UsrCod); +//------------------------------ Public files --------------------------------- +bool Brw_DB_GetIfFolderHasPublicFiles (const char Path[PATH_MAX + 1]); +unsigned Brw_DB_GetNumPublicFilesUsr (long UsrCod); +unsigned Brw_DB_GetNumberOfPublicFiles (MYSQL_RES **mysql_res,Brw_License_t License); + +//------------------------------- Assignments --------------------------------- +unsigned Brw_DB_GetFoldersAssignments (MYSQL_RES **mysql_res,long ZoneUsrCod); + //--------------------- My last access to file browsers ----------------------- void Brw_DB_UpdateDateMyLastAccFileBrowser (void); unsigned Brw_DB_GetDateMyLastAccFileBrowser (MYSQL_RES **mysql_res); unsigned Brw_DB_GetGrpLastAccFileBrowser (MYSQL_RES **mysql_res,const char *FieldNameDB); +//-------------------------------- File views --------------------------------- +void Brw_DB_UpdateFileViews (unsigned NumViews,long FilCod); +unsigned Brw_DB_GetFileViewsFromMe (MYSQL_RES **mysql_res,long FilCod); +unsigned Brw_DB_GetFileViewsFromLoggedUsrs (MYSQL_RES **mysql_res,long FilCod); +unsigned Brw_DB_GetFileViewsFromNonLoggedUsrs (long FilCod); +unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod); + //------------------------------- Hidden files -------------------------------- unsigned Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingPath (MYSQL_RES **mysql_res, const char *Path); @@ -94,7 +110,4 @@ void Brw_DB_StoreSizeOfFileZone (void); void Brw_DB_GetSizeOfFileBrowser (MYSQL_RES **mysql_res, Brw_FileBrowser_t FileBrowser); -//-------------------- OERs (Open Educational Resources) ---------------------- -unsigned Brw_DB_GetNumberOfOERs (MYSQL_RES **mysql_res,Brw_License_t License); - #endif diff --git a/swad_changelog.h b/swad_changelog.h index 9761f275..2efea133 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. */ -#define Log_PLATFORM_VERSION "SWAD 21.2.1 (2021-09-14)" +#define Log_PLATFORM_VERSION "SWAD 21.2.2 (2021-09-14)" #define CSS_FILE "swad20.45.css" #define JS_FILE "swad20.69.1.js" /* TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams + Version 21.2.2: Sep 14, 2021 Queries moved to module swad_browser_database. (315051 lines) Version 21.2.1: Sep 14, 2021 Queries moved to module swad_browser_database. (315003 lines) Version 21.2: Sep 14, 2021 Code refactoring related to file browsers. (314983 lines) Version 21.1.1: Sep 14, 2021 Queries moved to module swad_enrolment_database. (315050 lines) diff --git a/swad_figure.c b/swad_figure.c index 411967bb..0c627ca5 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -1767,7 +1767,7 @@ static void Fig_GetNumberOfOERs (Brw_License_t License, /***** Get the size of a file browser *****/ /* Query database */ - NumRows = Brw_DB_GetNumberOfOERs (&mysql_res,License); + NumRows = Brw_DB_GetNumberOfPublicFiles (&mysql_res,License); /* Reset values to zero */ NumFiles[0] = NumFiles[1] = 0L; diff --git a/swad_notification.c b/swad_notification.c index d407a18f..d3ea8572 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -1064,7 +1064,7 @@ void Ntf_MarkNotifOneFileAsRemoved (const char *Path) case Brw_ADMI_MRK_CRS: case Brw_ADMI_MRK_GRP: /***** Get file code *****/ - FilCod = Brw_GetFilCodByPath (Path,false); // Any file, public or not + FilCod = Brw_DB_GetFilCodByPath (Path,false); // Any file, public or not if (FilCod > 0) { /***** Set notification as removed *****/ diff --git a/swad_profile.c b/swad_profile.c index dac00290..2e3a1e0b 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -32,6 +32,7 @@ #include // For string functions #include "swad_box.h" +#include "swad_browser_database.h" #include "swad_config.h" #include "swad_database.h" #include "swad_error.h" diff --git a/swad_timeline_note.c b/swad_timeline_note.c index deff35ed..8e96cd6f 100644 --- a/swad_timeline_note.c +++ b/swad_timeline_note.c @@ -953,7 +953,7 @@ void Tml_Not_MarkNoteOneFileAsUnavailable (const char *Path) case Brw_ADMI_DOC_CRS: case Brw_ADMI_SHR_CRS: /***** Get file code *****/ - FilCod = Brw_GetFilCodByPath (Path,true); // Only if file is public + FilCod = Brw_DB_GetFilCodByPath (Path,true); // Only if file is public if (FilCod > 0) { /***** Mark possible note as unavailable *****/ diff --git a/swad_zip.c b/swad_zip.c index bd7d7ba6..0b0f759b 100644 --- a/swad_zip.c +++ b/swad_zip.c @@ -514,7 +514,7 @@ static unsigned long long ZIP_CloneDir (const char *Path,const char *PathClone,c Err_ShowErrorAndExit ("Can not create temporary link for compression."); /***** Update number of my views of this file *****/ - Brw_UpdateMyFileViews (Brw_GetFilCodByPath (PathFileInTree,false)); // Any file, public or not + Brw_UpdateMyFileViews (Brw_DB_GetFilCodByPath (PathFileInTree,false)); // Any file, public or not } } }