// swad_browser_database.c: file browsers 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 ***********************************/ /*****************************************************************************/ // #define _GNU_SOURCE // For asprintf // #include // For scandir, etc. // #include // For errno // #include // For PATH_MAX #include // To access MySQL databases // #include // For NULL // #include // For asprintf // #include // For exit, system, free, etc // #include // For string functions // #include // For lstat, time_t // #include // For lstat // #include // For time // #include // For access, lstat, getpid, chdir, symlink // #include "swad_box.h" // #include "swad_browser.h" #include "swad_browser_database.h" // #include "swad_config.h" #include "swad_database.h" #include "swad_error.h" // #include "swad_figure.h" // #include "swad_file_extension.h" // #include "swad_file_MIME.h" // #include "swad_form.h" #include "swad_global.h" // #include "swad_group_database.h" // #include "swad_hierarchy.h" // #include "swad_hierarchy_level.h" // #include "swad_HTML.h" // #include "swad_ID.h" // #include "swad_logo.h" // #include "swad_mark.h" // #include "swad_notification.h" // #include "swad_parameter.h" // #include "swad_photo.h" // #include "swad_profile.h" // #include "swad_project.h" // #include "swad_role.h" // #include "swad_setting.h" // #include "swad_string.h" // #include "swad_timeline.h" // #include "swad_timeline_note.h" // #include "swad_zip.h" /*****************************************************************************/ /******************** Global variables from other modules ********************/ /*****************************************************************************/ extern struct Globals Gbl; /*****************************************************************************/ /******************************* Private types *******************************/ /*****************************************************************************/ /*****************************************************************************/ /***************************** Public constants ******************************/ /*****************************************************************************/ /*****************************************************************************/ /***************************** Private constants *****************************/ /*****************************************************************************/ /*****************************************************************************/ /***************************** Private variables *****************************/ /*****************************************************************************/ /*****************************************************************************/ /**************************** Private prototypes *****************************/ /*****************************************************************************/ /*****************************************************************************/ /*********************** Get the size of a file zone *************************/ /*****************************************************************************/ void Brw_DB_GetSizeOfFileZone (MYSQL_RES **mysql_res, Brw_FileBrowser_t FileBrowser) { switch (Gbl.Scope.Current) { /* Scope = the whole platform */ case HieLvl_SYS: switch (FileBrowser) { case Brw_UNKNOWN: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT CrsCod)," // row[0] "COUNT(DISTINCT GrpCod)-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM " "(" "SELECT Cod AS CrsCod," "-1 AS GrpCod," "NumLevels," "NumFolders," "NumFiles," "TotalSize" " FROM brw_sizes" " WHERE FileBrowser IN (%u,%u,%u,%u,%u,%u)" " UNION " "SELECT grp_types.CrsCod," "brw_sizes.Cod AS GrpCod," "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM grp_types," "grp_groups," "brw_sizes" " WHERE grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u)" ") AS sizes", (unsigned) Brw_ADMI_DOC_CRS, (unsigned) Brw_ADMI_TCH_CRS, (unsigned) Brw_ADMI_SHR_CRS, (unsigned) Brw_ADMI_ASG_USR, (unsigned) Brw_ADMI_WRK_USR, (unsigned) Brw_ADMI_MRK_CRS, (unsigned) Brw_ADMI_DOC_GRP, (unsigned) Brw_ADMI_TCH_GRP, (unsigned) Brw_ADMI_SHR_GRP, (unsigned) Brw_ADMI_MRK_GRP); break; case Brw_ADMI_DOC_CRS: case Brw_ADMI_TCH_CRS: case Brw_ADMI_SHR_CRS: case Brw_ADMI_MRK_CRS: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT Cod)," // row[0] "-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM brw_sizes" " WHERE FileBrowser=%u", (unsigned) FileBrowser); break; case Brw_ADMI_DOC_GRP: case Brw_ADMI_TCH_GRP: case Brw_ADMI_SHR_GRP: case Brw_ADMI_MRK_GRP: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT grp_types.CrsCod)," // row[0] "COUNT(DISTINCT brw_sizes.Cod)," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM grp_types," "grp_groups," "brw_sizes" " WHERE grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", (unsigned) FileBrowser); break; case Brw_ADMI_ASG_USR: case Brw_ADMI_WRK_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT Cod)," // row[0] "-1," // row[1] "COUNT(DISTINCT ZoneUsrCod)," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM brw_sizes" " WHERE FileBrowser=%u", (unsigned) FileBrowser); break; case Brw_ADMI_BRF_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT -1," // row[0] "-1," // row[1] "COUNT(DISTINCT ZoneUsrCod)," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM brw_sizes" " WHERE FileBrowser=%u", (unsigned) FileBrowser); break; default: Err_WrongFileBrowserExit (); break; } break; /* Scope = the current country */ case HieLvl_CTY: switch (FileBrowser) { case Brw_UNKNOWN: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT CrsCod)," // row[0] "COUNT(DISTINCT GrpCod)-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM " "(" "SELECT brw_sizes.Cod AS CrsCod," "-1 AS GrpCod," // Course zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM ins_instits," "ctr_centers," "deg_degrees," "crs_courses," "brw_sizes" " 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_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u,%u,%u)" " UNION " "SELECT grp_types.CrsCod," "brw_sizes.Cod AS GrpCod," // Group zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM ins_instits," "ctr_centers," "deg_degrees," "crs_courses," "grp_types," "grp_groups," "brw_sizes" " 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=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u)" ") AS sizes", Gbl.Hierarchy.Cty.CtyCod, (unsigned) Brw_ADMI_DOC_CRS, (unsigned) Brw_ADMI_TCH_CRS, (unsigned) Brw_ADMI_SHR_CRS, (unsigned) Brw_ADMI_ASG_USR, (unsigned) Brw_ADMI_WRK_USR, (unsigned) Brw_ADMI_MRK_CRS, Gbl.Hierarchy.Cty.CtyCod, (unsigned) Brw_ADMI_DOC_GRP, (unsigned) Brw_ADMI_TCH_GRP, (unsigned) Brw_ADMI_SHR_GRP, (unsigned) Brw_ADMI_MRK_GRP); break; case Brw_ADMI_DOC_CRS: case Brw_ADMI_TCH_CRS: case Brw_ADMI_SHR_CRS: case Brw_ADMI_MRK_CRS: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ins_instits," "ctr_centers," "deg_degrees," "crs_courses," "brw_sizes" " 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_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Cty.CtyCod, (unsigned) FileBrowser); break; case Brw_ADMI_DOC_GRP: case Brw_ADMI_TCH_GRP: case Brw_ADMI_SHR_GRP: case Brw_ADMI_MRK_GRP: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT grp_types.CrsCod)," // row[0] "COUNT(DISTINCT brw_sizes.Cod)," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ins_instits," "ctr_centers," "deg_degrees," "crs_courses," "grp_types," "grp_groups," "brw_sizes" " 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=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Cty.CtyCod, (unsigned) FileBrowser); break; case Brw_ADMI_ASG_USR: case Brw_ADMI_WRK_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ins_instits," "ctr_centers," "deg_degrees," "crs_courses," "brw_sizes" " 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_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Cty.CtyCod, (unsigned) FileBrowser); break; case Brw_ADMI_BRF_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT -1," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ins_instits," "ctr_centers," "deg_degrees," "crs_courses," "crs_users," "brw_sizes" " 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=crs_users.CrsCod" " AND crs_users.UsrCod=brw_sizes.ZoneUsrCod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Cty.CtyCod, (unsigned) FileBrowser); break; default: Err_WrongFileBrowserExit (); break; } break; /* Scope = the current institution */ case HieLvl_INS: switch (FileBrowser) { case Brw_UNKNOWN: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT CrsCod)," // row[0] "COUNT(DISTINCT GrpCod)-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM " "(" "SELECT brw_sizes.Cod AS CrsCod," "-1 AS GrpCod," // Course zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM ctr_centers," "deg_degrees," "crs_courses," "brw_sizes" " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u,%u,%u)" " UNION " "SELECT grp_types.CrsCod," "brw_sizes.Cod AS GrpCod," // Group zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM ctr_centers," "deg_degrees," "crs_courses," "grp_types," "grp_groups," "brw_sizes" " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u)" ") AS sizes", Gbl.Hierarchy.Ins.InsCod, (unsigned) Brw_ADMI_DOC_CRS, (unsigned) Brw_ADMI_TCH_CRS, (unsigned) Brw_ADMI_SHR_CRS, (unsigned) Brw_ADMI_ASG_USR, (unsigned) Brw_ADMI_WRK_USR, (unsigned) Brw_ADMI_MRK_CRS, Gbl.Hierarchy.Ins.InsCod, (unsigned) Brw_ADMI_DOC_GRP, (unsigned) Brw_ADMI_TCH_GRP, (unsigned) Brw_ADMI_SHR_GRP, (unsigned) Brw_ADMI_MRK_GRP); break; case Brw_ADMI_DOC_CRS: case Brw_ADMI_TCH_CRS: case Brw_ADMI_SHR_CRS: case Brw_ADMI_MRK_CRS: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ctr_centers," "deg_degrees," "crs_courses," "brw_sizes" " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ins.InsCod, (unsigned) FileBrowser); break; case Brw_ADMI_DOC_GRP: case Brw_ADMI_TCH_GRP: case Brw_ADMI_SHR_GRP: case Brw_ADMI_MRK_GRP: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT grp_types.CrsCod)," // row[0] "COUNT(DISTINCT brw_sizes.Cod)," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ctr_centers," "deg_degrees," "crs_courses," "grp_types," "grp_groups," "brw_sizes" " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ins.InsCod, (unsigned) FileBrowser); break; case Brw_ADMI_ASG_USR: case Brw_ADMI_WRK_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ctr_centers," "deg_degrees," "crs_courses," "brw_sizes" " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ins.InsCod, (unsigned) FileBrowser); break; case Brw_ADMI_BRF_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT -1," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM ctr_centers," "deg_degrees," "crs_courses," "crs_users," "brw_sizes" " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=brw_sizes.ZoneUsrCod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ins.InsCod, (unsigned) FileBrowser); break; default: Err_WrongFileBrowserExit (); break; } break; /* Scope = the current center */ case HieLvl_CTR: switch (FileBrowser) { case Brw_UNKNOWN: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT CrsCod)," // row[0] "COUNT(DISTINCT GrpCod)-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM " "(" "SELECT brw_sizes.Cod AS CrsCod," "-1 AS GrpCod," // Course zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM deg_degrees," "crs_courses," "brw_sizes" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u,%u,%u)" " UNION " "SELECT grp_types.CrsCod," "brw_sizes.Cod AS GrpCod," // Group zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM deg_degrees," "crs_courses," "grp_types," "grp_groups," "brw_sizes" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u)" ") AS sizes", Gbl.Hierarchy.Ctr.CtrCod, (unsigned) Brw_ADMI_DOC_CRS, (unsigned) Brw_ADMI_TCH_CRS, (unsigned) Brw_ADMI_SHR_CRS, (unsigned) Brw_ADMI_ASG_USR, (unsigned) Brw_ADMI_WRK_USR, (unsigned) Brw_ADMI_MRK_CRS, Gbl.Hierarchy.Ctr.CtrCod, (unsigned) Brw_ADMI_DOC_GRP, (unsigned) Brw_ADMI_TCH_GRP, (unsigned) Brw_ADMI_SHR_GRP, (unsigned) Brw_ADMI_MRK_GRP); break; case Brw_ADMI_DOC_CRS: case Brw_ADMI_TCH_CRS: case Brw_ADMI_SHR_CRS: case Brw_ADMI_MRK_CRS: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM deg_degrees," "crs_courses," "brw_sizes" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ctr.CtrCod, (unsigned) FileBrowser); break; case Brw_ADMI_DOC_GRP: case Brw_ADMI_TCH_GRP: case Brw_ADMI_SHR_GRP: case Brw_ADMI_MRK_GRP: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT grp_types.CrsCod)," "COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "MAX(brw_sizes.NumLevels)," // row[2] "SUM(brw_sizes.NumFolders)," // row[3] "SUM(brw_sizes.NumFiles)," // row[4] "SUM(brw_sizes.TotalSize)" // row[5] " FROM deg_degrees," "crs_courses," "grp_types," "grp_groups," "brw_sizes" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ctr.CtrCod, (unsigned) FileBrowser); break; case Brw_ADMI_ASG_USR: case Brw_ADMI_WRK_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM deg_degrees," "crs_courses," "brw_sizes" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ctr.CtrCod, (unsigned) FileBrowser); break; case Brw_ADMI_BRF_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT -1," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM deg_degrees," "crs_courses," "crs_users," "brw_sizes" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=brw_sizes.ZoneUsrCod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Ctr.CtrCod, (unsigned) FileBrowser); break; default: Err_WrongFileBrowserExit (); break; } break; /* Scope = the current degree */ case HieLvl_DEG: switch (FileBrowser) { case Brw_UNKNOWN: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT CrsCod)," // row[0] "COUNT(DISTINCT GrpCod)-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM " "(" "SELECT brw_sizes.Cod AS CrsCod," "-1 AS GrpCod," // Course zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM crs_courses," "brw_sizes" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u,%u,%u)" " UNION " "SELECT grp_types.CrsCod," "brw_sizes.Cod AS GrpCod," // Group zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM crs_courses," "grp_types," "grp_groups," "brw_sizes" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u)" ") AS sizes", Gbl.Hierarchy.Deg.DegCod, (unsigned) Brw_ADMI_DOC_CRS, (unsigned) Brw_ADMI_TCH_CRS, (unsigned) Brw_ADMI_SHR_CRS, (unsigned) Brw_ADMI_ASG_USR, (unsigned) Brw_ADMI_WRK_USR, (unsigned) Brw_ADMI_MRK_CRS, Gbl.Hierarchy.Deg.DegCod, (unsigned) Brw_ADMI_DOC_GRP, (unsigned) Brw_ADMI_TCH_GRP, (unsigned) Brw_ADMI_SHR_GRP, (unsigned) Brw_ADMI_MRK_GRP); break; case Brw_ADMI_DOC_CRS: case Brw_ADMI_TCH_CRS: case Brw_ADMI_SHR_CRS: case Brw_ADMI_MRK_CRS: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM crs_courses," "brw_sizes" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Deg.DegCod, (unsigned) FileBrowser); break; case Brw_ADMI_DOC_GRP: case Brw_ADMI_TCH_GRP: case Brw_ADMI_SHR_GRP: case Brw_ADMI_MRK_GRP: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT grp_types.CrsCod)," // row[0] "COUNT(DISTINCT brw_sizes.Cod)," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM crs_courses," "grp_types," "grp_groups," "brw_sizes" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=grp_types.CrsCod" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Deg.DegCod, (unsigned) FileBrowser); break; case Brw_ADMI_ASG_USR: case Brw_ADMI_WRK_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT brw_sizes.Cod)," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM crs_courses," "brw_sizes" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Deg.DegCod, (unsigned) FileBrowser); break; case Brw_ADMI_BRF_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT -1," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM crs_courses," "crs_users," "brw_sizes" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=brw_sizes.ZoneUsrCod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Deg.DegCod, (unsigned) FileBrowser); break; default: Err_WrongFileBrowserExit (); break; } break; /* Scope = the current course */ case HieLvl_CRS: switch (FileBrowser) { case Brw_UNKNOWN: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT CrsCod)," // row[0] "COUNT(DISTINCT GrpCod)-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM " "(" "SELECT Cod AS CrsCod," "-1 AS GrpCod," // Course zones "NumLevels," "NumFolders," "NumFiles," "TotalSize" " FROM brw_sizes" " WHERE Cod=%ld" " AND FileBrowser IN (%u,%u,%u,%u,%u,%u)" " UNION " "SELECT grp_types.CrsCod," "brw_sizes.Cod AS GrpCod," // Group zones "brw_sizes.NumLevels," "brw_sizes.NumFolders," "brw_sizes.NumFiles," "brw_sizes.TotalSize" " FROM grp_types," "grp_groups," "brw_sizes" " WHERE grp_types.CrsCod=%ld" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser IN (%u,%u,%u,%u)" ") AS sizes", Gbl.Hierarchy.Crs.CrsCod, (unsigned) Brw_ADMI_DOC_CRS, (unsigned) Brw_ADMI_TCH_CRS, (unsigned) Brw_ADMI_SHR_CRS, (unsigned) Brw_ADMI_ASG_USR, (unsigned) Brw_ADMI_WRK_USR, (unsigned) Brw_ADMI_MRK_CRS, Gbl.Hierarchy.Crs.CrsCod, (unsigned) Brw_ADMI_DOC_GRP, (unsigned) Brw_ADMI_TCH_GRP, (unsigned) Brw_ADMI_SHR_GRP, (unsigned) Brw_ADMI_MRK_GRP); break; case Brw_ADMI_DOC_CRS: case Brw_ADMI_TCH_CRS: case Brw_ADMI_SHR_CRS: case Brw_ADMI_MRK_CRS: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT 1," // row[0] "-1," // row[1] "-1," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM brw_sizes" " WHERE Cod=%ld" " AND FileBrowser=%u", Gbl.Hierarchy.Crs.CrsCod, (unsigned) FileBrowser); break; case Brw_ADMI_DOC_GRP: case Brw_ADMI_TCH_GRP: case Brw_ADMI_SHR_GRP: case Brw_ADMI_MRK_GRP: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT COUNT(DISTINCT grp_types.CrsCod)," // row[0] "COUNT(DISTINCT brw_sizes.Cod)," // row[1] "-1," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM grp_types," "grp_groups," "brw_sizes" " WHERE grp_types.CrsCod=%ld" " AND grp_types.GrpTypCod=grp_groups.GrpTypCod" " AND grp_groups.GrpCod=brw_sizes.Cod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Crs.CrsCod, (unsigned) FileBrowser); break; case Brw_ADMI_ASG_USR: case Brw_ADMI_WRK_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT 1," // row[0] "-1," // row[1] "COUNT(DISTINCT ZoneUsrCod)," // row[2] "MAX(NumLevels)," // row[3] "SUM(NumFolders)," // row[4] "SUM(NumFiles)," // row[5] "SUM(TotalSize)" // row[6] " FROM brw_sizes" " WHERE Cod=%ld" " AND FileBrowser=%u", Gbl.Hierarchy.Crs.CrsCod, (unsigned) FileBrowser); break; case Brw_ADMI_BRF_USR: DB_QuerySELECT (mysql_res,"can not get size of a file browser", "SELECT -1," // row[0] "-1," // row[1] "COUNT(DISTINCT brw_sizes.ZoneUsrCod)," // row[2] "MAX(brw_sizes.NumLevels)," // row[3] "SUM(brw_sizes.NumFolders)," // row[4] "SUM(brw_sizes.NumFiles)," // row[5] "SUM(brw_sizes.TotalSize)" // row[6] " FROM crs_users," "brw_sizes" " WHERE crs_users.CrsCod=%ld" " AND crs_users.UsrCod=brw_sizes.ZoneUsrCod" " AND brw_sizes.FileBrowser=%u", Gbl.Hierarchy.Crs.CrsCod, (unsigned) FileBrowser); break; default: Err_WrongFileBrowserExit (); break; } break; default: Err_WrongScopeExit (); 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 } }