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, Answer TEXT NOT NULL,
Feedback TEXT NOT NULL, Feedback TEXT NOT NULL,
ImageName VARCHAR(43) NOT NULL, ImageName VARCHAR(43) NOT NULL,
ImageTitle VARCHAR(255) NOT NULL, ImageTitle VARCHAR(2047) NOT NULL,
ImageURL VARCHAR(255) NOT NULL, ImageURL VARCHAR(255) NOT NULL,
Correct ENUM('N','Y') NOT NULL, Correct ENUM('N','Y') NOT NULL,
INDEX(QstCod)); INDEX(QstCod));
@ -1147,7 +1147,7 @@ CREATE TABLE IF NOT EXISTS tst_questions (
Stem TEXT NOT NULL, Stem TEXT NOT NULL,
Feedback TEXT NOT NULL, Feedback TEXT NOT NULL,
ImageName VARCHAR(43) NOT NULL, ImageName VARCHAR(43) NOT NULL,
ImageTitle VARCHAR(255) NOT NULL, ImageTitle VARCHAR(2047) NOT NULL,
ImageURL VARCHAR(255) NOT NULL, ImageURL VARCHAR(255) NOT NULL,
NumHits INT NOT NULL DEFAULT 0, NumHits INT NOT NULL DEFAULT 0,
NumHitsNotBlank 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, TagCod INT NOT NULL AUTO_INCREMENT,
CrsCod INT NOT NULL DEFAULT -1, CrsCod INT NOT NULL DEFAULT -1,
ChangeTime DATETIME NOT NULL, ChangeTime DATETIME NOT NULL,
TagTxt VARCHAR(255) NOT NULL, TagTxt VARCHAR(2047) NOT NULL,
TagHidden ENUM('N','Y') NOT NULL, TagHidden ENUM('N','Y') NOT NULL,
UNIQUE INDEX(TagCod), UNIQUE INDEX(TagCod),
INDEX(CrsCod,ChangeTime), INDEX(CrsCod,ChangeTime));
INDEX(TagTxt));
-- --
-- Table usr_banned: stores users banned for ranking -- Table usr_banned: stores users banned for ranking
-- --

View File

@ -209,13 +209,26 @@
/****************************** Public constants *****************************/ /****************************** 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 CSS_FILE "swad16.147.css"
#define JS_FILE "swad16.144.js" #define JS_FILE "swad16.144.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // 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 // 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) Version 16.155.26:Mar 13, 2017 Adjusting size of database fields. (217009 lines)
3 changes necessary in database: 3 changes necessary in database:
ALTER TABLE timetable_crs CHANGE COLUMN Place Place VARCHAR(511) NOT NULL; 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 | | | Answer | text | NO | | NULL | |
| Feedback | text | NO | | NULL | | | Feedback | text | NO | | NULL | |
| ImageName | varchar(43) | NO | | NULL | | | ImageName | varchar(43) | NO | | NULL | |
| ImageTitle | varchar(255) | NO | | NULL | | | ImageTitle | varchar(2047) | NO | | NULL | |
| ImageURL | varchar(255) | NO | | NULL | | | ImageURL | varchar(255) | NO | | NULL | |
| Correct | enum('N','Y') | 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 (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
"QstCod INT NOT NULL," "QstCod INT NOT NULL,"
"AnsInd TINYINT NOT NULL," "AnsInd TINYINT NOT NULL,"
"Answer TEXT NOT NULL," "Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
"Feedback TEXT NOT NULL," "Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
"ImageName VARCHAR(43) NOT NULL," "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
"ImageTitle VARCHAR(255) NOT NULL," "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
"ImageURL VARCHAR(255) NOT NULL," "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
"Correct ENUM('N','Y') NOT NULL," "Correct ENUM('N','Y') NOT NULL,"
"INDEX(QstCod))"); "INDEX(QstCod))");
/***** Table tst_config *****/ /***** Table tst_config *****/
/* /*
@ -2337,14 +2337,14 @@ mysql> DESCRIBE tst_config;
7 rows in set (0,00 sec) 7 rows in set (0,00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_config (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_config ("
"CrsCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1,"
"Pluggable ENUM('unknown','N','Y') NOT NULL DEFAULT 'unknown'," "Pluggable ENUM('unknown','N','Y') NOT NULL DEFAULT 'unknown',"
"Min INT NOT NULL," "Min INT NOT NULL,"
"Def INT NOT NULL," "Def INT NOT NULL,"
"Max INT NOT NULL," "Max INT NOT NULL,"
"MinTimeNxtTstPerQst INT NOT NULL DEFAULT 0," "MinTimeNxtTstPerQst INT NOT NULL DEFAULT 0,"
"Feedback ENUM('nothing','total_result','each_result','each_good_bad','full_feedback') NOT NULL," "Feedback ENUM('nothing','total_result','each_result','each_good_bad','full_feedback') NOT NULL,"
"UNIQUE INDEX(CrsCod))"); "UNIQUE INDEX(CrsCod))");
/***** Table tst_exam_questions *****/ /***** Table tst_exam_questions *****/
/* /*
@ -2362,13 +2362,13 @@ mysql> DESCRIBE tst_exam_questions;
6 rows in set (0.00 sec) 6 rows in set (0.00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_exam_questions (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_exam_questions ("
"TstCod INT NOT NULL," "TstCod INT NOT NULL,"
"QstCod INT NOT NULL," "QstCod INT NOT NULL,"
"QstInd INT NOT NULL," "QstInd INT NOT NULL,"
"Score DOUBLE PRECISION NOT NULL DEFAULT 0," "Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
"Indexes TEXT NOT NULL," "Indexes TEXT NOT NULL," // Tst_MAX_BYTES_INDEXES_ONE_QST
"Answers TEXT NOT NULL," "Answers TEXT NOT NULL," // Tst_MAX_BYTES_ANSWERS_ONE_QST
"INDEX(TstCod,QstCod))"); "INDEX(TstCod,QstCod))");
/***** Table tst_exams *****/ /***** Table tst_exams *****/
/* /*
@ -2388,16 +2388,16 @@ mysql> DESCRIBE tst_exams;
8 rows in set (0.05 sec) 8 rows in set (0.05 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_exams (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_exams ("
"TstCod INT NOT NULL AUTO_INCREMENT," "TstCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL," "CrsCod INT NOT NULL,"
"UsrCod INT NOT NULL," "UsrCod INT NOT NULL,"
"AllowTeachers ENUM('N','Y') NOT NULL DEFAULT 'N'," "AllowTeachers ENUM('N','Y') NOT NULL DEFAULT 'N',"
"TstTime DATETIME NOT NULL," "TstTime DATETIME NOT NULL,"
"NumQsts INT NOT NULL DEFAULT 0," "NumQsts INT NOT NULL DEFAULT 0,"
"NumQstsNotBlank INT NOT NULL DEFAULT 0," "NumQstsNotBlank INT NOT NULL DEFAULT 0,"
"Score DOUBLE PRECISION NOT NULL DEFAULT 0," "Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
"UNIQUE INDEX(TstCod)," "UNIQUE INDEX(TstCod),"
"INDEX(CrsCod,UsrCod))"); "INDEX(CrsCod,UsrCod))");
/***** Table tst_question_tags *****/ /***** Table tst_question_tags *****/
/* /*
@ -2412,10 +2412,10 @@ mysql> DESCRIBE tst_question_tags;
3 rows in set (0.00 sec) 3 rows in set (0.00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_question_tags (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_question_tags ("
"QstCod INT NOT NULL," "QstCod INT NOT NULL,"
"TagCod INT NOT NULL," "TagCod INT NOT NULL,"
"TagInd TINYINT NOT NULL," "TagInd TINYINT NOT NULL,"
"UNIQUE INDEX(QstCod,TagCod))"); "UNIQUE INDEX(QstCod,TagCod))");
/***** Table tst_questions *****/ /***** Table tst_questions *****/
/* /*
@ -2431,29 +2431,30 @@ mysql> DESCRIBE tst_questions;
| Stem | text | NO | | NULL | | | Stem | text | NO | | NULL | |
| Feedback | text | NO | | NULL | | | Feedback | text | NO | | NULL | |
| ImageName | varchar(43) | NO | | NULL | | | ImageName | varchar(43) | NO | | NULL | |
| ImageTitle | varchar(255) | NO | | NULL | | | ImageTitle | varchar(2047) | NO | | NULL | |
| ImageURL | varchar(255) | NO | | NULL | | | ImageURL | varchar(255) | NO | | NULL | |
| NumHits | int(11) | NO | | 0 | | | NumHits | int(11) | NO | | 0 | |
| NumHitsNotBlank | int(11) | NO | | 0 | | | NumHitsNotBlank | int(11) | NO | | 0 | |
| Score | double | 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 (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_questions ("
"QstCod INT NOT NULL AUTO_INCREMENT," "QstCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1,"
"EditTime DATETIME NOT NULL," "EditTime DATETIME NOT NULL,"
"AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL," "AnsType ENUM ('int','float','true_false','unique_choice','multiple_choice','text') NOT NULL,"
"Shuffle ENUM('N','Y') NOT NULL," "Shuffle ENUM('N','Y') NOT NULL,"
"Stem TEXT NOT NULL," "Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"Feedback TEXT NOT NULL," "Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"ImageName VARCHAR(43) NOT NULL," "ImageName VARCHAR(43) NOT NULL," // Img_BYTES_NAME
"ImageTitle VARCHAR(255) NOT NULL," "ImageTitle VARCHAR(2047) NOT NULL," // Img_MAX_BYTES_TITLE
"NumHits INT NOT NULL DEFAULT 0," "ImageURL VARCHAR(255) NOT NULL," // Cns_MAX_BYTES_WWW
"NumHitsNotBlank INT NOT NULL DEFAULT 0," "NumHits INT NOT NULL DEFAULT 0,"
"Score DOUBLE PRECISION NOT NULL DEFAULT 0," "NumHitsNotBlank INT NOT NULL DEFAULT 0,"
"UNIQUE INDEX(QstCod)," "Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
"INDEX(CrsCod,EditTime))"); "UNIQUE INDEX(QstCod),"
"INDEX(CrsCod,EditTime))");
/***** Table tst_status *****/ /***** Table tst_status *****/
/* /*
@ -2469,11 +2470,11 @@ mysql> DESCRIBE tst_status;
4 rows in set (0.00 sec) 4 rows in set (0.00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_status (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_status ("
"SessionId CHAR(43) NOT NULL," "SessionId CHAR(43) NOT NULL,"
"CrsCod INT NOT NULL," "CrsCod INT NOT NULL,"
"NumTst INT NOT NULL," "NumTst INT NOT NULL,"
"Status TINYINT NOT NULL," "Status TINYINT NOT NULL,"
"UNIQUE INDEX(SessionId,CrsCod,NumTst))"); "UNIQUE INDEX(SessionId,CrsCod,NumTst))");
/***** Table tst_tags *****/ /***** Table tst_tags *****/
/* /*
@ -2484,21 +2485,20 @@ mysql> DESCRIBE tst_tags;
| TagCod | int(11) | NO | PRI | NULL | auto_increment | | TagCod | int(11) | NO | PRI | NULL | auto_increment |
| CrsCod | int(11) | NO | MUL | -1 | | | CrsCod | int(11) | NO | MUL | -1 | |
| ChangeTime | datetime | NO | | NULL | | | ChangeTime | datetime | NO | | NULL | |
| TagTxt | varchar(255) | NO | MUL | NULL | | | TagTxt | varchar(2047) | NO | | NULL | |
| TagHidden | enum('N','Y') | 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 // CrsCod is redundant for speed in querys
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_tags (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_tags ("
"TagCod INT NOT NULL AUTO_INCREMENT," "TagCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1,"
"ChangeTime DATETIME NOT NULL," "ChangeTime DATETIME NOT NULL,"
"TagTxt VARCHAR(255) NOT NULL," "TagTxt VARCHAR(2047) NOT NULL," // Tst_MAX_BYTES_TAG
"TagHidden ENUM('N','Y') NOT NULL," "TagHidden ENUM('N','Y') NOT NULL,"
"UNIQUE INDEX(TagCod)," "UNIQUE INDEX(TagCod),"
"INDEX(CrsCod,ChangeTime)," "INDEX(CrsCod,ChangeTime))");
"INDEX(TagTxt))");
/***** Table usr_banned *****/ /***** Table usr_banned *****/
/* /*

View File

@ -653,8 +653,8 @@ struct Globals
Tst_AnswerType_t AnswerType; Tst_AnswerType_t AnswerType;
unsigned NumQsts; unsigned NumQsts;
long QstCodes[Tst_MAX_QUESTIONS_PER_TEST]; // Codes of the sent/received questions in a test 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 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_SIZE_ANSWERS_ONE_QST + 1]; // Answers selected by user 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 AllowTeachers; // Can teachers of this course see the test result?
bool AllAnsTypes; bool AllAnsTypes;
struct struct

View File

@ -592,11 +592,13 @@ static void Tst_GetQuestionsAndAnswersFromForm (void)
/* Get indexes for this question */ /* Get indexes for this question */
sprintf (StrQstIndOrAns,"Ind%06u",NumQst); 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 */ /* Get answers selected by user for this question */
sprintf (StrQstIndOrAns,"Ans%06u",NumQst); 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) 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 *****/ /***** Delete old status from expired sessions *****/
sprintf (Query,"DELETE FROM tst_status" sprintf (Query,"DELETE FROM tst_status"
@ -703,7 +705,8 @@ static void Tst_SetTstStatus (unsigned NumTst,Tst_Status_t TstStatus)
" (SessionId,CrsCod,NumTst,Status)" " (SessionId,CrsCod,NumTst,Status)"
" VALUES" " VALUES"
" ('%s','%ld','%u','%u')", " ('%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"); 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) static Tst_Status_t Tst_GetTstStatus (unsigned NumTst)
{ {
char Query[512]; char Query[256 + Ses_BYTES_SESSION_ID];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -748,7 +751,7 @@ static Tst_Status_t Tst_GetTstStatus (unsigned NumTst)
static unsigned Tst_GetNumAccessesTst (void) static unsigned Tst_GetNumAccessesTst (void)
{ {
char Query[512]; char Query[256];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -758,7 +761,7 @@ static unsigned Tst_GetNumAccessesTst (void)
{ {
/***** Get number of hits to test from database *****/ /***** Get number of hits to test from database *****/
sprintf (Query,"SELECT NumAccTst FROM crs_usr" 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); Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Me.UsrDat.UsrCod);
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get number of hits to test"); 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 Str_SetDecimalPointToUS (); // To print the floating point as a dot
if (AnswerIsNotBlank) if (AnswerIsNotBlank)
sprintf (Query,"UPDATE tst_questions" 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'", " WHERE QstCod='%ld'",
ScoreThisQst,QstCod); ScoreThisQst,QstCod);
else // The answer is blank 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) static void Tst_UpdateMyNumAccessTst (unsigned NumAccessesTst)
{ {
char Query[512]; char Query[256];
/***** Update my number of accesses to test in this course *****/ /***** Update my number of accesses to test in this course *****/
sprintf (Query,"UPDATE crs_usr SET NumAccTst='%u'" sprintf (Query,"UPDATE crs_usr SET NumAccTst='%u'"
@ -1222,7 +1226,7 @@ static void Tst_UpdateMyNumAccessTst (unsigned NumAccessesTst)
static void Tst_UpdateLastAccTst (void) static void Tst_UpdateLastAccTst (void)
{ {
char Query[512]; char Query[256];
/***** Update date-time and number of questions of this test *****/ /***** Update date-time and number of questions of this test *****/
sprintf (Query,"UPDATE crs_usr SET LastAccTst=NOW(),NumQstsLastTst='%u'" 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"); sprintf (Query,"DROP TEMPORARY TABLE IF EXISTS tst_question_tags_tmp");
if (mysql_query (&Gbl.mysql,Query)) if (mysql_query (&Gbl.mysql,Query))
DB_ExitOnMySQLError ("can not remove temporary table"); DB_ExitOnMySQLError ("can not remove temporary table");
sprintf (Query,"CREATE TEMPORARY TABLE tst_question_tags_tmp ENGINE=MEMORY" sprintf (Query,"CREATE TEMPORARY TABLE tst_question_tags_tmp"
" SELECT QstCod FROM tst_question_tags WHERE TagCod='%ld'", " ENGINE=MEMORY"
" SELECT QstCod FROM tst_question_tags"
" WHERE TagCod='%ld'",
ExistingTagCod); ExistingTagCod);
if (mysql_query (&Gbl.mysql,Query)) if (mysql_query (&Gbl.mysql,Query))
DB_ExitOnMySQLError ("can not create temporary table"); DB_ExitOnMySQLError ("can not create temporary table");
/* Remove old tag in questions where it would be repeated */ /* 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" sprintf (Query,"DELETE FROM tst_question_tags"
" WHERE TagCod='%ld'" " WHERE TagCod='%ld'"
" AND QstCod IN" " 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); OldTagCod);
DB_QueryDELETE (Query,"can not remove a tag from some questions"); 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 */ /* 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" sprintf (Query,"UPDATE tst_question_tags"
" SET TagCod='%ld'" " SET TagCod='%ld'"
" WHERE TagCod='%ld'" " WHERE TagCod='%ld'"
" AND QstCod NOT IN" " 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, ExistingTagCod,
OldTagCod); OldTagCod);
DB_QueryUPDATE (Query,"can not update a tag in some questions"); DB_QueryUPDATE (Query,"can not update a tag in some questions");
@ -1562,7 +1570,7 @@ void Tst_RenameTag (void)
static bool Tst_CheckIfCurrentCrsHasTestTags (void) static bool Tst_CheckIfCurrentCrsHasTestTags (void)
{ {
char Query[512]; char Query[128];
/***** Get available tags from database *****/ /***** Get available tags from database *****/
sprintf (Query,"SELECT COUNT(*) FROM tst_tags WHERE CrsCod='%ld'", 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) static unsigned long Tst_GetAllTagsFromCurrentCrs (MYSQL_RES **mysql_res)
{ {
char Query[512]; char Query[256];
/***** Get available tags from database *****/ /***** Get available tags from database *****/
sprintf (Query,"SELECT TagCod,TagTxt,TagHidden FROM tst_tags" 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) static unsigned long Tst_GetEnabledTagsFromThisCrs (MYSQL_RES **mysql_res)
{ {
char Query[512]; char Query[256];
/***** Get available not hidden tags from database *****/ /***** Get available not hidden tags from database *****/
sprintf (Query,"SELECT TagCod,TagTxt FROM tst_tags" 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) static void Tst_GetConfigTstFromDB (void)
{ {
char Query[512]; char Query[256];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -2062,7 +2070,7 @@ void Tst_GetConfigFromRow (MYSQL_ROW row)
bool Tst_CheckIfCourseHaveTestsAndPluggableIsUnknown (void) bool Tst_CheckIfCourseHaveTestsAndPluggableIsUnknown (void)
{ {
char Query[512]; char Query[128];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -2302,26 +2310,31 @@ void Tst_ListQuestionsToEdit (void)
unsigned long NumRows; unsigned long NumRows;
/***** Get parameters, query the database and list the questions *****/ /***** 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\">"); fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">");
if (Gbl.Test.XML.CreateXML) 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 else
TsI_PutFormToExportQuestions (); // Button to export questions /* Button to export questions */
TsI_PutFormToExportQuestions ();
fprintf (Gbl.F.Out,"</div>"); 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 *****/ /***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
} }
else else
Tst_ShowFormAskEditTsts (); // Show the form again /* Show the form again */
Tst_ShowFormAskEditTsts ();
/***** Free memory used by the list of tags *****/ /***** Free memory used by the list of tags *****/
Tst_FreeTagsList (); Tst_FreeTagsList ();
@ -3709,7 +3722,7 @@ static void Tst_WriteTextAnsViewTest (unsigned NumQst)
/***** Write input field for the answer *****/ /***** Write input field for the answer *****/
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Ans%06u\"" fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Ans%06u\""
" size=\"40\" maxlength=\"%u\" value=\"\" />", " 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; unsigned NumOpt;
MYSQL_ROW row; MYSQL_ROW row;
char TextAnsUsr[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; char TextAnsUsr[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
char TextAnsOK[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; char TextAnsOK[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
bool Correct = false; bool Correct = false;
/* /*
row[ 0] AnsInd row[ 0] AnsInd
@ -3781,7 +3794,7 @@ static void Tst_WriteTextAnsAssessTest (unsigned NumQst,MYSQL_RES *mysql_res,
{ {
/* Filter the user answer */ /* Filter the user answer */
Str_Copy (TextAnsUsr,Gbl.Test.StrAnswersOneQst[NumQst], 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, /* In order to compare student answer to stored answer,
the text answers are stored avoiding two or more consecurive spaces */ 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 */ /* Filter this correct answer */
Str_Copy (TextAnsOK,Gbl.Test.Answer.Options[NumOpt].Text, Str_Copy (TextAnsOK,Gbl.Test.Answer.Options[NumOpt].Text,
Tst_MAX_SIZE_ANSWERS_ONE_QST); Tst_MAX_BYTES_ANSWERS_ONE_QST);
Str_ConvertToComparable (TextAnsOK); Str_ConvertToComparable (TextAnsOK);
/* Check is user answer is correct */ /* 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 *****/ /***** Get the tags of a question from database *****/
sprintf (Query,"SELECT tst_tags.TagTxt FROM tst_question_tags,tst_tags" 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", " ORDER BY tst_question_tags.TagInd",
QstCod,Gbl.CurrentCrs.Crs.CrsCod); QstCod,Gbl.CurrentCrs.Crs.CrsCod);
return DB_QuerySELECT (Query,mysql_res,"can not get the tags of a question"); 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 TagStr[6 + 10 + 1];
char AnsStr[6 + 10 + 1]; char AnsStr[6 + 10 + 1];
char FbStr[5 + 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 char TF[1 + 1]; // (T)rue or (F)alse
const char *Ptr; const char *Ptr;
unsigned NumCorrectAns; unsigned NumCorrectAns;
@ -5417,7 +5432,7 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
} }
else if (Gbl.Test.AnswerType == Tst_ANS_MULTIPLE_CHOICE) 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; Ptr = StrMultiAns;
while (*Ptr) while (*Ptr)
{ {
@ -5895,7 +5910,7 @@ void Tst_RequestRemoveQst (void)
void Tst_RemoveQst (void) void Tst_RemoveQst (void)
{ {
extern const char *Txt_Question_removed; extern const char *Txt_Question_removed;
char Query[512]; char Query[256];
bool EditingOnlyThisQst; bool EditingOnlyThisQst;
/***** Get the question code *****/ /***** 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_shuffled;
extern const char *Txt_The_answers_of_the_question_with_code_X_will_appear_without_shuffling; 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 EditingOnlyThisQst;
bool Shuffle; bool Shuffle;
@ -6022,7 +6037,8 @@ static void Tst_InsertOrUpdateQstIntoDB (void)
Gbl.Test.Stem.Length + Gbl.Test.Stem.Length +
Gbl.Test.Feedback.Length + Gbl.Test.Feedback.Length +
Img_BYTES_NAME + 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."); Lay_ShowErrorAndExit ("Not enough memory to store database query.");
if (Gbl.Test.QstCod < 0) // It's a new question if (Gbl.Test.QstCod < 0) // It's a new question
@ -6129,7 +6145,11 @@ static void Tst_InsertAnswersIntoDB (void)
unsigned i; unsigned i;
/***** Allocate space for query *****/ /***** 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."); Lay_ShowErrorAndExit ("Not enough memory to store database query.");
/***** Insert answers in the answers table *****/ /***** Insert answers in the answers table *****/
@ -6214,7 +6234,7 @@ static void Tst_InsertAnswersIntoDB (void)
static void Tst_RemAnsFromQst (void) static void Tst_RemAnsFromQst (void)
{ {
char Query[512]; char Query[128];
/***** Remove answers *****/ /***** Remove answers *****/
sprintf (Query,"DELETE FROM tst_answers WHERE QstCod='%ld'", sprintf (Query,"DELETE FROM tst_answers WHERE QstCod='%ld'",
@ -6228,7 +6248,7 @@ static void Tst_RemAnsFromQst (void)
static void Tst_RemTagsFromQst (void) static void Tst_RemTagsFromQst (void)
{ {
char Query[512]; char Query[128];
/***** Remove tags *****/ /***** Remove tags *****/
sprintf (Query,"DELETE FROM tst_question_tags WHERE QstCod='%ld'", sprintf (Query,"DELETE FROM tst_question_tags WHERE QstCod='%ld'",
@ -6242,7 +6262,7 @@ static void Tst_RemTagsFromQst (void)
static void Tst_RemoveUnusedTagsFromCurrentCrs (void) static void Tst_RemoveUnusedTagsFromCurrentCrs (void)
{ {
char Query[1024]; char Query[512];
/***** Remove unused tags from tst_tags *****/ /***** Remove unused tags from tst_tags *****/
sprintf (Query,"DELETE 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) static void Tst_RemoveAllImgFilesFromStemOfAllQstsInCrs (long CrsCod)
{ {
char Query[256]; char Query[128];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumImages; unsigned NumImages;
unsigned NumImg; unsigned NumImg;
/***** Get names of images associated to stems of test questions from database *****/ /***** Get names of images associated to stems of test questions from database *****/
sprintf (Query,"SELECT ImageName FROM tst_questions" sprintf (Query,"SELECT ImageName FROM tst_questions WHERE CrsCod='%ld'",
" WHERE CrsCod='%ld'",
CrsCod); CrsCod);
NumImages = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get images"); 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) 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 Query[256 +
char Indexes[Tst_MAX_SIZE_INDEXES_ONE_QST + 1]; Tst_MAX_BYTES_INDEXES_ONE_QST +
char Answers[Tst_MAX_SIZE_ANSWERS_ONE_QST + 1]; 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 *****/ /***** Replace each separator of multiple parameters by a comma *****/
/* In database commas are used as separators instead of special chars */ /* 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) static void Tst_GetTestResultQuestionsFromDB (long TstCod)
{ {
char Query[512]; char Query[256];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumQst; unsigned NumQst;
/***** Get questions of a test result from database *****/ /***** Get questions of a test result from database *****/
sprintf (Query,"SELECT QstCod,Indexes,Answers" sprintf (Query,"SELECT QstCod,Indexes,Answers FROM tst_exam_questions"
" FROM tst_exam_questions"
" WHERE TstCod='%ld' ORDER BY QstInd", " WHERE TstCod='%ld' ORDER BY QstInd",
TstCod); TstCod);
Gbl.Test.NumQsts = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get questions of a test result"); 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]) */ /* Get indexes for this question (row[1]) */
Str_Copy (Gbl.Test.StrIndexesOneQst[NumQst],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]) */ /* Get answers selected by user for this question (row[2]) */
Str_Copy (Gbl.Test.StrAnswersOneQst[NumQst],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 */ /* Replace each comma by a separator of multiple parameters */
/* In database commas are used as separators instead of special chars */ /* 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"); DB_QueryDELETE (Query,"can not remove test results made in a course");
/***** Remove test results made in the course *****/ /***** Remove test results made in the course *****/
sprintf (Query,"DELETE FROM tst_exams" sprintf (Query,"DELETE FROM tst_exams WHERE CrsCod='%ld'",
" WHERE CrsCod='%ld'",
CrsCod); CrsCod);
DB_QueryDELETE (Query,"can not remove test results made in a course"); 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_BYTES_TAG ((Tst_MAX_CHARS_TAG + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Tst_MAX_OPTIONS_PER_QUESTION 10 #define Tst_MAX_OPTIONS_PER_QUESTION 10
#define Tst_MAX_SIZE_INDEXES_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_SIZE_ANSWERS_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_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 #define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK ((Tst_MAX_CHARS_ANSWER_OR_FEEDBACK + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 16383