Version 20.58: Apr 06, 2021 Optimizations in database selects.

This commit is contained in:
acanas 2021-04-06 22:34:23 +02:00
parent db17a4465c
commit 364b133b28
8 changed files with 597 additions and 665 deletions

View File

@ -600,13 +600,14 @@ TODO: Salvador Romero Cort
TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria.
*/
#define Log_PLATFORM_VERSION "SWAD 20.57 (2021-04-05)"
#define Log_PLATFORM_VERSION "SWAD 20.58 (2021-04-06)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.6.2.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.58: Apr 06, 2021 Optimizations in database selects. (308989 lines)
Version 20.57: Apr 05, 2021 Optimizations in database selects. (309041 lines)
Version 20.56.1: Apr 04, 2021 Optimizations in database selects. (309252 lines)
Version 20.56: Apr 04, 2021 Optimizations in database selects. (309296 lines)

View File

@ -3836,6 +3836,42 @@ long DB_QuerySELECTCode (const char *MsgError,
return Cod;
}
/*****************************************************************************/
/**** Make a SELECT query for a unique row with one double from database *****/
/*****************************************************************************/
double DB_QuerySELECTDouble (const char *MsgError,
const char *fmt,...)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
va_list ap;
int NumBytesPrinted;
char *Query;
double DoubleNum;
/***** Create query string *****/
va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Query,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // -1 if no memory or any other error
Lay_NotEnoughMemoryExit ();
/***** Do SELECT query *****/
if (DB_QuerySELECTusingQueryStr (Query,&mysql_res,MsgError)) // Row found
{
row = mysql_fetch_row (mysql_res);
DoubleNum = Str_GetDoubleFromStr (row[0]);
}
else
DoubleNum = 0.0;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return DoubleNum;
}
/*****************************************************************************/
/*********** Make a SELECT query from database using query string ************/
/*****************************************************************************/

View File

@ -43,6 +43,8 @@ unsigned long DB_QuerySELECT (MYSQL_RES **mysql_res,const char *MsgError,
const char *fmt,...);
long DB_QuerySELECTCode (const char *MsgError,
const char *fmt,...);
double DB_QuerySELECTDouble (const char *MsgError,
const char *fmt,...);
long DB_GetNextCode (MYSQL_RES *mysql_res);
unsigned long DB_GetNumRowsTable (const char *Table);
unsigned long DB_QueryCOUNT (const char *MsgError,const char *fmt,...);

View File

@ -2040,25 +2040,20 @@ unsigned Exa_GetNumExams (Hie_Lvl_Level_t Scope)
double Exa_GetNumQstsPerCrsExam (Hie_Lvl_Level_t Scope)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
double NumQstsPerExam;
/***** Get number of questions per exam from database *****/
switch (Scope)
{
case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of questions per exam",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per exam",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(exa_set_questions.QstCod) AS NumQsts"
" FROM exa_exams,"
"exa_set_questions"
" WHERE exa_exams.ExaCod=exa_set_questions.ExaCod"
" GROUP BY exa_set_questions.ExaCod) AS NumQstsTable");
break;
case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of questions per exam",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per exam",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(exa_set_questions.QstCod) AS NumQsts"
" FROM ins_instits,"
"ctr_centers,"
@ -2074,10 +2069,9 @@ double Exa_GetNumQstsPerCrsExam (Hie_Lvl_Level_t Scope)
" AND exa_exams.ExaCod=exa_set_questions.ExaCod"
" GROUP BY exa_set_questions.ExaCod) AS NumQstsTable",
Gbl.Hierarchy.Cty.CtyCod);
break;
case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of questions per exam",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per exam",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(exa_set_questions.QstCod) AS NumQsts"
" FROM ctr_centers,"
"deg_degrees,"
@ -2091,10 +2085,9 @@ double Exa_GetNumQstsPerCrsExam (Hie_Lvl_Level_t Scope)
" AND exa_exams.ExaCod=exa_set_questions.ExaCod"
" GROUP BY exa_set_questions.ExaCod) AS NumQstsTable",
Gbl.Hierarchy.Ins.InsCod);
break;
case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of questions per exam",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per exam",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(exa_set_questions.QstCod) AS NumQsts"
" FROM deg_degrees,"
"crs_courses,"
@ -2106,10 +2099,9 @@ double Exa_GetNumQstsPerCrsExam (Hie_Lvl_Level_t Scope)
" AND exa_exams.ExaCod=exa_set_questions.ExaCod"
" GROUP BY exa_set_questions.ExaCod) AS NumQstsTable",
Gbl.Hierarchy.Ctr.CtrCod);
break;
case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of questions per exam",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per exam",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(exa_set_questions.QstCod) AS NumQsts"
" FROM crs_courses,"
"exa_exams,"
@ -2119,10 +2111,9 @@ double Exa_GetNumQstsPerCrsExam (Hie_Lvl_Level_t Scope)
" AND exa_exams.ExaCod=exa_set_questions.ExaCod"
" GROUP BY exa_set_questions.ExaCod) AS NumQstsTable",
Gbl.Hierarchy.Deg.DegCod);
break;
case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of questions per exam",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per exam",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(exa_set_questions.QstCod) AS NumQsts"
" FROM exa_exams,"
"exa_set_questions"
@ -2130,20 +2121,10 @@ double Exa_GetNumQstsPerCrsExam (Hie_Lvl_Level_t Scope)
" AND exa_exams.ExaCod=exa_set_questions.ExaCod"
" GROUP BY exa_set_questions.ExaCod) AS NumQstsTable",
Gbl.Hierarchy.Crs.CrsCod);
break;
default:
Lay_WrongScopeExit ();
break;
return 0.0; // Not reached
}
/***** Get average number of questions per exam *****/
row = mysql_fetch_row (mysql_res);
NumQstsPerExam = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumQstsPerExam;
}
/*****************************************************************************/

View File

@ -3895,8 +3895,6 @@ static void Fig_GetAndShowFollowStats (void)
"FollowedCod",
"FollowerCod"
};
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned Fol;
unsigned NumUsrsTotal;
unsigned NumUsrs;
@ -4048,7 +4046,7 @@ static void Fig_GetAndShowFollowStats (void)
switch (Gbl.Scope.Current)
{
case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
Average = DB_QuerySELECTDouble ("can not get number of questions"
" per survey",
"SELECT AVG(N)" // row[0]
" FROM (SELECT COUNT(%s) AS N"
@ -4058,7 +4056,7 @@ static void Fig_GetAndShowFollowStats (void)
FieldDB[1 - Fol]);
break;
case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
Average = DB_QuerySELECTDouble ("can not get number of questions"
" per survey",
"SELECT AVG(N)" // row[0]
" FROM (SELECT COUNT(DISTINCT usr_follow.%s) AS N"
@ -4081,7 +4079,7 @@ static void Fig_GetAndShowFollowStats (void)
FieldDB[1 - Fol]);
break;
case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
Average = DB_QuerySELECTDouble ("can not get number of questions"
" per survey",
"SELECT AVG(N)" // row[0]
" FROM (SELECT COUNT(DISTINCT usr_follow.%s) AS N"
@ -4102,7 +4100,7 @@ static void Fig_GetAndShowFollowStats (void)
FieldDB[1 - Fol]);
break;
case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
Average = DB_QuerySELECTDouble ("can not get number of questions"
" per survey",
"SELECT AVG(N)" // row[0]
" FROM (SELECT COUNT(DISTINCT usr_follow.%s) AS N"
@ -4121,7 +4119,7 @@ static void Fig_GetAndShowFollowStats (void)
FieldDB[1 - Fol]);
break;
case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
Average = DB_QuerySELECTDouble ("can not get number of questions"
" per survey",
"SELECT AVG(N)" // row[0]
" FROM (SELECT COUNT(DISTINCT usr_follow.%s) AS N"
@ -4138,7 +4136,7 @@ static void Fig_GetAndShowFollowStats (void)
FieldDB[1 - Fol]);
break;
case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
Average = DB_QuerySELECTDouble ("can not get number of questions"
" per survey",
"SELECT AVG(N)" // row[0]
" FROM (SELECT COUNT(DISTINCT usr_follow.%s) AS N"
@ -4154,16 +4152,10 @@ static void Fig_GetAndShowFollowStats (void)
break;
default:
Lay_WrongScopeExit ();
Average = 0.0; // Not reached
break;
}
/***** Get average *****/
row = mysql_fetch_row (mysql_res);
Average = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** Write number of followed per follower *****/
HTM_TR_Begin (NULL);

View File

@ -2817,25 +2817,20 @@ unsigned Gam_GetNumGames (Hie_Lvl_Level_t Scope)
double Gam_GetNumQstsPerCrsGame (Hie_Lvl_Level_t Scope)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
double NumQstsPerGame;
/***** Get number of questions per game from database *****/
switch (Scope)
{
case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of questions per game",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per game",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(gam_questions.QstCod) AS NumQsts"
" FROM gam_games,"
"gam_questions"
" WHERE gam_games.GamCod=gam_questions.GamCod"
" GROUP BY gam_questions.GamCod) AS NumQstsTable");
break;
case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of questions per game",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per game",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(gam_questions.QstCod) AS NumQsts"
" FROM ins_instits,"
"ctr_centers,"
@ -2851,10 +2846,9 @@ double Gam_GetNumQstsPerCrsGame (Hie_Lvl_Level_t Scope)
" AND gam_games.GamCod=gam_questions.GamCod"
" GROUP BY gam_questions.GamCod) AS NumQstsTable",
Gbl.Hierarchy.Cty.CtyCod);
break;
case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of questions per game",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per game",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(gam_questions.QstCod) AS NumQsts"
" FROM ctr_centers,"
"deg_degrees,"
@ -2868,10 +2862,9 @@ double Gam_GetNumQstsPerCrsGame (Hie_Lvl_Level_t Scope)
" AND gam_games.GamCod=gam_questions.GamCod"
" GROUP BY gam_questions.GamCod) AS NumQstsTable",
Gbl.Hierarchy.Ins.InsCod);
break;
case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of questions per game",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per game",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(gam_questions.QstCod) AS NumQsts"
" FROM deg_degrees,"
"crs_courses,"
@ -2883,10 +2876,9 @@ double Gam_GetNumQstsPerCrsGame (Hie_Lvl_Level_t Scope)
" AND gam_games.GamCod=gam_questions.GamCod"
" GROUP BY gam_questions.GamCod) AS NumQstsTable",
Gbl.Hierarchy.Ctr.CtrCod);
break;
case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of questions per game",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per game",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(gam_questions.QstCod) AS NumQsts"
" FROM crs_courses,"
"gam_games,"
@ -2896,10 +2888,9 @@ double Gam_GetNumQstsPerCrsGame (Hie_Lvl_Level_t Scope)
" AND gam_games.GamCod=gam_questions.GamCod"
" GROUP BY gam_questions.GamCod) AS NumQstsTable",
Gbl.Hierarchy.Deg.DegCod);
break;
case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of questions per game",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per game",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(gam_questions.QstCod) AS NumQsts"
" FROM gam_games,"
"gam_questions"
@ -2907,20 +2898,10 @@ double Gam_GetNumQstsPerCrsGame (Hie_Lvl_Level_t Scope)
" AND gam_games.GamCod=gam_questions.GamCod"
" GROUP BY gam_questions.GamCod) AS NumQstsTable",
Gbl.Hierarchy.Crs.CrsCod);
break;
default:
Lay_WrongScopeExit ();
break;
return 0.0; // Not reached
}
/***** Get average number of questions per game *****/
row = mysql_fetch_row (mysql_res);
NumQstsPerGame = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumQstsPerGame;
}
/*****************************************************************************/

View File

@ -4131,17 +4131,12 @@ unsigned Svy_GetNumCrsSurveys (Hie_Lvl_Level_t Scope,unsigned *NumNotif)
double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
double NumQstsPerSurvey;
/***** Get number of questions per survey from database *****/
switch (Scope)
{
case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
" per survey",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per survey",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(svy_questions.QstCod) AS NumQsts"
" FROM svy_surveys,"
"svy_questions"
@ -4149,11 +4144,9 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
" AND svy_surveys.SvyCod=svy_questions.SvyCod"
" GROUP BY svy_questions.SvyCod) AS NumQstsTable",
Sco_GetDBStrFromScope (Hie_Lvl_CRS));
break;
case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
" per survey",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per survey",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(svy_questions.QstCod) AS NumQsts"
" FROM ins_instits,"
"ctr_centers,"
@ -4171,11 +4164,9 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
" GROUP BY svy_questions.SvyCod) AS NumQstsTable",
Gbl.Hierarchy.Cty.CtyCod,
Sco_GetDBStrFromScope (Hie_Lvl_CRS));
break;
case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
" per survey",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per survey",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(svy_questions.QstCod) AS NumQsts"
" FROM ctr_centers,"
"deg_degrees,"
@ -4191,11 +4182,9 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
" GROUP BY svy_questions.SvyCod) AS NumQstsTable",
Gbl.Hierarchy.Ins.InsCod,
Sco_GetDBStrFromScope (Hie_Lvl_CRS));
break;
case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
" per survey",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per survey",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(svy_questions.QstCod) AS NumQsts"
" FROM deg_degrees,"
"crs_courses,"
@ -4209,11 +4198,9 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
" GROUP BY svy_questions.SvyCod) AS NumQstsTable",
Gbl.Hierarchy.Ctr.CtrCod,
Sco_GetDBStrFromScope (Hie_Lvl_CRS));
break;
case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
" per survey",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per survey",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(svy_questions.QstCod) AS NumQsts"
" FROM crs_courses,"
"svy_surveys,"
@ -4225,11 +4212,9 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
" GROUP BY svy_questions.SvyCod) AS NumQstsTable",
Gbl.Hierarchy.Deg.DegCod,
Sco_GetDBStrFromScope (Hie_Lvl_CRS));
break;
case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of questions"
" per survey",
"SELECT AVG(NumQsts)" // row[0]
return DB_QuerySELECTDouble ("can not get number of questions per survey",
"SELECT AVG(NumQsts)"
" FROM (SELECT COUNT(svy_questions.QstCod) AS NumQsts"
" FROM svy_surveys,"
"svy_questions"
@ -4238,18 +4223,8 @@ double Svy_GetNumQstsPerCrsSurvey (Hie_Lvl_Level_t Scope)
" AND svy_surveys.SvyCod=svy_questions.SvyCod"
" GROUP BY svy_questions.SvyCod) AS NumQstsTable",
Sco_GetDBStrFromScope (Hie_Lvl_CRS),Gbl.Hierarchy.Crs.CrsCod);
break;
default:
Lay_WrongScopeExit ();
break;
return 0.0; // Not reached
}
/***** Get average number of questions per survey *****/
row = mysql_fetch_row (mysql_res);
NumQstsPerSurvey = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumQstsPerSurvey;
}

View File

@ -9708,33 +9708,28 @@ unsigned Usr_GetCachedNumUsrsNotBelongingToAnyCrs (void)
static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Role)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
double NumCrssPerUsr;
/***** Get number of courses per user from database *****/
switch (Scope)
{
case Hie_Lvl_SYS:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)"
" FROM (SELECT COUNT(CrsCod) AS NumCrss"
" FROM crs_users"
" GROUP BY UsrCod) AS NumCrssTable");
else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)"
" FROM (SELECT COUNT(CrsCod) AS NumCrss"
" FROM crs_users"
" WHERE Role=%u"
" GROUP BY UsrCod) AS NumCrssTable",
(unsigned) Role);
break;
case Hie_Lvl_CTY:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)"
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM ins_instits,"
"ctr_centers,"
@ -9749,7 +9744,7 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM ins_instits,"
@ -9766,10 +9761,9 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_INS:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM ctr_centers,"
@ -9783,7 +9777,7 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM ctr_centers,"
@ -9798,10 +9792,9 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_CTR:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM deg_degrees,"
@ -9813,7 +9806,7 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM deg_degrees,"
@ -9826,10 +9819,9 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_DEG:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM crs_courses,"
@ -9839,7 +9831,7 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of courses per user",
return DB_QuerySELECTDouble ("can not get number of courses per user",
"SELECT AVG(NumCrss)" // row[0]
" FROM (SELECT COUNT(crs_users.CrsCod) AS NumCrss"
" FROM crs_courses,"
@ -9850,22 +9842,12 @@ static double Usr_GetNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.UsrCod) AS NumCrssTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_CRS:
return 1.0;
default:
Lay_WrongScopeExit ();
break;
return 0.0; // Not reached
}
/***** Get averga number of courses per user *****/
row = mysql_fetch_row (mysql_res);
NumCrssPerUsr = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumCrssPerUsr;
}
double Usr_GetCachedNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Role)
@ -9898,31 +9880,26 @@ double Usr_GetCachedNumCrssPerUsr (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Rol
static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Role)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
double NumUsrsPerCrs;
/***** Get number of users per course from database *****/
switch (Scope)
{
case Hie_Lvl_SYS:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(UsrCod) AS NumUsrs"
" FROM crs_users"
" GROUP BY CrsCod) AS NumUsrsTable");
else
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(UsrCod) AS NumUsrs"
" FROM crs_users"
" WHERE Role=%u GROUP BY CrsCod) AS NumUsrsTable",
(unsigned) Role);
break;
case Hie_Lvl_CTY:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM ins_instits,"
@ -9938,7 +9915,7 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM ins_instits,"
@ -9955,10 +9932,9 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_INS:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM ctr_centers,"
@ -9972,7 +9948,7 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM ctr_centers,"
@ -9987,10 +9963,9 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_CTR:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM deg_degrees,"
@ -10002,7 +9977,7 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM deg_degrees,"
@ -10015,10 +9990,9 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_DEG:
if (Role == Rol_UNK) // Any user
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM crs_courses,"
@ -10028,7 +10002,7 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod);
else
DB_QuerySELECT (&mysql_res,"can not get number of users per course",
return DB_QuerySELECTDouble ("can not get number of users per course",
"SELECT AVG(NumUsrs)" // row[0]
" FROM (SELECT COUNT(crs_users.UsrCod) AS NumUsrs"
" FROM crs_courses,"
@ -10039,7 +10013,6 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
" GROUP BY crs_users.CrsCod) AS NumUsrsTable",
Cod,
(unsigned) Role);
break;
case Hie_Lvl_CRS:
return (double) Usr_GetNumUsrsInCrss (Hie_Lvl_CRS,Cod,
Role == Rol_UNK ? 1 << Rol_STD |
@ -10049,17 +10022,8 @@ static double Usr_GetNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Ro
default:
Lay_WrongScopeExit ();
break;
return 0.0; // Not reached
}
/***** Get average number of users per course *****/
row = mysql_fetch_row (mysql_res);
NumUsrsPerCrs = Str_GetDoubleFromStr (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumUsrsPerCrs;
}
double Usr_GetCachedNumUsrsPerCrs (Hie_Lvl_Level_t Scope,long Cod,Rol_Role_t Role)