Version19.112.18

This commit is contained in:
Antonio Cañas Vargas 2020-01-07 13:14:42 +01:00
parent 6d0f193fd7
commit 4084329463
8 changed files with 158 additions and 82 deletions

View File

@ -492,7 +492,7 @@ 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.112.17 (2020-01-07)" #define Log_PLATFORM_VERSION "SWAD 19.112.18 (2020-01-07)"
#define CSS_FILE "swad19.112.css" #define CSS_FILE "swad19.112.css"
#define JS_FILE "swad19.91.1.js" #define JS_FILE "swad19.91.1.js"
/* /*
@ -502,6 +502,7 @@ ps2pdf source.ps destination.pdf
// TODO: Mapas más estrechos en móvil // TODO: Mapas más estrechos en móvil
// TODO: Quitar todos los EXTRA_DATA. // TODO: Quitar todos los EXTRA_DATA.
Version 19.112.18:Jan 07, 2020 Optimization in number of institutions in a country. (278668 lines)
Version 19.112.17:Jan 07, 2020 Optimization in number of institutions in a country. (278600 lines) Version 19.112.17:Jan 07, 2020 Optimization in number of institutions in a country. (278600 lines)
Version 19.112.16:Jan 07, 2020 Optimization in number of centres in an institution. (278576 lines) Version 19.112.16:Jan 07, 2020 Optimization in number of centres in an institution. (278576 lines)
Version 19.112.15:Jan 06, 2020 Optimization in number of degrees in an institution. (278567 lines) Version 19.112.15:Jan 06, 2020 Optimization in number of degrees in an institution. (278567 lines)

View File

@ -69,7 +69,6 @@ static void Cty_ListOneCountryForSeeing (struct Country *Cty,unsigned NumCty);
static void Cty_PutIconsListingCountries (void); static void Cty_PutIconsListingCountries (void);
static void Cty_PutIconToEditCountries (void); static void Cty_PutIconToEditCountries (void);
static unsigned Cty_GetNumUsrsWhoClaimToBelongToCty (long CtyCod);
static void Cty_GetParamCtyOrder (void); static void Cty_GetParamCtyOrder (void);
static void Cty_EditCountriesInternal (void); static void Cty_EditCountriesInternal (void);
@ -258,7 +257,7 @@ void Cty_ListCountries2 (void)
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\""); HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (Cty_GetNumUsrsWhoClaimToBelongToCty (0)); HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToAnotherCty ());
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\""); HTM_TD_Begin ("class=\"DAT RM\"");
@ -294,7 +293,7 @@ void Cty_ListCountries2 (void)
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\""); HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (Cty_GetNumUsrsWhoClaimToBelongToCty (-1L)); HTM_Unsigned (Usr_GetNumUsrsWhoDontClaimToBelongToAnyCty ());
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\""); HTM_TD_Begin ("class=\"DAT RM\"");
@ -417,7 +416,7 @@ static void Cty_ListOneCountryForSeeing (struct Country *Cty,unsigned NumCty)
/* Write stats of this country */ /* Write stats of this country */
HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor); HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor);
HTM_Unsigned (Cty->NumUsrsWhoClaimToBelongToCty); HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToCty (Cty));
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor); HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor);
@ -478,21 +477,6 @@ static void Cty_PutIconToEditCountries (void)
Ico_PutContextualIconToEdit (ActEdiCty,NULL); Ico_PutContextualIconToEdit (ActEdiCty,NULL);
} }
/*****************************************************************************/
/******** Get number of users who claim to belong to other countries *********/
/*****************************************************************************/
static unsigned Cty_GetNumUsrsWhoClaimToBelongToCty (long CtyCod)
{
/***** Get number of users from database *****/
return
(unsigned) DB_QueryCOUNT ("can not get number of users"
" who claim to belong to other countries",
"SELECT COUNT(*) FROM usr_data"
" WHERE CtyCod=%ld",
CtyCod);
}
/*****************************************************************************/ /*****************************************************************************/
/********************* Draw country map and name with link *******************/ /********************* Draw country map and name with link *******************/
/*****************************************************************************/ /*****************************************************************************/
@ -582,6 +566,7 @@ void Cty_WriteScriptGoogleGeochart (void)
extern const char *Txt_Users_NO_HTML; extern const char *Txt_Users_NO_HTML;
extern const char *Txt_Institutions_NO_HTML; extern const char *Txt_Institutions_NO_HTML;
unsigned NumCty; unsigned NumCty;
unsigned NumUsrsWhoClaimToBelongToCty;
unsigned MaxUsrsInCountry = 0; unsigned MaxUsrsInCountry = 0;
unsigned NumCtysWithUsrs = 0; unsigned NumCtysWithUsrs = 0;
@ -606,17 +591,20 @@ void Cty_WriteScriptGoogleGeochart (void)
for (NumCty = 0; for (NumCty = 0;
NumCty < Gbl.Hierarchy.Sys.Ctys.Num; NumCty < Gbl.Hierarchy.Sys.Ctys.Num;
NumCty++) NumCty++)
if (Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].NumUsrsWhoClaimToBelongToCty) {
NumUsrsWhoClaimToBelongToCty = Usr_GetNumUsrsWhoClaimToBelongToCty (&Gbl.Hierarchy.Sys.Ctys.Lst[NumCty]);
if (NumUsrsWhoClaimToBelongToCty)
{ {
/* Write data of this country */ /* Write data of this country */
HTM_TxtF (" ['%s', %u, %u],\n", HTM_TxtF (" ['%s', %u, %u],\n",
Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].Alpha2, Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].Alpha2,
Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].NumUsrsWhoClaimToBelongToCty, NumUsrsWhoClaimToBelongToCty,
Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].Inss.Num); Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].Inss.Num);
if (Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].NumUsrsWhoClaimToBelongToCty > MaxUsrsInCountry) if (NumUsrsWhoClaimToBelongToCty > MaxUsrsInCountry)
MaxUsrsInCountry = Gbl.Hierarchy.Sys.Ctys.Lst[NumCty].NumUsrsWhoClaimToBelongToCty; MaxUsrsInCountry = NumUsrsWhoClaimToBelongToCty;
NumCtysWithUsrs++; NumCtysWithUsrs++;
} }
}
/***** Write end of the script *****/ /***** Write end of the script *****/
HTM_TxtF (" ]);\n" HTM_TxtF (" ]);\n"
@ -855,7 +843,7 @@ void Cty_GetListCountries (Cty_GetExtraData_t GetExtraData)
Cty->Name[Lan][0] = '\0'; Cty->Name[Lan][0] = '\0';
Cty->WWW[Lan][0] = '\0'; Cty->WWW[Lan][0] = '\0';
} }
Cty->NumUsrsWhoClaimToBelongToCty = 0; Cty->NumUsrsWhoClaimToBelongToCty.Valid = false;
Cty->Inss.Num = Cty->NumCtrs = Cty->NumDegs = Cty->NumCrss = 0; Cty->Inss.Num = Cty->NumCtrs = Cty->NumDegs = Cty->NumCrss = 0;
Cty->NumUsrs = 0; Cty->NumUsrs = 0;
@ -877,8 +865,10 @@ void Cty_GetListCountries (Cty_GetExtraData_t GetExtraData)
/* Get number of users who claim to belong to this country */ /* Get number of users who claim to belong to this country */
if (sscanf (row[1 + Lan_NUM_LANGUAGES * 2 + 1],"%u", if (sscanf (row[1 + Lan_NUM_LANGUAGES * 2 + 1],"%u",
&Cty->NumUsrsWhoClaimToBelongToCty) != 1) &(Cty->NumUsrsWhoClaimToBelongToCty.NumUsrs)) == 1)
Cty->NumUsrsWhoClaimToBelongToCty = 0; Cty->NumUsrsWhoClaimToBelongToCty.Valid = true;
else
Cty->NumUsrsWhoClaimToBelongToCty.Valid = false;
/* Get number of centres in this country */ /* Get number of centres in this country */
Cty->NumCtrs = Ctr_GetNumCtrsInCty (Cty->CtyCod); Cty->NumCtrs = Ctr_GetNumCtrsInCty (Cty->CtyCod);
@ -1017,7 +1007,7 @@ bool Cty_GetDataOfCountryByCod (struct Country *Cty,Cty_GetExtraData_t GetExtraD
Cty->Name[Lan][0] = '\0'; Cty->Name[Lan][0] = '\0';
Cty->WWW[Lan][0] = '\0'; Cty->WWW[Lan][0] = '\0';
} }
Cty->NumUsrsWhoClaimToBelongToCty = 0; Cty->NumUsrsWhoClaimToBelongToCty.Valid = false;
Cty->Inss.Num = Cty->NumCtrs = Cty->NumDegs = Cty->NumCrss = 0; Cty->Inss.Num = Cty->NumCtrs = Cty->NumDegs = Cty->NumCrss = 0;
Cty->NumUsrs = 0; Cty->NumUsrs = 0;
@ -1059,39 +1049,31 @@ bool Cty_GetDataOfCountryByCod (struct Country *Cty,Cty_GetExtraData_t GetExtraD
Lan++) Lan++)
{ {
snprintf (StrField,sizeof (StrField), snprintf (StrField,sizeof (StrField),
"countries.Name_%s,", ",countries.Name_%s",
Lan_STR_LANG_ID[Lan]); Lan_STR_LANG_ID[Lan]);
Str_Concat (SubQueryNam1,StrField, Str_Concat (SubQueryNam1,StrField,
Cty_MAX_BYTES_SUBQUERY_CTYS); Cty_MAX_BYTES_SUBQUERY_CTYS);
snprintf (StrField,sizeof (StrField), snprintf (StrField,sizeof (StrField),
"Name_%s,", ",Name_%s",
Lan_STR_LANG_ID[Lan]); Lan_STR_LANG_ID[Lan]);
Str_Concat (SubQueryNam2,StrField, Str_Concat (SubQueryNam2,StrField,
Cty_MAX_BYTES_SUBQUERY_CTYS); Cty_MAX_BYTES_SUBQUERY_CTYS);
snprintf (StrField,sizeof (StrField), snprintf (StrField,sizeof (StrField),
"countries.WWW_%s,", ",countries.WWW_%s",
Lan_STR_LANG_ID[Lan]); Lan_STR_LANG_ID[Lan]);
Str_Concat (SubQueryWWW1,StrField, Str_Concat (SubQueryWWW1,StrField,
Cty_MAX_BYTES_SUBQUERY_CTYS); Cty_MAX_BYTES_SUBQUERY_CTYS);
snprintf (StrField,sizeof (StrField), snprintf (StrField,sizeof (StrField),
"WWW_%s,", ",WWW_%s",
Lan_STR_LANG_ID[Lan]); Lan_STR_LANG_ID[Lan]);
Str_Concat (SubQueryWWW2,StrField, Str_Concat (SubQueryWWW2,StrField,
Cty_MAX_BYTES_SUBQUERY_CTYS); Cty_MAX_BYTES_SUBQUERY_CTYS);
} }
NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a country", NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a country",
"(SELECT countries.Alpha2,%s%sCOUNT(*) AS NumUsrs" "SELECT Alpha2,%s%s"
" FROM countries,usr_data"
" WHERE countries.CtyCod='%03ld'"
" AND countries.CtyCod=usr_data.CtyCod)"
" UNION "
"(SELECT Alpha2,%s%s0 AS NumUsrs"
" FROM countries" " FROM countries"
" WHERE CtyCod='%03ld'" " WHERE CtyCod='%03ld'",
" AND CtyCod NOT IN"
" (SELECT DISTINCT CtyCod FROM usr_data))",
SubQueryNam1,SubQueryWWW1,Cty->CtyCod,
SubQueryNam2,SubQueryWWW2,Cty->CtyCod); SubQueryNam2,SubQueryWWW2,Cty->CtyCod);
break; break;
} }
@ -1129,11 +1111,6 @@ bool Cty_GetDataOfCountryByCod (struct Country *Cty,Cty_GetExtraData_t GetExtraD
Cns_MAX_BYTES_WWW); Cns_MAX_BYTES_WWW);
} }
/* Get number of users who claim to belong to this country */
if (sscanf (row[Lan_NUM_LANGUAGES * 2 + 1],"%u",
&Cty->NumUsrsWhoClaimToBelongToCty) != 1)
Cty->NumUsrsWhoClaimToBelongToCty = 0;
/* Get number of user in courses of this institution */ /* Get number of user in courses of this institution */
Cty->NumUsrs = Usr_GetNumUsrsInCrssOfCty (Rol_UNK,Cty->CtyCod); // Here Rol_UNK means "all users" Cty->NumUsrs = Usr_GetNumUsrsInCrssOfCty (Rol_UNK,Cty->CtyCod); // Here Rol_UNK means "all users"
@ -1235,7 +1212,7 @@ static void Cty_ListCountriesForEdition (void)
HTM_TABLE_BeginWidePadding (2); HTM_TABLE_BeginWidePadding (2);
Cty_PutHeadCountriesForEdition (); Cty_PutHeadCountriesForEdition ();
/***** Write all the countries *****/ /***** Write all countries *****/
for (NumCty = 0; for (NumCty = 0;
NumCty < Gbl.Hierarchy.Sys.Ctys.Num; NumCty < Gbl.Hierarchy.Sys.Ctys.Num;
NumCty++) NumCty++)
@ -1247,9 +1224,11 @@ static void Cty_ListCountriesForEdition (void)
/* Put icon to remove country */ /* Put icon to remove country */
HTM_TD_Begin ("rowspan=\"%u\" class=\"BT\"",1 + Lan_NUM_LANGUAGES); HTM_TD_Begin ("rowspan=\"%u\" class=\"BT\"",1 + Lan_NUM_LANGUAGES);
if (NumInssInCty || // Country has institutions if (NumInssInCty || // Country has institutions
Cty->NumUsrsWhoClaimToBelongToCty || Cty->NumUsrs) // Country has users
Cty->NumUsrs) // Country has users // Deletion forbidden
Ico_PutIconRemovalNotAllowed ();
else if (Usr_GetNumUsrsWhoClaimToBelongToCty (Cty)) // Country has users
// Deletion forbidden // Deletion forbidden
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else else
@ -1275,7 +1254,7 @@ static void Cty_ListCountriesForEdition (void)
/* Number of users */ /* Number of users */
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES); HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
HTM_Unsigned (Cty->NumUsrsWhoClaimToBelongToCty); HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToCty (Cty));
HTM_TD_End (); HTM_TD_End ();
/* Number of institutions */ /* Number of institutions */
@ -1383,11 +1362,13 @@ void Cty_RemoveCountry (void)
Cty_GetDataOfCountryByCod (Cty_EditingCty,Cty_GET_EXTRA_DATA); Cty_GetDataOfCountryByCod (Cty_EditingCty,Cty_GET_EXTRA_DATA);
/***** Check if this country has users *****/ /***** Check if this country has users *****/
if (Ins_GetNumInssInCty (Cty_EditingCty->CtyCod)) // Country has institutions ==> don't remove if (Ins_GetNumInssInCty (Cty_EditingCty->CtyCod)) // Country has institutions ==> don't remove
Ale_CreateAlert (Ale_WARNING,NULL, Ale_CreateAlert (Ale_WARNING,NULL,
Txt_You_can_not_remove_a_country_with_institutions_or_users); Txt_You_can_not_remove_a_country_with_institutions_or_users);
else if (Cty_EditingCty->NumUsrsWhoClaimToBelongToCty || else if (Cty_EditingCty->NumUsrs) // Country has users ==> don't remove
Cty_EditingCty->NumUsrs) // Country has users ==> don't remove Ale_CreateAlert (Ale_WARNING,NULL,
Txt_You_can_not_remove_a_country_with_institutions_or_users);
else if (Usr_GetNumUsrsWhoClaimToBelongToCty (Cty_EditingCty)) // Country has users ==> don't remove
Ale_CreateAlert (Ale_WARNING,NULL, Ale_CreateAlert (Ale_WARNING,NULL,
Txt_You_can_not_remove_a_country_with_institutions_or_users); Txt_You_can_not_remove_a_country_with_institutions_or_users);
else // Country has no users ==> remove it else // Country has no users ==> remove it
@ -2108,7 +2089,7 @@ static void Cty_EditingCountryConstructor (void)
Cty_EditingCty->NumDegs = 0; Cty_EditingCty->NumDegs = 0;
Cty_EditingCty->NumCrss = 0; Cty_EditingCty->NumCrss = 0;
Cty_EditingCty->NumUsrs = 0; Cty_EditingCty->NumUsrs = 0;
Cty_EditingCty->NumUsrsWhoClaimToBelongToCty = 0; Cty_EditingCty->NumUsrsWhoClaimToBelongToCty.Valid = false;
} }
static void Cty_EditingCountryDestructor (void) static void Cty_EditingCountryDestructor (void)

View File

@ -61,7 +61,11 @@ struct Country
unsigned NumDegs; unsigned NumDegs;
unsigned NumCrss; unsigned NumCrss;
unsigned NumUsrs; // Number of users in courses of the institution unsigned NumUsrs; // Number of users in courses of the institution
unsigned NumUsrsWhoClaimToBelongToCty; struct
{
bool Valid;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToCty;
}; };
#define Cty_NUM_ORDERS 2 #define Cty_NUM_ORDERS 2

View File

@ -459,7 +459,7 @@ static void CtyCfg_NumUsrs (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"DAT LB\""); HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToCty (Gbl.Hierarchy.Cty.CtyCod)); HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToCty (&Gbl.Hierarchy.Cty));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();

View File

@ -414,6 +414,8 @@ void Gbl_InitializeGlobals (void)
Crs_FlushCacheNumCrssInIns (); Crs_FlushCacheNumCrssInIns ();
Crs_FlushCacheNumCrssInCtr (); Crs_FlushCacheNumCrssInCtr ();
Crs_FlushCacheNumCrssInDeg (); Crs_FlushCacheNumCrssInDeg ();
Usr_FlushCacheNumUsrsWhoDontClaimToBelongToAnyCty ();
Usr_FlushCacheNumUsrsWhoClaimToBelongToAnotherCty ();
Usr_FlushCacheNumUsrsWhoClaimToBelongToIns (); Usr_FlushCacheNumUsrsWhoClaimToBelongToIns ();
Usr_FlushCacheNumUsrsWhoClaimToBelongToCtr (); Usr_FlushCacheNumUsrsWhoClaimToBelongToCtr ();
Usr_FlushCacheNumUsrsInCrssOfIns (); Usr_FlushCacheNumUsrsInCrssOfIns ();

View File

@ -813,6 +813,21 @@ struct Globals
long DegCod; long DegCod;
unsigned NumCrss; unsigned NumCrss;
} NumCrssInDeg; } NumCrssInDeg;
struct
{
bool Valid;
unsigned NumUsrs;
} NumUsrsWhoDontClaimToBelongToAnyCty;
struct
{
bool Valid;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToAnotherCty;
struct
{
long CtyCod;
unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToCty;
struct struct
{ {
long InsCod; long InsCod;

View File

@ -1177,7 +1177,7 @@ unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole,
Usr_MAX_BYTES_ROLES_STR); Usr_MAX_BYTES_ROLES_STR);
} }
NumUsrs = NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users", (unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM crs_usr,usr_courses_tmp" " FROM crs_usr,usr_courses_tmp"
" WHERE crs_usr.CrsCod=usr_courses_tmp.CrsCod" " WHERE crs_usr.CrsCod=usr_courses_tmp.CrsCod"
@ -4206,13 +4206,13 @@ unsigned Usr_GetNumUsrsInCrs (Rol_Role_t Role,long CrsCod)
Gbl.Cache.NumUsrsInCrs[Role].CrsCod = CrsCod; Gbl.Cache.NumUsrsInCrs[Role].CrsCod = CrsCod;
if (Role == Rol_UNK) if (Role == Rol_UNK)
Gbl.Cache.NumUsrsInCrs[Rol_UNK].NumUsrs = Gbl.Cache.NumUsrsInCrs[Rol_UNK].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users in a course", (unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(*) FROM crs_usr" "SELECT COUNT(*) FROM crs_usr"
" WHERE CrsCod=%ld", " WHERE CrsCod=%ld",
CrsCod); CrsCod);
else else
Gbl.Cache.NumUsrsInCrs[Role].NumUsrs = Gbl.Cache.NumUsrsInCrs[Role].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users in a course", (unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(*) FROM crs_usr" "SELECT COUNT(*) FROM crs_usr"
" WHERE CrsCod=%ld AND Role=%u", " WHERE CrsCod=%ld AND Role=%u",
CrsCod,(unsigned) Role); CrsCod,(unsigned) Role);
@ -4263,7 +4263,7 @@ unsigned Usr_GetNumUsrsInCrssOfDeg (Rol_Role_t Role,long DegCod)
Gbl.Cache.NumUsrsInCrssOfDeg[Role].DegCod = DegCod; Gbl.Cache.NumUsrsInCrssOfDeg[Role].DegCod = DegCod;
if (Role == Rol_UNK) // Any user if (Role == Rol_UNK) // Any user
Gbl.Cache.NumUsrsInCrssOfDeg[Rol_UNK].NumUsrs = Gbl.Cache.NumUsrsInCrssOfDeg[Rol_UNK].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users"
" in courses of a degree", " in courses of a degree",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM courses,crs_usr" " FROM courses,crs_usr"
@ -4272,7 +4272,7 @@ unsigned Usr_GetNumUsrsInCrssOfDeg (Rol_Role_t Role,long DegCod)
DegCod); DegCod);
else else
Gbl.Cache.NumUsrsInCrssOfDeg[Role].NumUsrs = Gbl.Cache.NumUsrsInCrssOfDeg[Role].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users"
" in courses of a degree", " in courses of a degree",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM courses,crs_usr" " FROM courses,crs_usr"
@ -4328,7 +4328,7 @@ unsigned Usr_GetNumUsrsInCrssOfCtr (Rol_Role_t Role,long CtrCod)
Gbl.Cache.NumUsrsInCrssOfCtr[Role].CtrCod = CtrCod; Gbl.Cache.NumUsrsInCrssOfCtr[Role].CtrCod = CtrCod;
if (Role == Rol_UNK) // Any user if (Role == Rol_UNK) // Any user
Gbl.Cache.NumUsrsInCrssOfCtr[Rol_UNK].NumUsrs = Gbl.Cache.NumUsrsInCrssOfCtr[Rol_UNK].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users"
" in courses of a centre", " in courses of a centre",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM degrees,courses,crs_usr" " FROM degrees,courses,crs_usr"
@ -4340,7 +4340,7 @@ unsigned Usr_GetNumUsrsInCrssOfCtr (Rol_Role_t Role,long CtrCod)
// This query is very slow. // This query is very slow.
// It's a bad idea to get number of teachers or students for a big list of centres // It's a bad idea to get number of teachers or students for a big list of centres
Gbl.Cache.NumUsrsInCrssOfCtr[Role].NumUsrs = Gbl.Cache.NumUsrsInCrssOfCtr[Role].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users"
" in courses of a centre", " in courses of a centre",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM degrees,courses,crs_usr" " FROM degrees,courses,crs_usr"
@ -4397,8 +4397,7 @@ unsigned Usr_GetNumUsrsInCrssOfIns (Rol_Role_t Role,long InsCod)
Gbl.Cache.NumUsrsInCrssOfIns[Role].InsCod = InsCod; Gbl.Cache.NumUsrsInCrssOfIns[Role].InsCod = InsCod;
if (Role == Rol_UNK) // Any user if (Role == Rol_UNK) // Any user
Gbl.Cache.NumUsrsInCrssOfIns[Rol_UNK].NumUsrs = Gbl.Cache.NumUsrsInCrssOfIns[Rol_UNK].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users",
" in courses of an institution",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM centres,degrees,courses,crs_usr" " FROM centres,degrees,courses,crs_usr"
" WHERE centres.InsCod=%ld" " WHERE centres.InsCod=%ld"
@ -4410,8 +4409,7 @@ unsigned Usr_GetNumUsrsInCrssOfIns (Rol_Role_t Role,long InsCod)
// This query is very slow. // This query is very slow.
// It's a bad idea to get number of teachers or students for a big list of institutions // It's a bad idea to get number of teachers or students for a big list of institutions
Gbl.Cache.NumUsrsInCrssOfIns[Role].NumUsrs = Gbl.Cache.NumUsrsInCrssOfIns[Role].NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users",
" in courses of an institution",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM centres,degrees,courses,crs_usr" " FROM centres,degrees,courses,crs_usr"
" WHERE centres.InsCod=%ld" " WHERE centres.InsCod=%ld"
@ -4435,8 +4433,7 @@ unsigned Usr_GetNumUsrsInCrssOfCty (Rol_Role_t Role,long CtyCod)
/***** Get the number of users in courses of a country from database ******/ /***** Get the number of users in courses of a country from database ******/
if (Role == Rol_UNK) // Any user if (Role == Rol_UNK) // Any user
NumUsrs = NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users",
" in courses of a country",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM institutions,centres,degrees,courses,crs_usr" " FROM institutions,centres,degrees,courses,crs_usr"
" WHERE institutions.CtyCod=%ld" " WHERE institutions.CtyCod=%ld"
@ -4449,8 +4446,7 @@ unsigned Usr_GetNumUsrsInCrssOfCty (Rol_Role_t Role,long CtyCod)
// This query is very slow. // This query is very slow.
// It's a bad idea to get number of teachers or students for a big list of countries // It's a bad idea to get number of teachers or students for a big list of countries
NumUsrs = NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users",
" in courses of a country",
"SELECT COUNT(DISTINCT crs_usr.UsrCod)" "SELECT COUNT(DISTINCT crs_usr.UsrCod)"
" FROM institutions,centres,degrees,courses,crs_usr" " FROM institutions,centres,degrees,courses,crs_usr"
" WHERE institutions.CtyCod=%ld" " WHERE institutions.CtyCod=%ld"
@ -4544,18 +4540,91 @@ unsigned Usr_GetNumTchsCurrentInsInDepartment (long DptCod)
(unsigned) Rol_NET,(unsigned) Rol_TCH); (unsigned) Rol_NET,(unsigned) Rol_TCH);
} }
/*****************************************************************************/
/******* Get number of users who don't claim to belong to any country ********/
/*****************************************************************************/
void Usr_FlushCacheNumUsrsWhoDontClaimToBelongToAnyCty (void)
{
Gbl.Cache.NumUsrsWhoDontClaimToBelongToAnyCty.Valid = false;
}
unsigned Usr_GetNumUsrsWhoDontClaimToBelongToAnyCty (void)
{
/***** 1. Fast check: If cached... *****/
if (Gbl.Cache.NumUsrsWhoDontClaimToBelongToAnyCty.Valid)
return Gbl.Cache.NumUsrsWhoDontClaimToBelongToAnyCty.NumUsrs;
/***** 2. Slow: number of users who don't claim to belong to any country
from database *****/
Gbl.Cache.NumUsrsWhoDontClaimToBelongToAnyCty.NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(UsrCod) FROM usr_data"
" WHERE CtyCod<0");
Gbl.Cache.NumUsrsWhoDontClaimToBelongToAnyCty.Valid = true;
return Gbl.Cache.NumUsrsWhoDontClaimToBelongToAnyCty.NumUsrs;
}
/*****************************************************************************/
/******** Get number of users who claim to belong to another country *********/
/*****************************************************************************/
void Usr_FlushCacheNumUsrsWhoClaimToBelongToAnotherCty (void)
{
Gbl.Cache.NumUsrsWhoClaimToBelongToAnotherCty.Valid = false;
}
unsigned Usr_GetNumUsrsWhoClaimToBelongToAnotherCty (void)
{
/***** 1. Fast check: If cached... *****/
if (Gbl.Cache.NumUsrsWhoClaimToBelongToAnotherCty.Valid)
return Gbl.Cache.NumUsrsWhoClaimToBelongToAnotherCty.NumUsrs;
/***** 2. Slow: number of users who claim to belong to another country
from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToAnotherCty.NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(UsrCod) FROM usr_data"
" WHERE CtyCod=0");
Gbl.Cache.NumUsrsWhoClaimToBelongToAnotherCty.Valid = true;
return Gbl.Cache.NumUsrsWhoClaimToBelongToAnotherCty.NumUsrs;
}
/*****************************************************************************/ /*****************************************************************************/
/*********** Get number of users who claim to belong to a country ************/ /*********** Get number of users who claim to belong to a country ************/
/*****************************************************************************/ /*****************************************************************************/
unsigned Usr_GetNumUsrsWhoClaimToBelongToCty (long CtyCod) void Usr_FlushCacheNumUsrsWhoClaimToBelongToCty (void)
{ {
/***** Get the number of users in a country from database *****/ Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod = -1L;
return Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs = 0;
(unsigned) DB_QueryCOUNT ("can not get the number of users in a country", }
unsigned Usr_GetNumUsrsWhoClaimToBelongToCty (struct Country *Cty)
{
/***** 1. Fast check: Trivial case *****/
if (Cty->CtyCod <= 0)
return 0;
/***** 2. Fast check: If cached... *****/
if (Cty->CtyCod == Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod)
{
Cty->NumUsrsWhoClaimToBelongToCty.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs;
Cty->NumUsrsWhoClaimToBelongToCty.Valid = true;
return Cty->NumUsrsWhoClaimToBelongToCty.NumUsrs;
}
/***** 3. Slow: number of users who claim to belong to an institution
from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod = Cty->CtyCod;
Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs =
Cty->NumUsrsWhoClaimToBelongToCty.NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(UsrCod) FROM usr_data" "SELECT COUNT(UsrCod) FROM usr_data"
" WHERE CtyCod=%ld", " WHERE CtyCod=%ld",
CtyCod); Cty->CtyCod);
Cty->NumUsrsWhoClaimToBelongToCty.Valid = true;
return Cty->NumUsrsWhoClaimToBelongToCty.NumUsrs;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -4582,8 +4651,7 @@ unsigned Usr_GetNumUsrsWhoClaimToBelongToIns (long InsCod)
from database *****/ from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToIns.InsCod = InsCod; Gbl.Cache.NumUsrsWhoClaimToBelongToIns.InsCod = InsCod;
Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users" (unsigned) DB_QueryCOUNT ("can not get number of users",
" in an institution",
"SELECT COUNT(UsrCod) FROM usr_data" "SELECT COUNT(UsrCod) FROM usr_data"
" WHERE InsCod=%ld", " WHERE InsCod=%ld",
InsCod); InsCod);
@ -4614,7 +4682,7 @@ unsigned Usr_GetNumUsrsWhoClaimToBelongToCtr (long CtrCod)
from database *****/ from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.CtrCod = CtrCod; Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.CtrCod = CtrCod;
Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs =
(unsigned) DB_QueryCOUNT ("can not get the number of users in a centre", (unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(UsrCod) FROM usr_data" "SELECT COUNT(UsrCod) FROM usr_data"
" WHERE CtrCod=%ld", " WHERE CtrCod=%ld",
CtrCod); CtrCod);

View File

@ -31,6 +31,7 @@
#include "swad_action.h" #include "swad_action.h"
#include "swad_constant.h" #include "swad_constant.h"
#include "swad_country.h"
#include "swad_cryptography.h" #include "swad_cryptography.h"
#include "swad_date.h" #include "swad_date.h"
#include "swad_degree.h" #include "swad_degree.h"
@ -421,7 +422,11 @@ long Usr_GetRamdomStdFromCrs (long CrsCod);
long Usr_GetRamdomStdFromGrp (long GrpCod); long Usr_GetRamdomStdFromGrp (long GrpCod);
unsigned Usr_GetNumTchsCurrentInsInDepartment (long DptCod); unsigned Usr_GetNumTchsCurrentInsInDepartment (long DptCod);
unsigned Usr_GetNumUsrsWhoClaimToBelongToCty (long CtyCod); void Usr_FlushCacheNumUsrsWhoDontClaimToBelongToAnyCty (void);
unsigned Usr_GetNumUsrsWhoDontClaimToBelongToAnyCty (void);
void Usr_FlushCacheNumUsrsWhoClaimToBelongToAnotherCty (void);
unsigned Usr_GetNumUsrsWhoClaimToBelongToAnotherCty (void);
unsigned Usr_GetNumUsrsWhoClaimToBelongToCty (struct Country *Cty);
void Usr_FlushCacheNumUsrsWhoClaimToBelongToIns (void); void Usr_FlushCacheNumUsrsWhoClaimToBelongToIns (void);
unsigned Usr_GetNumUsrsWhoClaimToBelongToIns (long InsCod); unsigned Usr_GetNumUsrsWhoClaimToBelongToIns (long InsCod);
void Usr_FlushCacheNumUsrsWhoClaimToBelongToCtr (void); void Usr_FlushCacheNumUsrsWhoClaimToBelongToCtr (void);