Version19.209

This commit is contained in:
acanas 2020-05-01 22:56:02 +02:00
parent 378cc4de2f
commit 2bfc915e08
9 changed files with 221 additions and 84 deletions

View File

@ -604,7 +604,8 @@ CREATE TABLE IF NOT EXISTS figures (
Figure INT NOT NULL, Figure INT NOT NULL,
Scope ENUM('Sys','Cty','Ins','Ctr','Deg','Crs') NOT NULL DEFAULT 'Sys', Scope ENUM('Sys','Cty','Ins','Ctr','Deg','Crs') NOT NULL DEFAULT 'Sys',
Cod INT NOT NULL DEFAULT -1, Cod INT NOT NULL DEFAULT -1,
Value INT NOT NULL, ValueInt INT NOT NULL DEFAULT 0,
ValueDouble DOUBLE PRECISION NOT NULL DEFAULT 0.0,
LastUpdate TIMESTAMP, LastUpdate TIMESTAMP,
UNIQUE INDEX(Figure,Scope,Cod)); UNIQUE INDEX(Figure,Scope,Cod));
-- --

View File

@ -544,10 +544,16 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD: En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 19.208.1 (2020-05-01)" #define Log_PLATFORM_VERSION "SWAD 19.209 (2020-05-01)"
#define CSS_FILE "swad19.193.1.css" #define CSS_FILE "swad19.193.1.css"
#define JS_FILE "swad19.193.1.js" #define JS_FILE "swad19.193.1.js"
/* /*
Version 19.209: May 01, 2020 More figures cached. (300734 lines)
3 changes necessary in database:
ALTER TABLE figures CHANGE COLUMN Value ValueInt INT NOT NULL DEFAULT 0;
ALTER TABLE figures ADD COLUMN ValueDouble DOUBLE PRECISION NOT NULL DEFAULT 0.0 AFTER ValueInt;
DELETE FROM figures;
Version 19.208.1: May 01, 2020 Fixed bug in cache of figures. (300599 lines) Version 19.208.1: May 01, 2020 Fixed bug in cache of figures. (300599 lines)
Version 19.208: May 01, 2020 New module for cache of figures. (300598 lines) Version 19.208: May 01, 2020 New module for cache of figures. (300598 lines)
1 change necessary in database: 1 change necessary in database:

View File

@ -1317,22 +1317,24 @@ mysql> DESCRIBE expanded_folders;
/***** Table figures *****/ /***** Table figures *****/
/* /*
mysql> DESCRIBE figures; mysql> DESCRIBE figures;
+------------+-------------------------------------------+------+-----+-------------------+-----------------------------+ +-------------+-------------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+------------+-------------------------------------------+------+-----+-------------------+-----------------------------+ +-------------+-------------------------------------------+------+-----+-------------------+-----------------------------+
| Figure | int(11) | NO | PRI | NULL | | | Figure | int(11) | NO | PRI | NULL | |
| Scope | enum('Sys','Cty','Ins','Ctr','Deg','Crs') | NO | PRI | Sys | | | Scope | enum('Sys','Cty','Ins','Ctr','Deg','Crs') | NO | PRI | Sys | |
| Cod | int(11) | NO | PRI | -1 | | | Cod | int(11) | NO | PRI | -1 | |
| Value | int(11) | NO | | NULL | | | ValueInt | int(11) | NO | | 0 | |
| LastUpdate | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | ValueDouble | double | NO | | 0 | |
+------------+-------------------------------------------+------+-----+-------------------+-----------------------------+ | LastUpdate | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
5 rows in set (0.01 sec) +-------------+-------------------------------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS figures (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS figures ("
"Figure INT NOT NULL," "Figure INT NOT NULL,"
"Scope ENUM('Sys','Cty','Ins','Ctr','Deg','Crs') NOT NULL DEFAULT 'Sys'," "Scope ENUM('Sys','Cty','Ins','Ctr','Deg','Crs') NOT NULL DEFAULT 'Sys',"
"Cod INT NOT NULL DEFAULT -1," "Cod INT NOT NULL DEFAULT -1,"
"Value INT NOT NULL," "ValueInt INT NOT NULL,"
"ValueDouble DOUBLE PRECISION NOT NULL,"
"LastUpdate TIMESTAMP," "LastUpdate TIMESTAMP,"
"UNIQUE INDEX(Figure,Scope,Cod))"); "UNIQUE INDEX(Figure,Scope,Cod))");

View File

@ -34,6 +34,7 @@
#include "swad_box.h" #include "swad_box.h"
#include "swad_database.h" #include "swad_database.h"
#include "swad_figure.h" #include "swad_figure.h"
#include "swad_figure_cache.h"
#include "swad_file_browser.h" #include "swad_file_browser.h"
#include "swad_follow.h" #include "swad_follow.h"
#include "swad_form.h" #include "swad_form.h"
@ -424,9 +425,54 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
{ {
extern const char *Txt_Total; extern const char *Txt_Total;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
static FigCch_FigureCached_t FigureNumUsrs[Rol_NUM_ROLES] =
{
[Rol_UNK ] = FigCch_NUM_USRS_IN_CRSS, // Any users in courses
[Rol_GST ] = FigCch_UNKNOWN, // Not applicable
[Rol_USR ] = FigCch_UNKNOWN, // Not applicable
[Rol_STD ] = FigCch_NUM_STDS_IN_CRSS, // Students
[Rol_NET ] = FigCch_NUM_NETS_IN_CRSS, // Non-editing teachers
[Rol_TCH ] = FigCch_NUM_TCHS_IN_CRSS, // Teachers
[Rol_DEG_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_CTR_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_INS_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_SYS_ADM] = FigCch_UNKNOWN, // Not applicable
};
static FigCch_FigureCached_t FigureNumCrssPerUsr[Rol_NUM_ROLES] =
{
[Rol_UNK ] = FigCch_NUM_CRSS_PER_USR, // Number of courses per user
[Rol_GST ] = FigCch_UNKNOWN, // Not applicable
[Rol_USR ] = FigCch_UNKNOWN, // Not applicable
[Rol_STD ] = FigCch_NUM_CRSS_PER_STD, // Number of courses per student
[Rol_NET ] = FigCch_NUM_CRSS_PER_NET, // Number of courses per non-editing teacher
[Rol_TCH ] = FigCch_NUM_CRSS_PER_TCH, // Number of courses per teacher
[Rol_DEG_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_CTR_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_INS_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_SYS_ADM] = FigCch_UNKNOWN, // Not applicable
};
static FigCch_FigureCached_t FigureNumUsrsPerCrs[Rol_NUM_ROLES] =
{
[Rol_UNK ] = FigCch_NUM_USRS_PER_CRS, // Number of users per course
[Rol_GST ] = FigCch_UNKNOWN, // Not applicable
[Rol_USR ] = FigCch_UNKNOWN, // Not applicable
[Rol_STD ] = FigCch_NUM_STDS_PER_CRS, // Number of students per course
[Rol_NET ] = FigCch_NUM_NETS_PER_CRS, // Number of non-editing teachers per course
[Rol_TCH ] = FigCch_NUM_TCHS_PER_CRS, // Number of teachers per course
[Rol_DEG_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_CTR_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_INS_ADM] = FigCch_UNKNOWN, // Not applicable
[Rol_SYS_ADM] = FigCch_UNKNOWN, // Not applicable
};
unsigned NumUsrs; unsigned NumUsrs;
double NumCrssPerUsr; double NumCrssPerUsr;
double NumUsrsPerCrs; double NumUsrsPerCrs;
long Cod = (Gbl.Scope.Current == Hie_CTY ? Gbl.Hierarchy.Cty.CtyCod :
(Gbl.Scope.Current == Hie_INS ? Gbl.Hierarchy.Ins.InsCod :
(Gbl.Scope.Current == Hie_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L)))));
char *Class = (Role == Rol_UNK) ? "DAT_N_LINE_TOP RB" : char *Class = (Role == Rol_UNK) ? "DAT_N_LINE_TOP RB" :
"DAT RB"; "DAT RB";
unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) | unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) |
@ -435,20 +481,34 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
(1 << Role); (1 << Role);
/***** Get the number of users belonging to any course *****/ /***** Get the number of users belonging to any course *****/
NumUsrs = Usr_GetNumUsrsInCrss (Gbl.Scope.Current, if (!FigCch_GetFigureFromCache (FigureNumUsrs[Role],Gbl.Scope.Current,Cod,
(Gbl.Scope.Current == Hie_CTY ? Gbl.Hierarchy.Cty.CtyCod : FigCch_Type_UNSIGNED,&NumUsrs))
(Gbl.Scope.Current == Hie_INS ? Gbl.Hierarchy.Ins.InsCod : {
(Gbl.Scope.Current == Hie_CTR ? Gbl.Hierarchy.Ctr.CtrCod : // Not updated recently in cache ==> compute and update it in cache
(Gbl.Scope.Current == Hie_DEG ? Gbl.Hierarchy.Deg.DegCod : NumUsrs = Usr_GetNumUsrsInCrss (Gbl.Scope.Current,Cod,Roles);
(Gbl.Scope.Current == Hie_CRS ? Gbl.Hierarchy.Crs.CrsCod : FigCch_UpdateFigureIntoCache (FigureNumUsrs[Role],Gbl.Scope.Current,Cod,
-1L))))), FigCch_Type_UNSIGNED,&NumUsrs);
Roles); }
/***** Get average number of courses per user *****/ /***** Get average number of courses per user *****/
NumCrssPerUsr = Usr_GetNumCrssPerUsr (Role); if (!FigCch_GetFigureFromCache (FigureNumCrssPerUsr[Role],Gbl.Scope.Current,Cod,
FigCch_Type_DOUBLE,&NumCrssPerUsr))
{
// Not updated recently in cache ==> compute and update it in cache
NumCrssPerUsr = Usr_GetNumCrssPerUsr (Gbl.Scope.Current,Cod,Role);
FigCch_UpdateFigureIntoCache (FigureNumCrssPerUsr[Role],Gbl.Scope.Current,Cod,
FigCch_Type_DOUBLE,&NumCrssPerUsr);
}
/***** Query the number of users per course *****/ /***** Query the number of users per course *****/
NumUsrsPerCrs = Usr_GetNumUsrsPerCrs (Role); if (!FigCch_GetFigureFromCache (FigureNumUsrsPerCrs[Role],Gbl.Scope.Current,Cod,
FigCch_Type_DOUBLE,&NumUsrsPerCrs))
{
// Not updated recently in cache ==> compute and update it in cache
NumUsrsPerCrs = Usr_GetNumUsrsPerCrs (Gbl.Scope.Current,Cod,Role);
FigCch_UpdateFigureIntoCache (FigureNumUsrsPerCrs[Role],Gbl.Scope.Current,Cod,
FigCch_Type_DOUBLE,&NumUsrsPerCrs);
}
/***** Write the total number of users *****/ /***** Write the total number of users *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);

View File

@ -64,19 +64,34 @@
void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure, void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
Hie_Level_t Scope,long Cod, Hie_Level_t Scope,long Cod,
unsigned Value) FigCch_Type_t Type,const void *ValuePtr)
{ {
/***** Trivial check *****/ /***** Trivial check *****/
if (Figure == FigCch_UNKNOWN) if (Figure == FigCch_UNKNOWN)
return; return;
/***** Update figure's value in database *****/ /***** Update figure's value in database *****/
DB_QueryREPLACE ("can not update cached figure value", switch (Type)
"REPLACE INTO figures" {
" (Figure,Scope,Cod,Value)" case FigCch_Type_UNSIGNED:
" VALUES" DB_QueryREPLACE ("can not update cached figure value",
" (%u,'%s',%ld,%u)", "REPLACE INTO figures"
(unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod,Value); " (Figure,Scope,Cod,ValueInt)"
" VALUES"
" (%u,'%s',%ld,%u)",
(unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod,
*((unsigned *) ValuePtr));
break;
case FigCch_Type_DOUBLE:
DB_QueryREPLACE ("can not update cached figure value",
"REPLACE INTO figures"
" (Figure,Scope,Cod,ValueDouble)"
" VALUES"
" (%u,'%s',%ld,%.15lg)",
(unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod,
*((double *) ValuePtr));
break;
}
} }
/*****************************************************************************/ /*****************************************************************************/
@ -86,13 +101,27 @@ void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure, bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
Hie_Level_t Scope,long Cod, Hie_Level_t Scope,long Cod,
unsigned *Value) FigCch_Type_t Type,void *ValuePtr)
{ {
static const char *Field[FigCch_NUM_TYPES] =
{
[FigCch_Type_UNSIGNED] = "ValueInt",
[FigCch_Type_DOUBLE ] = "ValueDouble",
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
bool Found = false; bool Found = false;
*Value = 0; // Default value when not found /***** Set default value when not found *****/
switch (Type)
{
case FigCch_Type_UNSIGNED:
*((unsigned *) ValuePtr) = 0;
break;
case FigCch_Type_DOUBLE:
*((double *) ValuePtr) = 0.0;
break;
}
/***** Trivial check *****/ /***** Trivial check *****/
if (Figure == FigCch_UNKNOWN) if (Figure == FigCch_UNKNOWN)
@ -100,10 +129,11 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
/***** Get figure's value if cached and recent *****/ /***** Get figure's value if cached and recent *****/
if (DB_QuerySELECT (&mysql_res,"can not get cached figure value", if (DB_QuerySELECT (&mysql_res,"can not get cached figure value",
"SELECT Value" "SELECT %s"
" FROM figures" " FROM figures"
" WHERE Figure=%u AND Scope='%s' AND Cod=%ld" " WHERE Figure=%u AND Scope='%s' AND Cod=%ld"
" AND LastUpdate>FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)", " AND LastUpdate>FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Field[Type],
(unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod, (unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod,
FigCch_TIME_CACHE)) FigCch_TIME_CACHE))
{ {
@ -112,8 +142,19 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
/* Get value (row[0]) */ /* Get value (row[0]) */
if (row[0]) if (row[0])
if (sscanf (row[0],"%u",Value) == 1) {
Found = true; switch (Type)
{
case FigCch_Type_UNSIGNED:
if (sscanf (row[0],"%u",(unsigned *) ValuePtr) == 1)
Found = true;
break;
case FigCch_Type_DOUBLE:
if (sscanf (row[0],"%lf",(double *) ValuePtr) == 1)
Found = true;
break;
}
}
} }
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/

View File

@ -40,28 +40,45 @@ typedef enum
{ {
FigCch_UNKNOWN = 0, // Unknown figure FigCch_UNKNOWN = 0, // Unknown figure
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
FigCch_NUM_STDS_IN_CRSS = 1, // Number of students in courses FigCch_NUM_CTYS = 1, // Number of countries
FigCch_NUM_NETS_IN_CRSS = 2, // Number of non-editing teachers in courses FigCch_NUM_INSS = 2, // Number of institutions
FigCch_NUM_TCHS_IN_CRSS = 3, // Number of teachers in courses FigCch_NUM_CTRS = 3, // Number of centres
FigCch_NUM_USRS_IN_CRSS = 4, // Number of users in courses FigCch_NUM_CTRS_WITH_MAP = 4, // Number of centres with map
FigCch_NUM_DEGS = 5, // Number of degrees
FigCch_NUM_CRSS = 6, // Number of courses
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
FigCch_NUM_CTYS = 5, // Number of countries FigCch_NUM_STDS_IN_CRSS = 7, // Number of students in courses
FigCch_NUM_INSS = 6, // Number of institutions FigCch_NUM_NETS_IN_CRSS = 8, // Number of non-editing teachers in courses
FigCch_NUM_CTRS = 7, // Number of centres FigCch_NUM_TCHS_IN_CRSS = 9, // Number of teachers in courses
FigCch_NUM_CTRS_WITH_MAP = 8, // Number of centres with map FigCch_NUM_USRS_IN_CRSS = 10, // Number of users in courses
FigCch_NUM_DEGS = 9, // Number of degrees //--------------------------------------------------------------------------
FigCch_NUM_CRSS = 10, // Number of courses FigCch_NUM_CRSS_PER_USR = 11, // Number of courses per user
FigCch_NUM_CRSS_PER_STD = 12, // Number of courses per student
FigCch_NUM_CRSS_PER_NET = 13, // Number of courses per non-editing teacher
FigCch_NUM_CRSS_PER_TCH = 14, // Number of courses per teacher
//--------------------------------------------------------------------------
FigCch_NUM_USRS_PER_CRS = 15, // Number of users per course
FigCch_NUM_STDS_PER_CRS = 16, // Number of students per course
FigCch_NUM_NETS_PER_CRS = 17, // Number of non-editing teachers per course
FigCch_NUM_TCHS_PER_CRS = 18, // Number of teachers per course
} FigCch_FigureCached_t; } FigCch_FigureCached_t;
#define FigCch_NUM_TYPES 2
typedef enum
{
FigCch_Type_UNSIGNED,
FigCch_Type_DOUBLE,
} FigCch_Type_t;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure, void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
Hie_Level_t Scope,long Cod, Hie_Level_t Scope,long Cod,
unsigned Value); FigCch_Type_t Type,const void *ValuePtr);
bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure, bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
Hie_Level_t Scope,long Cod, Hie_Level_t Scope,long Cod,
unsigned *Value); FigCch_Type_t Type,void *ValuePtr);
#endif #endif

View File

@ -133,12 +133,12 @@ static void SysCfg_Configuration (bool PrintView)
/***** Get number of centres with map *****/ /***** Get number of centres with map *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS_WITH_MAP,Hie_SYS,-1L, if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS_WITH_MAP,Hie_SYS,-1L,
&NumCtrsWithMap)) FigCch_Type_UNSIGNED,&NumCtrsWithMap))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumCtrsWithMap = Ctr_GetNumCtrsWithMapInSys (); NumCtrsWithMap = Ctr_GetNumCtrsWithMapInSys ();
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS_WITH_MAP,Hie_SYS,-1L, FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS_WITH_MAP,Hie_SYS,-1L,
NumCtrsWithMap); FigCch_Type_UNSIGNED,&NumCtrsWithMap);
} }
if (PrintView) if (PrintView)
@ -147,11 +147,13 @@ static void SysCfg_Configuration (bool PrintView)
else else
{ {
/***** Get number of centres *****/ /***** Get number of centres *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS,Hie_SYS,-1L,&NumCtrs)) if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumCtrs))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumCtrs = Ctr_GetNumCtrsInSys (); NumCtrs = Ctr_GetNumCtrsInSys ();
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,Hie_SYS,-1L,NumCtrs); FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumCtrs);
} }
/***** Number of countries, /***** Number of countries,
@ -364,11 +366,13 @@ static void SysCfg_NumCtys (void)
HTM_TD_Begin ("class=\"LB\""); HTM_TD_Begin ("class=\"LB\"");
Frm_StartFormGoTo (ActSeeCty); Frm_StartFormGoTo (ActSeeCty);
HTM_BUTTON_SUBMIT_Begin (Txt_Countries,"BT_LINK DAT",NULL); HTM_BUTTON_SUBMIT_Begin (Txt_Countries,"BT_LINK DAT",NULL);
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTYS,Hie_SYS,-1L,&NumCtys)) if (!FigCch_GetFigureFromCache (FigCch_NUM_CTYS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumCtys))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumCtys = Cty_GetNumCtysTotal (); NumCtys = Cty_GetNumCtysTotal ();
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS,Hie_SYS,-1L,NumCtys); FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumCtys);
} }
HTM_Unsigned (NumCtys); HTM_Unsigned (NumCtys);
HTM_BUTTON_End (); HTM_BUTTON_End ();
@ -395,11 +399,13 @@ static void SysCfg_NumInss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"DAT LB\""); HTM_TD_Begin ("class=\"DAT LB\"");
if (!FigCch_GetFigureFromCache (FigCch_NUM_INSS,Hie_SYS,-1L,&NumInss)) if (!FigCch_GetFigureFromCache (FigCch_NUM_INSS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumInss))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumInss = Ins_GetNumInssTotal (); NumInss = Ins_GetNumInssTotal ();
FigCch_UpdateFigureIntoCache (FigCch_NUM_INSS,Hie_SYS,-1L,NumInss); FigCch_UpdateFigureIntoCache (FigCch_NUM_INSS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumInss);
} }
HTM_Unsigned (NumInss); HTM_Unsigned (NumInss);
HTM_TD_End (); HTM_TD_End ();
@ -424,11 +430,13 @@ static void SysCfg_NumDegs (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"DAT LB\""); HTM_TD_Begin ("class=\"DAT LB\"");
if (!FigCch_GetFigureFromCache (FigCch_NUM_DEGS,Hie_SYS,-1L,&NumDegs)) if (!FigCch_GetFigureFromCache (FigCch_NUM_DEGS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumDegs))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumDegs = Deg_GetNumDegsTotal (); NumDegs = Deg_GetNumDegsTotal ();
FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,Hie_SYS,-1L,NumDegs); FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumDegs);
} }
HTM_Unsigned (NumDegs); HTM_Unsigned (NumDegs);
HTM_TD_End (); HTM_TD_End ();
@ -453,11 +461,13 @@ static void SysCfg_NumCrss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"DAT LB\""); HTM_TD_Begin ("class=\"DAT LB\"");
if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,Hie_SYS,-1L,&NumCrss)) if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumCrss))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumCrss = Crs_GetNumCrssTotal (); NumCrss = Crs_GetNumCrssTotal ();
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,Hie_SYS,-1L,NumCrss); FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,Hie_SYS,-1L,
FigCch_Type_UNSIGNED,&NumCrss);
} }
HTM_Unsigned (NumCrss); HTM_Unsigned (NumCrss);
HTM_TD_End (); HTM_TD_End ();
@ -499,7 +509,7 @@ static void SysCfg_NumUsrsInCrss (Rol_Role_t Role)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"DAT LB\""); HTM_TD_Begin ("class=\"DAT LB\"");
if (!FigCch_GetFigureFromCache (Figure[Role],Hie_SYS,-1L, if (!FigCch_GetFigureFromCache (Figure[Role],Hie_SYS,-1L,
&NumUsrsInCrss)) FigCch_Type_UNSIGNED,&NumUsrsInCrss))
{ {
// Not updated recently in cache ==> compute and update it in cache // Not updated recently in cache ==> compute and update it in cache
NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_SYS,-1L, NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_SYS,-1L,
@ -508,7 +518,7 @@ static void SysCfg_NumUsrsInCrss (Rol_Role_t Role)
(1 << Rol_TCH) : // Any user (1 << Rol_TCH) : // Any user
(1 << Role)); (1 << Role));
FigCch_UpdateFigureIntoCache (Figure[Role],Hie_SYS,-1L, FigCch_UpdateFigureIntoCache (Figure[Role],Hie_SYS,-1L,
NumUsrsInCrss); FigCch_Type_UNSIGNED,&NumUsrsInCrss);
} }
HTM_Unsigned (NumUsrsInCrss); HTM_Unsigned (NumUsrsInCrss);
HTM_TD_End (); HTM_TD_End ();

View File

@ -9434,14 +9434,14 @@ unsigned Usr_GetNumUsrsNotBelongingToAnyCrs (void)
/************ Get average number of courses with users of a role *************/ /************ Get average number of courses with users of a role *************/
/*****************************************************************************/ /*****************************************************************************/
double Usr_GetNumCrssPerUsr (Rol_Role_t Role) double Usr_GetNumCrssPerUsr (Hie_Level_t Scope,long Cod,Rol_Role_t Role)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
double NumCrssPerUsr; double NumCrssPerUsr;
/***** Get number of courses per user from database *****/ /***** Get number of courses per user from database *****/
switch (Gbl.Scope.Current) switch (Scope)
{ {
case Hie_SYS: case Hie_SYS:
if (Role == Rol_UNK) // Any user if (Role == Rol_UNK) // Any user
@ -9470,7 +9470,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Cty.CtyCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user", DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss) FROM " "SELECT AVG(NumCrss) FROM "
@ -9483,7 +9483,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Cty.CtyCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_INS: case Hie_INS:
@ -9497,7 +9497,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Ins.InsCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user", DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss) FROM " "SELECT AVG(NumCrss) FROM "
@ -9509,7 +9509,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Ins.InsCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_CTR: case Hie_CTR:
@ -9522,7 +9522,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Ctr.CtrCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user", DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss) FROM " "SELECT AVG(NumCrss) FROM "
@ -9533,7 +9533,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Ctr.CtrCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_DEG: case Hie_DEG:
@ -9545,7 +9545,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" WHERE courses.DegCod=%ld" " WHERE courses.DegCod=%ld"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Deg.DegCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user", DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss) FROM " "SELECT AVG(NumCrss) FROM "
@ -9555,7 +9555,7 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.UsrCod) AS NumCrssTable", " GROUP BY crs_usr.UsrCod) AS NumCrssTable",
Gbl.Hierarchy.Deg.DegCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_CRS: case Hie_CRS:
@ -9579,14 +9579,14 @@ double Usr_GetNumCrssPerUsr (Rol_Role_t Role)
/************ Get average number of courses with users of a type *************/ /************ Get average number of courses with users of a type *************/
/*****************************************************************************/ /*****************************************************************************/
double Usr_GetNumUsrsPerCrs (Rol_Role_t Role) double Usr_GetNumUsrsPerCrs (Hie_Level_t Scope,long Cod,Rol_Role_t Role)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
double NumUsrsPerCrs; double NumUsrsPerCrs;
/***** Get number of users per course from database *****/ /***** Get number of users per course from database *****/
switch (Gbl.Scope.Current) switch (Scope)
{ {
case Hie_SYS: case Hie_SYS:
if (Role == Rol_UNK) // Any user if (Role == Rol_UNK) // Any user
@ -9615,7 +9615,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Cty.CtyCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of users per course", DB_QuerySELECT (&mysql_res,"can not get number of users per course",
"SELECT AVG(NumUsrs) FROM " "SELECT AVG(NumUsrs) FROM "
@ -9628,7 +9628,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Cty.CtyCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_INS: case Hie_INS:
@ -9642,7 +9642,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Ins.InsCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of users per course", DB_QuerySELECT (&mysql_res,"can not get number of users per course",
"SELECT AVG(NumUsrs) FROM " "SELECT AVG(NumUsrs) FROM "
@ -9654,7 +9654,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Ins.InsCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_CTR: case Hie_CTR:
@ -9667,7 +9667,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Ctr.CtrCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of users per course", DB_QuerySELECT (&mysql_res,"can not get number of users per course",
"SELECT AVG(NumUsrs) FROM " "SELECT AVG(NumUsrs) FROM "
@ -9678,7 +9678,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Ctr.CtrCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_DEG: case Hie_DEG:
@ -9690,7 +9690,7 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" WHERE courses.DegCod=%ld" " WHERE courses.DegCod=%ld"
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Deg.DegCod); Cod);
else else
DB_QuerySELECT (&mysql_res,"can not get number of users per course", DB_QuerySELECT (&mysql_res,"can not get number of users per course",
"SELECT AVG(NumUsrs) FROM " "SELECT AVG(NumUsrs) FROM "
@ -9700,11 +9700,11 @@ double Usr_GetNumUsrsPerCrs (Rol_Role_t Role)
" AND courses.CrsCod=crs_usr.CrsCod" " AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role=%u" " AND crs_usr.Role=%u"
" GROUP BY crs_usr.CrsCod) AS NumUsrsTable", " GROUP BY crs_usr.CrsCod) AS NumUsrsTable",
Gbl.Hierarchy.Deg.DegCod, Cod,
(unsigned) Role); (unsigned) Role);
break; break;
case Hie_CRS: case Hie_CRS:
return (double) Usr_GetNumUsrsInCrss (Hie_CRS,Gbl.Hierarchy.Crs.CrsCod, return (double) Usr_GetNumUsrsInCrss (Hie_CRS,Cod,
Role == Rol_UNK ? 1 << Rol_STD | Role == Rol_UNK ? 1 << Rol_STD |
1 << Rol_NET | 1 << Rol_NET |
1 << Rol_TCH : // Any user 1 << Rol_TCH : // Any user

View File

@ -510,8 +510,8 @@ void Usr_ShowWarningNoUsersFound (Rol_Role_t Role);
unsigned Usr_GetTotalNumberOfUsersInPlatform (void); unsigned Usr_GetTotalNumberOfUsersInPlatform (void);
unsigned Usr_GetNumUsrsInCrss (Hie_Level_t Scope,long Cod,unsigned Roles); unsigned Usr_GetNumUsrsInCrss (Hie_Level_t Scope,long Cod,unsigned Roles);
unsigned Usr_GetNumUsrsNotBelongingToAnyCrs (void); unsigned Usr_GetNumUsrsNotBelongingToAnyCrs (void);
double Usr_GetNumCrssPerUsr (Rol_Role_t Role); double Usr_GetNumCrssPerUsr (Hie_Level_t Scope,long Cod,Rol_Role_t Role);
double Usr_GetNumUsrsPerCrs (Rol_Role_t Role); double Usr_GetNumUsrsPerCrs (Hie_Level_t Scope,long Cod,Rol_Role_t Role);
bool Usr_CheckIfUsrBanned (long UsrCod); bool Usr_CheckIfUsrBanned (long UsrCod);
void Usr_RemoveUsrFromUsrBanned (long UsrCod); void Usr_RemoveUsrFromUsrBanned (long UsrCod);