mirror of https://github.com/acanas/swad-core.git
Version 21.6.3: Sep 20, 2021 Queries moved to module swad_game_database.
This commit is contained in:
parent
74d611fc4d
commit
f9acc93507
|
@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
|
||||||
|
|
||||||
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 21.6.2 (2021-09-18)"
|
#define Log_PLATFORM_VERSION "SWAD 21.6.3 (2021-09-20)"
|
||||||
#define CSS_FILE "swad20.45.css"
|
#define CSS_FILE "swad20.45.css"
|
||||||
#define JS_FILE "swad20.69.1.js"
|
#define JS_FILE "swad20.69.1.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 21.6.3: Sep 20, 2021 Queries moved to module swad_game_database. (315708 lines)
|
||||||
Version 21.6.2: Sep 18, 2021 Queries moved to module swad_game_database. (315679 lines)
|
Version 21.6.2: Sep 18, 2021 Queries moved to module swad_game_database. (315679 lines)
|
||||||
Version 21.6.1: Sep 18, 2021 Queries moved to module swad_game_database. (315571 lines)
|
Version 21.6.1: Sep 18, 2021 Queries moved to module swad_game_database. (315571 lines)
|
||||||
Version 21.6: Sep 18, 2021 New module swad_game_database for database queries related to games. (315565 lines)
|
Version 21.6: Sep 18, 2021 New module swad_game_database for database queries related to games. (315565 lines)
|
||||||
|
|
61
swad_game.c
61
swad_game.c
|
@ -2175,9 +2175,7 @@ static void Gam_ExchangeQuestions (long GamCod,
|
||||||
long QstCodBottom;
|
long QstCodBottom;
|
||||||
|
|
||||||
/***** Lock table to make the move atomic *****/
|
/***** Lock table to make the move atomic *****/
|
||||||
DB_Query ("can not lock tables to move game question",
|
Gam_DB_LockTable ();
|
||||||
"LOCK TABLES gam_questions WRITE");
|
|
||||||
Gbl.DB.LockedTables = true;
|
|
||||||
|
|
||||||
/***** Get question code of the questions to be moved *****/
|
/***** Get question code of the questions to be moved *****/
|
||||||
QstCodTop = Gam_DB_GetQstCodFromQstInd (GamCod,QstIndTop);
|
QstCodTop = Gam_DB_GetQstCodFromQstInd (GamCod,QstIndTop);
|
||||||
|
@ -2199,40 +2197,16 @@ static void Gam_ExchangeQuestions (long GamCod,
|
||||||
*/
|
*/
|
||||||
/* Step 1: change temporarily top index to minus bottom index
|
/* Step 1: change temporarily top index to minus bottom index
|
||||||
in order to not repeat unique index (GamCod,QstInd) */
|
in order to not repeat unique index (GamCod,QstInd) */
|
||||||
DB_QueryUPDATE ("can not exchange indexes of questions",
|
Gam_DB_UpdateQstIndex (-((long) QstIndBottom),GamCod,QstCodTop );
|
||||||
"UPDATE gam_questions"
|
|
||||||
" SET QstInd=-%u"
|
|
||||||
" WHERE GamCod=%ld"
|
|
||||||
" AND QstCod=%ld",
|
|
||||||
QstIndBottom,
|
|
||||||
GamCod,
|
|
||||||
QstCodTop);
|
|
||||||
|
|
||||||
/* Step 2: change bottom index to old top index */
|
/* Step 2: change bottom index to old top index */
|
||||||
DB_QueryUPDATE ("can not exchange indexes of questions",
|
Gam_DB_UpdateQstIndex ( (long) QstIndTop ,GamCod,QstCodBottom);
|
||||||
"UPDATE gam_questions"
|
|
||||||
" SET QstInd=%u"
|
|
||||||
" WHERE GamCod=%ld"
|
|
||||||
" AND QstCod=%ld",
|
|
||||||
QstIndTop,
|
|
||||||
GamCod,
|
|
||||||
QstCodBottom);
|
|
||||||
|
|
||||||
/* Step 3: change top index to old bottom index */
|
/* Step 3: change top index to old bottom index */
|
||||||
DB_QueryUPDATE ("can not exchange indexes of questions",
|
Gam_DB_UpdateQstIndex ( (long) QstIndBottom ,GamCod,QstCodTop );
|
||||||
"UPDATE gam_questions"
|
|
||||||
" SET QstInd=%u"
|
|
||||||
" WHERE GamCod=%ld"
|
|
||||||
" AND QstCod=%ld",
|
|
||||||
QstIndBottom,
|
|
||||||
GamCod,
|
|
||||||
QstCodTop);
|
|
||||||
|
|
||||||
/***** Unlock table *****/
|
/***** Unlock table *****/
|
||||||
Gbl.DB.LockedTables = false; // Set to false before the following unlock...
|
Gam_DB_UnlockTable ();
|
||||||
// ...to not retry the unlock if error in unlocking
|
|
||||||
DB_Query ("can not unlock tables after moving game questions",
|
|
||||||
"UNLOCK TABLES");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2302,17 +2276,7 @@ void Gam_ShowTstTagsPresentInAGame (long GamCod)
|
||||||
unsigned long NumTags;
|
unsigned long NumTags;
|
||||||
|
|
||||||
/***** Get all tags of questions in this game *****/
|
/***** Get all tags of questions in this game *****/
|
||||||
NumTags = (unsigned)
|
NumTags = Gam_DB_GetTstTagsPresentInAGame (&mysql_res,GamCod);
|
||||||
DB_QuerySELECT (&mysql_res,"can not get tags present in a match result",
|
|
||||||
"SELECT tst_tags.TagTxt" // row[0]
|
|
||||||
" FROM (SELECT DISTINCT(tst_question_tags.TagCod)"
|
|
||||||
" FROM tst_question_tags,gam_questions"
|
|
||||||
" WHERE gam_questions.GamCod=%ld"
|
|
||||||
" AND gam_questions.QstCod=tst_question_tags.QstCod) AS TagsCods,"
|
|
||||||
"tst_tags"
|
|
||||||
" WHERE TagsCods.TagCod=tst_tags.TagCod"
|
|
||||||
" ORDER BY tst_tags.TagTxt",
|
|
||||||
GamCod);
|
|
||||||
Tst_ShowTagList (NumTags,mysql_res);
|
Tst_ShowTagList (NumTags,mysql_res);
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
|
@ -2332,14 +2296,7 @@ void Gam_GetScoreRange (long GamCod,double *MinScore,double *MaxScore)
|
||||||
unsigned NumAnswers;
|
unsigned NumAnswers;
|
||||||
|
|
||||||
/***** Get maximum score of a game from database *****/
|
/***** Get maximum score of a game from database *****/
|
||||||
NumQsts = (unsigned)
|
NumQsts = Gam_DB_GetNumAnswersOfQstsInGame (&mysql_res,GamCod);
|
||||||
DB_QuerySELECT (&mysql_res,"can not get data of a question",
|
|
||||||
"SELECT COUNT(tst_answers.AnsInd) AS N" // row[0]
|
|
||||||
" FROM tst_answers,gam_questions"
|
|
||||||
" WHERE gam_questions.GamCod=%ld"
|
|
||||||
" AND gam_questions.QstCod=tst_answers.QstCod"
|
|
||||||
" GROUP BY tst_answers.QstCod",
|
|
||||||
GamCod);
|
|
||||||
for (NumQst = 0, *MinScore = *MaxScore = 0.0;
|
for (NumQst = 0, *MinScore = *MaxScore = 0.0;
|
||||||
NumQst < NumQsts;
|
NumQst < NumQsts;
|
||||||
NumQst++)
|
NumQst++)
|
||||||
|
@ -2350,9 +2307,11 @@ void Gam_GetScoreRange (long GamCod,double *MinScore,double *MaxScore)
|
||||||
if (sscanf (row[0],"%u",&NumAnswers) != 1)
|
if (sscanf (row[0],"%u",&NumAnswers) != 1)
|
||||||
NumAnswers = 0;
|
NumAnswers = 0;
|
||||||
|
|
||||||
/* Accumulate minimum and maximum score */
|
/* Check number of answers */
|
||||||
if (NumAnswers < 2)
|
if (NumAnswers < 2)
|
||||||
Err_ShowErrorAndExit ("Wrong number of answers.");
|
Err_ShowErrorAndExit ("Wrong number of answers.");
|
||||||
|
|
||||||
|
/* Accumulate minimum and maximum score */
|
||||||
*MinScore += -1.0 / (double) (NumAnswers - 1);
|
*MinScore += -1.0 / (double) (NumAnswers - 1);
|
||||||
*MaxScore += 1.0;
|
*MaxScore += 1.0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,6 +472,45 @@ void Gam_DB_UpdateIndexesOfQstsGreaterThan (long GamCod,unsigned QstInd)
|
||||||
QstInd);
|
QstInd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Change index of a set in an exam **********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Gam_DB_UpdateQstIndex (long QstInd,long GamCod,long QstCod)
|
||||||
|
{
|
||||||
|
DB_QueryUPDATE ("can not exchange indexes of questions",
|
||||||
|
"UPDATE gam_questions"
|
||||||
|
" SET QstInd=%ld"
|
||||||
|
" WHERE GamCod=%ld"
|
||||||
|
" AND QstCod=%ld",
|
||||||
|
QstInd,
|
||||||
|
GamCod,
|
||||||
|
QstCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************ Lock table to make the exchange of questions atomic ************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Gam_DB_LockTable (void)
|
||||||
|
{
|
||||||
|
DB_Query ("can not lock tables to move game question",
|
||||||
|
"LOCK TABLES gam_questions WRITE");
|
||||||
|
Gbl.DB.LockedTables = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********** Unlock table to make the exchange of questions atomic ************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Gam_DB_UnlockTable (void)
|
||||||
|
{
|
||||||
|
Gbl.DB.LockedTables = false; // Set to false before the following unlock...
|
||||||
|
// ...to not retry the unlock if error in unlocking
|
||||||
|
DB_Query ("can not unlock tables after moving game questions",
|
||||||
|
"UNLOCK TABLES");
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************* Get number of questions of a game *********************/
|
/******************* Get number of questions of a game *********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -697,6 +736,42 @@ double Gam_DB_GetNumQstsPerGame (HieLvl_Level_t Scope)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Get all tags of questions in a game *******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Gam_DB_GetTstTagsPresentInAGame (MYSQL_RES **mysql_res,long GamCod)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QuerySELECT (mysql_res,"can not get tags present in a match result",
|
||||||
|
"SELECT tst_tags.TagTxt" // row[0]
|
||||||
|
" FROM (SELECT DISTINCT(tst_question_tags.TagCod)"
|
||||||
|
" FROM tst_question_tags,gam_questions"
|
||||||
|
" WHERE gam_questions.GamCod=%ld"
|
||||||
|
" AND gam_questions.QstCod=tst_question_tags.QstCod) AS TagsCods,"
|
||||||
|
"tst_tags"
|
||||||
|
" WHERE TagsCods.TagCod=tst_tags.TagCod"
|
||||||
|
" ORDER BY tst_tags.TagTxt",
|
||||||
|
GamCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************* Get number of answers of each question in a game **************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Gam_DB_GetNumAnswersOfQstsInGame (MYSQL_RES **mysql_res,long GamCod)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QuerySELECT (mysql_res,"can not get data of a question",
|
||||||
|
"SELECT COUNT(tst_answers.AnsInd) AS N" // row[0]
|
||||||
|
" FROM tst_answers,"
|
||||||
|
"gam_questions"
|
||||||
|
" WHERE gam_questions.GamCod=%ld"
|
||||||
|
" AND gam_questions.QstCod=tst_answers.QstCod"
|
||||||
|
" GROUP BY tst_answers.QstCod",
|
||||||
|
GamCod);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************************* Remove question from game *************************/
|
/************************* Remove question from game *************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -58,6 +58,9 @@ void Gam_DB_RemoveCrsGames (long CrsCod);
|
||||||
//---------------------------- Game questions ---------------------------------
|
//---------------------------- Game questions ---------------------------------
|
||||||
void Gam_DB_InsertQstInGame (long GamCod,unsigned QstInd,long QstCod);
|
void Gam_DB_InsertQstInGame (long GamCod,unsigned QstInd,long QstCod);
|
||||||
void Gam_DB_UpdateIndexesOfQstsGreaterThan (long GamCod,unsigned QstInd);
|
void Gam_DB_UpdateIndexesOfQstsGreaterThan (long GamCod,unsigned QstInd);
|
||||||
|
void Gam_DB_UpdateQstIndex (long QstInd,long GamCod,long QstCod);
|
||||||
|
void Gam_DB_LockTable (void);
|
||||||
|
void Gam_DB_UnlockTable (void);
|
||||||
|
|
||||||
unsigned Gam_DB_GetNumQstsGame (long GamCod);
|
unsigned Gam_DB_GetNumQstsGame (long GamCod);
|
||||||
unsigned Gam_DB_GetGameQuestions (MYSQL_RES **mysql_res,long GamCod);
|
unsigned Gam_DB_GetGameQuestions (MYSQL_RES **mysql_res,long GamCod);
|
||||||
|
@ -67,6 +70,8 @@ unsigned Gam_DB_GetMaxQuestionIndexInGame (long GamCod);
|
||||||
unsigned Gam_DB_GetPrevQuestionIndexInGame (long GamCod,unsigned QstInd);
|
unsigned Gam_DB_GetPrevQuestionIndexInGame (long GamCod,unsigned QstInd);
|
||||||
unsigned Gam_DB_GetNextQuestionIndexInGame (long GamCod,unsigned QstInd);
|
unsigned Gam_DB_GetNextQuestionIndexInGame (long GamCod,unsigned QstInd);
|
||||||
double Gam_DB_GetNumQstsPerGame (HieLvl_Level_t Scope);
|
double Gam_DB_GetNumQstsPerGame (HieLvl_Level_t Scope);
|
||||||
|
unsigned Gam_DB_GetTstTagsPresentInAGame (MYSQL_RES **mysql_res,long GamCod);
|
||||||
|
unsigned Gam_DB_GetNumAnswersOfQstsInGame (MYSQL_RES **mysql_res,long GamCod);
|
||||||
|
|
||||||
void Gam_DB_RemoveQstFromGame (long GamCod,unsigned QstInd);
|
void Gam_DB_RemoveQstFromGame (long GamCod,unsigned QstInd);
|
||||||
void Gam_DB_RemoveGameQsts (long GamCod);
|
void Gam_DB_RemoveGameQsts (long GamCod);
|
||||||
|
|
Loading…
Reference in New Issue