diff --git a/swad_account.c b/swad_account.c index 32f61b337..d2804356a 100644 --- a/swad_account.c +++ b/swad_account.c @@ -193,7 +193,6 @@ void Acc_CheckIfEmptyAccountExists (void) unsigned NumUsr; struct UsrData UsrDat; MYSQL_RES *mysql_res; - MYSQL_ROW row; /***** Contextual menu *****/ Mnu_ContextMenuBegin (); @@ -211,14 +210,15 @@ void Acc_CheckIfEmptyAccountExists (void) /***** Check if there are users with this user's ID *****/ if (ID_CheckIfUsrIDIsValid (ID)) { - NumUsrs = (unsigned) DB_QuerySELECT (&mysql_res,"can not get user's codes", - "SELECT usr_ids.UsrCod" - " FROM usr_ids," - "usr_data" - " WHERE usr_ids.UsrID='%s'" - " AND usr_ids.UsrCod=usr_data.UsrCod" - " AND usr_data.Password=''", - ID); + NumUsrs = (unsigned) + DB_QuerySELECT (&mysql_res,"can not get user's codes", + "SELECT usr_ids.UsrCod" // row[0] + " FROM usr_ids," + "usr_data" + " WHERE usr_ids.UsrID='%s'" + " AND usr_ids.UsrCod=usr_data.UsrCod" + " AND usr_data.Password=''", + ID); if (NumUsrs) { /***** Begin box and table *****/ @@ -237,10 +237,8 @@ void Acc_CheckIfEmptyAccountExists (void) NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd) { /***** Get user's data from query result *****/ - row = mysql_fetch_row (mysql_res); - /* Get user's code */ - UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]); + UsrDat.UsrCod = DB_GetNextCod (mysql_res); /* Get user's data */ Usr_GetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS); diff --git a/swad_agenda.c b/swad_agenda.c index 6fbe84400..fba0da9c5 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -1052,8 +1052,6 @@ static void Agd_GetListEvents (struct Agd_Agenda *Agenda, [Dat_END_TIME ] = "EndTime,StartTime,Event,Location", }; MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned long NumRows; unsigned NumEvent; bool DoQuery = true; @@ -1150,26 +1148,25 @@ static void Agd_GetListEvents (struct Agd_Agenda *Agenda, if (DoQuery) { /* Make query */ - NumRows = DB_QuerySELECT (&mysql_res,"can not get agenda events", - "SELECT AgdCod" - " FROM agd_agendas" - " WHERE %s%s%s%s" - " ORDER BY %s", - UsrSubQuery, - Past__FutureEventsSubQuery, - PrivatPublicEventsSubQuery, - HiddenVisiblEventsSubQuery, - OrderBySubQuery[Agenda->SelectedOrder]); + Agenda->Num = (unsigned) + DB_QuerySELECT (&mysql_res,"can not get agenda events", + "SELECT AgdCod" // row[0] + " FROM agd_agendas" + " WHERE %s%s%s%s" + " ORDER BY %s", + UsrSubQuery, + Past__FutureEventsSubQuery, + PrivatPublicEventsSubQuery, + HiddenVisiblEventsSubQuery, + OrderBySubQuery[Agenda->SelectedOrder]); /* Free allocated memory for subquery */ free (UsrSubQuery); - if (NumRows) // Events found... + if (Agenda->Num) // Events found... { - Agenda->Num = (unsigned) NumRows; - /***** Create list of events *****/ - if ((Agenda->LstAgdCods = calloc (NumRows, + if ((Agenda->LstAgdCods = calloc ((size_t) Agenda->Num, sizeof (*Agenda->LstAgdCods))) == NULL) Lay_NotEnoughMemoryExit (); @@ -1177,19 +1174,14 @@ static void Agd_GetListEvents (struct Agd_Agenda *Agenda, for (NumEvent = 0; NumEvent < Agenda->Num; NumEvent++) - { /* Get next event code */ - row = mysql_fetch_row (mysql_res); - if ((Agenda->LstAgdCods[NumEvent] = Str_ConvertStrCodToLongCod (row[0])) < 0) + if ((Agenda->LstAgdCods[NumEvent] = DB_GetNextCod (mysql_res)) < 0) Lay_ShowErrorAndExit ("Error: wrong event code."); - } } /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); } - else - Agenda->Num = 0; Agenda->LstIsRead = true; } @@ -1878,102 +1870,88 @@ unsigned Agd_GetNumEventsFromUsr (long UsrCod) 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 *****/ switch (Scope) { case Hie_Lvl_SYS: - DB_QuerySELECT (&mysql_res,"can not get number of users with events", - "SELECT COUNT(DISTINCT UsrCod)" - " FROM agd_agendas" - " WHERE UsrCod>0"); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of users with events", + "SELECT COUNT(DISTINCT UsrCod)" + " FROM agd_agendas" + " WHERE UsrCod>0"); case Hie_Lvl_CTY: - DB_QuerySELECT (&mysql_res,"can not get number of users with events", - "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "crs_users," - "agd_agendas" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Cty.CtyCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of users with events", + "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "crs_users," + "agd_agendas" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.Status=0" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Cty.CtyCod); case Hie_Lvl_INS: - DB_QuerySELECT (&mysql_res,"can not get number of users with events", - "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "crs_users," - "agd_agendas" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Ins.InsCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of users with events", + "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "crs_users," + "agd_agendas" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.Status=0" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Ins.InsCod); case Hie_Lvl_CTR: - DB_QuerySELECT (&mysql_res,"can not get number of users with events", - "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" - " FROM deg_degrees," - "crs_courses," - "crs_users," - "agd_agendas" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Ctr.CtrCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of users with events", + "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" + " FROM deg_degrees," + "crs_courses," + "crs_users," + "agd_agendas" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.Status=0" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Ctr.CtrCod); case Hie_Lvl_DEG: - DB_QuerySELECT (&mysql_res,"can not get number of users with events", - "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" - " FROM crs_courses," - "crs_users," - "agd_agendas" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.Status=0" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Deg.DegCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of users with events", + "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" + " FROM crs_courses," + "crs_users," + "agd_agendas" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.Status=0" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Deg.DegCod); case Hie_Lvl_CRS: - DB_QuerySELECT (&mysql_res,"can not get number of users with events", - "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" - " FROM crs_users," - "agd_agendas" - " WHERE crs_users.CrsCod=%ld" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Crs.CrsCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of users with events", + "SELECT COUNT(DISTINCT agd_agendas.UsrCod)" + " FROM crs_users," + "agd_agendas" + " WHERE crs_users.CrsCod=%ld" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Crs.CrsCod); default: 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) { - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned NumEvents; - /***** Get number of events from database *****/ switch (Scope) { case Hie_Lvl_SYS: - DB_QuerySELECT (&mysql_res,"can not get number of events", - "SELECT COUNT(*)" - " FROM agd_agendas" - " WHERE UsrCod>0"); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of events", + "SELECT COUNT(*)" + " FROM agd_agendas" + " WHERE UsrCod>0"); case Hie_Lvl_CTY: - DB_QuerySELECT (&mysql_res,"can not get number of events", - "SELECT COUNT(*)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "crs_users," - "agd_agendas" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Cty.CtyCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of events", + "SELECT COUNT(*)" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "crs_users," + "agd_agendas" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Cty.CtyCod); case Hie_Lvl_INS: - DB_QuerySELECT (&mysql_res,"can not get number of events", - "SELECT COUNT(*)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "crs_users," - "agd_agendas" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Ins.InsCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of events", + "SELECT COUNT(*)" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "crs_users," + "agd_agendas" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Ins.InsCod); case Hie_Lvl_CTR: - DB_QuerySELECT (&mysql_res,"can not get number of events", - "SELECT COUNT(*)" - " FROM deg_degrees," - "crs_courses," - "crs_users," - "agd_agendas" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Ctr.CtrCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of events", + "SELECT COUNT(*)" + " FROM deg_degrees," + "crs_courses," + "crs_users," + "agd_agendas" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Ctr.CtrCod); case Hie_Lvl_DEG: - DB_QuerySELECT (&mysql_res,"can not get number of events", - "SELECT COUNT(*)" - " FROM crs_courses," - "crs_users," - "agd_agendas" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Deg.DegCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of events", + "SELECT COUNT(*)" + " FROM crs_courses," + "crs_users," + "agd_agendas" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=crs_users.CrsCod" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Deg.DegCod); case Hie_Lvl_CRS: - DB_QuerySELECT (&mysql_res,"can not get number of events", - "SELECT COUNT(*)" - " FROM crs_users," - "agd_agendas" - " WHERE crs_users.CrsCod=%ld" - " AND crs_users.UsrCod=agd_agendas.UsrCod", - Gbl.Hierarchy.Crs.CrsCod); - break; + return (unsigned) + DB_QueryCOUNT ("can not get number of events", + "SELECT COUNT(*)" + " FROM crs_users," + "agd_agendas" + " WHERE crs_users.CrsCod=%ld" + " AND crs_users.UsrCod=agd_agendas.UsrCod", + Gbl.Hierarchy.Crs.CrsCod); default: 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; } /*****************************************************************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 5fe2a2b17..a508a9a46 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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.53 (2021-03-29)" +#define Log_PLATFORM_VERSION "SWAD 20.53.1 (2021-03-30)" #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.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.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) diff --git a/swad_database.c b/swad_database.c index 5da7297c3..b55c66cea 100644 --- a/swad_database.c +++ b/swad_database.c @@ -3827,6 +3827,22 @@ static unsigned long DB_QuerySELECTusingQueryStr (char *Query, 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 ********************/ /*****************************************************************************/ diff --git a/swad_database.h b/swad_database.h index dfc568dfb..3d270ebe2 100644 --- a/swad_database.h +++ b/swad_database.h @@ -41,6 +41,7 @@ void DB_BuildQuery (char **Query,const char *fmt,...); unsigned long DB_QuerySELECT (MYSQL_RES **mysql_res,const char *MsgError, const char *fmt,...); +long DB_GetNextCod (MYSQL_RES *mysql_res); unsigned long DB_GetNumRowsTable (const char *Table); unsigned long DB_QueryCOUNT (const char *MsgError,const char *fmt,...);