From 58bea36918fb9559f2cfb5825088266ce9346c7d Mon Sep 17 00:00:00 2001 From: acanas Date: Sun, 26 Sep 2021 12:46:51 +0200 Subject: [PATCH] Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database. --- swad_changelog.h | 7 +-- swad_match.c | 4 +- swad_match_database.c | 99 ++++++++++++++++++++++++++++++++++++++++++- swad_match_database.h | 10 ++++- swad_match_print.c | 72 ++++++------------------------- 5 files changed, 124 insertions(+), 68 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index a155dad64..7103c913f 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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) diff --git a/swad_match.c b/swad_match.c index fafdbc936..487c92d79 100644 --- a/swad_match.c +++ b/swad_match.c @@ -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 (); diff --git a/swad_match_database.c b/swad_match_database.c index a54df255b..6597837ef 100644 --- a/swad_match_database.c +++ b/swad_match_database.c @@ -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", diff --git a/swad_match_database.h b/swad_match_database.h index d31cc122c..8894a966e 100644 --- a/swad_match_database.h +++ b/swad_match_database.h @@ -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 diff --git a/swad_match_print.c b/swad_match_print.c index b89cb9629..92e149171 100644 --- a/swad_match_print.c +++ b/swad_match_print.c @@ -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]);