From 732e527430ddd748aebd4e8f7564109d6d79b817 Mon Sep 17 00:00:00 2001 From: acanas Date: Wed, 15 Sep 2021 01:54:56 +0200 Subject: [PATCH] Version 21.3: Sep 15, 2021 New module swad_notification_database for database queries related to notifications. --- Makefile | 6 +- swad_API.c | 3 +- swad_browser.c | 201 ++++------------------------------- swad_browser.h | 4 - swad_browser_database.c | 199 ++++++++++++++++++++++++++++++++++ swad_browser_database.h | 7 ++ swad_changelog.h | 3 +- swad_notification.c | 21 +--- swad_notification.h | 2 + swad_notification_database.c | 102 ++++++++++++++++++ swad_notification_database.h | 51 +++++++++ swad_report.c | 1 + swad_timeline_note.c | 5 +- swad_zip.c | 1 + 14 files changed, 397 insertions(+), 209 deletions(-) create mode 100644 swad_notification_database.c create mode 100644 swad_notification_database.h diff --git a/Makefile b/Makefile index f18394ef..973bd230 100644 --- a/Makefile +++ b/Makefile @@ -61,9 +61,9 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \ swad_media.o swad_media_database.o swad_menu.o swad_message.o \ swad_MFU.o \ swad_network.o swad_nickname.o swad_notice.o swad_notification.o \ - swad_pagination.o swad_parameter.o swad_password.o swad_photo.o \ - swad_place.o swad_plugin.o swad_privacy.o swad_profile.o \ - swad_program.o swad_project.o \ + swad_notification_database.o swad_pagination.o swad_parameter.o \ + swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_privacy.o \ + swad_profile.o swad_program.o swad_project.o \ swad_QR.o \ swad_record.o swad_report.o swad_role.o swad_room.o swad_RSS.o \ swad_scope.o swad_search.o swad_session.o swad_setting.o \ diff --git a/swad_API.c b/swad_API.c index faf99e09..d6b9bb03 100644 --- a/swad_API.c +++ b/swad_API.c @@ -105,6 +105,7 @@ cp -f /home/acanas/swad/swad/swad /var/www/cgi-bin/ #include "swad_API.h" #include "swad_attendance_database.h" #include "swad_browser.h" +#include "swad_browser_database.h" #include "swad_database.h" #include "swad_error.h" #include "swad_forum.h" @@ -5623,7 +5624,7 @@ static bool API_WriteRowFileBrowser (unsigned Level,Brw_FileType_t FileType,cons if (FileMetadata.FilCod <= 0) // No entry for this file in database table of files /* Add entry to the table of files/folders */ - FileMetadata.FilCod = Brw_AddPathToDB (-1L,FileMetadata.FilFolLnk.Type, + FileMetadata.FilCod = Brw_DB_AddPath (-1L,FileMetadata.FilFolLnk.Type, Gbl.FileBrowser.FilFolLnk.Full,false,Brw_LICENSE_DEFAULT); Gbl.Usrs.Other.UsrDat.UsrCod = FileMetadata.PublisherUsrCod; diff --git a/swad_browser.c b/swad_browser.c index 9bb84dd9..ce9883d6 100644 --- a/swad_browser.c +++ b/swad_browser.c @@ -1332,11 +1332,6 @@ static Brw_License_t Brw_GetParLicense (void); static void Brw_GetFileViewsFromLoggedUsrs (struct FileMetadata *FileMetadata); static unsigned Brw_GetFileViewsFromMe (long FilCod); -static void Brw_ChangeFileOrFolderHiddenInDB (const char Path[PATH_MAX + 1],bool IsHidden); - -static void Brw_ChangeFilePublicInDB (struct FileMetadata *FileMetadata, - bool IsPublic,Brw_License_t License); - static void Brw_RemoveOneFileOrFolderFromDB (const char Path[PATH_MAX + 1]); static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]); static void Brw_RenameOneFolderInDB (const char OldPath[PATH_MAX + 1], @@ -4504,7 +4499,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId, Brw_GetFileTypeSizeAndDate (&FileMetadata); if (FileMetadata.FilCod <= 0) // No entry for this file in database table of files /* Add entry to the table of files/folders */ - FileMetadata.FilCod = Brw_AddPathToDB (-1L,FileMetadata.FilFolLnk.Type, + FileMetadata.FilCod = Brw_DB_AddPath (-1L,FileMetadata.FilFolLnk.Type, Gbl.FileBrowser.FilFolLnk.Full,false,Brw_LICENSE_DEFAULT); /***** Is this row public or private? *****/ @@ -6721,7 +6716,7 @@ static bool Brw_PasteTreeIntoFolder (unsigned LevelOrg, Fil_FastCopyOfFiles (PathOrg,PathDstWithFile); /***** Add entry to the table of files/folders *****/ - FilCod = Brw_AddPathToDB (Gbl.Usrs.Me.UsrDat.UsrCod,FileType, + FilCod = Brw_DB_AddPath (Gbl.Usrs.Me.UsrDat.UsrCod,FileType, PathDstInTreeWithFile,false,Brw_LICENSE_DEFAULT); if (*FirstFilCod <= 0) *FirstFilCod = FilCod; @@ -6763,7 +6758,7 @@ static bool Brw_PasteTreeIntoFolder (unsigned LevelOrg, Err_ShowErrorAndExit ("Can not create folder."); /* Add entry to the table of files/folders */ - Brw_AddPathToDB (Gbl.Usrs.Me.UsrDat.UsrCod,FileType, + Brw_DB_AddPath (Gbl.Usrs.Me.UsrDat.UsrCod,FileType, PathDstInTreeWithFile,false,Brw_LICENSE_DEFAULT); } } @@ -7158,7 +7153,7 @@ void Brw_RecFolderFileBrowser (void) "%s/%s", Gbl.FileBrowser.FilFolLnk.Full, Gbl.FileBrowser.NewFilFolLnkName); - Brw_AddPathToDB (Gbl.Usrs.Me.UsrDat.UsrCod,Brw_IS_FOLDER, + Brw_DB_AddPath (Gbl.Usrs.Me.UsrDat.UsrCod,Brw_IS_FOLDER, PathCompleteInTreeIncludingFolder,false,Brw_LICENSE_DEFAULT); /* The folder has been created sucessfully */ @@ -7468,7 +7463,7 @@ static bool Brw_RcvFileInFileBrw (Brw_UploadType_t UploadType) "%s/%s", Gbl.FileBrowser.FilFolLnk.Full, Gbl.FileBrowser.NewFilFolLnkName); - FilCod = Brw_AddPathToDB (Gbl.Usrs.Me.UsrDat.UsrCod,Brw_IS_FILE, + FilCod = Brw_DB_AddPath (Gbl.Usrs.Me.UsrDat.UsrCod,Brw_IS_FILE, PathCompleteInTreeIncludingFile,false,Brw_LICENSE_DEFAULT); /* Show message of confirmation */ @@ -7650,7 +7645,7 @@ void Brw_RecLinkFileBrowser (void) sizeof (PathCompleteInTreeIncludingFile), "%s/%s.url", Gbl.FileBrowser.FilFolLnk.Full,FileName); - FilCod = Brw_AddPathToDB (Gbl.Usrs.Me.UsrDat.UsrCod,Brw_IS_LINK, + FilCod = Brw_DB_AddPath (Gbl.Usrs.Me.UsrDat.UsrCod,Brw_IS_LINK, PathCompleteInTreeIncludingFile,false,Brw_LICENSE_DEFAULT); /* Show message of confirmation */ @@ -7780,7 +7775,7 @@ void Brw_SetDocumentAsVisible (void) /***** Change file to visible *****/ if (Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Gbl.FileBrowser.FilFolLnk.Type, Gbl.FileBrowser.FilFolLnk.Full)) - Brw_ChangeFileOrFolderHiddenInDB (Gbl.FileBrowser.FilFolLnk.Full,false); + Brw_DB_ChangeFileOrFolderHidden (Gbl.FileBrowser.FilFolLnk.Full,false); /***** Remove the affected clipboards *****/ Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type, @@ -7804,7 +7799,7 @@ void Brw_SetDocumentAsHidden (void) set it as hidden *****/ if (!Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Gbl.FileBrowser.FilFolLnk.Type, Gbl.FileBrowser.FilFolLnk.Full)) - Brw_ChangeFileOrFolderHiddenInDB (Gbl.FileBrowser.FilFolLnk.Full,true); + Brw_DB_ChangeFileOrFolderHidden (Gbl.FileBrowser.FilFolLnk.Full,true); /***** Remove the affected clipboards *****/ Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type, @@ -7835,7 +7830,7 @@ bool Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Brw_FileType_t FileType,const cha IsHidden = (row[0][0] == 'Y'); } else - Brw_AddPathToDB (-1L,FileType, + Brw_DB_AddPath (-1L,FileType, Gbl.FileBrowser.FilFolLnk.Full,false,Brw_LICENSE_DEFAULT); /***** Free structure that stores the query result *****/ @@ -7894,7 +7889,7 @@ void Brw_ShowFileMetadata (void) { if (FileMetadata.FilCod <= 0) // No entry for this file in database table of files /* Add entry to the table of files/folders */ - FileMetadata.FilCod = Brw_AddPathToDB (-1L,FileMetadata.FilFolLnk.Type, + FileMetadata.FilCod = Brw_DB_AddPath (-1L,FileMetadata.FilFolLnk.Type, FileMetadata.FilFolLnk.Full, false,Brw_LICENSE_DEFAULT); @@ -8294,7 +8289,7 @@ void Brw_DownloadFile (void) { if (FileMetadata.FilCod <= 0) // No entry for this file in database table of files /* Add entry to the table of files/folders */ - FileMetadata.FilCod = Brw_AddPathToDB (-1L,FileMetadata.FilFolLnk.Type, + FileMetadata.FilCod = Brw_DB_AddPath (-1L,FileMetadata.FilFolLnk.Type, Gbl.FileBrowser.FilFolLnk.Full, false,Brw_LICENSE_DEFAULT); @@ -8706,7 +8701,7 @@ void Brw_ChgFileMetadata (void) } /***** Change file metadata *****/ - Brw_ChangeFilePublicInDB (&FileMetadata,PublicFileAfterEdition,License); + Brw_DB_ChangeFilePublic (&FileMetadata,PublicFileAfterEdition,License); /***** Remove the affected clipboards *****/ Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type, @@ -9184,63 +9179,6 @@ static unsigned Brw_GetFileViewsFromMe (long FilCod) return NumMyViews; } -/*****************************************************************************/ -/***************** Change hiddeness of file in the database ******************/ -/*****************************************************************************/ - -static void Brw_ChangeFileOrFolderHiddenInDB (const char Path[PATH_MAX + 1],bool IsHidden) - { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - - /***** Mark file as hidden in database *****/ - DB_QueryUPDATE ("can not change status of a file in database", - "UPDATE brw_files" - " SET Hidden='%c'" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND Path='%s'", - IsHidden ? 'Y' : - 'N', - (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], - Cod,ZoneUsrCod, - Path); - } - -/*****************************************************************************/ -/******* Change publisher, public and license of file in the database ********/ -/*****************************************************************************/ - -static void Brw_ChangeFilePublicInDB (struct FileMetadata *FileMetadata, - bool IsPublic,Brw_License_t License) - { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - - /***** Trivial check *****/ - if (FileMetadata->FilCod <= 0) - return; - - /***** Change publisher, public and license of file in database *****/ - DB_QueryUPDATE ("can not change metadata of a file in database", - "UPDATE brw_files" - " SET Public='%c'," - "License=%u" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND FilCod=%ld" - " AND Path='%s'", - IsPublic ? 'Y' : - 'N', - (unsigned) License, - (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], - Cod,ZoneUsrCod, - FileMetadata->FilCod, - FileMetadata->FilFolLnk.Full); - } - /*****************************************************************************/ /******** Get code of user in assignment / works for expanded folders ********/ /*****************************************************************************/ @@ -9342,139 +9280,38 @@ void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod, } } -/*****************************************************************************/ -/**************** Add a path of file/folder to the database ******************/ -/*****************************************************************************/ - -long Brw_AddPathToDB (long PublisherUsrCod,Brw_FileType_t FileType, - const char *FullPathInTree,bool IsPublic,Brw_License_t License) - { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - - /***** Add path to the database *****/ - return - DB_QueryINSERTandReturnCode ("can not add path to database", - "INSERT INTO brw_files" - " (FileBrowser,Cod,ZoneUsrCod,PublisherUsrCod," - "FileType,Path,Hidden,Public,License)" - " VALUES" - " (%u,%ld,%ld,%ld," - "%u,'%s','N','%c',%u)", - (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], - Cod,ZoneUsrCod, - PublisherUsrCod, - (unsigned) FileType, - FullPathInTree, - IsPublic ? 'Y' : - 'N', - (unsigned) License); - } - /*****************************************************************************/ /**************** Remove a file or folder from the database ******************/ /*****************************************************************************/ static void Brw_RemoveOneFileOrFolderFromDB (const char Path[PATH_MAX + 1]) { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type]; - /***** Set possible notifications as removed. Set possible social note as unavailable. Important: do this before removing from files *****/ Ntf_MarkNotifOneFileAsRemoved (Path); Tml_Not_MarkNoteOneFileAsUnavailable (Path); - /***** Remove from database the entries that store the marks properties *****/ - if (FileBrowser == Brw_ADMI_MRK_CRS || - FileBrowser == Brw_ADMI_MRK_GRP) - DB_QueryDELETE ("can not remove properties of marks from database", - "DELETE FROM mrk_marks" - " USING brw_files," - "mrk_marks" - " WHERE brw_files.FileBrowser=%u" - " AND brw_files.Cod=%ld" - " AND brw_files.Path='%s'" - " AND brw_files.FilCod=mrk_marks.FilCod", - (unsigned) FileBrowser, - Cod, - Path); - - /***** Remove from database the entries that store the file views *****/ - DB_QueryDELETE ("can not remove file views from database", - "DELETE FROM brw_views" - " USING brw_files," - "brw_views" - " WHERE brw_files.FileBrowser=%u" - " AND brw_files.Cod=%ld" - " AND brw_files.ZoneUsrCod=%ld" - " AND brw_files.Path='%s'" - " AND brw_files.FilCod=brw_views.FilCod", - (unsigned) FileBrowser,Cod,ZoneUsrCod,Path); - - /***** Remove from database the entry that stores the data of a file *****/ - DB_QueryDELETE ("can not remove path from database", - "DELETE FROM brw_files" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND Path='%s'", - (unsigned) FileBrowser,Cod,ZoneUsrCod,Path); + /***** Remove from database the entries that store + the marks properties, file views and file data *****/ + Brw_DB_RemoveOneFileOrFolder (Path); } /*****************************************************************************/ -/************** Remove children of a folder from the database ****************/ +/*************** Remove children of a folder from the database ***************/ /*****************************************************************************/ static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]) { - long Cod = Brw_GetCodForFileBrowser (); - long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); - Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type]; - /***** Set possible notifications as removed. Set possible social notes as unavailable. Important: do this before removing from files *****/ Ntf_MarkNotifChildrenOfFolderAsRemoved (Path); Tml_Not_MarkNotesChildrenOfFolderAsUnavailable (Path); - /***** Remove from database the entries that store the marks properties *****/ - if (FileBrowser == Brw_ADMI_MRK_CRS || - FileBrowser == Brw_ADMI_MRK_GRP) - DB_QueryDELETE ("can not remove properties of marks from database", - "DELETE FROM mrk_marks" - " USING brw_files," - "mrk_marks" - " WHERE brw_files.FileBrowser=%u" - " AND brw_files.Cod=%ld" - " AND brw_files.Path LIKE '%s/%%'" - " AND brw_files.FilCod=mrk_marks.FilCod", - (unsigned) FileBrowser, - Cod, - Path); - - /***** Remove from database the entries that store the file views *****/ - DB_QueryDELETE ("can not remove file views from database", - "DELETE FROM brw_views" - " USING brw_files," - "brw_views" - " WHERE brw_files.FileBrowser=%u" - " AND brw_files.Cod=%ld" - " AND brw_files.ZoneUsrCod=%ld" - " AND brw_files.Path LIKE '%s/%%'" - " AND brw_files.FilCod=brw_views.FilCod", - (unsigned) FileBrowser,Cod,ZoneUsrCod,Path); - - /***** Remove from database the entries that store the data of files *****/ - DB_QueryDELETE ("can not remove paths from database", - "DELETE FROM brw_files" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND ZoneUsrCod=%ld" - " AND Path LIKE '%s/%%'", - (unsigned) FileBrowser,Cod,ZoneUsrCod,Path); + /***** Remove from database the entries that store + the marks properties, file views and file data *****/ + Brw_DB_RemoveChildrenOfFolder (Path); } /*****************************************************************************/ diff --git a/swad_browser.h b/swad_browser.h index 17cf2911..ccd241e9 100644 --- a/swad_browser.h +++ b/swad_browser.h @@ -225,10 +225,6 @@ void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod, long *CrsCod, long *GrpCod); -long Brw_AddPathToDB (long PublisherUsrCod,Brw_FileType_t FileType, - const char *FullPathInTree, - bool IsPublic,Brw_License_t License); - bool Brw_CheckIfICanViewProjectFiles (long PrjCod); long Brw_GetCodForFileBrowser (void); diff --git a/swad_browser_database.c b/swad_browser_database.c index b52c7ef8..6993e487 100644 --- a/swad_browser_database.c +++ b/swad_browser_database.c @@ -165,6 +165,36 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_expanded_folders[Brw_NUM_TYP /**************************** Private prototypes *****************************/ /*****************************************************************************/ +/*****************************************************************************/ +/**************** Add a path of file/folder to the database ******************/ +/*****************************************************************************/ + +long Brw_DB_AddPath (long PublisherUsrCod,Brw_FileType_t FileType, + const char *FullPathInTree,bool IsPublic,Brw_License_t License) + { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFileBrowser (); + long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); + + /***** Add path to the database *****/ + return + DB_QueryINSERTandReturnCode ("can not add path to database", + "INSERT INTO brw_files" + " (FileBrowser,Cod,ZoneUsrCod,PublisherUsrCod," + "FileType,Path,Hidden,Public,License)" + " VALUES" + " (%u,%ld,%ld,%ld," + "%u,'%s','N','%c',%u)", + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod,ZoneUsrCod, + PublisherUsrCod, + (unsigned) FileType, + FullPathInTree, + IsPublic ? 'Y' : + 'N', + (unsigned) License); + } + /*****************************************************************************/ /*********************** Get file code using its path ************************/ /*****************************************************************************/ @@ -271,6 +301,114 @@ unsigned Brw_DB_GetNumFilesUsr (long UsrCod) (unsigned) Brw_IS_UNKNOWN); // Unknown entries are counted as files } +/*****************************************************************************/ +/**************** Remove a file or folder from the database ******************/ +/*****************************************************************************/ + +void Brw_DB_RemoveOneFileOrFolder (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 (); + Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type]; + + /***** Remove from database the entries that store the marks properties *****/ + if (FileBrowser == Brw_ADMI_MRK_CRS || + FileBrowser == Brw_ADMI_MRK_GRP) + DB_QueryDELETE ("can not remove properties of marks from database", + "DELETE FROM mrk_marks" + " USING brw_files," + "mrk_marks" + " WHERE brw_files.FileBrowser=%u" + " AND brw_files.Cod=%ld" + " AND brw_files.Path='%s'" + " AND brw_files.FilCod=mrk_marks.FilCod", + (unsigned) FileBrowser, + Cod, + Path); + + /***** Remove from database the entries that store the file views *****/ + DB_QueryDELETE ("can not remove file views from database", + "DELETE FROM brw_views" + " USING brw_files," + "brw_views" + " WHERE brw_files.FileBrowser=%u" + " AND brw_files.Cod=%ld" + " AND brw_files.ZoneUsrCod=%ld" + " AND brw_files.Path='%s'" + " AND brw_files.FilCod=brw_views.FilCod", + (unsigned) FileBrowser, + Cod, + ZoneUsrCod, + Path); + + /***** Remove from database the entry that stores the data of a file *****/ + DB_QueryDELETE ("can not remove path from database", + "DELETE FROM brw_files" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND Path='%s'", + (unsigned) FileBrowser, + Cod, + ZoneUsrCod, + Path); + } + +/*****************************************************************************/ +/************** Remove children of a folder from the database ****************/ +/*****************************************************************************/ + +void Brw_DB_RemoveChildrenOfFolder (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 (); + Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type]; + + /***** Remove from database the entries that store the marks properties *****/ + if (FileBrowser == Brw_ADMI_MRK_CRS || + FileBrowser == Brw_ADMI_MRK_GRP) + DB_QueryDELETE ("can not remove properties of marks from database", + "DELETE FROM mrk_marks" + " USING brw_files," + "mrk_marks" + " WHERE brw_files.FileBrowser=%u" + " AND brw_files.Cod=%ld" + " AND brw_files.Path LIKE '%s/%%'" + " AND brw_files.FilCod=mrk_marks.FilCod", + (unsigned) FileBrowser, + Cod, + Path); + + /***** Remove from database the entries that store the file views *****/ + DB_QueryDELETE ("can not remove file views from database", + "DELETE FROM brw_views" + " USING brw_files," + "brw_views" + " WHERE brw_files.FileBrowser=%u" + " AND brw_files.Cod=%ld" + " AND brw_files.ZoneUsrCod=%ld" + " AND brw_files.Path LIKE '%s/%%'" + " AND brw_files.FilCod=brw_views.FilCod", + (unsigned) FileBrowser, + Cod, + ZoneUsrCod, + Path); + + /***** Remove from database the entries that store the data of files *****/ + DB_QueryDELETE ("can not remove paths from database", + "DELETE FROM brw_files" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND Path LIKE '%s/%%'", + (unsigned) FileBrowser, + Cod, + ZoneUsrCod, + Path); + } + /*****************************************************************************/ /******** Remove files related to an institution from the database ***********/ /*****************************************************************************/ @@ -1088,6 +1226,41 @@ void Brw_DB_RemoveUsrFiles (long UsrCod) UsrCod); } +/*****************************************************************************/ +/************ Change public and license of file in the database **************/ +/*****************************************************************************/ + +void Brw_DB_ChangeFilePublic (const struct FileMetadata *FileMetadata, + bool IsPublic,Brw_License_t License) + { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFileBrowser (); + long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); + + /***** Trivial check *****/ + if (FileMetadata->FilCod <= 0) + return; + + /***** Change publisher, public and license of file in database *****/ + DB_QueryUPDATE ("can not change metadata of a file in database", + "UPDATE brw_files" + " SET Public='%c'," + "License=%u" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND FilCod=%ld" + " AND Path='%s'", + IsPublic ? 'Y' : + 'N', + (unsigned) License, + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, + ZoneUsrCod, + FileMetadata->FilCod, + FileMetadata->FilFolLnk.Full); + } + /*****************************************************************************/ /*********** Check if a folder contains file(s) marked as public *************/ /*****************************************************************************/ @@ -1422,6 +1595,32 @@ unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod) UsrCod); } +/*****************************************************************************/ +/***************** Change hiddeness of file in the database ******************/ +/*****************************************************************************/ + +void Brw_DB_ChangeFileOrFolderHidden (const char Path[PATH_MAX + 1],bool IsHidden) + { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFileBrowser (); + long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser (); + + /***** Mark file as hidden/unhidden in database *****/ + DB_QueryUPDATE ("can not change status of a file in database", + "UPDATE brw_files" + " SET Hidden='%c'" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND ZoneUsrCod=%ld" + " AND Path='%s'", + IsHidden ? 'Y' : + 'N', + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, + ZoneUsrCod, + Path); + } + /*****************************************************************************/ /************** Check if a file / folder from is set as hidden ***************/ /*****************************************************************************/ diff --git a/swad_browser_database.h b/swad_browser_database.h index b0ea10ab..aec4d874 100644 --- a/swad_browser_database.h +++ b/swad_browser_database.h @@ -48,10 +48,14 @@ /*****************************************************************************/ //---------------------------------- Files ------------------------------------ +long Brw_DB_AddPath (long PublisherUsrCod,Brw_FileType_t FileType, + const char *FullPathInTree,bool IsPublic,Brw_License_t License); 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_RemoveOneFileOrFolder (const char Path[PATH_MAX + 1]); +void Brw_DB_RemoveChildrenOfFolder (const char Path[PATH_MAX + 1]); void Brw_DB_RemoveInsFiles (long InsCod); void Brw_DB_RemoveCtrFiles (long CtrCod); void Brw_DB_RemoveDegFiles (long DegCod); @@ -63,6 +67,8 @@ void Brw_DB_RemoveWrkFiles (long CrsCod,long UsrCod); void Brw_DB_RemoveUsrFiles (long UsrCod); //------------------------------ Public files --------------------------------- +void Brw_DB_ChangeFilePublic (const struct FileMetadata *FileMetadata, + bool IsPublic,Brw_License_t License); 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); @@ -83,6 +89,7 @@ unsigned Brw_DB_GetFileViewsFromNonLoggedUsrs (long FilCod); unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod); //------------------------------- Hidden files -------------------------------- +void Brw_DB_ChangeFileOrFolderHidden (const char Path[PATH_MAX + 1],bool IsHidden); unsigned Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingPath (MYSQL_RES **mysql_res, const char *Path); bool Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (const struct FileMetadata *FileMetadata); diff --git a/swad_changelog.h b/swad_changelog.h index 2efea133..57f0c025 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.2 (2021-09-14)" +#define Log_PLATFORM_VERSION "SWAD 21.3 (2021-09-15)" #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.3: Sep 15, 2021 New module swad_notification_database for database queries related to notifications. (315211 lines) 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) diff --git a/swad_notification.c b/swad_notification.c index d3ea8572..17607071 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -33,6 +33,7 @@ #include "swad_action.h" #include "swad_box.h" +#include "swad_browser_database.h" #include "swad_call_for_exam.h" #include "swad_config.h" #include "swad_config.h" @@ -51,6 +52,7 @@ #include "swad_message.h" #include "swad_notice.h" #include "swad_notification.h" +#include "swad_notification_database.h" #include "swad_parameter.h" #include "swad_survey.h" #include "swad_timeline.h" @@ -965,7 +967,6 @@ void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long CrsCod,lon void Ntf_DB_MarkNotifAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod) { - /***** Set notification as removed *****/ DB_QueryUPDATE ("can not set notification(s) as removed", "UPDATE ntf_notifications" " SET Status=(Status | %u)" @@ -1105,7 +1106,6 @@ void Ntf_MarkNotifChildrenOfFolderAsRemoved (const char *Path) { extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type]; - long Cod = Brw_GetCodForFileBrowser (); Ntf_NotifyEvent_t NotifyEvent; switch (FileBrowser) @@ -1140,20 +1140,9 @@ void Ntf_MarkNotifChildrenOfFolderAsRemoved (const char *Path) default: return; } - DB_QueryUPDATE ("can not set notification(s) as removed", - "UPDATE ntf_notifications" - " SET Status=(Status | %u)" - " WHERE NotifyEvent=%u" - " AND Cod IN" - " (SELECT FilCod" - " FROM brw_files" - " WHERE FileBrowser=%u" - " AND Cod=%ld" - " AND Path LIKE '%s/%%')", - (unsigned) Ntf_STATUS_BIT_REMOVED, - (unsigned) NotifyEvent, - (unsigned) FileBrowser,Cod, - Path); + Ntf_DB_MarkNotifChildrenOfFolderAsRemoved (NotifyEvent,FileBrowser, + Brw_GetCodForFileBrowser (), + Path); break; default: break; diff --git a/swad_notification.h b/swad_notification.h index 3ce38be9..9480a816 100644 --- a/swad_notification.h +++ b/swad_notification.h @@ -27,6 +27,7 @@ /********************************** Headers **********************************/ /*****************************************************************************/ +// #include "swad_browser.h" #include "swad_user.h" /*****************************************************************************/ @@ -123,6 +124,7 @@ void Ntf_GetNotifSummaryAndContent (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], bool GetContent); void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long CrsCod,long ToUsrCod); void Ntf_DB_MarkNotifAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod); + void Ntf_MarkNotifToOneUsrAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod,long ToUsrCod); void Ntf_MarkNotifInCrsAsRemoved (long ToUsrCod,long CrsCod); void Ntf_MarkNotifOneFileAsRemoved (const char *Path); diff --git a/swad_notification_database.c b/swad_notification_database.c new file mode 100644 index 00000000..e0d0361b --- /dev/null +++ b/swad_notification_database.c @@ -0,0 +1,102 @@ +// swad_notification_database.c: notifications operations with database + +/* + 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-2021 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 . +*/ +/*****************************************************************************/ +/********************************* Headers ***********************************/ +/*****************************************************************************/ + +// #include // For NULL +// #include // For system +// #include +// #include // For the macro WEXITSTATUS +// #include // For unlink + +// #include "swad_action.h" +// #include "swad_box.h" +// #include "swad_call_for_exam.h" +// #include "swad_config.h" +// #include "swad_config.h" +#include "swad_database.h" +// #include "swad_enrolment.h" +// #include "swad_error.h" +// #include "swad_figure.h" +// #include "swad_follow.h" +// #include "swad_form.h" +// #include "swad_forum.h" +// #include "swad_global.h" +// #include "swad_hierarchy.h" +// #include "swad_hierarchy_level.h" +// #include "swad_HTML.h" +// #include "swad_mark.h" +// #include "swad_message.h" +// #include "swad_notice.h" +// #include "swad_notification.h" +#include "swad_notification_database.h" +// #include "swad_parameter.h" +// #include "swad_survey.h" +// #include "swad_timeline.h" +// #include "swad_timeline_notification.h" +// #include "swad_timeline_publication.h" + +/*****************************************************************************/ +/************** External global variables from others modules ****************/ +/*****************************************************************************/ + +extern struct Globals Gbl; + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private prototypes ****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/************ Set possible notifications of children as removed **************/ +/*****************************************************************************/ + +void Ntf_DB_MarkNotifChildrenOfFolderAsRemoved (Ntf_NotifyEvent_t NotifyEvent, + Brw_FileBrowser_t FileBrowser, + long Cod,const char *Path) + { + DB_QueryUPDATE ("can not set notification(s) as removed", + "UPDATE ntf_notifications" + " SET Status=(Status | %u)" + " WHERE NotifyEvent=%u" + " AND Cod IN" + " (SELECT FilCod" + " FROM brw_files" + " WHERE FileBrowser=%u" + " AND Cod=%ld" + " AND Path LIKE '%s/%%')", + (unsigned) Ntf_STATUS_BIT_REMOVED, + (unsigned) NotifyEvent, + (unsigned) FileBrowser, + Cod, + Path); + } diff --git a/swad_notification_database.h b/swad_notification_database.h new file mode 100644 index 00000000..d26dfcf6 --- /dev/null +++ b/swad_notification_database.h @@ -0,0 +1,51 @@ +// swad_notification.h: notifications about events, sent by email + +#ifndef _SWAD_NTF_DB +#define _SWAD_NTF_DB +/* + 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-2021 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 . +*/ +/*****************************************************************************/ +/********************************** Headers **********************************/ +/*****************************************************************************/ + +#include "swad_browser.h" +#include "swad_notification.h" +// #include "swad_user.h" + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + + +/*****************************************************************************/ +/******************************** Public types *******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Public prototypes ****************************/ +/*****************************************************************************/ + +void Ntf_DB_MarkNotifChildrenOfFolderAsRemoved (Ntf_NotifyEvent_t NotifyEvent, + Brw_FileBrowser_t FileBrowser, + long Cod,const char *Path); + +#endif diff --git a/swad_report.c b/swad_report.c index 2d5c6444..4c7b6a49 100644 --- a/swad_report.c +++ b/swad_report.c @@ -30,6 +30,7 @@ #include // For mkdir #include "swad_box.h" +#include "swad_browser_database.h" #include "swad_database.h" #include "swad_error.h" #include "swad_form.h" diff --git a/swad_timeline_note.c b/swad_timeline_note.c index 8e96cd6f..aea39791 100644 --- a/swad_timeline_note.c +++ b/swad_timeline_note.c @@ -31,6 +31,7 @@ #include "swad_alert.h" #include "swad_box.h" +#include "swad_browser_database.h" #include "swad_call_for_exam.h" #include "swad_course.h" #include "swad_forum.h" @@ -1044,8 +1045,8 @@ void Tml_Not_MarkNotesChildrenOfFolderAsUnavailable (const char *Path) default: return; } - Tml_DB_MarkNotesChildrenOfFolderAsUnavailable (NoteType, - FileBrowser,Brw_GetCodForFileBrowser (), + Tml_DB_MarkNotesChildrenOfFolderAsUnavailable (NoteType,FileBrowser, + Brw_GetCodForFileBrowser (), Path); break; default: diff --git a/swad_zip.c b/swad_zip.c index 0b0f759b..74cf1015 100644 --- a/swad_zip.c +++ b/swad_zip.c @@ -38,6 +38,7 @@ #include "swad_box.h" #include "swad_browser.h" +#include "swad_browser_database.h" #include "swad_config.h" #include "swad_error.h" #include "swad_form.h"