diff --git a/sql/swad.sql b/sql/swad.sql index cadd30e9..7bbb04c7 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -1087,7 +1087,7 @@ CREATE TABLE IF NOT EXISTS tst_answers ( Answer TEXT NOT NULL, Feedback TEXT NOT NULL, ImageName VARCHAR(43) NOT NULL, - ImageTitle VARCHAR(255) NOT NULL, + ImageTitle VARCHAR(2047) NOT NULL, ImageURL VARCHAR(255) NOT NULL, Correct ENUM('N','Y') NOT NULL, INDEX(QstCod)); @@ -1147,7 +1147,7 @@ CREATE TABLE IF NOT EXISTS tst_questions ( Stem TEXT NOT NULL, Feedback TEXT NOT NULL, ImageName VARCHAR(43) NOT NULL, - ImageTitle VARCHAR(255) NOT NULL, + ImageTitle VARCHAR(2047) NOT NULL, ImageURL VARCHAR(255) NOT NULL, NumHits INT NOT NULL DEFAULT 0, NumHitsNotBlank INT NOT NULL DEFAULT 0, @@ -1170,11 +1170,10 @@ CREATE TABLE IF NOT EXISTS tst_tags ( TagCod INT NOT NULL AUTO_INCREMENT, CrsCod INT NOT NULL DEFAULT -1, ChangeTime DATETIME NOT NULL, - TagTxt VARCHAR(255) NOT NULL, + TagTxt VARCHAR(2047) NOT NULL, TagHidden ENUM('N','Y') NOT NULL, UNIQUE INDEX(TagCod), - INDEX(CrsCod,ChangeTime), - INDEX(TagTxt)); + INDEX(CrsCod,ChangeTime)); -- -- Table usr_banned: stores users banned for ranking -- diff --git a/swad_changelog.h b/swad_changelog.h index 5f7405dd..1920ac23 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -209,13 +209,26 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.155.26 (2017-03-13)" +#define Log_PLATFORM_VERSION "SWAD 16.155.27 (2017-03-13)" #define CSS_FILE "swad16.147.css" #define JS_FILE "swad16.144.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1 /* + Version 16.155.27:Mar 13, 2017 Adjusting size of database fields. (217038 lines) + 4 changes necessary in database. +ALTER TABLE tst_answers CHANGE COLUMN ImageTitle ImageTitle VARCHAR(2047) NOT NULL; +ALTER TABLE tst_questions CHANGE COLUMN ImageTitle ImageTitle VARCHAR(2047) NOT NULL; +DROP INDEX TagTxt ON tst_tags; +ALTER TABLE tst_tags CHANGE COLUMN TagTxt TagTxt VARCHAR(2047) NOT NULL; + + DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_tags (" + "TagCod INT NOT NULL AUTO_INCREMENT," + "CrsCod INT NOT NULL DEFAULT -1," + "ChangeTime DATETIME NOT NULL," + "TagTxt VARCHAR(2047) NOT NULL," // Tst_MAX_BYTES_TAG + Version 16.155.26:Mar 13, 2017 Adjusting size of database fields. (217009 lines) 3 changes necessary in database: ALTER TABLE timetable_crs CHANGE COLUMN Place Place VARCHAR(511) NOT NULL; diff --git a/swad_database.c b/swad_database.c index f2a09a7d..70014378 100644 --- a/swad_database.c +++ b/swad_database.c @@ -2303,22 +2303,22 @@ mysql> DESCRIBE tst_answers; | Answer | text | NO | | NULL | | | Feedback | text | NO | | NULL | | | ImageName | varchar(43) | NO | | NULL | | -| ImageTitle | varchar(255) | NO | | NULL | | +| ImageTitle | varchar(2047) | NO | | NULL | | | ImageURL | varchar(255) | NO | | NULL | | | Correct | enum('N','Y') | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ -8 rows in set (0.01 sec) +8 rows in set (0,00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers (" - "QstCod INT NOT NULL," - "AnsInd TINYINT NOT NULL," - "Answer TEXT NOT NULL," - "Feedback TEXT NOT NULL," - "ImageName VARCHAR(43) NOT NULL," - "ImageTitle VARCHAR(255) NOT NULL," - "ImageURL VARCHAR(255) NOT NULL," - "Correct ENUM('N','Y') NOT NULL," - "INDEX(QstCod))"); + "QstCod INT NOT NULL," + "AnsInd TINYINT NOT NULL," + "Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK + "Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK + "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME + "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE + "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW + "Correct ENUM('N','Y') NOT NULL," + "INDEX(QstCod))"); /***** Table tst_config *****/ /* @@ -2337,14 +2337,14 @@ mysql> DESCRIBE tst_config; 7 rows in set (0,00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_config (" - "CrsCod INT NOT NULL DEFAULT -1," - "Pluggable ENUM('unknown','N','Y') NOT NULL DEFAULT 'unknown'," - "Min INT NOT NULL," - "Def INT NOT NULL," - "Max INT NOT NULL," - "MinTimeNxtTstPerQst INT NOT NULL DEFAULT 0," - "Feedback ENUM('nothing','total_result','each_result','each_good_bad','full_feedback') NOT NULL," - "UNIQUE INDEX(CrsCod))"); + "CrsCod INT NOT NULL DEFAULT -1," + "Pluggable ENUM('unknown','N','Y') NOT NULL DEFAULT 'unknown'," + "Min INT NOT NULL," + "Def INT NOT NULL," + "Max INT NOT NULL," + "MinTimeNxtTstPerQst INT NOT NULL DEFAULT 0," + "Feedback ENUM('nothing','total_result','each_result','each_good_bad','full_feedback') NOT NULL," + "UNIQUE INDEX(CrsCod))"); /***** Table tst_exam_questions *****/ /* @@ -2362,13 +2362,13 @@ mysql> DESCRIBE tst_exam_questions; 6 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_exam_questions (" - "TstCod INT NOT NULL," - "QstCod INT NOT NULL," - "QstInd INT NOT NULL," - "Score DOUBLE PRECISION NOT NULL DEFAULT 0," - "Indexes TEXT NOT NULL," - "Answers TEXT NOT NULL," - "INDEX(TstCod,QstCod))"); + "TstCod INT NOT NULL," + "QstCod INT NOT NULL," + "QstInd INT NOT NULL," + "Score DOUBLE PRECISION NOT NULL DEFAULT 0," + "Indexes TEXT NOT NULL," // Tst_MAX_BYTES_INDEXES_ONE_QST + "Answers TEXT NOT NULL," // Tst_MAX_BYTES_ANSWERS_ONE_QST + "INDEX(TstCod,QstCod))"); /***** Table tst_exams *****/ /* @@ -2388,16 +2388,16 @@ mysql> DESCRIBE tst_exams; 8 rows in set (0.05 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_exams (" - "TstCod INT NOT NULL AUTO_INCREMENT," - "CrsCod INT NOT NULL," - "UsrCod INT NOT NULL," - "AllowTeachers ENUM('N','Y') NOT NULL DEFAULT 'N'," - "TstTime DATETIME NOT NULL," - "NumQsts INT NOT NULL DEFAULT 0," - "NumQstsNotBlank INT NOT NULL DEFAULT 0," - "Score DOUBLE PRECISION NOT NULL DEFAULT 0," - "UNIQUE INDEX(TstCod)," - "INDEX(CrsCod,UsrCod))"); + "TstCod INT NOT NULL AUTO_INCREMENT," + "CrsCod INT NOT NULL," + "UsrCod INT NOT NULL," + "AllowTeachers ENUM('N','Y') NOT NULL DEFAULT 'N'," + "TstTime DATETIME NOT NULL," + "NumQsts INT NOT NULL DEFAULT 0," + "NumQstsNotBlank INT NOT NULL DEFAULT 0," + "Score DOUBLE PRECISION NOT NULL DEFAULT 0," + "UNIQUE INDEX(TstCod)," + "INDEX(CrsCod,UsrCod))"); /***** Table tst_question_tags *****/ /* @@ -2412,10 +2412,10 @@ mysql> DESCRIBE tst_question_tags; 3 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_question_tags (" - "QstCod INT NOT NULL," - "TagCod INT NOT NULL," - "TagInd TINYINT NOT NULL," - "UNIQUE INDEX(QstCod,TagCod))"); + "QstCod INT NOT NULL," + "TagCod INT NOT NULL," + "TagInd TINYINT NOT NULL," + "UNIQUE INDEX(QstCod,TagCod))"); /***** Table tst_questions *****/ /* @@ -2431,29 +2431,30 @@ mysql> DESCRIBE tst_questions; | Stem | text | NO | | NULL | | | Feedback | text | NO | | NULL | | | ImageName | varchar(43) | NO | | NULL | | -| ImageTitle | varchar(255) | NO | | NULL | | +| ImageTitle | varchar(2047) | NO | | NULL | | | ImageURL | varchar(255) | NO | | NULL | | | NumHits | int(11) | NO | | 0 | | | NumHitsNotBlank | int(11) | NO | | 0 | | | Score | double | NO | | 0 | | +-----------------+---------------------------------------------------------------------------+------+-----+---------+----------------+ -13 rows in set (0.00 sec) +13 rows in set (0,00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_questions (" - "QstCod INT NOT NULL AUTO_INCREMENT," - "CrsCod INT NOT NULL DEFAULT -1," - "EditTime DATETIME NOT NULL," - "AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL," - "Shuffle ENUM('N','Y') NOT NULL," - "Stem TEXT NOT NULL," - "Feedback TEXT NOT NULL," - "ImageName VARCHAR(43) NOT NULL," - "ImageTitle VARCHAR(255) NOT NULL," - "NumHits INT NOT NULL DEFAULT 0," - "NumHitsNotBlank INT NOT NULL DEFAULT 0," - "Score DOUBLE PRECISION NOT NULL DEFAULT 0," - "UNIQUE INDEX(QstCod)," - "INDEX(CrsCod,EditTime))"); + "QstCod INT NOT NULL AUTO_INCREMENT," + "CrsCod INT NOT NULL DEFAULT -1," + "EditTime DATETIME NOT NULL," + "AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL," + "Shuffle ENUM('N','Y') NOT NULL," + "Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT + "Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT + "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME + "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE + "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW + "NumHits INT NOT NULL DEFAULT 0," + "NumHitsNotBlank INT NOT NULL DEFAULT 0," + "Score DOUBLE PRECISION NOT NULL DEFAULT 0," + "UNIQUE INDEX(QstCod)," + "INDEX(CrsCod,EditTime))"); /***** Table tst_status *****/ /* @@ -2469,11 +2470,11 @@ mysql> DESCRIBE tst_status; 4 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_status (" - "SessionId CHAR(43) NOT NULL," - "CrsCod INT NOT NULL," - "NumTst INT NOT NULL," - "Status TINYINT NOT NULL," - "UNIQUE INDEX(SessionId,CrsCod,NumTst))"); + "SessionId CHAR(43) NOT NULL," + "CrsCod INT NOT NULL," + "NumTst INT NOT NULL," + "Status TINYINT NOT NULL," + "UNIQUE INDEX(SessionId,CrsCod,NumTst))"); /***** Table tst_tags *****/ /* @@ -2484,21 +2485,20 @@ mysql> DESCRIBE tst_tags; | TagCod | int(11) | NO | PRI | NULL | auto_increment | | CrsCod | int(11) | NO | MUL | -1 | | | ChangeTime | datetime | NO | | NULL | | -| TagTxt | varchar(255) | NO | MUL | NULL | | +| TagTxt | varchar(2047) | NO | | NULL | | | TagHidden | enum('N','Y') | NO | | NULL | | +------------+---------------+------+-----+---------+----------------+ -5 rows in set (0.00 sec) +5 rows in set (0,00 sec) */ // CrsCod is redundant for speed in querys DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_tags (" - "TagCod INT NOT NULL AUTO_INCREMENT," - "CrsCod INT NOT NULL DEFAULT -1," - "ChangeTime DATETIME NOT NULL," - "TagTxt VARCHAR(255) NOT NULL," - "TagHidden ENUM('N','Y') NOT NULL," - "UNIQUE INDEX(TagCod)," - "INDEX(CrsCod,ChangeTime)," - "INDEX(TagTxt))"); + "TagCod INT NOT NULL AUTO_INCREMENT," + "CrsCod INT NOT NULL DEFAULT -1," + "ChangeTime DATETIME NOT NULL," + "TagTxt VARCHAR(2047) NOT NULL," // Tst_MAX_BYTES_TAG + "TagHidden ENUM('N','Y') NOT NULL," + "UNIQUE INDEX(TagCod)," + "INDEX(CrsCod,ChangeTime))"); /***** Table usr_banned *****/ /* diff --git a/swad_global.h b/swad_global.h index d6feac4f..a2230556 100644 --- a/swad_global.h +++ b/swad_global.h @@ -653,8 +653,8 @@ struct Globals Tst_AnswerType_t AnswerType; unsigned NumQsts; long QstCodes[Tst_MAX_QUESTIONS_PER_TEST]; // Codes of the sent/received questions in a test - char StrIndexesOneQst[Tst_MAX_QUESTIONS_PER_TEST][Tst_MAX_SIZE_INDEXES_ONE_QST + 1]; // 0 1 2 3, 3 0 2 1, etc. - char StrAnswersOneQst[Tst_MAX_QUESTIONS_PER_TEST][Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; // Answers selected by user + char StrIndexesOneQst[Tst_MAX_QUESTIONS_PER_TEST][Tst_MAX_BYTES_INDEXES_ONE_QST + 1]; // 0 1 2 3, 3 0 2 1, etc. + char StrAnswersOneQst[Tst_MAX_QUESTIONS_PER_TEST][Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; // Answers selected by user bool AllowTeachers; // Can teachers of this course see the test result? bool AllAnsTypes; struct diff --git a/swad_test.c b/swad_test.c index 6d66d539..d471dd5b 100644 --- a/swad_test.c +++ b/swad_test.c @@ -592,11 +592,13 @@ static void Tst_GetQuestionsAndAnswersFromForm (void) /* Get indexes for this question */ sprintf (StrQstIndOrAns,"Ind%06u",NumQst); - Par_GetParMultiToText (StrQstIndOrAns,Gbl.Test.StrIndexesOneQst[NumQst],Tst_MAX_SIZE_INDEXES_ONE_QST); /* If choice ==> "0", "1", "2",... */ + Par_GetParMultiToText (StrQstIndOrAns,Gbl.Test.StrIndexesOneQst[NumQst], + Tst_MAX_BYTES_INDEXES_ONE_QST); /* If choice ==> "0", "1", "2",... */ /* Get answers selected by user for this question */ sprintf (StrQstIndOrAns,"Ans%06u",NumQst); - Par_GetParMultiToText (StrQstIndOrAns,Gbl.Test.StrAnswersOneQst[NumQst],Tst_MAX_SIZE_ANSWERS_ONE_QST); /* If answer type == T/F ==> " ", "T", "F"; if choice ==> "0", "2",... */ + Par_GetParMultiToText (StrQstIndOrAns,Gbl.Test.StrAnswersOneQst[NumQst], + Tst_MAX_BYTES_ANSWERS_ONE_QST); /* If answer type == T/F ==> " ", "T", "F"; if choice ==> "0", "2",... */ } } @@ -691,7 +693,7 @@ static bool Tst_CheckIfNextTstAllowed (void) static void Tst_SetTstStatus (unsigned NumTst,Tst_Status_t TstStatus) { - char Query[512 + Ses_BYTES_SESSION_ID]; + char Query[256 + Ses_BYTES_SESSION_ID]; /***** Delete old status from expired sessions *****/ sprintf (Query,"DELETE FROM tst_status" @@ -703,7 +705,8 @@ static void Tst_SetTstStatus (unsigned NumTst,Tst_Status_t TstStatus) " (SessionId,CrsCod,NumTst,Status)" " VALUES" " ('%s','%ld','%u','%u')", - Gbl.Session.Id,Gbl.CurrentCrs.Crs.CrsCod,NumTst,(unsigned) TstStatus); + Gbl.Session.Id,Gbl.CurrentCrs.Crs.CrsCod, + NumTst,(unsigned) TstStatus); DB_QueryREPLACE (Query,"can not update status of test"); } @@ -713,7 +716,7 @@ static void Tst_SetTstStatus (unsigned NumTst,Tst_Status_t TstStatus) static Tst_Status_t Tst_GetTstStatus (unsigned NumTst) { - char Query[512]; + char Query[256 + Ses_BYTES_SESSION_ID]; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -748,7 +751,7 @@ static Tst_Status_t Tst_GetTstStatus (unsigned NumTst) static unsigned Tst_GetNumAccessesTst (void) { - char Query[512]; + char Query[256]; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -758,7 +761,7 @@ static unsigned Tst_GetNumAccessesTst (void) { /***** Get number of hits to test from database *****/ sprintf (Query,"SELECT NumAccTst FROM crs_usr" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", + " WHERE CrsCod='%ld' AND UsrCod='%ld'", Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Me.UsrDat.UsrCod); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get number of hits to test"); @@ -1188,7 +1191,8 @@ static void Tst_UpdateScoreQst (long QstCod,float ScoreThisQst,bool AnswerIsNotB Str_SetDecimalPointToUS (); // To print the floating point as a dot if (AnswerIsNotBlank) sprintf (Query,"UPDATE tst_questions" - " SET NumHits=NumHits+1,NumHitsNotBlank=NumHitsNotBlank+1,Score=Score+(%lf)" + " SET NumHits=NumHits+1,NumHitsNotBlank=NumHitsNotBlank+1," + "Score=Score+(%lf)" " WHERE QstCod='%ld'", ScoreThisQst,QstCod); else // The answer is blank @@ -1206,7 +1210,7 @@ static void Tst_UpdateScoreQst (long QstCod,float ScoreThisQst,bool AnswerIsNotB static void Tst_UpdateMyNumAccessTst (unsigned NumAccessesTst) { - char Query[512]; + char Query[256]; /***** Update my number of accesses to test in this course *****/ sprintf (Query,"UPDATE crs_usr SET NumAccTst='%u'" @@ -1222,7 +1226,7 @@ static void Tst_UpdateMyNumAccessTst (unsigned NumAccessesTst) static void Tst_UpdateLastAccTst (void) { - char Query[512]; + char Query[256]; /***** Update date-time and number of questions of this test *****/ sprintf (Query,"UPDATE crs_usr SET LastAccTst=NOW(),NumQstsLastTst='%u'" @@ -1499,26 +1503,30 @@ void Tst_RenameTag (void) sprintf (Query,"DROP TEMPORARY TABLE IF EXISTS tst_question_tags_tmp"); if (mysql_query (&Gbl.mysql,Query)) DB_ExitOnMySQLError ("can not remove temporary table"); - sprintf (Query,"CREATE TEMPORARY TABLE tst_question_tags_tmp ENGINE=MEMORY" - " SELECT QstCod FROM tst_question_tags WHERE TagCod='%ld'", + sprintf (Query,"CREATE TEMPORARY TABLE tst_question_tags_tmp" + " ENGINE=MEMORY" + " SELECT QstCod FROM tst_question_tags" + " WHERE TagCod='%ld'", ExistingTagCod); if (mysql_query (&Gbl.mysql,Query)) DB_ExitOnMySQLError ("can not create temporary table"); /* Remove old tag in questions where it would be repeated */ + // New tag existed for a question ==> delete old tag sprintf (Query,"DELETE FROM tst_question_tags" " WHERE TagCod='%ld'" " AND QstCod IN" - " (SELECT QstCod FROM tst_question_tags_tmp)", // New tag existed for a question ==> delete old tag + " (SELECT QstCod FROM tst_question_tags_tmp)", OldTagCod); DB_QueryDELETE (Query,"can not remove a tag from some questions"); /* Change old tag to new tag in questions where it would not be repeated */ + // New tag did not exist for a question ==> change old tag to new tag sprintf (Query,"UPDATE tst_question_tags" " SET TagCod='%ld'" " WHERE TagCod='%ld'" " AND QstCod NOT IN" - " (SELECT QstCod FROM tst_question_tags_tmp)", // New tag did not exist for a question ==> change old tag to new tag + " (SELECT QstCod FROM tst_question_tags_tmp)", ExistingTagCod, OldTagCod); DB_QueryUPDATE (Query,"can not update a tag in some questions"); @@ -1562,7 +1570,7 @@ void Tst_RenameTag (void) static bool Tst_CheckIfCurrentCrsHasTestTags (void) { - char Query[512]; + char Query[128]; /***** Get available tags from database *****/ sprintf (Query,"SELECT COUNT(*) FROM tst_tags WHERE CrsCod='%ld'", @@ -1577,7 +1585,7 @@ static bool Tst_CheckIfCurrentCrsHasTestTags (void) static unsigned long Tst_GetAllTagsFromCurrentCrs (MYSQL_RES **mysql_res) { - char Query[512]; + char Query[256]; /***** Get available tags from database *****/ sprintf (Query,"SELECT TagCod,TagTxt,TagHidden FROM tst_tags" @@ -1593,7 +1601,7 @@ static unsigned long Tst_GetAllTagsFromCurrentCrs (MYSQL_RES **mysql_res) static unsigned long Tst_GetEnabledTagsFromThisCrs (MYSQL_RES **mysql_res) { - char Query[512]; + char Query[256]; /***** Get available not hidden tags from database *****/ sprintf (Query,"SELECT TagCod,TagTxt FROM tst_tags" @@ -1963,7 +1971,7 @@ static void Tst_PutInputFieldNumQst (const char *Field,const char *Label, static void Tst_GetConfigTstFromDB (void) { - char Query[512]; + char Query[256]; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -2062,7 +2070,7 @@ void Tst_GetConfigFromRow (MYSQL_ROW row) bool Tst_CheckIfCourseHaveTestsAndPluggableIsUnknown (void) { - char Query[512]; + char Query[128]; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -2302,26 +2310,31 @@ void Tst_ListQuestionsToEdit (void) unsigned long NumRows; /***** Get parameters, query the database and list the questions *****/ - if (Tst_GetParamsTst ()) // Get parameters of the form + if (Tst_GetParamsTst ()) // Get parameters from the form { - if ((NumRows = Tst_GetQuestionsForEdit (&mysql_res)) != 0) // Query database + if ((NumRows = Tst_GetQuestionsForEdit (&mysql_res)) != 0) // Query database { - /***** Buttons for edition *****/ + /* Buttons for edition */ fprintf (Gbl.F.Out,"
"); if (Gbl.Test.XML.CreateXML) - TsI_CreateXML (NumRows,mysql_res); // Create XML file for exporting questions and put a link to download it + /* Create XML file for exporting questions + and put a link to download it */ + TsI_CreateXML (NumRows,mysql_res); else - TsI_PutFormToExportQuestions (); // Button to export questions + /* Button to export questions */ + TsI_PutFormToExportQuestions (); fprintf (Gbl.F.Out,"
"); - Tst_ListOneOrMoreQuestionsToEdit (NumRows,mysql_res); // Show the table with the questions + /* Show the table with the questions */ + Tst_ListOneOrMoreQuestionsToEdit (NumRows,mysql_res); } /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); } else - Tst_ShowFormAskEditTsts (); // Show the form again + /* Show the form again */ + Tst_ShowFormAskEditTsts (); /***** Free memory used by the list of tags *****/ Tst_FreeTagsList (); @@ -3709,7 +3722,7 @@ static void Tst_WriteTextAnsViewTest (unsigned NumQst) /***** Write input field for the answer *****/ fprintf (Gbl.F.Out,"", - NumQst,Tst_MAX_SIZE_ANSWERS_ONE_QST); + NumQst,Tst_MAX_BYTES_ANSWERS_ONE_QST); } /*****************************************************************************/ @@ -3721,8 +3734,8 @@ static void Tst_WriteTextAnsAssessTest (unsigned NumQst,MYSQL_RES *mysql_res, { unsigned NumOpt; MYSQL_ROW row; - char TextAnsUsr[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; - char TextAnsOK[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; + char TextAnsUsr[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; + char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; bool Correct = false; /* row[ 0] AnsInd @@ -3781,7 +3794,7 @@ static void Tst_WriteTextAnsAssessTest (unsigned NumQst,MYSQL_RES *mysql_res, { /* Filter the user answer */ Str_Copy (TextAnsUsr,Gbl.Test.StrAnswersOneQst[NumQst], - Tst_MAX_SIZE_ANSWERS_ONE_QST); + Tst_MAX_BYTES_ANSWERS_ONE_QST); /* In order to compare student answer to stored answer, the text answers are stored avoiding two or more consecurive spaces */ @@ -3795,7 +3808,7 @@ static void Tst_WriteTextAnsAssessTest (unsigned NumQst,MYSQL_RES *mysql_res, { /* Filter this correct answer */ Str_Copy (TextAnsOK,Gbl.Test.Answer.Options[NumOpt].Text, - Tst_MAX_SIZE_ANSWERS_ONE_QST); + Tst_MAX_BYTES_ANSWERS_ONE_QST); Str_ConvertToComparable (TextAnsOK); /* Check is user answer is correct */ @@ -4201,7 +4214,9 @@ unsigned long Tst_GetTagsQst (long QstCod,MYSQL_RES **mysql_res) /***** Get the tags of a question from database *****/ sprintf (Query,"SELECT tst_tags.TagTxt FROM tst_question_tags,tst_tags" - " WHERE tst_question_tags.QstCod='%ld' AND tst_question_tags.TagCod=tst_tags.TagCod AND tst_tags.CrsCod='%ld'" + " WHERE tst_question_tags.QstCod='%ld'" + " AND tst_question_tags.TagCod=tst_tags.TagCod" + " AND tst_tags.CrsCod='%ld'" " ORDER BY tst_question_tags.TagInd", QstCod,Gbl.CurrentCrs.Crs.CrsCod); return DB_QuerySELECT (Query,mysql_res,"can not get the tags of a question"); @@ -5286,7 +5301,7 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback) char TagStr[6 + 10 + 1]; char AnsStr[6 + 10 + 1]; char FbStr[5 + 10 + 1]; - char StrMultiAns[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; + char StrMultiAns[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; char TF[1 + 1]; // (T)rue or (F)alse const char *Ptr; unsigned NumCorrectAns; @@ -5417,7 +5432,7 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback) } else if (Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE) { - Par_GetParMultiToText ("AnsMulti",StrMultiAns,Tst_MAX_SIZE_ANSWERS_ONE_QST); + Par_GetParMultiToText ("AnsMulti",StrMultiAns,Tst_MAX_BYTES_ANSWERS_ONE_QST); Ptr = StrMultiAns; while (*Ptr) { @@ -5895,7 +5910,7 @@ void Tst_RequestRemoveQst (void) void Tst_RemoveQst (void) { extern const char *Txt_Question_removed; - char Query[512]; + char Query[256]; bool EditingOnlyThisQst; /***** Get the question code *****/ @@ -5942,7 +5957,7 @@ void Tst_ChangeShuffleQst (void) { extern const char *Txt_The_answers_of_the_question_with_code_X_will_appear_shuffled; extern const char *Txt_The_answers_of_the_question_with_code_X_will_appear_without_shuffling; - char Query[512]; + char Query[256]; bool EditingOnlyThisQst; bool Shuffle; @@ -6022,7 +6037,8 @@ static void Tst_InsertOrUpdateQstIntoDB (void) Gbl.Test.Stem.Length + Gbl.Test.Feedback.Length + Img_BYTES_NAME + - Img_MAX_BYTES_TITLE)) == NULL) + Img_MAX_BYTES_TITLE + + Cns_MAX_BYTES_WWW)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store database query."); if (Gbl.Test.QstCod < 0) // It's a new question @@ -6129,7 +6145,11 @@ static void Tst_InsertAnswersIntoDB (void) unsigned i; /***** Allocate space for query *****/ - if ((Query = malloc (256 + Tst_MAX_BYTES_ANSWER_OR_FEEDBACK * 2)) == NULL) + if ((Query = malloc (256 + + Tst_MAX_BYTES_ANSWER_OR_FEEDBACK * 2 + + Img_BYTES_NAME + + Img_MAX_BYTES_TITLE + + Cns_MAX_BYTES_WWW)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store database query."); /***** Insert answers in the answers table *****/ @@ -6214,7 +6234,7 @@ static void Tst_InsertAnswersIntoDB (void) static void Tst_RemAnsFromQst (void) { - char Query[512]; + char Query[128]; /***** Remove answers *****/ sprintf (Query,"DELETE FROM tst_answers WHERE QstCod='%ld'", @@ -6228,7 +6248,7 @@ static void Tst_RemAnsFromQst (void) static void Tst_RemTagsFromQst (void) { - char Query[512]; + char Query[128]; /***** Remove tags *****/ sprintf (Query,"DELETE FROM tst_question_tags WHERE QstCod='%ld'", @@ -6242,7 +6262,7 @@ static void Tst_RemTagsFromQst (void) static void Tst_RemoveUnusedTagsFromCurrentCrs (void) { - char Query[1024]; + char Query[512]; /***** Remove unused tags from tst_tags *****/ sprintf (Query,"DELETE FROM tst_tags" @@ -6290,15 +6310,14 @@ static void Tst_RemoveImgFileFromStemOfQst (long CrsCod,long QstCod) static void Tst_RemoveAllImgFilesFromStemOfAllQstsInCrs (long CrsCod) { - char Query[256]; + char Query[128]; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumImages; unsigned NumImg; /***** Get names of images associated to stems of test questions from database *****/ - sprintf (Query,"SELECT ImageName FROM tst_questions" - " WHERE CrsCod='%ld'", + sprintf (Query,"SELECT ImageName FROM tst_questions WHERE CrsCod='%ld'", CrsCod); NumImages = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get images"); @@ -7885,9 +7904,11 @@ static void Tst_GetTestResultDataByTstCod (long TstCod,time_t *TstTimeUTC, static void Tst_StoreOneTestResultQstInDB (long TstCod,long QstCod,unsigned NumQst,double Score) { - char Query[256 + Tst_MAX_SIZE_INDEXES_ONE_QST + Tst_MAX_SIZE_ANSWERS_ONE_QST]; - char Indexes[Tst_MAX_SIZE_INDEXES_ONE_QST + 1]; - char Answers[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; + char Query[256 + + Tst_MAX_BYTES_INDEXES_ONE_QST + + Tst_MAX_BYTES_ANSWERS_ONE_QST]; + char Indexes[Tst_MAX_BYTES_INDEXES_ONE_QST + 1]; + char Answers[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1]; /***** Replace each separator of multiple parameters by a comma *****/ /* In database commas are used as separators instead of special chars */ @@ -7915,14 +7936,13 @@ static void Tst_StoreOneTestResultQstInDB (long TstCod,long QstCod,unsigned NumQ static void Tst_GetTestResultQuestionsFromDB (long TstCod) { - char Query[512]; + char Query[256]; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumQst; /***** Get questions of a test result from database *****/ - sprintf (Query,"SELECT QstCod,Indexes,Answers" - " FROM tst_exam_questions" + sprintf (Query,"SELECT QstCod,Indexes,Answers FROM tst_exam_questions" " WHERE TstCod='%ld' ORDER BY QstInd", TstCod); Gbl.Test.NumQsts = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get questions of a test result"); @@ -7940,11 +7960,11 @@ static void Tst_GetTestResultQuestionsFromDB (long TstCod) /* Get indexes for this question (row[1]) */ Str_Copy (Gbl.Test.StrIndexesOneQst[NumQst],row[1], - Tst_MAX_SIZE_INDEXES_ONE_QST); + Tst_MAX_BYTES_INDEXES_ONE_QST); /* Get answers selected by user for this question (row[2]) */ Str_Copy (Gbl.Test.StrAnswersOneQst[NumQst],row[2], - Tst_MAX_SIZE_ANSWERS_ONE_QST); + Tst_MAX_BYTES_ANSWERS_ONE_QST); /* Replace each comma by a separator of multiple parameters */ /* In database commas are used as separators instead of special chars */ @@ -8017,8 +8037,7 @@ void Tst_RemoveCrsTestResults (long CrsCod) DB_QueryDELETE (Query,"can not remove test results made in a course"); /***** Remove test results made in the course *****/ - sprintf (Query,"DELETE FROM tst_exams" - " WHERE CrsCod='%ld'", + sprintf (Query,"DELETE FROM tst_exams WHERE CrsCod='%ld'", CrsCod); DB_QueryDELETE (Query,"can not remove test results made in a course"); } diff --git a/swad_test.h b/swad_test.h index 93046f0f..bd1d7464 100644 --- a/swad_test.h +++ b/swad_test.h @@ -40,8 +40,8 @@ #define Tst_MAX_BYTES_TAG ((Tst_MAX_CHARS_TAG + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 #define Tst_MAX_OPTIONS_PER_QUESTION 10 -#define Tst_MAX_SIZE_INDEXES_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1)) -#define Tst_MAX_SIZE_ANSWERS_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1)) +#define Tst_MAX_BYTES_INDEXES_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1)) +#define Tst_MAX_BYTES_ANSWERS_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1)) #define Tst_MAX_CHARS_ANSWER_OR_FEEDBACK (1024 - 1) // 1023 #define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK ((Tst_MAX_CHARS_ANSWER_OR_FEEDBACK + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 16383