Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database.

This commit is contained in:
acanas 2021-09-26 12:46:51 +02:00
parent 6161a356cb
commit 58bea36918
5 changed files with 124 additions and 68 deletions

View File

@ -602,15 +602,16 @@ 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.
*/
#define Log_PLATFORM_VERSION "SWAD 21.16.4 (2021-09-25)"
#define Log_PLATFORM_VERSION "SWAD 21.16.5 (2021-09-26)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 21.16.4: Sep 24, 2021 Queries moved to module swad_match_database. (317091 lines)
Version 21.16.3: Sep 24, 2021 Queries moved to module swad_match_database. (317085 lines)
Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database. (317134 lines)
Version 21.16.4: Sep 25, 2021 Queries moved to module swad_match_database. (317091 lines)
Version 21.16.3: Sep 25, 2021 Queries moved to module swad_match_database. (317085 lines)
Version 21.16.2: Sep 25, 2021 Code refactoring related to error alerts. (317087 lines)
Version 21.16.1: Sep 24, 2021 Queries moved to module swad_match_database. (317054 lines)
Version 21.16: Sep 24, 2021 New module swad_match_database for database queries related to game matches. (316995 lines)

View File

@ -3098,10 +3098,10 @@ static void Mch_ShowMatchScore (const struct Mch_Match *Match)
NumRowsPerScorePoint = (double) Mch_NUM_ROWS_SCORE / Range;
/***** Get maximum number of users *****/
MaxUsrs = Mch_DB_GetMaxUsrs (Match->MchCod);
MaxUsrs = Mch_DB_GetMaxUsrsPerScore (Match->MchCod);
/***** Get scores from database *****/
NumScores = Mch_DB_GetUsrsPerScore (&mysql_res,Match->MchCod);
NumScores = Mch_DB_GetNumUsrsPerScore (&mysql_res,Match->MchCod);
/***** Begin table ****/
HTM_TABLE_BeginWide ();

View File

@ -863,6 +863,101 @@ unsigned Mch_DB_GetElapsedTimeInMatch (MYSQL_RES **mysql_res,long MchCod)
MchCod);
}
/*****************************************************************************/
/***************************** Create match print ****************************/
/*****************************************************************************/
void Mch_DB_CreateMatchPrint (const struct MchPrn_Print *Print)
{
Str_SetDecimalPointToUS (); // To print the floating point as a dot
DB_QueryINSERT ("can not create match result",
"INSERT mch_results "
"(MchCod,UsrCod,StartTime,EndTime,NumQsts,NumQstsNotBlank,Score)"
" VALUES "
"(%ld," // MchCod
"%ld," // UsrCod
"NOW()," // StartTime
"NOW()," // EndTime
"%u," // NumQsts
"%u," // NumQstsNotBlank
"'%.15lg')", // Score
Print->MchCod,
Print->UsrCod,
Print->NumQsts.All,
Print->NumQsts.NotBlank,
Print->Score);
Str_SetDecimalPointToLocal (); // Return to local system
}
/*****************************************************************************/
/***************************** Update match print ****************************/
/*****************************************************************************/
void Mch_DB_UpdateMatchPrint (const struct MchPrn_Print *Print)
{
Str_SetDecimalPointToUS (); // To print the floating point as a dot
DB_QueryUPDATE ("can not update match print",
"UPDATE mch_results"
" SET EndTime=NOW(),"
"NumQsts=%u,"
"NumQstsNotBlank=%u,"
"Score='%.15lg'"
" WHERE MchCod=%ld"
" AND UsrCod=%ld",
Print->NumQsts.All,
Print->NumQsts.NotBlank,
Print->Score,
Print->MchCod,
Print->UsrCod);
Str_SetDecimalPointToLocal (); // Return to local system
}
/*****************************************************************************/
/*********************** Check if match print exists *************************/
/*****************************************************************************/
bool Mch_DB_CheckIfMatchPrintExists (const struct MchPrn_Print *Print)
{
return (DB_QueryCOUNT ("can not get if match print exists",
"SELECT COUNT(*)"
" FROM mch_results"
" WHERE MchCod=%ld"
" AND UsrCod=%ld",
Print->MchCod,
Print->UsrCod) != 0);
}
/*****************************************************************************/
/********* Get data of a match print using match code and user code **********/
/*****************************************************************************/
unsigned Mch_DB_GetMatchPrintData (MYSQL_RES **mysql_res,
const struct MchPrn_Print *Print)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get data of a match print",
"SELECT UNIX_TIMESTAMP(mch_results.StartTime)," // row[1]
"UNIX_TIMESTAMP(mch_results.EndTime)," // row[2]
"mch_results.NumQsts," // row[3]
"mch_results.NumQstsNotBlank," // row[4]
"mch_results.Score" // row[5]
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_results.MchCod=%ld"
" AND mch_results.UsrCod=%ld"
" AND mch_results.MchCod=mch_matches.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld", // Extra check
Print->MchCod,
Print->UsrCod,
Gbl.Hierarchy.Crs.CrsCod);
}
/*****************************************************************************/
/************ Get number of users who have played a given match **************/
/*****************************************************************************/
@ -884,7 +979,7 @@ unsigned Mch_DB_GetNumUsrsWhoHavePlayedMch (long MchCod)
/********* Get maximum number of users per score in match results ************/
/*****************************************************************************/
unsigned Mch_DB_GetMaxUsrs (long MchCod)
unsigned Mch_DB_GetMaxUsrsPerScore (long MchCod)
{
return DB_QuerySELECTUnsigned ("can not get max users",
"SELECT MAX(NumUsrs)"
@ -900,7 +995,7 @@ unsigned Mch_DB_GetMaxUsrs (long MchCod)
/************** Get number of users per score in match results ***************/
/*****************************************************************************/
unsigned Mch_DB_GetUsrsPerScore (MYSQL_RES **mysql_res,long MchCod)
unsigned Mch_DB_GetNumUsrsPerScore (MYSQL_RES **mysql_res,long MchCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get scores",

View File

@ -109,9 +109,15 @@ unsigned Mch_DB_GetElapsedTimeInQuestion (MYSQL_RES **mysql_res,
unsigned Mch_DB_GetElapsedTimeInMatch (MYSQL_RES **mysql_res,long MchCod);
//----------------------------- Match results ---------------------------------
void Mch_DB_CreateMatchPrint (const struct MchPrn_Print *Print);
void Mch_DB_UpdateMatchPrint (const struct MchPrn_Print *Print);
bool Mch_DB_CheckIfMatchPrintExists (const struct MchPrn_Print *Print);
unsigned Mch_DB_GetMatchPrintData (MYSQL_RES **mysql_res,
const struct MchPrn_Print *Print);
unsigned Mch_DB_GetNumUsrsWhoHavePlayedMch (long MchCod);
unsigned Mch_DB_GetMaxUsrs (long MchCod);
unsigned Mch_DB_GetUsrsPerScore (MYSQL_RES **mysql_res,long MchCod);
unsigned Mch_DB_GetMaxUsrsPerScore (long MchCod);
unsigned Mch_DB_GetNumUsrsPerScore (MYSQL_RES **mysql_res,long MchCod);
#endif

View File

@ -29,6 +29,7 @@
#include "swad_date.h"
#include "swad_global.h"
#include "swad_match.h"
#include "swad_match_database.h"
#include "swad_match_print.h"
/*****************************************************************************/
@ -57,7 +58,7 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static void MchPrn_UpdateMyMatchPrintInDB (struct MchPrn_Print *Print);
static void MchPrn_UpdateMatchPrintInDB (const struct MchPrn_Print *Print);
/*****************************************************************************/
/**************************** Reset match print ******************************/
@ -90,53 +91,21 @@ void MchPrn_ComputeScoreAndUpdateMyMatchPrintInDB (long MchCod)
Mch_ComputeScore (&Print);
/***** Update my match result in database *****/
MchPrn_UpdateMyMatchPrintInDB (&Print);
MchPrn_UpdateMatchPrintInDB (&Print);
}
/*****************************************************************************/
/******************** Create/update my result in a match *********************/
/************************* Create/update match print *************************/
/*****************************************************************************/
static void MchPrn_UpdateMyMatchPrintInDB (struct MchPrn_Print *Print)
static void MchPrn_UpdateMatchPrintInDB (const struct MchPrn_Print *Print)
{
Str_SetDecimalPointToUS (); // To print the floating point as a dot
if (DB_QueryCOUNT ("can not get if match result exists",
"SELECT COUNT(*)"
" FROM mch_results"
" WHERE MchCod=%ld"
" AND UsrCod=%ld",
Print->MchCod,Print->UsrCod)) // Match print exists
/* Update result */
DB_QueryUPDATE ("can not update match result",
"UPDATE mch_results"
" SET EndTime=NOW(),"
"NumQsts=%u,"
"NumQstsNotBlank=%u,"
"Score='%.15lg'"
" WHERE MchCod=%ld"
" AND UsrCod=%ld",
Print->NumQsts.All,
Print->NumQsts.NotBlank,
Print->Score,
Print->MchCod,Print->UsrCod);
else // Match print doesn't exist
/* Create result */
DB_QueryINSERT ("can not create match result",
"INSERT mch_results "
"(MchCod,UsrCod,StartTime,EndTime,NumQsts,NumQstsNotBlank,Score)"
" VALUES "
"(%ld," // MchCod
"%ld," // UsrCod
"NOW()," // StartTime
"NOW()," // EndTime
"%u," // NumQsts
"%u," // NumQstsNotBlank
"'%.15lg')", // Score
Print->MchCod,Print->UsrCod,
Print->NumQsts.All,
Print->NumQsts.NotBlank,
Print->Score);
Str_SetDecimalPointToLocal (); // Return to local system
if (Mch_DB_CheckIfMatchPrintExists (Print)) // Match print exists
/* Update match print */
Mch_DB_UpdateMatchPrint (Print);
else // Match print doesn't exist
/* Create match print */
Mch_DB_CreateMatchPrint (Print);
}
/*****************************************************************************/
@ -150,27 +119,12 @@ void MchPrn_GetMatchPrintDataByMchCodAndUsrCod (struct MchPrn_Print *Print)
Dat_StartEndTime_t StartEndTime;
/***** Make database query *****/
if (DB_QuerySELECT (&mysql_res,"can not get data of a match print",
"SELECT UNIX_TIMESTAMP(mch_results.StartTime)," // row[1]
"UNIX_TIMESTAMP(mch_results.EndTime)," // row[2]
"mch_results.NumQsts," // row[3]
"mch_results.NumQstsNotBlank," // row[4]
"mch_results.Score" // row[5]
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_results.MchCod=%ld"
" AND mch_results.UsrCod=%ld"
" AND mch_results.MchCod=mch_matches.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld", // Extra check
Print->MchCod,Print->UsrCod,
Gbl.Hierarchy.Crs.CrsCod) == 1)
if (Mch_DB_GetMatchPrintData (&mysql_res,Print) == 1)
{
row = mysql_fetch_row (mysql_res);
/* Get start time (row[0] and row[1] hold UTC date-times) */
for (StartEndTime = (Dat_StartEndTime_t) 0;
for (StartEndTime = (Dat_StartEndTime_t) 0;
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
StartEndTime++)
Print->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[StartEndTime]);