Version 20.53.1: Mar 30, 2021 Optimizations in database selects.

This commit is contained in:
acanas 2021-03-30 12:30:39 +02:00
parent fa7188661c
commit ff125a81de
5 changed files with 179 additions and 199 deletions

View File

@ -193,7 +193,6 @@ void Acc_CheckIfEmptyAccountExists (void)
unsigned NumUsr; unsigned NumUsr;
struct UsrData UsrDat; struct UsrData UsrDat;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row;
/***** Contextual menu *****/ /***** Contextual menu *****/
Mnu_ContextMenuBegin (); Mnu_ContextMenuBegin ();
@ -211,14 +210,15 @@ void Acc_CheckIfEmptyAccountExists (void)
/***** Check if there are users with this user's ID *****/ /***** Check if there are users with this user's ID *****/
if (ID_CheckIfUsrIDIsValid (ID)) if (ID_CheckIfUsrIDIsValid (ID))
{ {
NumUsrs = (unsigned) DB_QuerySELECT (&mysql_res,"can not get user's codes", NumUsrs = (unsigned)
"SELECT usr_ids.UsrCod" DB_QuerySELECT (&mysql_res,"can not get user's codes",
" FROM usr_ids," "SELECT usr_ids.UsrCod" // row[0]
"usr_data" " FROM usr_ids,"
" WHERE usr_ids.UsrID='%s'" "usr_data"
" AND usr_ids.UsrCod=usr_data.UsrCod" " WHERE usr_ids.UsrID='%s'"
" AND usr_data.Password=''", " AND usr_ids.UsrCod=usr_data.UsrCod"
ID); " AND usr_data.Password=''",
ID);
if (NumUsrs) if (NumUsrs)
{ {
/***** Begin box and table *****/ /***** Begin box and table *****/
@ -237,10 +237,8 @@ void Acc_CheckIfEmptyAccountExists (void)
NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd) NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd)
{ {
/***** Get user's data from query result *****/ /***** Get user's data from query result *****/
row = mysql_fetch_row (mysql_res);
/* Get user's code */ /* Get user's code */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]); UsrDat.UsrCod = DB_GetNextCod (mysql_res);
/* Get user's data */ /* Get user's data */
Usr_GetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS); Usr_GetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS);

View File

@ -1052,8 +1052,6 @@ static void Agd_GetListEvents (struct Agd_Agenda *Agenda,
[Dat_END_TIME ] = "EndTime,StartTime,Event,Location", [Dat_END_TIME ] = "EndTime,StartTime,Event,Location",
}; };
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRows;
unsigned NumEvent; unsigned NumEvent;
bool DoQuery = true; bool DoQuery = true;
@ -1150,26 +1148,25 @@ static void Agd_GetListEvents (struct Agd_Agenda *Agenda,
if (DoQuery) if (DoQuery)
{ {
/* Make query */ /* Make query */
NumRows = DB_QuerySELECT (&mysql_res,"can not get agenda events", Agenda->Num = (unsigned)
"SELECT AgdCod" DB_QuerySELECT (&mysql_res,"can not get agenda events",
" FROM agd_agendas" "SELECT AgdCod" // row[0]
" WHERE %s%s%s%s" " FROM agd_agendas"
" ORDER BY %s", " WHERE %s%s%s%s"
UsrSubQuery, " ORDER BY %s",
Past__FutureEventsSubQuery, UsrSubQuery,
PrivatPublicEventsSubQuery, Past__FutureEventsSubQuery,
HiddenVisiblEventsSubQuery, PrivatPublicEventsSubQuery,
OrderBySubQuery[Agenda->SelectedOrder]); HiddenVisiblEventsSubQuery,
OrderBySubQuery[Agenda->SelectedOrder]);
/* Free allocated memory for subquery */ /* Free allocated memory for subquery */
free (UsrSubQuery); free (UsrSubQuery);
if (NumRows) // Events found... if (Agenda->Num) // Events found...
{ {
Agenda->Num = (unsigned) NumRows;
/***** Create list of events *****/ /***** Create list of events *****/
if ((Agenda->LstAgdCods = calloc (NumRows, if ((Agenda->LstAgdCods = calloc ((size_t) Agenda->Num,
sizeof (*Agenda->LstAgdCods))) == NULL) sizeof (*Agenda->LstAgdCods))) == NULL)
Lay_NotEnoughMemoryExit (); Lay_NotEnoughMemoryExit ();
@ -1177,19 +1174,14 @@ static void Agd_GetListEvents (struct Agd_Agenda *Agenda,
for (NumEvent = 0; for (NumEvent = 0;
NumEvent < Agenda->Num; NumEvent < Agenda->Num;
NumEvent++) NumEvent++)
{
/* Get next event code */ /* Get next event code */
row = mysql_fetch_row (mysql_res); if ((Agenda->LstAgdCods[NumEvent] = DB_GetNextCod (mysql_res)) < 0)
if ((Agenda->LstAgdCods[NumEvent] = Str_ConvertStrCodToLongCod (row[0])) < 0)
Lay_ShowErrorAndExit ("Error: wrong event code."); Lay_ShowErrorAndExit ("Error: wrong event code.");
}
} }
/***** Free structure that stores the query result *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
} }
else
Agenda->Num = 0;
Agenda->LstIsRead = true; Agenda->LstIsRead = true;
} }
@ -1878,102 +1870,88 @@ unsigned Agd_GetNumEventsFromUsr (long UsrCod)
unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
{ {
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumUsrs;
/***** Get number of courses with events from database *****/ /***** Get number of courses with events from database *****/
switch (Scope) switch (Scope)
{ {
case Hie_Lvl_SYS: case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of users with events", return (unsigned)
"SELECT COUNT(DISTINCT UsrCod)" DB_QueryCOUNT ("can not get number of users with events",
" FROM agd_agendas" "SELECT COUNT(DISTINCT UsrCod)"
" WHERE UsrCod>0"); " FROM agd_agendas"
break; " WHERE UsrCod>0");
case Hie_Lvl_CTY: case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of users with events", return (unsigned)
"SELECT COUNT(DISTINCT agd_agendas.UsrCod)" DB_QueryCOUNT ("can not get number of users with events",
" FROM ins_instits," "SELECT COUNT(DISTINCT agd_agendas.UsrCod)"
"ctr_centers," " FROM ins_instits,"
"deg_degrees," "ctr_centers,"
"crs_courses," "deg_degrees,"
"crs_users," "crs_courses,"
"agd_agendas" "crs_users,"
" WHERE ins_instits.CtyCod=%ld" "agd_agendas"
" AND ins_instits.InsCod=ctr_centers.InsCod" " WHERE ins_instits.CtyCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND crs_courses.Status=0" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.Status=0"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Cty.CtyCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of users with events", return (unsigned)
"SELECT COUNT(DISTINCT agd_agendas.UsrCod)" DB_QueryCOUNT ("can not get number of users with events",
" FROM ctr_centers," "SELECT COUNT(DISTINCT agd_agendas.UsrCod)"
"deg_degrees," " FROM ctr_centers,"
"crs_courses," "deg_degrees,"
"crs_users," "crs_courses,"
"agd_agendas" "crs_users,"
" WHERE ctr_centers.InsCod=%ld" "agd_agendas"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " WHERE ctr_centers.InsCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND crs_courses.Status=0" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.Status=0"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Ins.InsCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of users with events", return (unsigned)
"SELECT COUNT(DISTINCT agd_agendas.UsrCod)" DB_QueryCOUNT ("can not get number of users with events",
" FROM deg_degrees," "SELECT COUNT(DISTINCT agd_agendas.UsrCod)"
"crs_courses," " FROM deg_degrees,"
"crs_users," "crs_courses,"
"agd_agendas" "crs_users,"
" WHERE deg_degrees.CtrCod=%ld" "agd_agendas"
" AND deg_degrees.DegCod=crs_courses.DegCod" " WHERE deg_degrees.CtrCod=%ld"
" AND crs_courses.Status=0" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.Status=0"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Ctr.CtrCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of users with events", return (unsigned)
"SELECT COUNT(DISTINCT agd_agendas.UsrCod)" DB_QueryCOUNT ("can not get number of users with events",
" FROM crs_courses," "SELECT COUNT(DISTINCT agd_agendas.UsrCod)"
"crs_users," " FROM crs_courses,"
"agd_agendas" "crs_users,"
" WHERE crs_courses.DegCod=%ld" "agd_agendas"
" AND crs_courses.Status=0" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.Status=0"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Deg.DegCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Deg.DegCod);
case Hie_Lvl_CRS: case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of users with events", return (unsigned)
"SELECT COUNT(DISTINCT agd_agendas.UsrCod)" DB_QueryCOUNT ("can not get number of users with events",
" FROM crs_users," "SELECT COUNT(DISTINCT agd_agendas.UsrCod)"
"agd_agendas" " FROM crs_users,"
" WHERE crs_users.CrsCod=%ld" "agd_agendas"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " WHERE crs_users.CrsCod=%ld"
Gbl.Hierarchy.Crs.CrsCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Crs.CrsCod);
default: default:
Lay_WrongScopeExit (); Lay_WrongScopeExit ();
break; return 0; // Not reached
} }
/***** Get number of users *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%u",&NumUsrs) != 1)
Lay_ShowErrorAndExit ("Error when getting number of users with events.");
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumUsrs;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1983,98 +1961,84 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
unsigned Agd_GetNumEvents (Hie_Lvl_Level_t Scope) unsigned Agd_GetNumEvents (Hie_Lvl_Level_t Scope)
{ {
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumEvents;
/***** Get number of events from database *****/ /***** Get number of events from database *****/
switch (Scope) switch (Scope)
{ {
case Hie_Lvl_SYS: case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of events", return (unsigned)
"SELECT COUNT(*)" DB_QueryCOUNT ("can not get number of events",
" FROM agd_agendas" "SELECT COUNT(*)"
" WHERE UsrCod>0"); " FROM agd_agendas"
break; " WHERE UsrCod>0");
case Hie_Lvl_CTY: case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of events", return (unsigned)
"SELECT COUNT(*)" DB_QueryCOUNT ("can not get number of events",
" FROM ins_instits," "SELECT COUNT(*)"
"ctr_centers," " FROM ins_instits,"
"deg_degrees," "ctr_centers,"
"crs_courses," "deg_degrees,"
"crs_users," "crs_courses,"
"agd_agendas" "crs_users,"
" WHERE ins_instits.CtyCod=%ld" "agd_agendas"
" AND ins_instits.InsCod=ctr_centers.InsCod" " WHERE ins_instits.CtyCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Cty.CtyCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of events", return (unsigned)
"SELECT COUNT(*)" DB_QueryCOUNT ("can not get number of events",
" FROM ctr_centers," "SELECT COUNT(*)"
"deg_degrees," " FROM ctr_centers,"
"crs_courses," "deg_degrees,"
"crs_users," "crs_courses,"
"agd_agendas" "crs_users,"
" WHERE ctr_centers.InsCod=%ld" "agd_agendas"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " WHERE ctr_centers.InsCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Ins.InsCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of events", return (unsigned)
"SELECT COUNT(*)" DB_QueryCOUNT ("can not get number of events",
" FROM deg_degrees," "SELECT COUNT(*)"
"crs_courses," " FROM deg_degrees,"
"crs_users," "crs_courses,"
"agd_agendas" "crs_users,"
" WHERE deg_degrees.CtrCod=%ld" "agd_agendas"
" AND deg_degrees.DegCod=crs_courses.DegCod" " WHERE deg_degrees.CtrCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Ctr.CtrCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of events", return (unsigned)
"SELECT COUNT(*)" DB_QueryCOUNT ("can not get number of events",
" FROM crs_courses," "SELECT COUNT(*)"
"crs_users," " FROM crs_courses,"
"agd_agendas" "crs_users,"
" WHERE crs_courses.DegCod=%ld" "agd_agendas"
" AND crs_courses.CrsCod=crs_users.CrsCod" " WHERE crs_courses.DegCod=%ld"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_courses.CrsCod=crs_users.CrsCod"
Gbl.Hierarchy.Deg.DegCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Deg.DegCod);
case Hie_Lvl_CRS: case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of events", return (unsigned)
"SELECT COUNT(*)" DB_QueryCOUNT ("can not get number of events",
" FROM crs_users," "SELECT COUNT(*)"
"agd_agendas" " FROM crs_users,"
" WHERE crs_users.CrsCod=%ld" "agd_agendas"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " WHERE crs_users.CrsCod=%ld"
Gbl.Hierarchy.Crs.CrsCod); " AND crs_users.UsrCod=agd_agendas.UsrCod",
break; Gbl.Hierarchy.Crs.CrsCod);
default: default:
Lay_WrongScopeExit (); Lay_WrongScopeExit ();
break; return 0; // Not reached
} }
/***** Get number of events *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%u",&NumEvents) != 1)
Lay_ShowErrorAndExit ("Error when getting number of events.");
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumEvents;
} }
/*****************************************************************************/ /*****************************************************************************/

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. 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.53 (2021-03-29)" #define Log_PLATFORM_VERSION "SWAD 20.53.1 (2021-03-30)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.6.2.js" #define JS_FILE "swad20.6.2.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.53.1: Mar 30, 2021 Optimizations in database selects. (309459 lines)
Version 20.53: Mar 29, 2021 Code refactoring in database selects. (309473 lines) Version 20.53: Mar 29, 2021 Code refactoring in database selects. (309473 lines)
Version 20.52: Mar 28, 2021 Code refactoring in database selects. (309103 lines) Version 20.52: Mar 28, 2021 Code refactoring in database selects. (309103 lines)
Version 20.51.49: Mar 26, 2021 User IDs database table renamed. (308816 lines) Version 20.51.49: Mar 26, 2021 User IDs database table renamed. (308816 lines)

View File

@ -3827,6 +3827,22 @@ static unsigned long DB_QuerySELECTusingQueryStr (char *Query,
return (unsigned long) mysql_num_rows (*mysql_res); return (unsigned long) mysql_num_rows (*mysql_res);
} }
/*****************************************************************************/
/********************** Get next code from query result **********************/
/*****************************************************************************/
/* Each row of the result should hold a code (long) */
long DB_GetNextCod (MYSQL_RES *mysql_res)
{
MYSQL_ROW row;
/***** Get next row from query result *****/
row = mysql_fetch_row (mysql_res);
/***** row[0] should hold a code (long) ******/
return Str_ConvertStrCodToLongCod (row[0]);
}
/*****************************************************************************/ /*****************************************************************************/
/**************** Make a SELECT COUNT query from database ********************/ /**************** Make a SELECT COUNT query from database ********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -41,6 +41,7 @@ void DB_BuildQuery (char **Query,const char *fmt,...);
unsigned long DB_QuerySELECT (MYSQL_RES **mysql_res,const char *MsgError, unsigned long DB_QuerySELECT (MYSQL_RES **mysql_res,const char *MsgError,
const char *fmt,...); const char *fmt,...);
long DB_GetNextCod (MYSQL_RES *mysql_res);
unsigned long DB_GetNumRowsTable (const char *Table); unsigned long DB_GetNumRowsTable (const char *Table);
unsigned long DB_QueryCOUNT (const char *MsgError,const char *fmt,...); unsigned long DB_QueryCOUNT (const char *MsgError,const char *fmt,...);