Version 16.155.27

This commit is contained in:
Antonio Cañas Vargas 2017-03-13 19:02:15 +01:00
parent da87da4bda
commit 3006896573
6 changed files with 166 additions and 135 deletions

View File

@ -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
--

View File

@ -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;

View File

@ -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 *****/
/*

View File

@ -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

View File

@ -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,"<div class=\"CONTEXT_MENU\">");
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,"</div>");
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,"<input type=\"text\" name=\"Ans%06u\""
" size=\"40\" maxlength=\"%u\" value=\"\" />",
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");
}

View File

@ -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