mirror of https://github.com/acanas/swad-core.git
Version 16.155.27
This commit is contained in:
parent
da87da4bda
commit
3006896573
|
@ -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
|
||||
--
|
||||
|
|
|
@ -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;
|
||||
|
|
142
swad_database.c
142
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 *****/
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
127
swad_test.c
127
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,"<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");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue