diff --git a/swad_changelog.h b/swad_changelog.h index 8968e81ff..dabea1867 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -355,10 +355,11 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.11.6 (2018-10-31)" +#define Log_PLATFORM_VERSION "SWAD 18.11.7 (2018-10-31)" #define CSS_FILE "swad18.4.css" #define JS_FILE "swad17.17.1.js" /* + Version 18.11.7: Oct 31, 2018 Joining building and performing query into one function. (235741 lines) Version 18.11.6: Oct 31, 2018 Joining building and performing query into one function. (235687 lines) Version 18.11.5: Oct 31, 2018 Joining building and performing query into one function. (235619 lines) Version 18.11.4: Oct 30, 2018 Joining building and performing query into one function. (235593 lines) diff --git a/swad_database.c b/swad_database.c index 46bd92b88..91d68e8af 100644 --- a/swad_database.c +++ b/swad_database.c @@ -3175,6 +3175,25 @@ unsigned long DB_QuerySELECT_old (char **Query,MYSQL_RES **mysql_res,const char /**************** Make a SELECT COUNT query from database ********************/ /*****************************************************************************/ +unsigned long DB_QueryCOUNT (const char *MsgError, + const char *fmt,...) + { + int NumBytesPrinted; + va_list ap; + char *Query = NULL; + + va_start (ap,fmt); + NumBytesPrinted = vasprintf (&Query,fmt,ap); + va_end (ap); + + if (NumBytesPrinted < 0) // If memory allocation wasn't possible, + // or some other error occurs, + // vasprintf will return -1 + Lay_NotEnoughMemoryExit (); + + return DB_QueryCOUNT_old (&Query,MsgError); + } + unsigned long DB_QueryCOUNT_new (const char *MsgError) { return DB_QueryCOUNT_old (&Gbl.DB.QueryPtr,MsgError); diff --git a/swad_database.h b/swad_database.h index d129b6807..53cc6d355 100644 --- a/swad_database.h +++ b/swad_database.h @@ -45,6 +45,8 @@ unsigned long DB_QuerySELECT (MYSQL_RES **mysql_res,const char *MsgError, unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError); unsigned long DB_QuerySELECT_old (char **Query,MYSQL_RES **mysql_res,const char *MsgError); +unsigned long DB_QueryCOUNT (const char *MsgError, + const char *fmt,...); unsigned long DB_QueryCOUNT_new (const char *MsgError); unsigned long DB_QueryCOUNT_old (char **Query,const char *MsgError); diff --git a/swad_game.c b/swad_game.c index 5db0f3cdd..648248b0c 100644 --- a/swad_game.c +++ b/swad_game.c @@ -888,7 +888,7 @@ void Gam_GetListGames (void) char OrderBySubQuery[256]; MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumRows; + unsigned long NumRows = 0; // Initialized to avoid warning unsigned NumGame; unsigned ScopesAllowed = 0; unsigned HiddenAllowed = 0; @@ -975,23 +975,22 @@ void Gam_GetListGames (void) break; } - DB_BuildQuery ("SELECT GamCod FROM games" - " WHERE %s%s%s%s%s%s" - " ORDER BY %s", - SubQuery[Sco_SCOPE_SYS], - SubQuery[Sco_SCOPE_CTY], - SubQuery[Sco_SCOPE_INS], - SubQuery[Sco_SCOPE_CTR], - SubQuery[Sco_SCOPE_DEG], - SubQuery[Sco_SCOPE_CRS], - OrderBySubQuery); + /* Make query */ + NumRows = DB_QuerySELECT (&mysql_res,"can not get games", + "SELECT GamCod FROM games" + " WHERE %s%s%s%s%s%s" + " ORDER BY %s", + SubQuery[Sco_SCOPE_SYS], + SubQuery[Sco_SCOPE_CTY], + SubQuery[Sco_SCOPE_INS], + SubQuery[Sco_SCOPE_CTR], + SubQuery[Sco_SCOPE_DEG], + SubQuery[Sco_SCOPE_CRS], + OrderBySubQuery); } else Lay_ShowErrorAndExit ("Can not get list of games."); - /* Make query */ - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get games"); - if (NumRows) // Games found... { Gbl.Games.Num = (unsigned) NumRows; @@ -1197,19 +1196,16 @@ void Gam_GetDataOfGameByCod (struct Game *Game) MYSQL_ROW row; unsigned long NumRows; - /***** Build query *****/ - DB_BuildQuery ("SELECT GamCod,Scope,Cod,Hidden,Roles,UsrCod," - "UNIX_TIMESTAMP(StartTime)," - "UNIX_TIMESTAMP(EndTime)," - "NOW() BETWEEN StartTime AND EndTime," - "Title" - " FROM games" - " WHERE GamCod=%ld", - Game->GamCod); - /***** Get data of game from database *****/ - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get game data"); - + NumRows = DB_QuerySELECT (&mysql_res,"can not get game data", + "SELECT GamCod,Scope,Cod,Hidden,Roles,UsrCod," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW() BETWEEN StartTime AND EndTime," + "Title" + " FROM games" + " WHERE GamCod=%ld", + Game->GamCod); if (NumRows) // Game found... { /* Get row */ @@ -1299,71 +1295,71 @@ void Gam_GetDataOfGameByCod (struct Game *Game) { case Rol_STD: Game->Status.ICanViewResults = (Game->Scope == Sco_SCOPE_CRS || - Game->Scope == Sco_SCOPE_DEG || - Game->Scope == Sco_SCOPE_CTR || - Game->Scope == Sco_SCOPE_INS || - Game->Scope == Sco_SCOPE_CTY || - Game->Scope == Sco_SCOPE_SYS) && - (Game->NumQsts != 0) && - Game->Status.Visible && - Game->Status.Open && - Game->Status.IAmLoggedWithAValidRoleToAnswer && - Game->Status.IBelongToScope && - Game->Status.IHaveAnswered; + Game->Scope == Sco_SCOPE_DEG || + Game->Scope == Sco_SCOPE_CTR || + Game->Scope == Sco_SCOPE_INS || + Game->Scope == Sco_SCOPE_CTY || + Game->Scope == Sco_SCOPE_SYS) && + (Game->NumQsts != 0) && + Game->Status.Visible && + Game->Status.Open && + Game->Status.IAmLoggedWithAValidRoleToAnswer && + Game->Status.IBelongToScope && + Game->Status.IHaveAnswered; Game->Status.ICanEdit = false; break; case Rol_NET: Game->Status.ICanViewResults = (Game->Scope == Sco_SCOPE_CRS || - Game->Scope == Sco_SCOPE_DEG || - Game->Scope == Sco_SCOPE_CTR || - Game->Scope == Sco_SCOPE_INS || - Game->Scope == Sco_SCOPE_CTY || - Game->Scope == Sco_SCOPE_SYS) && - Game->NumQsts != 0 && - !Game->Status.ICanAnswer; + Game->Scope == Sco_SCOPE_DEG || + Game->Scope == Sco_SCOPE_CTR || + Game->Scope == Sco_SCOPE_INS || + Game->Scope == Sco_SCOPE_CTY || + Game->Scope == Sco_SCOPE_SYS) && + Game->NumQsts != 0 && + !Game->Status.ICanAnswer; Game->Status.ICanEdit = false; break; case Rol_TCH: Game->Status.ICanViewResults = (Game->Scope == Sco_SCOPE_CRS || - Game->Scope == Sco_SCOPE_DEG || - Game->Scope == Sco_SCOPE_CTR || - Game->Scope == Sco_SCOPE_INS || - Game->Scope == Sco_SCOPE_CTY || - Game->Scope == Sco_SCOPE_SYS) && - Game->NumQsts != 0 && - !Game->Status.ICanAnswer; + Game->Scope == Sco_SCOPE_DEG || + Game->Scope == Sco_SCOPE_CTR || + Game->Scope == Sco_SCOPE_INS || + Game->Scope == Sco_SCOPE_CTY || + Game->Scope == Sco_SCOPE_SYS) && + Game->NumQsts != 0 && + !Game->Status.ICanAnswer; Game->Status.ICanEdit = Game->Scope == Sco_SCOPE_CRS && - Game->Status.IBelongToScope; + Game->Status.IBelongToScope; break; case Rol_DEG_ADM: Game->Status.ICanViewResults = (Game->Scope == Sco_SCOPE_DEG || - Game->Scope == Sco_SCOPE_CTR || - Game->Scope == Sco_SCOPE_INS || - Game->Scope == Sco_SCOPE_CTY || - Game->Scope == Sco_SCOPE_SYS) && - (Game->NumQsts != 0) && - !Game->Status.ICanAnswer; + Game->Scope == Sco_SCOPE_CTR || + Game->Scope == Sco_SCOPE_INS || + Game->Scope == Sco_SCOPE_CTY || + Game->Scope == Sco_SCOPE_SYS) && + (Game->NumQsts != 0) && + !Game->Status.ICanAnswer; Game->Status.ICanEdit = Game->Scope == Sco_SCOPE_DEG && - Game->Status.IBelongToScope; + Game->Status.IBelongToScope; break; case Rol_CTR_ADM: Game->Status.ICanViewResults = (Game->Scope == Sco_SCOPE_CTR || - Game->Scope == Sco_SCOPE_INS || - Game->Scope == Sco_SCOPE_CTY || - Game->Scope == Sco_SCOPE_SYS) && - (Game->NumQsts != 0) && - !Game->Status.ICanAnswer; + Game->Scope == Sco_SCOPE_INS || + Game->Scope == Sco_SCOPE_CTY || + Game->Scope == Sco_SCOPE_SYS) && + (Game->NumQsts != 0) && + !Game->Status.ICanAnswer; Game->Status.ICanEdit = Game->Scope == Sco_SCOPE_CTR && - Game->Status.IBelongToScope; + Game->Status.IBelongToScope; break; case Rol_INS_ADM: Game->Status.ICanViewResults = (Game->Scope == Sco_SCOPE_INS || - Game->Scope == Sco_SCOPE_CTY || - Game->Scope == Sco_SCOPE_SYS) && - (Game->NumQsts != 0) && - !Game->Status.ICanAnswer; + Game->Scope == Sco_SCOPE_CTY || + Game->Scope == Sco_SCOPE_SYS) && + (Game->NumQsts != 0) && + !Game->Status.ICanAnswer; Game->Status.ICanEdit = Game->Scope == Sco_SCOPE_INS && - Game->Status.IBelongToScope; + Game->Status.IBelongToScope; break; case Rol_SYS_ADM: Game->Status.ICanViewResults = (Game->NumQsts != 0); @@ -1428,8 +1424,9 @@ static void Gam_GetGameTxtFromDB (long GamCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) unsigned long NumRows; /***** Get text of game from database *****/ - DB_BuildQuery ("SELECT Txt FROM games WHERE GamCod=%ld",GamCod); - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get game text"); + NumRows = DB_QuerySELECT (&mysql_res,"can not get game text", + "SELECT Txt FROM games WHERE GamCod=%ld", + GamCod); /***** The result of the query must have one row or none *****/ if (NumRows == 1) @@ -2343,14 +2340,14 @@ static void Gam_GetAndWriteNamesOfGrpsAssociatedToGame (struct Game *Game) unsigned long NumRows; /***** Get groups associated to a game from database *****/ - DB_BuildQuery ("SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" - " FROM gam_grp,crs_grp,crs_grp_types" - " WHERE gam_grp.GamCod=%ld" - " AND gam_grp.GrpCod=crs_grp.GrpCod" - " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" - " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", - Game->GamCod); - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get groups of a game"); + NumRows = DB_QuerySELECT (&mysql_res,"can not get groups of a game", + "SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" + " FROM gam_grp,crs_grp,crs_grp_types" + " WHERE gam_grp.GamCod=%ld" + " AND gam_grp.GrpCod=crs_grp.GrpCod" + " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" + " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", + Game->GamCod); /***** Write heading *****/ fprintf (Gbl.F.Out,"
%s: ", @@ -2564,10 +2561,10 @@ static int Gam_GetQstIndFromQstCod (long GamCod,long QstCod) int QstInd = -1; /***** Get number of games with a field value from database *****/ - DB_BuildQuery ("SELECT QstInd FROM gam_questions" - " WHERE GamCod=%ld AND QstCod=%ld", - GamCod,QstCod); - if (!DB_QuerySELECT_new (&mysql_res,"can not get question index")) + if (!DB_QuerySELECT (&mysql_res,"can not get question index", + "SELECT QstInd FROM gam_questions" + " WHERE GamCod=%ld AND QstCod=%ld", + GamCod,QstCod)) Lay_ShowErrorAndExit ("Error when getting question index."); /***** Get question index (row[0]) *****/ @@ -2593,10 +2590,10 @@ static long Gam_GetQstCodFromQstInd (long GamCod,unsigned QstInd) long QstCod; /***** Get question code of thw question to be moved up *****/ - DB_BuildQuery ("SELECT QstCod FROM gam_questions" - " WHERE GamCod=%ld AND QstInd=%u", - GamCod,QstInd); - if (!DB_QuerySELECT_new (&mysql_res,"can not get question code")) + if (!DB_QuerySELECT (&mysql_res,"can not get question code", + "SELECT QstCod FROM gam_questions" + " WHERE GamCod=%ld AND QstInd=%u", + GamCod,QstInd)) Lay_ShowErrorAndExit ("Error: wrong question code."); /***** Get question code (row[0]) *****/ @@ -2623,9 +2620,9 @@ static int Gam_GetMaxQuestionIndexInGame (long GamCod) int QstInd = -1; /***** Get maximum question index in a game from database *****/ - DB_BuildQuery ("SELECT MAX(QstInd) FROM gam_questions WHERE GamCod=%ld", - GamCod); - DB_QuerySELECT_new (&mysql_res,"can not get last question index"); + DB_QuerySELECT (&mysql_res,"can not get last question index", + "SELECT MAX(QstInd) FROM gam_questions WHERE GamCod=%ld", + GamCod); row = mysql_fetch_row (mysql_res); if (row[0]) // There are questions if (sscanf (row[0],"%d",&QstInd) != 1) @@ -2652,10 +2649,10 @@ static int Gam_GetPrevQuestionIndexInGame (long GamCod,unsigned QstInd) /***** Get previous question index in a game from database *****/ // Although indexes are always continuous... // ...this implementation works even with non continuous indexes - DB_BuildQuery ("SELECT MAX(QstInd) FROM gam_questions" - " WHERE GamCod=%ld AND QstInd<%u", - GamCod,QstInd); - if (!DB_QuerySELECT_new (&mysql_res,"can not get previous question index")) + if (!DB_QuerySELECT (&mysql_res,"can not get previous question index", + "SELECT MAX(QstInd) FROM gam_questions" + " WHERE GamCod=%ld AND QstInd<%u", + GamCod,QstInd)) Lay_ShowErrorAndExit ("Error: previous question index not found."); /***** Get previous question index (row[0]) *****/ @@ -2685,10 +2682,10 @@ static int Gam_GetNextQuestionIndexInGame (long GamCod,unsigned QstInd) /***** Get next question index in a game from database *****/ // Although indexes are always continuous... // ...this implementation works even with non continuous indexes - DB_BuildQuery ("SELECT MIN(QstInd) FROM gam_questions" - " WHERE GamCod=%ld AND QstInd>%u", - GamCod,QstInd); - if (!DB_QuerySELECT_new (&mysql_res,"can not get next question index")) + if (!DB_QuerySELECT (&mysql_res,"can not get next question index", + "SELECT MIN(QstInd) FROM gam_questions" + " WHERE GamCod=%ld AND QstInd>%u", + GamCod,QstInd)) Lay_ShowErrorAndExit ("Error: next question index not found."); /***** Get next question index (row[0]) *****/ @@ -2735,19 +2732,19 @@ static void Gam_ListGameQuestions (struct Game *Game) row[5] ImageTitle row[6] ImageURL */ - DB_BuildQuery ("SELECT tst_questions.QstCod," - "tst_questions.AnsType," - "tst_questions.Stem," - "tst_questions.Feedback," - "tst_questions.ImageName," - "tst_questions.ImageTitle," - "tst_questions.ImageURL" - " FROM gam_questions,tst_questions" - " WHERE gam_questions.GamCod=%ld" - " AND gam_questions.QstCod=tst_questions.QstCod" - " ORDER BY gam_questions.QstInd", - Game->GamCod); - NumQsts = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get data of a question"); + NumQsts = (unsigned) DB_QuerySELECT (&mysql_res,"can not get data of a question", + "SELECT tst_questions.QstCod," + "tst_questions.AnsType," + "tst_questions.Stem," + "tst_questions.Feedback," + "tst_questions.ImageName," + "tst_questions.ImageTitle," + "tst_questions.ImageURL" + " FROM gam_questions,tst_questions" + " WHERE gam_questions.GamCod=%ld" + " AND gam_questions.QstCod=tst_questions.QstCod" + " ORDER BY gam_questions.QstInd", + Game->GamCod); /***** Start box *****/ Gbl.Games.CurrentGamCod = Game->GamCod; @@ -3129,10 +3126,10 @@ static unsigned Gam_GetNumUsrsWhoAnswered (long GamCod,long QstCod,unsigned AnsI unsigned NumUsrs = 0; // Default returned value /***** Get answers of a question from database *****/ - DB_BuildQuery ("SELECT NumUsrs FROM gam_answers" - " WHERE GamCod=%ld AND QstCod=%ld AND AnsInd=%u", - GamCod,QstCod,AnsInd); - if (DB_QuerySELECT_new (&mysql_res,"can not get number of users who answered")) + if (DB_QuerySELECT (&mysql_res,"can not get number of users who answered", + "SELECT NumUsrs FROM gam_answers" + " WHERE GamCod=%ld AND QstCod=%ld AND AnsInd=%u", + GamCod,QstCod,AnsInd)) { row = mysql_fetch_row (mysql_res); if (row[0]) // There are users who selected this answer @@ -3543,19 +3540,19 @@ static void Gam_PlayGameShowQuestionAndAnswers (bool ShowAnswers) row[4] ImageTitle row[5] ImageURL */ - DB_BuildQuery ("SELECT " - "tst_questions.QstCod," - "tst_questions.AnsType," - "tst_questions.Stem," - "tst_questions.ImageName," - "tst_questions.ImageTitle," - "tst_questions.ImageURL" - " FROM gam_questions,tst_questions" - " WHERE gam_questions.GamCod=%ld" - " AND gam_questions.QstInd=%u" - " AND gam_questions.QstCod=tst_questions.QstCod", - Game.GamCod,QstInd); - if (!DB_QuerySELECT_new (&mysql_res,"can not get data of a question")) + if (!DB_QuerySELECT (&mysql_res,"can not get data of a question", + "SELECT " + "tst_questions.QstCod," + "tst_questions.AnsType," + "tst_questions.Stem," + "tst_questions.ImageName," + "tst_questions.ImageTitle," + "tst_questions.ImageURL" + " FROM gam_questions,tst_questions" + " WHERE gam_questions.GamCod=%ld" + " AND gam_questions.QstInd=%u" + " AND gam_questions.QstCod=tst_questions.QstCod", + Game.GamCod,QstInd)) Ale_ShowAlert (Ale_WARNING,"Questions doesn't exist."); row = mysql_fetch_row (mysql_res); @@ -3700,10 +3697,11 @@ static void Gam_ReceiveAndStoreUserAnswersToAGame (long GamCod) unsigned AnsInd; /***** Get questions of this game from database *****/ - DB_BuildQuery ("SELECT QstCod FROM gam_questions" - " WHERE GamCod=%ld ORDER BY QstCod", - GamCod); - if ((NumQsts = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get questions of a game"))) // The game has questions + NumQsts = (unsigned) DB_QuerySELECT (&mysql_res,"can not get questions of a game", + "SELECT QstCod FROM gam_questions" + " WHERE GamCod=%ld ORDER BY QstCod", + GamCod); + if (NumQsts) // The game has questions { /***** Get questions *****/ for (NumQst = 0; @@ -3812,65 +3810,69 @@ unsigned Gam_GetNumCoursesWithGames (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - DB_BuildQuery ("SELECT COUNT(DISTINCT Cod)" - " FROM games" - " WHERE Scope='%s'", - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of courses with games", + "SELECT COUNT(DISTINCT Cod)" + " FROM games" + " WHERE Scope='%s'", + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CTY: - DB_BuildQuery ("SELECT COUNT(DISTINCT games.Cod)" - " FROM institutions,centres,degrees,courses,games" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of courses with games", + "SELECT COUNT(DISTINCT games.Cod)" + " FROM institutions,centres,degrees,courses,games" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_INS: - DB_BuildQuery ("SELECT COUNT(DISTINCT games.Cod)" - " FROM centres,degrees,courses,games" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of courses with games", + "SELECT COUNT(DISTINCT games.Cod)" + " FROM centres,degrees,courses,games" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CTR: - DB_BuildQuery ("SELECT COUNT(DISTINCT games.Cod)" - " FROM degrees,courses,games" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentCtr.Ctr.CtrCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of courses with games", + " FROM degrees,courses,games" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentCtr.Ctr.CtrCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_DEG: - DB_BuildQuery ("SELECT COUNT(DISTINCT games.Cod)" - " FROM courses,games" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentDeg.Deg.DegCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of courses with games", + "SELECT COUNT(DISTINCT games.Cod)" + " FROM courses,games" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentDeg.Deg.DegCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CRS: - DB_BuildQuery ("SELECT COUNT(DISTINCT Cod)" - " FROM games" - " WHERE Scope='%s' AND Cod=%ld", - Sco_ScopeDB[Sco_SCOPE_CRS], - Gbl.CurrentCrs.Crs.CrsCod); + DB_QuerySELECT (&mysql_res,"can not get number of courses with games", + "SELECT COUNT(DISTINCT Cod)" + " FROM games" + " WHERE Scope='%s' AND Cod=%ld", + Sco_ScopeDB[Sco_SCOPE_CRS], + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_new (&mysql_res,"can not get number of courses with games"); /***** Get number of games *****/ row = mysql_fetch_row (mysql_res); @@ -3899,66 +3901,71 @@ unsigned Gam_GetNumGames (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - DB_BuildQuery ("SELECT COUNT(*)" - " FROM games" - " WHERE Scope='%s'", - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of games", + "SELECT COUNT(*)" + " FROM games" + " WHERE Scope='%s'", + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CTY: - DB_BuildQuery ("SELECT COUNT(*)" - " FROM institutions,centres,degrees,courses,games" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentCty.Cty.CtyCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of games", + "SELECT COUNT(*)" + " FROM institutions,centres,degrees,courses,games" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentCty.Cty.CtyCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_INS: - DB_BuildQuery ("SELECT COUNT(*)" - " FROM centres,degrees,courses,games" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of games", + "SELECT COUNT(*)" + " FROM centres,degrees,courses,games" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CTR: - DB_BuildQuery ("SELECT COUNT(*)" - " FROM degrees,courses,games" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentCtr.Ctr.CtrCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of games", + "SELECT COUNT(*)" + " FROM degrees,courses,games" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentCtr.Ctr.CtrCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_DEG: - DB_BuildQuery ("SELECT COUNT(*)" - " FROM courses,games" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'", - Gbl.CurrentDeg.Deg.DegCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of games", + "SELECT COUNT(*)" + " FROM courses,games" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'", + Gbl.CurrentDeg.Deg.DegCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CRS: - DB_BuildQuery ("SELECT COUNT(*)" - " FROM games" - " WHERE games.Scope='%s'" - " AND CrsCod=%ld", - Sco_ScopeDB[Sco_SCOPE_CRS], - Gbl.CurrentCrs.Crs.CrsCod); + DB_QuerySELECT (&mysql_res,"can not get number of games", + "SELECT COUNT(*)" + " FROM games" + " WHERE games.Scope='%s'" + " AND CrsCod=%ld", + Sco_ScopeDB[Sco_SCOPE_CRS], + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_new (&mysql_res,"can not get number of games"); /***** Get number of games *****/ row = mysql_fetch_row (mysql_res); @@ -3986,82 +3993,87 @@ float Gam_GetNumQstsPerCrsGame (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - DB_BuildQuery ("SELECT AVG(NumQsts) FROM" - " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" - " FROM games,gam_questions" - " WHERE games.Scope='%s'" - " AND games.GamCod=gam_questions.GamCod" - " GROUP BY gam_questions.GamCod) AS NumQstsTable", - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of questions per game", + "SELECT AVG(NumQsts) FROM" + " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" + " FROM games,gam_questions" + " WHERE games.Scope='%s'" + " AND games.GamCod=gam_questions.GamCod" + " GROUP BY gam_questions.GamCod) AS NumQstsTable", + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CTY: - DB_BuildQuery ("SELECT AVG(NumQsts) FROM" - " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" - " FROM institutions,centres,degrees,courses,games,gam_questions" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'" - " AND games.GamCod=gam_questions.GamCod" - " GROUP BY gam_questions.GamCod) AS NumQstsTable", - Gbl.CurrentCty.Cty.CtyCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of questions per game", + "SELECT AVG(NumQsts) FROM" + " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" + " FROM institutions,centres,degrees,courses,games,gam_questions" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'" + " AND games.GamCod=gam_questions.GamCod" + " GROUP BY gam_questions.GamCod) AS NumQstsTable", + Gbl.CurrentCty.Cty.CtyCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_INS: - DB_BuildQuery ("SELECT AVG(NumQsts) FROM" - " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" - " FROM centres,degrees,courses,games,gam_questions" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'" - " AND games.GamCod=gam_questions.GamCod" - " GROUP BY gam_questions.GamCod) AS NumQstsTable", - Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of questions per game", + "SELECT AVG(NumQsts) FROM" + " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" + " FROM centres,degrees,courses,games,gam_questions" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'" + " AND games.GamCod=gam_questions.GamCod" + " GROUP BY gam_questions.GamCod) AS NumQstsTable", + Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CTR: - DB_BuildQuery ("SELECT AVG(NumQsts) FROM" - " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" - " FROM degrees,courses,games,gam_questions" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'" - " AND games.GamCod=gam_questions.GamCod" - " GROUP BY gam_questions.GamCod) AS NumQstsTable", - Gbl.CurrentCtr.Ctr.CtrCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of questions per game", + "SELECT AVG(NumQsts) FROM" + " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" + " FROM degrees,courses,games,gam_questions" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'" + " AND games.GamCod=gam_questions.GamCod" + " GROUP BY gam_questions.GamCod) AS NumQstsTable", + Gbl.CurrentCtr.Ctr.CtrCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_DEG: - DB_BuildQuery ("SELECT AVG(NumQsts) FROM" - " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" - " FROM courses,games,gam_questions" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=games.Cod" - " AND games.Scope='%s'" - " AND games.GamCod=gam_questions.GamCod" - " GROUP BY gam_questions.GamCod) AS NumQstsTable", - Gbl.CurrentDeg.Deg.DegCod, - Sco_ScopeDB[Sco_SCOPE_CRS]); + DB_QuerySELECT (&mysql_res,"can not get number of questions per game", + "SELECT AVG(NumQsts) FROM" + " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" + " FROM courses,games,gam_questions" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=games.Cod" + " AND games.Scope='%s'" + " AND games.GamCod=gam_questions.GamCod" + " GROUP BY gam_questions.GamCod) AS NumQstsTable", + Gbl.CurrentDeg.Deg.DegCod, + Sco_ScopeDB[Sco_SCOPE_CRS]); break; case Sco_SCOPE_CRS: - DB_BuildQuery ("SELECT AVG(NumQsts) FROM" - " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" - " FROM games,gam_questions" - " WHERE games.Scope='%s' AND games.Cod=%ld" - " AND games.GamCod=gam_questions.GamCod" - " GROUP BY gam_questions.GamCod) AS NumQstsTable", - Sco_ScopeDB[Sco_SCOPE_CRS],Gbl.CurrentCrs.Crs.CrsCod); + DB_QuerySELECT (&mysql_res,"can not get number of questions per game", + "SELECT AVG(NumQsts) FROM" + " (SELECT COUNT(gam_questions.QstCod) AS NumQsts" + " FROM games,gam_questions" + " WHERE games.Scope='%s' AND games.Cod=%ld" + " AND games.GamCod=gam_questions.GamCod" + " GROUP BY gam_questions.GamCod) AS NumQstsTable", + Sco_ScopeDB[Sco_SCOPE_CRS],Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_new (&mysql_res,"can not get number of questions per game"); /***** Get number of courses *****/ row = mysql_fetch_row (mysql_res); diff --git a/swad_group.c b/swad_group.c index a874f5ddc..ade310ae2 100644 --- a/swad_group.c +++ b/swad_group.c @@ -128,7 +128,7 @@ static unsigned Grp_CountNumGrpsInThisCrsOfType (long GrpTypCod); static void Grp_GetDataOfGroupTypeByCod (struct GroupType *GrpTyp); static bool Grp_GetMultipleEnrolmentOfAGroupType (long GrpTypCod); static long Grp_GetTypeOfGroupOfAGroup (long GrpCod); -static unsigned Grp_CountNumUsrsInNoGrpsOfType (Rol_Role_t Role,long GrpTypCod); +static unsigned long Grp_CountNumUsrsInNoGrpsOfType (Rol_Role_t Role,long GrpTypCod); static long Grp_GetFirstCodGrpIBelongTo (long GrpTypCod); static bool Grp_GetIfGrpIsAvailable (long GrpTypCod); static void Grp_GetLstCodGrpsUsrBelongs (long CrsCod,long GrpTypCod,long UsrCod, @@ -2305,7 +2305,7 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp, Role >= Rol_STD; Role--) fprintf (Gbl.F.Out,"" - "%u" + "%lu" "", Grp_CountNumUsrsInNoGrpsOfType (Role,GrpTyp->GrpTypCod)); @@ -2674,7 +2674,7 @@ void Grp_GetListGrpTypesInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes) { MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumRow; + unsigned long NumGrpTyp; if (++Gbl.CurrentCrs.Grps.GrpTypes.NestedCalls > 1) // If list is created yet, there's nothing to do return; @@ -2688,42 +2688,47 @@ void Grp_GetListGrpTypesInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes) switch (WhichGroupTypes) { case Grp_ONLY_GROUP_TYPES_WITH_GROUPS: - DB_BuildQuery ("SELECT crs_grp_types.GrpTypCod,crs_grp_types.GrpTypName," - "crs_grp_types.Mandatory,crs_grp_types.Multiple," - "crs_grp_types.MustBeOpened," - "UNIX_TIMESTAMP(crs_grp_types.OpenTime)," - "COUNT(crs_grp.GrpCod)" - " FROM crs_grp_types,crs_grp" - " WHERE crs_grp_types.CrsCod=%ld" - " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" - " GROUP BY crs_grp_types.GrpTypCod" - " ORDER BY crs_grp_types.GrpTypName", - Gbl.CurrentCrs.Crs.CrsCod); + Gbl.CurrentCrs.Grps.GrpTypes.Num = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get types of group" + " of a course", + "SELECT crs_grp_types.GrpTypCod,crs_grp_types.GrpTypName," + "crs_grp_types.Mandatory,crs_grp_types.Multiple," + "crs_grp_types.MustBeOpened," + "UNIX_TIMESTAMP(crs_grp_types.OpenTime)," + "COUNT(crs_grp.GrpCod)" + " FROM crs_grp_types,crs_grp" + " WHERE crs_grp_types.CrsCod=%ld" + " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" + " GROUP BY crs_grp_types.GrpTypCod" + " ORDER BY crs_grp_types.GrpTypName", + Gbl.CurrentCrs.Crs.CrsCod); break; case Grp_ALL_GROUP_TYPES: - DB_BuildQuery ("(SELECT crs_grp_types.GrpTypCod,crs_grp_types.GrpTypName AS GrpTypName," - "crs_grp_types.Mandatory,crs_grp_types.Multiple," - "crs_grp_types.MustBeOpened," - "UNIX_TIMESTAMP(crs_grp_types.OpenTime)," - "COUNT(crs_grp.GrpCod)" - " FROM crs_grp_types,crs_grp" - " WHERE crs_grp_types.CrsCod=%ld" - " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" - " GROUP BY crs_grp_types.GrpTypCod)" - " UNION " - "(SELECT GrpTypCod,GrpTypName," - "Mandatory,Multiple," - "MustBeOpened," - "UNIX_TIMESTAMP(OpenTime)," - "0" - " FROM crs_grp_types WHERE CrsCod=%ld" - " AND GrpTypCod NOT IN (SELECT GrpTypCod FROM crs_grp))" - " ORDER BY GrpTypName", - Gbl.CurrentCrs.Crs.CrsCod, - Gbl.CurrentCrs.Crs.CrsCod); + Gbl.CurrentCrs.Grps.GrpTypes.Num = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get types of group" + " of a course", + "(SELECT crs_grp_types.GrpTypCod,crs_grp_types.GrpTypName AS GrpTypName," + "crs_grp_types.Mandatory,crs_grp_types.Multiple," + "crs_grp_types.MustBeOpened," + "UNIX_TIMESTAMP(crs_grp_types.OpenTime)," + "COUNT(crs_grp.GrpCod)" + " FROM crs_grp_types,crs_grp" + " WHERE crs_grp_types.CrsCod=%ld" + " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" + " GROUP BY crs_grp_types.GrpTypCod)" + " UNION " + "(SELECT GrpTypCod,GrpTypName," + "Mandatory,Multiple," + "MustBeOpened," + "UNIX_TIMESTAMP(OpenTime)," + "0" + " FROM crs_grp_types WHERE CrsCod=%ld" + " AND GrpTypCod NOT IN (SELECT GrpTypCod FROM crs_grp))" + " ORDER BY GrpTypName", + Gbl.CurrentCrs.Crs.CrsCod, + Gbl.CurrentCrs.Crs.CrsCod); break; } - Gbl.CurrentCrs.Grps.GrpTypes.Num = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get types of group of a course"); /***** Get group types *****/ Gbl.CurrentCrs.Grps.GrpTypes.NumGrpsTotal = 0; @@ -2735,43 +2740,43 @@ void Grp_GetListGrpTypesInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes) Lay_NotEnoughMemoryExit (); /***** Get group types *****/ - for (NumRow = 0; - NumRow < Gbl.CurrentCrs.Grps.GrpTypes.Num; - NumRow++) + for (NumGrpTyp = 0; + NumGrpTyp < Gbl.CurrentCrs.Grps.GrpTypes.Num; + NumGrpTyp++) { /* Get next group type */ row = mysql_fetch_row (mysql_res); /* Get group type code (row[0]) */ - if ((Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].GrpTypCod = Str_ConvertStrCodToLongCod (row[0])) < 0) + if ((Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypCod = Str_ConvertStrCodToLongCod (row[0])) < 0) Lay_ShowErrorAndExit ("Wrong type of group."); /* Get group type name (row[1]) */ - Str_Copy (Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].GrpTypName,row[1], + Str_Copy (Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypName,row[1], Grp_MAX_BYTES_GROUP_TYPE_NAME); /* Is it mandatory to register in any groups of this type? (row[2]) */ - Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].MandatoryEnrolment = (row[2][0] == 'Y'); + Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].MandatoryEnrolment = (row[2][0] == 'Y'); /* Is it possible to register in multiple groups of this type? (row[3]) */ - Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].MultipleEnrolment = (row[3][0] == 'Y'); + Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].MultipleEnrolment = (row[3][0] == 'Y'); /* Groups of this type must be opened? (row[4]) */ - Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].MustBeOpened = (row[4][0] == 'Y'); + Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].MustBeOpened = (row[4][0] == 'Y'); /* Get open time (row[5] holds the open time UTC) */ - Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].OpenTimeUTC = Dat_GetUNIXTimeFromStr (row[5]); - Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].MustBeOpened &= Grp_CheckIfOpenTimeInTheFuture (Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].OpenTimeUTC); + Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].OpenTimeUTC = Dat_GetUNIXTimeFromStr (row[5]); + Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].MustBeOpened &= Grp_CheckIfOpenTimeInTheFuture (Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].OpenTimeUTC); /* Number of groups of this type (row[6]) */ - if (sscanf (row[6],"%u",&Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].NumGrps) != 1) + if (sscanf (row[6],"%u",&Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps) != 1) Lay_ShowErrorAndExit ("Wrong number of groups of a type."); /* Add number of groups to total number of groups */ - Gbl.CurrentCrs.Grps.GrpTypes.NumGrpsTotal += Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].NumGrps; + Gbl.CurrentCrs.Grps.GrpTypes.NumGrpsTotal += Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps; /* Initialize pointer to the list of groups of this type */ - Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumRow].LstGrps = NULL; + Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].LstGrps = NULL; } } @@ -2793,12 +2798,14 @@ void Grp_OpenGroupsAutomatically (void) long GrpTypCod; /***** Find group types to be opened *****/ - DB_BuildQuery ("SELECT GrpTypCod FROM crs_grp_types" - " WHERE CrsCod=%ld AND MustBeOpened='Y'" - " AND OpenTime<=NOW()", - Gbl.CurrentCrs.Crs.CrsCod); - NumGrpTypes = (unsigned) DB_QuerySELECT_new (&mysql_res, - "can not get the types of group to be opened"); + NumGrpTypes = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get the types of group" + " to be opened", + "SELECT GrpTypCod FROM crs_grp_types" + " WHERE CrsCod=%ld AND MustBeOpened='Y'" + " AND OpenTime<=NOW()", + Gbl.CurrentCrs.Crs.CrsCod); + for (NumGrpTyp = 0; NumGrpTyp < NumGrpTypes; NumGrpTyp++) @@ -2973,12 +2980,12 @@ static unsigned Grp_CountNumGrpsInThisCrsOfType (long GrpTypCod) unsigned long Grp_GetGrpsOfType (long GrpTypCod,MYSQL_RES **mysql_res) { /***** Get groups of a type from database *****/ - DB_BuildQuery ("SELECT GrpCod,GrpName,MaxStudents,Open,FileZones" - " FROM crs_grp" - " WHERE GrpTypCod=%ld" - " ORDER BY GrpName", - GrpTypCod); - return DB_QuerySELECT_new (mysql_res,"can not get groups of a type"); + return DB_QuerySELECT (mysql_res,"can not get groups of a type", + "SELECT GrpCod,GrpName,MaxStudents,Open,FileZones" + " FROM crs_grp" + " WHERE GrpTypCod=%ld" + " ORDER BY GrpName", + GrpTypCod); } /*****************************************************************************/ @@ -2993,11 +3000,15 @@ static void Grp_GetDataOfGroupTypeByCod (struct GroupType *GrpTyp) unsigned long NumRows; /***** Get data of a type of group from database *****/ - DB_BuildQuery ("SELECT GrpTypName,Mandatory,Multiple,MustBeOpened,UNIX_TIMESTAMP(OpenTime)" - " FROM crs_grp_types" - " WHERE CrsCod=%ld AND GrpTypCod=%ld", - Gbl.CurrentCrs.Crs.CrsCod,GrpTyp->GrpTypCod); - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get type of group"); + NumRows = DB_QuerySELECT (&mysql_res,"can not get type of group", + "SELECT GrpTypName," + "Mandatory," + "Multiple," + "MustBeOpened," + "UNIX_TIMESTAMP(OpenTime)" + " FROM crs_grp_types" + " WHERE CrsCod=%ld AND GrpTypCod=%ld", + Gbl.CurrentCrs.Crs.CrsCod,GrpTyp->GrpTypCod); /***** Count number of rows in result *****/ if (NumRows != 1) @@ -3027,9 +3038,11 @@ static bool Grp_GetMultipleEnrolmentOfAGroupType (long GrpTypCod) bool MultipleEnrolment; /***** Get data of a type of group from database *****/ - DB_BuildQuery ("SELECT Multiple FROM crs_grp_types WHERE GrpTypCod=%ld", - GrpTypCod); - if (DB_QuerySELECT_new (&mysql_res,"can not get if type of group has multiple enrolment") != 1) + if (DB_QuerySELECT (&mysql_res,"can not get if type of group" + " has multiple enrolment", + "SELECT Multiple FROM crs_grp_types" + " WHERE GrpTypCod=%ld", + GrpTypCod) != 1) Lay_ShowErrorAndExit ("Error when getting type of group."); /***** Get multiple enrolment *****/ @@ -3066,15 +3079,19 @@ void Grp_GetDataOfGroupByCod (struct GroupData *GrpDat) if (GrpDat->GrpCod > 0) { /***** Get data of a group from database *****/ - DB_BuildQuery ("SELECT crs_grp_types.GrpTypCod,crs_grp_types.CrsCod," - "crs_grp_types.GrpTypName,crs_grp_types.Multiple," - "crs_grp.GrpName,crs_grp.MaxStudents," - "crs_grp.Open,crs_grp.FileZones" - " FROM crs_grp,crs_grp_types" - " WHERE crs_grp.GrpCod=%ld" - " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod", - GrpDat->GrpCod); - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get data of a group"); + NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a group", + "SELECT crs_grp_types.GrpTypCod," + "crs_grp_types.CrsCod," + "crs_grp_types.GrpTypName," + "crs_grp_types.Multiple," + "crs_grp.GrpName," + "crs_grp.MaxStudents," + "crs_grp.Open," + "crs_grp.FileZones" + " FROM crs_grp,crs_grp_types" + " WHERE crs_grp.GrpCod=%ld" + " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod", + GrpDat->GrpCod); if (NumRows == 1) { @@ -3126,8 +3143,11 @@ static long Grp_GetTypeOfGroupOfAGroup (long GrpCod) long GrpTypCod; /***** Get data of a group from database *****/ - DB_BuildQuery ("SELECT GrpTypCod FROM crs_grp WHERE GrpCod=%ld",GrpCod); - if (DB_QuerySELECT_new (&mysql_res,"can not get the type of a group") != 1) + if (DB_QuerySELECT (&mysql_res,"can not get the type of a group", + "SELECT GrpTypCod" + " FROM crs_grp" + " WHERE GrpCod=%ld", + GrpCod) != 1) Lay_ShowErrorAndExit ("Error when getting group."); /***** Get data of group *****/ @@ -3191,34 +3211,20 @@ unsigned Grp_CountNumUsrsInGrp (Rol_Role_t Role,long GrpCod) /*** Count # of users of current course not belonging to groups of a type ****/ /*****************************************************************************/ -static unsigned Grp_CountNumUsrsInNoGrpsOfType (Rol_Role_t Role,long GrpTypCod) +static unsigned long Grp_CountNumUsrsInNoGrpsOfType (Rol_Role_t Role,long GrpTypCod) { - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned NumUsrs; - /***** Get number of users not belonging to groups of a type ******/ - DB_BuildQuery ("SELECT COUNT(UsrCod) FROM crs_usr" - " WHERE CrsCod=%ld AND Role=%u" - " AND UsrCod NOT IN" - " (SELECT DISTINCT crs_grp_usr.UsrCod" - " FROM crs_grp,crs_grp_usr" - " WHERE crs_grp.GrpTypCod=%ld" - " AND crs_grp.GrpCod=crs_grp_usr.GrpCod)", - Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Role,GrpTypCod); - DB_QuerySELECT_new (&mysql_res,"can not get the number of users" - " not belonging to groups of a type"); - - /***** Get the number of users (row[0]) *****/ - row = mysql_fetch_row (mysql_res); - if (sscanf (row[0],"%u",&NumUsrs) != 1) - Lay_ShowErrorAndExit ("Error when getting the number of users" - " not belonging to groups of a type."); - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - - return NumUsrs; + return DB_QueryCOUNT ("can not get the number of users" + " not belonging to groups of a type", + "SELECT COUNT(UsrCod) FROM crs_usr" + " WHERE CrsCod=%ld AND Role=%u" + " AND UsrCod NOT IN" + " (SELECT DISTINCT crs_grp_usr.UsrCod" + " FROM crs_grp,crs_grp_usr" + " WHERE crs_grp.GrpTypCod=%ld" + " AND crs_grp.GrpCod=crs_grp_usr.GrpCod)", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Role,GrpTypCod); } /*****************************************************************************/ @@ -3234,12 +3240,12 @@ static long Grp_GetFirstCodGrpIBelongTo (long GrpTypCod) long CodGrpIBelong; /***** Get a group which I belong to from database *****/ - DB_BuildQuery ("SELECT crs_grp.GrpCod FROM crs_grp,crs_grp_usr" - " WHERE crs_grp.GrpTypCod=%ld" - " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" - " AND crs_grp_usr.UsrCod=%ld", - GrpTypCod,Gbl.Usrs.Me.UsrDat.UsrCod); - NumRows = DB_QuerySELECT_new (&mysql_res,"can not check if you belong to a group"); + NumRows = DB_QuerySELECT (&mysql_res,"can not check if you belong to a group", + "SELECT crs_grp.GrpCod FROM crs_grp,crs_grp_usr" + " WHERE crs_grp.GrpTypCod=%ld" + " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" + " AND crs_grp_usr.UsrCod=%ld", + GrpTypCod,Gbl.Usrs.Me.UsrDat.UsrCod); /***** Get the group *****/ if (NumRows == 0) @@ -3485,31 +3491,38 @@ static void Grp_GetLstCodGrpsUsrBelongs (long CrsCod,long GrpTypCod, /***** Get groups which a user belong to from database *****/ if (CrsCod < 0) // Query the groups from all the user's courses - DB_BuildQuery ("SELECT GrpCod" - " FROM crs_grp_usr" - " WHERE UsrCod=%ld", // Groups will be unordered - UsrCod); + LstGrps->NumGrps = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get the groups" + " which a user belongs to", + "SELECT GrpCod" + " FROM crs_grp_usr" + " WHERE UsrCod=%ld", // Groups will be unordered + UsrCod); else if (GrpTypCod < 0) // Query the groups of any type in the course - DB_BuildQuery ("SELECT crs_grp.GrpCod" - " FROM crs_grp_types,crs_grp,crs_grp_usr" - " WHERE crs_grp_types.CrsCod=%ld" - " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" - " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" - " AND crs_grp_usr.UsrCod=%ld" - " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", - Gbl.CurrentCrs.Crs.CrsCod,UsrCod); + LstGrps->NumGrps = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get the groups" + " which a user belongs to", + "SELECT crs_grp.GrpCod" + " FROM crs_grp_types,crs_grp,crs_grp_usr" + " WHERE crs_grp_types.CrsCod=%ld" + " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" + " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" + " AND crs_grp_usr.UsrCod=%ld" + " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", + Gbl.CurrentCrs.Crs.CrsCod,UsrCod); else // Query only the groups of specified type in the course - DB_BuildQuery ("SELECT crs_grp.GrpCod" - " FROM crs_grp_types,crs_grp,crs_grp_usr" - " WHERE crs_grp_types.CrsCod=%ld" - " AND crs_grp_types.GrpTypCod=%ld" - " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" - " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" - " AND crs_grp_usr.UsrCod=%ld" - " ORDER BY crs_grp.GrpName", - Gbl.CurrentCrs.Crs.CrsCod,GrpTypCod,UsrCod); - LstGrps->NumGrps = (unsigned) DB_QuerySELECT_new (&mysql_res, - "can not get the groups which a user belongs to"); + LstGrps->NumGrps = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get the groups" + " which a user belongs to", + "SELECT crs_grp.GrpCod" + " FROM crs_grp_types,crs_grp,crs_grp_usr" + " WHERE crs_grp_types.CrsCod=%ld" + " AND crs_grp_types.GrpTypCod=%ld" + " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" + " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" + " AND crs_grp_usr.UsrCod=%ld" + " ORDER BY crs_grp.GrpName", + Gbl.CurrentCrs.Crs.CrsCod,GrpTypCod,UsrCod); /***** Get the groups *****/ if (LstGrps->NumGrps) @@ -3544,16 +3557,18 @@ void Grp_GetLstCodGrpsWithFileZonesIBelong (struct ListCodGrps *LstGrps) unsigned NumGrp; /***** Get groups which I belong to from database *****/ - DB_BuildQuery ("SELECT crs_grp.GrpCod" - " FROM crs_grp_types,crs_grp,crs_grp_usr" - " WHERE crs_grp_types.CrsCod=%ld" - " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" - " AND crs_grp.FileZones='Y'" - " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" - " AND crs_grp_usr.UsrCod=%ld" - " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", - Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Me.UsrDat.UsrCod); - LstGrps->NumGrps = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get the groups which I belong to"); + LstGrps->NumGrps = + (unsigned) DB_QuerySELECT (&mysql_res,"can not get the groups" + " which you belong to", + "SELECT crs_grp.GrpCod" + " FROM crs_grp_types,crs_grp,crs_grp_usr" + " WHERE crs_grp_types.CrsCod=%ld" + " AND crs_grp_types.GrpTypCod=crs_grp.GrpTypCod" + " AND crs_grp.FileZones='Y'" + " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" + " AND crs_grp_usr.UsrCod=%ld" + " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", + Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Me.UsrDat.UsrCod); /***** Get the groups *****/ if (LstGrps->NumGrps) @@ -3603,16 +3618,19 @@ void Grp_GetNamesGrpsStdBelongsTo (long GrpTypCod,long UsrCod,char *GroupNames) MYSQL_ROW row; unsigned long NumRow; unsigned long NumRows; - size_t MaxLength = (Grp_MAX_BYTES_GROUP_NAME + 2) * Gbl.CurrentCrs.Grps.GrpTypes.NumGrpsTotal; + size_t MaxLength = (Grp_MAX_BYTES_GROUP_NAME + 2) * + Gbl.CurrentCrs.Grps.GrpTypes.NumGrpsTotal; /***** Get the names of groups which a user belongs to, from database *****/ - DB_BuildQuery ("SELECT crs_grp.GrpName FROM crs_grp,crs_grp_usr" - " WHERE crs_grp.GrpTypCod=%ld" - " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" - " AND crs_grp_usr.UsrCod=%ld" - " ORDER BY crs_grp.GrpName", - GrpTypCod,UsrCod); - NumRows = DB_QuerySELECT_new (&mysql_res,"can not get the names of groups a user belongs to"); + NumRows = DB_QuerySELECT (&mysql_res,"can not get the names of groups" + " a user belongs to", + "SELECT crs_grp.GrpName" + " FROM crs_grp,crs_grp_usr" + " WHERE crs_grp.GrpTypCod=%ld" + " AND crs_grp.GrpCod=crs_grp_usr.GrpCod" + " AND crs_grp_usr.UsrCod=%ld" + " ORDER BY crs_grp.GrpName", + GrpTypCod,UsrCod); /***** Get the groups *****/ GroupNames[0] = '\0';