mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-05 00:05:23 +02:00
Version 16.153
This commit is contained in:
parent
45929a7164
commit
cc988bb840
|
@ -204,13 +204,14 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 16.152 (2017-03-07)"
|
#define Log_PLATFORM_VERSION "SWAD 16.153 (2017-03-08)"
|
||||||
#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.153: Mar 08, 2017 Code refactoring related to number of chars and bytes. (216450 lines)
|
||||||
Version 16.152: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216428 lines)
|
Version 16.152: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216428 lines)
|
||||||
Version 16.151: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216422 lines)
|
Version 16.151: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216422 lines)
|
||||||
Version 16.150: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216409 lines)
|
Version 16.150: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216409 lines)
|
||||||
|
|
|
@ -630,7 +630,7 @@ struct Globals
|
||||||
TT_ClassType_t ClassType;
|
TT_ClassType_t ClassType;
|
||||||
unsigned Duration;
|
unsigned Duration;
|
||||||
char Place[TT_MAX_BYTES_PLACE + 1];
|
char Place[TT_MAX_BYTES_PLACE + 1];
|
||||||
char Group[TT_MAX_BYTES_GROUP + 1];
|
char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
|
||||||
long GrpCod; // Group code (-1 if no group selected)
|
long GrpCod; // Group code (-1 if no group selected)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|
|
@ -1100,8 +1100,18 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
|
||||||
LengthSpecStrSrc = 1;
|
LengthSpecStrSrc = 1;
|
||||||
SpecialChar = 0x20;
|
SpecialChar = 0x20;
|
||||||
break;
|
break;
|
||||||
case '%': /* Change "%XX" --> "&#decimal_number;" */
|
case '%': /* Change "%XX" --> "&#decimal_number;" (from 0 to 255) */
|
||||||
IsSpecialChar = true;
|
IsSpecialChar = true;
|
||||||
|
/* Some special characters, like a chinese character,
|
||||||
|
are received from a form in a format like this:
|
||||||
|
%26%2335753%3B --> %26 %23 3 5 7 5 3 %3B --> 让
|
||||||
|
^ ^ ^
|
||||||
|
| | |
|
||||||
|
SpecialChar SpecialChar SpecialChar
|
||||||
|
Here one chinese character is converted
|
||||||
|
to 2 special chars + 5 normal chars + 1 special char,
|
||||||
|
and finally is stored as the following 8 bytes: 让
|
||||||
|
*/
|
||||||
sscanf (PtrSrc + 1,"%2X",&SpecialChar);
|
sscanf (PtrSrc + 1,"%2X",&SpecialChar);
|
||||||
LengthSpecStrSrc = 3;
|
LengthSpecStrSrc = 3;
|
||||||
break;
|
break;
|
||||||
|
@ -1226,7 +1236,7 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
|
||||||
ThereIsSpaceChar = false;
|
ThereIsSpaceChar = false;
|
||||||
break;
|
break;
|
||||||
case 0x23: /* "%23" --> "#" */
|
case 0x23: /* "%23" --> "#" */
|
||||||
StrSpecialChar[0] = '#';
|
StrSpecialChar[0] = '#'; // '#' must be converted to '#' to allow HTML entities like 分
|
||||||
StrSpecialChar[1] = '\0';
|
StrSpecialChar[1] = '\0';
|
||||||
NumPrintableCharsFromReturn++;
|
NumPrintableCharsFromReturn++;
|
||||||
ThereIsSpaceChar = false;
|
ThereIsSpaceChar = false;
|
||||||
|
@ -1268,7 +1278,7 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
|
||||||
ThereIsSpaceChar = false;
|
ThereIsSpaceChar = false;
|
||||||
break;
|
break;
|
||||||
case 0x3B: /* "%3B" --> ";" */
|
case 0x3B: /* "%3B" --> ";" */
|
||||||
StrSpecialChar[0] = ';';
|
StrSpecialChar[0] = ';'; // ';' must be converted to ';' to allow HTML entities like 分
|
||||||
StrSpecialChar[1] = '\0';
|
StrSpecialChar[1] = '\0';
|
||||||
NumPrintableCharsFromReturn++;
|
NumPrintableCharsFromReturn++;
|
||||||
ThereIsSpaceChar = false;
|
ThereIsSpaceChar = false;
|
||||||
|
|
|
@ -34,11 +34,24 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Public constants *****************************/
|
/***************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
/*
|
||||||
|
Some special characters, like a chinese character,
|
||||||
|
are received from a form in a format like this:
|
||||||
|
%26%2335753%3B --> %26 %23 3 5 7 5 3 %3B --> 让
|
||||||
|
^ ^ ^
|
||||||
|
| | |
|
||||||
|
SpecialChar SpecialChar SpecialChar
|
||||||
|
Here one chinese character is converted
|
||||||
|
to 2 special chars + 5 normal chars + 1 special char,
|
||||||
|
and finally is stored as the following 8 bytes: 让
|
||||||
|
|
||||||
#define Str_BYTES_STR_HEX 3 // Number of bytes of the string %XX
|
The maximum UTF-8 code is 1114111 or 0x10FFFF.
|
||||||
#define Str_MAX_BYTES_SPEC_CHAR_HTML 10 // Number of bytes of the string from � to max UTF8  (= )
|
So, when read from form, a character may be read temporarily as %26%231114111%3B (16 bytes)
|
||||||
|
Then it may be transformed to  (10 bytes)
|
||||||
#define Str_MAX_BYTES_PER_CHAR 10 // max (Str_BYTES_STR_HEX,Str_MAX_BYTES_SPEC_CHAR_HTML)
|
So, each char from a form may be transformed finally into a sequence of 1 to 10 bytes,
|
||||||
|
but temporarily it may need 16 bytes
|
||||||
|
*/
|
||||||
|
#define Str_MAX_BYTES_PER_CHAR 16 // Maximum number of bytes of a char
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Public types *******************************/
|
/******************************* Public types *******************************/
|
||||||
|
|
|
@ -49,9 +49,10 @@ extern struct Globals Gbl;
|
||||||
/***************************** Private constants *****************************/
|
/***************************** Private constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Svy_MAX_LENGTH_ANSWER 1000
|
#define Svy_MAX_CHARS_ANSWER 1000
|
||||||
#define Svy_MAX_BYTES_ANSWER (Svy_MAX_LENGTH_ANSWER * Str_MAX_BYTES_PER_CHAR)
|
#define Svy_MAX_BYTES_ANSWER (Svy_MAX_CHARS_ANSWER * Str_MAX_BYTES_PER_CHAR)
|
||||||
#define Svy_MAX_BYTES_LIST_ANSWER_TYPES (10 + (Svy_NUM_ANS_TYPES - 1) * (1 + 10))
|
|
||||||
|
#define Svy_MAX_BYTES_LIST_ANSWER_TYPES (10 + (Svy_NUM_ANS_TYPES - 1) * (1 + 10))
|
||||||
|
|
||||||
const char *Svy_StrAnswerTypesDB[Svy_NUM_ANS_TYPES] =
|
const char *Svy_StrAnswerTypesDB[Svy_NUM_ANS_TYPES] =
|
||||||
{
|
{
|
||||||
|
@ -1202,7 +1203,7 @@ void Svy_GetDataOfSurveyByCod (struct Survey *Svy)
|
||||||
|
|
||||||
/* Get the title of the survey (row[9]) */
|
/* Get the title of the survey (row[9]) */
|
||||||
Str_Copy (Svy->Title,row[9],
|
Str_Copy (Svy->Title,row[9],
|
||||||
Svy_MAX_LENGTH_SURVEY_TITLE);
|
Svy_MAX_BYTES_SURVEY_TITLE);
|
||||||
|
|
||||||
/* Get number of questions and number of users who have already answer this survey */
|
/* Get number of questions and number of users who have already answer this survey */
|
||||||
Svy->NumQsts = Svy_GetNumQstsSvy (Svy->SvyCod);
|
Svy->NumQsts = Svy_GetNumQstsSvy (Svy->SvyCod);
|
||||||
|
@ -1842,7 +1843,7 @@ void Svy_RequestCreatOrEditSvy (void)
|
||||||
"</tr>",
|
"</tr>",
|
||||||
The_ClassForm[Gbl.Prefs.Theme],
|
The_ClassForm[Gbl.Prefs.Theme],
|
||||||
Txt_Title,
|
Txt_Title,
|
||||||
Svy_MAX_LENGTH_SURVEY_TITLE,Svy.Title);
|
Svy_MAX_CHARS_SURVEY_TITLE,Svy.Title);
|
||||||
|
|
||||||
/***** Survey start and end dates *****/
|
/***** Survey start and end dates *****/
|
||||||
Dat_PutFormStartEndClientLocalDateTimes (Svy.TimeUTC,Dat_FORM_SECONDS_ON);
|
Dat_PutFormStartEndClientLocalDateTimes (Svy.TimeUTC,Dat_FORM_SECONDS_ON);
|
||||||
|
@ -2128,7 +2129,7 @@ void Svy_RecFormSurvey (void)
|
||||||
NewSvy.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" );
|
NewSvy.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" );
|
||||||
|
|
||||||
/***** Get survey title *****/
|
/***** Get survey title *****/
|
||||||
Par_GetParToText ("Title",NewSvy.Title,Svy_MAX_LENGTH_SURVEY_TITLE);
|
Par_GetParToText ("Title",NewSvy.Title,Svy_MAX_BYTES_SURVEY_TITLE);
|
||||||
|
|
||||||
/***** Get survey text and insert links *****/
|
/***** Get survey text and insert links *****/
|
||||||
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
|
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
|
||||||
|
@ -3319,7 +3320,7 @@ static void Svy_WriteQstStem (const char *Stem)
|
||||||
size_t Length;
|
size_t Length;
|
||||||
|
|
||||||
/* Convert the stem, that is in HTML, to rigorous HTML */
|
/* Convert the stem, that is in HTML, to rigorous HTML */
|
||||||
Length = strlen (Stem) * Str_MAX_BYTES_SPEC_CHAR_HTML;
|
Length = strlen (Stem) * Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((HeadingRigorousHTML = malloc (Length + 1)) == NULL)
|
if ((HeadingRigorousHTML = malloc (Length + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
|
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
|
||||||
Str_Copy (HeadingRigorousHTML,Stem,
|
Str_Copy (HeadingRigorousHTML,Stem,
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
/************************** Public types and constants ***********************/
|
/************************** Public types and constants ***********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Svy_MAX_LENGTH_SURVEY_TITLE (256 - 1)
|
#define Svy_MAX_CHARS_SURVEY_TITLE (256 - 1)
|
||||||
|
#define Svy_MAX_BYTES_SURVEY_TITLE (Svy_MAX_CHARS_SURVEY_TITLE * Str_MAX_BYTES_PER_CHAR)
|
||||||
|
|
||||||
#define Svy_NUM_DATES 2
|
#define Svy_NUM_DATES 2
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -49,7 +50,7 @@ struct Survey
|
||||||
long Cod; // Country, institution, centre, degree or course code
|
long Cod; // Country, institution, centre, degree or course code
|
||||||
unsigned Roles; // Example: if survey can be made by students and teachers, Roles == (1 << Rol_ROLE_STUDENT) | (1 << Rol_ROLE_TEACHER)
|
unsigned Roles; // Example: if survey can be made by students and teachers, Roles == (1 << Rol_ROLE_STUDENT) | (1 << Rol_ROLE_TEACHER)
|
||||||
long UsrCod;
|
long UsrCod;
|
||||||
char Title[Svy_MAX_LENGTH_SURVEY_TITLE + 1];
|
char Title[Svy_MAX_BYTES_SURVEY_TITLE + 1];
|
||||||
time_t TimeUTC[Svy_NUM_DATES];
|
time_t TimeUTC[Svy_NUM_DATES];
|
||||||
unsigned NumQsts; // Number of questions in the survey
|
unsigned NumQsts; // Number of questions in the survey
|
||||||
unsigned NumUsrs; // Number of distinct users who have already answered the survey
|
unsigned NumUsrs; // Number of distinct users who have already answered the survey
|
||||||
|
|
|
@ -53,10 +53,10 @@ extern struct Globals Gbl;
|
||||||
|
|
||||||
#define Syl_MAX_LEVELS_SYLLABUS 10
|
#define Syl_MAX_LEVELS_SYLLABUS 10
|
||||||
|
|
||||||
#define Syl_MAX_LENGTH_ITEM_COD (Syl_MAX_LEVELS_SYLLABUS * (10 + 1) - 1)
|
#define Syl_MAX_BYTES_ITEM_COD (Syl_MAX_LEVELS_SYLLABUS * (10 + 1) - 1)
|
||||||
|
|
||||||
#define Syl_MAX_LENGTH_TEXT_ITEM 1024
|
#define Syl_MAX_CHARS_TEXT_ITEM 1000
|
||||||
#define Syl_MAX_BYTES_TEXT_ITEM (Syl_MAX_LENGTH_TEXT_ITEM*Str_MAX_BYTES_PER_CHAR)
|
#define Syl_MAX_BYTES_TEXT_ITEM (Syl_MAX_CHARS_TEXT_ITEM * Str_MAX_BYTES_PER_CHAR)
|
||||||
|
|
||||||
#define Syl_WIDTH_NUM_SYLLABUS 20
|
#define Syl_WIDTH_NUM_SYLLABUS 20
|
||||||
|
|
||||||
|
@ -948,7 +948,7 @@ static void Syl_PutFormItemSyllabus (bool NewItem,unsigned NumItem,int Level,int
|
||||||
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Txt\""
|
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Txt\""
|
||||||
" size=\"80\" maxlength=\"%u\" value=\"%s\""
|
" size=\"80\" maxlength=\"%u\" value=\"%s\""
|
||||||
" placeholder=\"%s\"",
|
" placeholder=\"%s\"",
|
||||||
Syl_MAX_LENGTH_TEXT_ITEM,Text,
|
Syl_MAX_CHARS_TEXT_ITEM,Text,
|
||||||
Txt_Enter_a_new_item_here);
|
Txt_Enter_a_new_item_here);
|
||||||
if (NewItem)
|
if (NewItem)
|
||||||
fprintf (Gbl.F.Out," autofocus=\"autofocus\"");
|
fprintf (Gbl.F.Out," autofocus=\"autofocus\"");
|
||||||
|
@ -987,14 +987,14 @@ static void Syl_WriteNumItem (char *StrDst,FILE *FileTgt,int Level,int *CodItem)
|
||||||
{
|
{
|
||||||
if (StrDst)
|
if (StrDst)
|
||||||
Str_Concat (StrDst,".",
|
Str_Concat (StrDst,".",
|
||||||
Syl_MAX_LENGTH_ITEM_COD);
|
Syl_MAX_BYTES_ITEM_COD);
|
||||||
if (FileTgt)
|
if (FileTgt)
|
||||||
fprintf (FileTgt,".");
|
fprintf (FileTgt,".");
|
||||||
}
|
}
|
||||||
sprintf (InStr,"%d",CodItem[N]);
|
sprintf (InStr,"%d",CodItem[N]);
|
||||||
if (StrDst)
|
if (StrDst)
|
||||||
Str_Concat (StrDst,InStr,
|
Str_Concat (StrDst,InStr,
|
||||||
Syl_MAX_LENGTH_ITEM_COD);
|
Syl_MAX_BYTES_ITEM_COD);
|
||||||
if (FileTgt)
|
if (FileTgt)
|
||||||
fprintf (FileTgt,"%s",InStr);
|
fprintf (FileTgt,"%s",InStr);
|
||||||
}
|
}
|
||||||
|
|
106
swad_test.c
106
swad_test.c
|
@ -53,7 +53,7 @@
|
||||||
/***************************** Public constants ******************************/
|
/***************************** Public constants ******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
// strings are limited to Tst_MAX_LENGTH_FEEDBACK_TYPE characters
|
// strings are limited to Tst_MAX_BYTES_FEEDBACK_TYPE bytes
|
||||||
const char *Tst_FeedbackXML[Tst_NUM_TYPES_FEEDBACK] =
|
const char *Tst_FeedbackXML[Tst_NUM_TYPES_FEEDBACK] =
|
||||||
{
|
{
|
||||||
"nothing",
|
"nothing",
|
||||||
|
@ -63,7 +63,7 @@ const char *Tst_FeedbackXML[Tst_NUM_TYPES_FEEDBACK] =
|
||||||
"fullFeedback",
|
"fullFeedback",
|
||||||
};
|
};
|
||||||
|
|
||||||
// strings are limited to Tst_MAX_LENGTH_ANSWER_TYPE characters
|
// strings are limited to Tst_MAX_BYTES_ANSWER_TYPE characters
|
||||||
const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES] =
|
const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES] =
|
||||||
{
|
{
|
||||||
"int",
|
"int",
|
||||||
|
@ -1020,7 +1020,7 @@ void Tst_WriteQstStem (const char *Stem,const char *ClassStem)
|
||||||
char *StemRigorousHTML;
|
char *StemRigorousHTML;
|
||||||
|
|
||||||
/***** Convert the stem, that is in HTML, to rigorous HTML *****/
|
/***** Convert the stem, that is in HTML, to rigorous HTML *****/
|
||||||
StemLength = strlen (Stem) * Str_MAX_BYTES_SPEC_CHAR_HTML;
|
StemLength = strlen (Stem) * Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((StemRigorousHTML = malloc (StemLength + 1)) == NULL)
|
if ((StemRigorousHTML = malloc (StemLength + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
|
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
|
||||||
Str_Copy (StemRigorousHTML,Stem,
|
Str_Copy (StemRigorousHTML,Stem,
|
||||||
|
@ -1150,7 +1150,7 @@ void Tst_WriteQstFeedback (const char *Feedback,const char *ClassFeedback)
|
||||||
if (Feedback[0])
|
if (Feedback[0])
|
||||||
{
|
{
|
||||||
/***** Convert the feedback, that is in HTML, to rigorous HTML *****/
|
/***** Convert the feedback, that is in HTML, to rigorous HTML *****/
|
||||||
FeedbackLength = strlen (Feedback) * Str_MAX_BYTES_SPEC_CHAR_HTML;
|
FeedbackLength = strlen (Feedback) * Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((FeedbackRigorousHTML = malloc (FeedbackLength + 1)) == NULL)
|
if ((FeedbackRigorousHTML = malloc (FeedbackLength + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
|
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
|
||||||
Str_Copy (FeedbackRigorousHTML,Feedback,
|
Str_Copy (FeedbackRigorousHTML,Feedback,
|
||||||
|
@ -1737,7 +1737,7 @@ static void Tst_ShowFormEditTags (void)
|
||||||
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"NewTagTxt\""
|
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"NewTagTxt\""
|
||||||
" size=\"36\" maxlength=\"%u\" value=\"%s\""
|
" size=\"36\" maxlength=\"%u\" value=\"%s\""
|
||||||
" onchange=\"document.getElementById('%s').submit();\" />",
|
" onchange=\"document.getElementById('%s').submit();\" />",
|
||||||
Tst_MAX_LENGTH_TAG,row[1],Gbl.Form.Id);
|
Tst_MAX_CHARS_TAG,row[1],Gbl.Form.Id);
|
||||||
Act_FormEnd ();
|
Act_FormEnd ();
|
||||||
fprintf (Gbl.F.Out,"</td>"
|
fprintf (Gbl.F.Out,"</td>"
|
||||||
"</tr>");
|
"</tr>");
|
||||||
|
@ -2323,13 +2323,13 @@ void Tst_ListQuestionsToEdit (void)
|
||||||
/********** Get from the database several test questions for listing *********/
|
/********** Get from the database several test questions for listing *********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Tst_MAX_LENGTH_QUERY_TEST (16 * 1024 - 1)
|
#define Tst_MAX_BYTES_QUERY_TEST (16 * 1024 - 1)
|
||||||
|
|
||||||
static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
||||||
{
|
{
|
||||||
extern const char *Txt_No_questions_found_matching_your_search_criteria;
|
extern const char *Txt_No_questions_found_matching_your_search_criteria;
|
||||||
unsigned long NumRows;
|
unsigned long NumRows;
|
||||||
char Query[Tst_MAX_LENGTH_QUERY_TEST + 1];
|
char Query[Tst_MAX_BYTES_QUERY_TEST + 1];
|
||||||
long LengthQuery;
|
long LengthQuery;
|
||||||
unsigned NumItemInList;
|
unsigned NumItemInList;
|
||||||
const char *Ptr;
|
const char *Ptr;
|
||||||
|
@ -2367,25 +2367,25 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
||||||
" FROM tst_questions");
|
" FROM tst_questions");
|
||||||
if (!Gbl.Test.Tags.All)
|
if (!Gbl.Test.Tags.All)
|
||||||
Str_Concat (Query,",tst_question_tags,tst_tags",
|
Str_Concat (Query,",tst_question_tags,tst_tags",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
|
|
||||||
Str_Concat (Query," WHERE tst_questions.CrsCod='",
|
Str_Concat (Query," WHERE tst_questions.CrsCod='",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
sprintf (CrsCodStr,"%ld",Gbl.CurrentCrs.Crs.CrsCod);
|
sprintf (CrsCodStr,"%ld",Gbl.CurrentCrs.Crs.CrsCod);
|
||||||
Str_Concat (Query,CrsCodStr,
|
Str_Concat (Query,CrsCodStr,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
|
Str_Concat (Query,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
sprintf (LongStr,"%ld",(long) Gbl.DateRange.TimeUTC[0]);
|
sprintf (LongStr,"%ld",(long) Gbl.DateRange.TimeUTC[0]);
|
||||||
Str_Concat (Query,LongStr,
|
Str_Concat (Query,LongStr,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
|
Str_Concat (Query,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
sprintf (LongStr,"%ld",(long) Gbl.DateRange.TimeUTC[1]);
|
sprintf (LongStr,"%ld",(long) Gbl.DateRange.TimeUTC[1]);
|
||||||
Str_Concat (Query,LongStr,
|
Str_Concat (Query,LongStr,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"')",
|
Str_Concat (Query,"')",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
|
|
||||||
/* Add the tags selected */
|
/* Add the tags selected */
|
||||||
if (!Gbl.Test.Tags.All)
|
if (!Gbl.Test.Tags.All)
|
||||||
|
@ -2393,11 +2393,11 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
||||||
Str_Concat (Query," AND tst_questions.QstCod=tst_question_tags.QstCod"
|
Str_Concat (Query," AND tst_questions.QstCod=tst_question_tags.QstCod"
|
||||||
" AND tst_question_tags.TagCod=tst_tags.TagCod"
|
" AND tst_question_tags.TagCod=tst_tags.TagCod"
|
||||||
" AND tst_tags.CrsCod='",
|
" AND tst_tags.CrsCod='",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,CrsCodStr,
|
Str_Concat (Query,CrsCodStr,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
LengthQuery = strlen (Query);
|
LengthQuery = strlen (Query);
|
||||||
NumItemInList = 0;
|
NumItemInList = 0;
|
||||||
Ptr = Gbl.Test.Tags.List;
|
Ptr = Gbl.Test.Tags.List;
|
||||||
|
@ -2405,20 +2405,20 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
||||||
{
|
{
|
||||||
Par_GetNextStrUntilSeparParamMult (&Ptr,TagText,Tst_MAX_BYTES_TAG);
|
Par_GetNextStrUntilSeparParamMult (&Ptr,TagText,Tst_MAX_BYTES_TAG);
|
||||||
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
|
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
|
||||||
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 256)
|
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
|
||||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||||
Str_Concat (Query,
|
Str_Concat (Query,
|
||||||
NumItemInList ? " OR tst_tags.TagTxt='" :
|
NumItemInList ? " OR tst_tags.TagTxt='" :
|
||||||
" AND (tst_tags.TagTxt='",
|
" AND (tst_tags.TagTxt='",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,TagText,
|
Str_Concat (Query,TagText,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
NumItemInList++;
|
NumItemInList++;
|
||||||
}
|
}
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the types of answer selected */
|
/* Add the types of answer selected */
|
||||||
|
@ -2432,53 +2432,53 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
||||||
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Tst_MAX_BYTES_TAG);
|
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Tst_MAX_BYTES_TAG);
|
||||||
AnsType = Tst_ConvertFromUnsignedStrToAnsTyp (UnsignedStr);
|
AnsType = Tst_ConvertFromUnsignedStrToAnsTyp (UnsignedStr);
|
||||||
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
|
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
|
||||||
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 256)
|
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
|
||||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||||
Str_Concat (Query,
|
Str_Concat (Query,
|
||||||
NumItemInList ? " OR tst_questions.AnsType='" :
|
NumItemInList ? " OR tst_questions.AnsType='" :
|
||||||
" AND (tst_questions.AnsType='",
|
" AND (tst_questions.AnsType='",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
|
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
NumItemInList++;
|
NumItemInList++;
|
||||||
}
|
}
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End the query */
|
/* End the query */
|
||||||
Str_Concat (Query," GROUP BY tst_questions.QstCod",
|
Str_Concat (Query," GROUP BY tst_questions.QstCod",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
|
|
||||||
switch (Gbl.Test.SelectedOrder)
|
switch (Gbl.Test.SelectedOrder)
|
||||||
{
|
{
|
||||||
case Tst_ORDER_STEM:
|
case Tst_ORDER_STEM:
|
||||||
Str_Concat (Query," ORDER BY tst_questions.Stem",
|
Str_Concat (Query," ORDER BY tst_questions.Stem",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
break;
|
break;
|
||||||
case Tst_ORDER_NUM_HITS:
|
case Tst_ORDER_NUM_HITS:
|
||||||
Str_Concat (Query," ORDER BY tst_questions.NumHits DESC,"
|
Str_Concat (Query," ORDER BY tst_questions.NumHits DESC,"
|
||||||
"tst_questions.Stem",
|
"tst_questions.Stem",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
break;
|
break;
|
||||||
case Tst_ORDER_AVERAGE_SCORE:
|
case Tst_ORDER_AVERAGE_SCORE:
|
||||||
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
|
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
|
||||||
"tst_questions.NumHits DESC,"
|
"tst_questions.NumHits DESC,"
|
||||||
"tst_questions.Stem",
|
"tst_questions.Stem",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
break;
|
break;
|
||||||
case Tst_ORDER_NUM_HITS_NOT_BLANK:
|
case Tst_ORDER_NUM_HITS_NOT_BLANK:
|
||||||
Str_Concat (Query," ORDER BY tst_questions.NumHitsNotBlank DESC,"
|
Str_Concat (Query," ORDER BY tst_questions.NumHitsNotBlank DESC,"
|
||||||
"tst_questions.Stem",
|
"tst_questions.Stem",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
break;
|
break;
|
||||||
case Tst_ORDER_AVERAGE_SCORE_NOT_BLANK:
|
case Tst_ORDER_AVERAGE_SCORE_NOT_BLANK:
|
||||||
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
|
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
|
||||||
"tst_questions.NumHitsNotBlank DESC,"
|
"tst_questions.NumHitsNotBlank DESC,"
|
||||||
"tst_questions.Stem",
|
"tst_questions.Stem",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2497,7 +2497,7 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
|
||||||
|
|
||||||
static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
||||||
{
|
{
|
||||||
char Query[Tst_MAX_LENGTH_QUERY_TEST + 1];
|
char Query[Tst_MAX_BYTES_QUERY_TEST + 1];
|
||||||
long LengthQuery;
|
long LengthQuery;
|
||||||
unsigned NumItemInList;
|
unsigned NumItemInList;
|
||||||
const char *Ptr;
|
const char *Ptr;
|
||||||
|
@ -2558,20 +2558,20 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
||||||
{
|
{
|
||||||
Par_GetNextStrUntilSeparParamMult (&Ptr,TagText,Tst_MAX_BYTES_TAG);
|
Par_GetNextStrUntilSeparParamMult (&Ptr,TagText,Tst_MAX_BYTES_TAG);
|
||||||
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
|
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
|
||||||
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 128)
|
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
|
||||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||||
Str_Concat (Query,
|
Str_Concat (Query,
|
||||||
NumItemInList ? " OR tst_tags.TagTxt='" :
|
NumItemInList ? " OR tst_tags.TagTxt='" :
|
||||||
" AND (tst_tags.TagTxt='",
|
" AND (tst_tags.TagTxt='",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,TagText,
|
Str_Concat (Query,TagText,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
NumItemInList++;
|
NumItemInList++;
|
||||||
}
|
}
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add answer types selected */
|
/* Add answer types selected */
|
||||||
|
@ -2585,28 +2585,28 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
||||||
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Tst_MAX_BYTES_TAG);
|
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Tst_MAX_BYTES_TAG);
|
||||||
AnsType = Tst_ConvertFromUnsignedStrToAnsTyp (UnsignedStr);
|
AnsType = Tst_ConvertFromUnsignedStrToAnsTyp (UnsignedStr);
|
||||||
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
|
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
|
||||||
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 128)
|
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
|
||||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||||
Str_Concat (Query,
|
Str_Concat (Query,
|
||||||
NumItemInList ? " OR tst_questions.AnsType='" :
|
NumItemInList ? " OR tst_questions.AnsType='" :
|
||||||
" AND (tst_questions.AnsType='",
|
" AND (tst_questions.AnsType='",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
|
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
NumItemInList++;
|
NumItemInList++;
|
||||||
}
|
}
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End query */
|
/* End query */
|
||||||
Str_Concat (Query," ORDER BY RAND(NOW()) LIMIT ",
|
Str_Concat (Query," ORDER BY RAND(NOW()) LIMIT ",
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
sprintf (StrNumQsts,"%u",Gbl.Test.NumQsts);
|
sprintf (StrNumQsts,"%u",Gbl.Test.NumQsts);
|
||||||
Str_Concat (Query,StrNumQsts,
|
Str_Concat (Query,StrNumQsts,
|
||||||
Tst_MAX_LENGTH_QUERY_TEST);
|
Tst_MAX_BYTES_QUERY_TEST);
|
||||||
/*
|
/*
|
||||||
if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
|
if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
|
||||||
Lay_ShowAlert (Lay_INFO,Query);
|
Lay_ShowAlert (Lay_INFO,Query);
|
||||||
|
@ -3062,7 +3062,7 @@ static void Tst_WriteAnswersOfAQstEdit (long QstCod)
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
/* Convert the answer (row[1]), that is in HTML, to rigorous HTML */
|
/* Convert the answer (row[1]), that is in HTML, to rigorous HTML */
|
||||||
LengthAnswer = strlen (row[1]) * Str_MAX_BYTES_SPEC_CHAR_HTML;
|
LengthAnswer = strlen (row[1]) * Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((Answer = malloc (LengthAnswer + 1)) == NULL)
|
if ((Answer = malloc (LengthAnswer + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store answer.");
|
Lay_ShowErrorAndExit ("Not enough memory to store answer.");
|
||||||
Str_Copy (Answer,row[1],
|
Str_Copy (Answer,row[1],
|
||||||
|
@ -3076,7 +3076,7 @@ static void Tst_WriteAnswersOfAQstEdit (long QstCod)
|
||||||
if (row[2])
|
if (row[2])
|
||||||
if (row[2][0])
|
if (row[2][0])
|
||||||
{
|
{
|
||||||
LengthFeedback = strlen (row[2]) * Str_MAX_BYTES_SPEC_CHAR_HTML;
|
LengthFeedback = strlen (row[2]) * Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((Feedback = malloc (LengthFeedback + 1)) == NULL)
|
if ((Feedback = malloc (LengthFeedback + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
|
Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
|
||||||
Str_Copy (Feedback,row[2],
|
Str_Copy (Feedback,row[2],
|
||||||
|
@ -4556,7 +4556,7 @@ static void Tst_PutFormEditOneQst (char Stem[Cns_MAX_BYTES_TEXT + 1],
|
||||||
" class=\"TAG_TXT\" maxlength=\"%u\" value=\"%s\""
|
" class=\"TAG_TXT\" maxlength=\"%u\" value=\"%s\""
|
||||||
" onchange=\"changeSelTag('%u')\" />"
|
" onchange=\"changeSelTag('%u')\" />"
|
||||||
"</td>",
|
"</td>",
|
||||||
NumTag,NumTag,Tst_MAX_LENGTH_TAG,Gbl.Test.Tags.Txt[NumTag],NumTag);
|
NumTag,NumTag,Tst_MAX_CHARS_TAG,Gbl.Test.Tags.Txt[NumTag],NumTag);
|
||||||
|
|
||||||
fprintf (Gbl.F.Out,"</tr>");
|
fprintf (Gbl.F.Out,"</tr>");
|
||||||
}
|
}
|
||||||
|
@ -5373,7 +5373,8 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
|
||||||
|
|
||||||
/* Get answer */
|
/* Get answer */
|
||||||
sprintf (AnsStr,"AnsStr%u",NumOpt);
|
sprintf (AnsStr,"AnsStr%u",NumOpt);
|
||||||
Par_GetParToHTML (AnsStr,Gbl.Test.Answer.Options[NumOpt].Text,Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
|
Par_GetParToHTML (AnsStr,Gbl.Test.Answer.Options[NumOpt].Text,
|
||||||
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
|
||||||
if (Gbl.Test.AnswerType == Tst_ANS_TEXT)
|
if (Gbl.Test.AnswerType == Tst_ANS_TEXT)
|
||||||
/* 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 */
|
||||||
|
@ -5381,7 +5382,8 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
|
||||||
|
|
||||||
/* Get feedback */
|
/* Get feedback */
|
||||||
sprintf (FbStr,"FbStr%u",NumOpt);
|
sprintf (FbStr,"FbStr%u",NumOpt);
|
||||||
Par_GetParToHTML (FbStr,Gbl.Test.Answer.Options[NumOpt].Feedback,Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
|
Par_GetParToHTML (FbStr,Gbl.Test.Answer.Options[NumOpt].Feedback,
|
||||||
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
|
||||||
|
|
||||||
/* Get image associated to the answer (action, file and title) */
|
/* Get image associated to the answer (action, file and title) */
|
||||||
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||
|
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||
|
||||||
|
|
29
swad_test.h
29
swad_test.h
|
@ -31,25 +31,28 @@
|
||||||
/***************************** Public constants ******************************/
|
/***************************** Public constants ******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Tst_SCORE_MAX 10 // Maximum score of a test (10 in Spain). Must be unsigned! // TODO: Make this configurable by teachers
|
#define Tst_SCORE_MAX 10 // Maximum score of a test (10 in Spain). Must be unsigned! // TODO: Make this configurable by teachers
|
||||||
|
|
||||||
#define Tst_MAX_QUESTIONS_PER_TEST 100 // Absolute maximum number of questions in a test
|
#define Tst_MAX_QUESTIONS_PER_TEST 100 // Absolute maximum number of questions in a test
|
||||||
#define Tst_MAX_TAGS_PER_QUESTION 5
|
#define Tst_MAX_TAGS_PER_QUESTION 5
|
||||||
#define Tst_MAX_LENGTH_TAG (256 -1)
|
|
||||||
#define Tst_MAX_BYTES_TAG (Tst_MAX_LENGTH_TAG*Str_MAX_BYTES_PER_CHAR)
|
#define Tst_MAX_CHARS_TAG (128 - 1)
|
||||||
#define Tst_MAX_OPTIONS_PER_QUESTION 10
|
#define Tst_MAX_BYTES_TAG (Tst_MAX_CHARS_TAG * Str_MAX_BYTES_PER_CHAR)
|
||||||
|
|
||||||
|
#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_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_SIZE_ANSWERS_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1))
|
||||||
|
|
||||||
#define Tst_MAX_LENGTH_ANSWER 1000
|
#define Tst_MAX_CHARS_ANSWER_OR_FEEDBACK 1000
|
||||||
#define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK (Tst_MAX_LENGTH_ANSWER*Str_MAX_BYTES_PER_CHAR)
|
#define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK (Tst_MAX_CHARS_ANSWER_OR_FEEDBACK * Str_MAX_BYTES_PER_CHAR)
|
||||||
|
|
||||||
#define Tst_CONFIG_DEFAULT_MIN_QUESTIONS 1
|
#define Tst_CONFIG_DEFAULT_MIN_QUESTIONS 1
|
||||||
#define Tst_CONFIG_DEFAULT_DEF_QUESTIONS 20 // Number of questions to be generated by default in a self-assessment test
|
#define Tst_CONFIG_DEFAULT_DEF_QUESTIONS 20 // Number of questions to be generated by default in a self-assessment test
|
||||||
#define Tst_CONFIG_DEFAULT_MAX_QUESTIONS 30 // Maximum number of questions to be generated in a self-assessment test
|
#define Tst_CONFIG_DEFAULT_MAX_QUESTIONS 30 // Maximum number of questions to be generated in a self-assessment test
|
||||||
|
|
||||||
#define Tst_MAX_LENGTH_FEEDBACK_TYPE 32
|
#define Tst_MAX_BYTES_FEEDBACK_TYPE 32
|
||||||
#define Tst_MAX_LENGTH_ANSWER_TYPE 32
|
|
||||||
|
#define Tst_MAX_BYTES_ANSWER_TYPE 32
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -1123,7 +1123,7 @@ static void TsI_WriteRowImportedQst (struct XMLElement *StemElem,
|
||||||
{
|
{
|
||||||
/* Convert the answer, that is in HTML, to rigorous HTML */
|
/* Convert the answer, that is in HTML, to rigorous HTML */
|
||||||
AnswerTextLength = strlen (Gbl.Test.Answer.Options[NumOpt].Text) *
|
AnswerTextLength = strlen (Gbl.Test.Answer.Options[NumOpt].Text) *
|
||||||
Str_MAX_BYTES_SPEC_CHAR_HTML;
|
Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((AnswerText = malloc (AnswerTextLength + 1)) == NULL)
|
if ((AnswerText = malloc (AnswerTextLength + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store answer.");
|
Lay_ShowErrorAndExit ("Not enough memory to store answer.");
|
||||||
Str_Copy (AnswerText,Gbl.Test.Answer.Options[NumOpt].Text,
|
Str_Copy (AnswerText,Gbl.Test.Answer.Options[NumOpt].Text,
|
||||||
|
@ -1138,7 +1138,7 @@ static void TsI_WriteRowImportedQst (struct XMLElement *StemElem,
|
||||||
if (Gbl.Test.Answer.Options[NumOpt].Feedback[0])
|
if (Gbl.Test.Answer.Options[NumOpt].Feedback[0])
|
||||||
{
|
{
|
||||||
AnswerFeedbackLength = strlen (Gbl.Test.Answer.Options[NumOpt].Feedback) *
|
AnswerFeedbackLength = strlen (Gbl.Test.Answer.Options[NumOpt].Feedback) *
|
||||||
Str_MAX_BYTES_SPEC_CHAR_HTML;
|
Str_MAX_BYTES_PER_CHAR;
|
||||||
if ((AnswerFeedback = malloc (AnswerFeedbackLength + 1)) == NULL)
|
if ((AnswerFeedback = malloc (AnswerFeedbackLength + 1)) == NULL)
|
||||||
Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
|
Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
|
||||||
Str_Copy (AnswerFeedback,
|
Str_Copy (AnswerFeedback,
|
||||||
|
|
|
@ -62,8 +62,7 @@ extern struct Globals Gbl;
|
||||||
#define TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN ((100 - TT_PERCENT_WIDTH_OF_ALL_DAYS - TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN * 2) / 2) // Width (%) of the separation columns
|
#define TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN ((100 - TT_PERCENT_WIDTH_OF_ALL_DAYS - TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN * 2) / 2) // Width (%) of the separation columns
|
||||||
|
|
||||||
#define TT_MAX_BYTES_STR_CLASS_TYPE 256
|
#define TT_MAX_BYTES_STR_CLASS_TYPE 256
|
||||||
#define TT_MAX_BYTES_STR_DURATION (2 + 1 + 2 + 1 + 1) // "hh:mm h"
|
#define TT_MAX_BYTES_STR_DURATION 32 // "hh:mm h"
|
||||||
#define TT_MAX_LENGTH_PLACE 32
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Internal types ******************************/
|
/******************************* Internal types ******************************/
|
||||||
|
@ -100,7 +99,7 @@ struct TimeTableColumn
|
||||||
TT_ClassType_t ClassType;
|
TT_ClassType_t ClassType;
|
||||||
unsigned Duration;
|
unsigned Duration;
|
||||||
char Place[TT_MAX_BYTES_PLACE + 1];
|
char Place[TT_MAX_BYTES_PLACE + 1];
|
||||||
char Group[TT_MAX_BYTES_GROUP + 1];
|
char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
|
||||||
};
|
};
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -204,9 +203,6 @@ static void TT_GetParamsTimeTable (void)
|
||||||
Lay_ShowErrorAndExit ("Duration is missing.");
|
Lay_ShowErrorAndExit ("Duration is missing.");
|
||||||
Gbl.TimeTable.Duration = Hours * 2 + Minutes / 30;
|
Gbl.TimeTable.Duration = Hours * 2 + Minutes / 30;
|
||||||
|
|
||||||
/***** Get group *****/
|
|
||||||
Par_GetParToText ("ModTTGrp",Gbl.TimeTable.Group,TT_MAX_BYTES_GROUP);
|
|
||||||
|
|
||||||
/***** Get group code *****/
|
/***** Get group code *****/
|
||||||
Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod");
|
Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod");
|
||||||
|
|
||||||
|
@ -742,7 +738,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
|
||||||
Gbl.CurrentCrs.Crs.CrsCod);
|
Gbl.CurrentCrs.Crs.CrsCod);
|
||||||
Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Group,
|
Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Group,
|
||||||
row[5],
|
row[5],
|
||||||
TT_MAX_BYTES_GROUP);
|
Grp_MAX_BYTES_GROUP_NAME);
|
||||||
TimeTable[Day][Hour].Columns[FirstFreeColumn].GrpCod = GrpCod;
|
TimeTable[Day][Hour].Columns[FirstFreeColumn].GrpCod = GrpCod;
|
||||||
// no break;
|
// no break;
|
||||||
case TT_TUTOR_TIMETABLE:
|
case TT_TUTOR_TIMETABLE:
|
||||||
|
@ -799,7 +795,7 @@ static void TT_ModifTimeTable (void)
|
||||||
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Duration = Gbl.TimeTable.Duration;
|
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Duration = Gbl.TimeTable.Duration;
|
||||||
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Group,
|
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Group,
|
||||||
Gbl.TimeTable.Group,
|
Gbl.TimeTable.Group,
|
||||||
TT_MAX_BYTES_GROUP);
|
Grp_MAX_BYTES_GROUP_NAME);
|
||||||
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Place,
|
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Place,
|
||||||
Gbl.TimeTable.Place,
|
Gbl.TimeTable.Place,
|
||||||
TT_MAX_BYTES_PLACE);
|
TT_MAX_BYTES_PLACE);
|
||||||
|
@ -1278,8 +1274,6 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
|
||||||
else
|
else
|
||||||
fprintf (Gbl.F.Out,"0:30");
|
fprintf (Gbl.F.Out,"0:30");
|
||||||
fprintf (Gbl.F.Out," h\" />");
|
fprintf (Gbl.F.Out," h\" />");
|
||||||
Par_PutHiddenParamString ("ModTTGrp","");
|
|
||||||
Par_PutHiddenParamString ("ModTTPlace","");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1302,7 +1296,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
|
||||||
fprintf (Gbl.F.Out,"<option");
|
fprintf (Gbl.F.Out,"<option");
|
||||||
if (Dur == Duration)
|
if (Dur == Duration)
|
||||||
fprintf (Gbl.F.Out," selected=\"selected\"");
|
fprintf (Gbl.F.Out," selected=\"selected\"");
|
||||||
fprintf (Gbl.F.Out,">%d:%02d h</option>",
|
fprintf (Gbl.F.Out,">%u:%02u h</option>",
|
||||||
Dur / 2,
|
Dur / 2,
|
||||||
Dur % 2 ? 30 :
|
Dur % 2 ? 30 :
|
||||||
0);
|
0);
|
||||||
|
@ -1349,11 +1343,10 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
|
||||||
" size=\"1\" maxlength=\"%u\" value=\"%s\""
|
" size=\"1\" maxlength=\"%u\" value=\"%s\""
|
||||||
" onchange=\"document.getElementById('%s').submit();\" />"
|
" onchange=\"document.getElementById('%s').submit();\" />"
|
||||||
"</label>",
|
"</label>",
|
||||||
Txt_Classroom,TT_MAX_LENGTH_PLACE,Place,Gbl.Form.Id);
|
Txt_Classroom,TT_MAX_CHARS_PLACE,Place,Gbl.Form.Id);
|
||||||
}
|
}
|
||||||
else // TimeTableView == TT_TUT_EDIT
|
else // TimeTableView == TT_TUT_EDIT
|
||||||
{
|
{
|
||||||
Par_PutHiddenParamString ("ModTTGrp","");
|
|
||||||
/***** Place *****/
|
/***** Place *****/
|
||||||
fprintf (Gbl.F.Out,"<br />"
|
fprintf (Gbl.F.Out,"<br />"
|
||||||
"<label class=\"DAT_SMALL\">"
|
"<label class=\"DAT_SMALL\">"
|
||||||
|
@ -1362,7 +1355,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
|
||||||
" size=\"12\" maxlength=\"%u\" value=\"%s\""
|
" size=\"12\" maxlength=\"%u\" value=\"%s\""
|
||||||
" onchange=\"document.getElementById('%s').submit();\" />"
|
" onchange=\"document.getElementById('%s').submit();\" />"
|
||||||
"</label>",
|
"</label>",
|
||||||
Txt_Place,TT_MAX_LENGTH_PLACE,Place,Gbl.Form.Id);
|
Txt_Place,TT_MAX_CHARS_PLACE,Place,Gbl.Form.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -33,8 +33,8 @@
|
||||||
/************************* Public constants and types ************************/
|
/************************* Public constants and types ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define TT_MAX_BYTES_PLACE (128 - 1)
|
#define TT_MAX_CHARS_PLACE 32
|
||||||
#define TT_MAX_BYTES_GROUP (256 - 1)
|
#define TT_MAX_BYTES_PLACE (TT_MAX_CHARS_PLACE * Str_MAX_BYTES_PER_CHAR)
|
||||||
|
|
||||||
#define TT_NUM_TIMETABLE_TYPES 3
|
#define TT_NUM_TIMETABLE_TYPES 3
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|
38
swad_user.c
38
swad_user.c
|
@ -96,7 +96,7 @@ const char *Usr_IconsClassPhotoOrList[Usr_NUM_USR_LIST_TYPES] =
|
||||||
#define Usr_NUM_ALL_FIELDS_DATA_TCH 11
|
#define Usr_NUM_ALL_FIELDS_DATA_TCH 11
|
||||||
const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR];
|
const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR];
|
||||||
|
|
||||||
#define Usr_MAX_LENGTH_QUERY_GET_LIST_USRS (16 * 1024 - 1)
|
#define Usr_MAX_BYTES_QUERY_GET_LIST_USRS (16 * 1024 - 1)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Internal types *******************************/
|
/****************************** Internal types *******************************/
|
||||||
|
@ -148,7 +148,7 @@ static void Usr_WriteUsrData (const char *BgColor,
|
||||||
bool NonBreak,bool Accepted);
|
bool NonBreak,bool Accepted);
|
||||||
|
|
||||||
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
char Query[Usr_MAX_LENGTH_QUERY_GET_LIST_USRS + 1]);
|
char Query[Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1]);
|
||||||
|
|
||||||
static void Usr_GetAdmsLst (Sco_Scope_t Scope);
|
static void Usr_GetAdmsLst (Sco_Scope_t Scope);
|
||||||
static void Usr_GetGstsLst (Sco_Scope_t Scope);
|
static void Usr_GetGstsLst (Sco_Scope_t Scope);
|
||||||
|
@ -3120,14 +3120,14 @@ static void Usr_InsertMyLastData (void)
|
||||||
/*********** Write a row of a table with the main data of a user *************/
|
/*********** Write a row of a table with the main data of a user *************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Usr_MAX_LENGTH_BG_COLOR (16 - 1)
|
#define Usr_MAX_BYTES_BG_COLOR (16 - 1)
|
||||||
|
|
||||||
void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
|
void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
|
||||||
bool PutCheckBoxToSelectUsr)
|
bool PutCheckBoxToSelectUsr)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Enrollment_confirmed;
|
extern const char *Txt_Enrollment_confirmed;
|
||||||
extern const char *Txt_Enrollment_not_confirmed;
|
extern const char *Txt_Enrollment_not_confirmed;
|
||||||
char BgColor[Usr_MAX_LENGTH_BG_COLOR + 1];
|
char BgColor[Usr_MAX_BYTES_BG_COLOR + 1];
|
||||||
char PhotoURL[PATH_MAX + 1];
|
char PhotoURL[PATH_MAX + 1];
|
||||||
bool ShowPhoto;
|
bool ShowPhoto;
|
||||||
bool UsrIsTheMsgSender = PutCheckBoxToSelectUsr &&
|
bool UsrIsTheMsgSender = PutCheckBoxToSelectUsr &&
|
||||||
|
@ -3141,7 +3141,7 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
|
||||||
// Two colors are used alternatively to better distinguish the rows
|
// Two colors are used alternatively to better distinguish the rows
|
||||||
if (UsrIsTheMsgSender)
|
if (UsrIsTheMsgSender)
|
||||||
Str_Copy (BgColor,"LIGHT_GREEN",
|
Str_Copy (BgColor,"LIGHT_GREEN",
|
||||||
Usr_MAX_LENGTH_BG_COLOR);
|
Usr_MAX_BYTES_BG_COLOR);
|
||||||
else
|
else
|
||||||
sprintf (BgColor,"COLOR%u",Gbl.RowEvenOdd);
|
sprintf (BgColor,"COLOR%u",Gbl.RowEvenOdd);
|
||||||
|
|
||||||
|
@ -3926,7 +3926,7 @@ unsigned Usr_GetNumberOfTeachersInCentre (long CtrCod)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
char Query[Usr_MAX_LENGTH_QUERY_GET_LIST_USRS + 1])
|
char Query[Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1])
|
||||||
{
|
{
|
||||||
unsigned NumPositiveCods = 0;
|
unsigned NumPositiveCods = 0;
|
||||||
unsigned NumNegativeCods = 0;
|
unsigned NumNegativeCods = 0;
|
||||||
|
@ -4033,7 +4033,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
{
|
{
|
||||||
Str_Concat (Query," AND (crs_usr.UsrCod IN"
|
Str_Concat (Query," AND (crs_usr.UsrCod IN"
|
||||||
" (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE",
|
" (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
NumPositiveCods = 0;
|
NumPositiveCods = 0;
|
||||||
for (NumGrpSel = 0;
|
for (NumGrpSel = 0;
|
||||||
NumGrpSel < Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps;
|
NumGrpSel < Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps;
|
||||||
|
@ -4042,16 +4042,16 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
{
|
{
|
||||||
Str_Concat (Query,NumPositiveCods ? " OR GrpCod='" :
|
Str_Concat (Query,NumPositiveCods ? " OR GrpCod='" :
|
||||||
" GrpCod='",
|
" GrpCod='",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
sprintf (LongStr,"%ld",GrpCod);
|
sprintf (LongStr,"%ld",GrpCod);
|
||||||
Str_Concat (Query,LongStr,
|
Str_Concat (Query,LongStr,
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
NumPositiveCods++;
|
NumPositiveCods++;
|
||||||
}
|
}
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4063,27 +4063,27 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
{
|
{
|
||||||
if (NumPositiveCods || NumNegativeCods)
|
if (NumPositiveCods || NumNegativeCods)
|
||||||
Str_Concat (Query," OR ",
|
Str_Concat (Query," OR ",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
else
|
else
|
||||||
Str_Concat (Query," AND (",
|
Str_Concat (Query," AND (",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
/* Select all the students of the course who don't belong to any group of type GrpTypCod */
|
/* Select all the students of the course who don't belong to any group of type GrpTypCod */
|
||||||
Str_Concat (Query,"crs_usr.UsrCod NOT IN"
|
Str_Concat (Query,"crs_usr.UsrCod NOT IN"
|
||||||
" (SELECT DISTINCT crs_grp_usr.UsrCod"
|
" (SELECT DISTINCT crs_grp_usr.UsrCod"
|
||||||
" FROM crs_grp,crs_grp_usr"
|
" FROM crs_grp,crs_grp_usr"
|
||||||
" WHERE crs_grp.GrpTypCod='",
|
" WHERE crs_grp.GrpTypCod='",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
sprintf (LongStr,"%ld",Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypCod);
|
sprintf (LongStr,"%ld",Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypCod);
|
||||||
Str_Concat (Query,LongStr,
|
Str_Concat (Query,LongStr,
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
Str_Concat (Query,"' AND crs_grp.GrpCod=crs_grp_usr.GrpCod)",
|
Str_Concat (Query,"' AND crs_grp.GrpCod=crs_grp_usr.GrpCod)",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
NumNegativeCods++;
|
NumNegativeCods++;
|
||||||
}
|
}
|
||||||
if (NumPositiveCods ||
|
if (NumPositiveCods ||
|
||||||
NumNegativeCods)
|
NumNegativeCods)
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
|
|
||||||
/***** Free memory used by the list of booleans AddStdsWithoutGroupOf *****/
|
/***** Free memory used by the list of booleans AddStdsWithoutGroupOf *****/
|
||||||
free ((void *) AddStdsWithoutGroupOf);
|
free ((void *) AddStdsWithoutGroupOf);
|
||||||
|
@ -4098,7 +4098,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
"usr_data.Surname2,"
|
"usr_data.Surname2,"
|
||||||
"usr_data.FirstName,"
|
"usr_data.FirstName,"
|
||||||
"usr_data.UsrCod",
|
"usr_data.UsrCod",
|
||||||
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
|
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -4110,7 +4110,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
|
||||||
|
|
||||||
void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope)
|
void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope)
|
||||||
{
|
{
|
||||||
char Query[Usr_MAX_LENGTH_QUERY_GET_LIST_USRS + 1]; // Big query when the course has lot of groups
|
char Query[Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1]; // Big query when the course has lot of groups
|
||||||
const char *QueryFields =
|
const char *QueryFields =
|
||||||
"DISTINCT usr_data.UsrCod,"
|
"DISTINCT usr_data.UsrCod,"
|
||||||
"usr_data.EncryptedUsrCod,"
|
"usr_data.EncryptedUsrCod,"
|
||||||
|
|
|
@ -3134,7 +3134,7 @@ int swad__markNotificationsAsRead (struct soap *soap,
|
||||||
/****************** Send a message to one or more users **********************/
|
/****************** Send a message to one or more users **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Svc_MAX_LENGTH_QUERY_RECIPIENTS (10 * 1024 - 1)
|
#define Svc_MAX_BYTES_QUERY_RECIPIENTS (10 * 1024 - 1)
|
||||||
|
|
||||||
int swad__sendMessage (struct soap *soap,
|
int swad__sendMessage (struct soap *soap,
|
||||||
char *wsKey,int messageCode,char *to,char *subject,char *body, // input
|
char *wsKey,int messageCode,char *to,char *subject,char *body, // input
|
||||||
|
@ -3143,7 +3143,7 @@ int swad__sendMessage (struct soap *soap,
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
long ReplyUsrCod = -1L;
|
long ReplyUsrCod = -1L;
|
||||||
char Nickname[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
char Nickname[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
||||||
char Query[Svc_MAX_LENGTH_QUERY_RECIPIENTS + 1];
|
char Query[Svc_MAX_BYTES_QUERY_RECIPIENTS + 1];
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned NumRow,NumRows;
|
unsigned NumRow,NumRows;
|
||||||
|
@ -3249,7 +3249,7 @@ int swad__sendMessage (struct soap *soap,
|
||||||
|
|
||||||
/* Check for overflow in query */
|
/* Check for overflow in query */
|
||||||
if (strlen (Query) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
|
if (strlen (Query) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS)
|
Svc_MAX_BYTES_QUERY_RECIPIENTS)
|
||||||
return soap_sender_fault (Gbl.soap,
|
return soap_sender_fault (Gbl.soap,
|
||||||
"Can not send message",
|
"Can not send message",
|
||||||
"Too many recipients");
|
"Too many recipients");
|
||||||
|
@ -3259,25 +3259,25 @@ int swad__sendMessage (struct soap *soap,
|
||||||
{
|
{
|
||||||
if (ReplyUsrCod > 0)
|
if (ReplyUsrCod > 0)
|
||||||
Str_Concat (Query," UNION ",
|
Str_Concat (Query," UNION ",
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
|
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||||
Str_Concat (Query,"SELECT UsrCod FROM usr_nicknames"
|
Str_Concat (Query,"SELECT UsrCod FROM usr_nicknames"
|
||||||
" WHERE Nickname IN ('",
|
" WHERE Nickname IN ('",
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
|
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||||
FirstNickname = false;
|
FirstNickname = false;
|
||||||
ThereAreNicknames = true;
|
ThereAreNicknames = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Str_Concat (Query,",'",
|
Str_Concat (Query,",'",
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
|
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||||
Str_Concat (Query,Nickname,
|
Str_Concat (Query,Nickname,
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
|
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||||
Str_Concat (Query,"'",
|
Str_Concat (Query,"'",
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
|
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ThereAreNicknames)
|
if (ThereAreNicknames)
|
||||||
Str_Concat (Query,")",
|
Str_Concat (Query,")",
|
||||||
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
|
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||||
|
|
||||||
/***** Initialize output structure *****/
|
/***** Initialize output structure *****/
|
||||||
sendMessageOut->numUsers = 0;
|
sendMessageOut->numUsers = 0;
|
||||||
|
@ -3521,7 +3521,7 @@ int swad__getTestConfig (struct soap *soap,
|
||||||
|
|
||||||
/***** Set default result to empty *****/
|
/***** Set default result to empty *****/
|
||||||
getTestConfigOut->numQuestions = getTestConfigOut->minQuestions = getTestConfigOut->defQuestions = getTestConfigOut->maxQuestions = 0;
|
getTestConfigOut->numQuestions = getTestConfigOut->minQuestions = getTestConfigOut->defQuestions = getTestConfigOut->maxQuestions = 0;
|
||||||
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,Tst_MAX_LENGTH_FEEDBACK_TYPE + 1);
|
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_FEEDBACK_TYPE + 1);
|
||||||
getTestConfigOut->feedback[0] = '\0';
|
getTestConfigOut->feedback[0] = '\0';
|
||||||
|
|
||||||
/***** Get test configuration *****/
|
/***** Get test configuration *****/
|
||||||
|
@ -3534,7 +3534,7 @@ int swad__getTestConfig (struct soap *soap,
|
||||||
getTestConfigOut->maxQuestions = (int) Gbl.Test.Config.Max;
|
getTestConfigOut->maxQuestions = (int) Gbl.Test.Config.Max;
|
||||||
Str_Copy (getTestConfigOut->feedback,
|
Str_Copy (getTestConfigOut->feedback,
|
||||||
Tst_FeedbackXML[Gbl.Test.Config.FeedbackType],
|
Tst_FeedbackXML[Gbl.Test.Config.FeedbackType],
|
||||||
Tst_MAX_LENGTH_FEEDBACK_TYPE);
|
Tst_MAX_BYTES_FEEDBACK_TYPE);
|
||||||
|
|
||||||
/***** Get number of tests *****/
|
/***** Get number of tests *****/
|
||||||
if (Gbl.Test.Config.Pluggable == Tst_PLUGGABLE_YES &&
|
if (Gbl.Test.Config.Pluggable == Tst_PLUGGABLE_YES &&
|
||||||
|
@ -3798,10 +3798,10 @@ static int Svc_GetTstQuestions (long CrsCod,long BeginTime,struct swad__getTests
|
||||||
|
|
||||||
/* Get answer type (row[1]) */
|
/* Get answer type (row[1]) */
|
||||||
AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
|
AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
|
||||||
getTestsOut->questionsArray.__ptr[NumRow].answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_LENGTH_ANSWER_TYPE + 1);
|
getTestsOut->questionsArray.__ptr[NumRow].answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_ANSWER_TYPE + 1);
|
||||||
Str_Copy (getTestsOut->questionsArray.__ptr[NumRow].answerType,
|
Str_Copy (getTestsOut->questionsArray.__ptr[NumRow].answerType,
|
||||||
Tst_StrAnswerTypesXML[AnswerType],
|
Tst_StrAnswerTypesXML[AnswerType],
|
||||||
Tst_MAX_LENGTH_ANSWER_TYPE);
|
Tst_MAX_BYTES_ANSWER_TYPE);
|
||||||
|
|
||||||
/* Get shuffle (row[2]) */
|
/* Get shuffle (row[2]) */
|
||||||
getTestsOut->questionsArray.__ptr[NumRow].shuffle = (row[2][0] == 'Y') ? 1 :
|
getTestsOut->questionsArray.__ptr[NumRow].shuffle = (row[2][0] == 'Y') ? 1 :
|
||||||
|
@ -3984,12 +3984,11 @@ static int Svc_GetTstQuestionTags (long CrsCod,long BeginTime,struct swad__getTe
|
||||||
return SOAP_OK;
|
return SOAP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************** Return one test question for Trivial game *****************/
|
/***************** Return one test question for Trivial game *****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Svc_MAX_LENGTH_DEGREES_STR (1024 - 1)
|
#define Svc_MAX_BYTES_DEGREES_STR (1024 - 1)
|
||||||
|
|
||||||
int swad__getTrivialQuestion (struct soap *soap,
|
int swad__getTrivialQuestion (struct soap *soap,
|
||||||
char *wsKey,char *degrees,float lowerScore,float upperScore, // input
|
char *wsKey,char *degrees,float lowerScore,float upperScore, // input
|
||||||
|
@ -3999,7 +3998,7 @@ int swad__getTrivialQuestion (struct soap *soap,
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
const char *Ptr;
|
const char *Ptr;
|
||||||
char LongStr[1 + 10 + 1];
|
char LongStr[1 + 10 + 1];
|
||||||
char DegreesStr[Svc_MAX_LENGTH_DEGREES_STR + 1];
|
char DegreesStr[Svc_MAX_BYTES_DEGREES_STR + 1];
|
||||||
char DegStr[ 1 + 1 + 1 + 10 + 1 + 1];
|
char DegStr[ 1 + 1 + 1 + 10 + 1 + 1];
|
||||||
// DegStr=", ' - number ' \0"
|
// DegStr=", ' - number ' \0"
|
||||||
long DegCod;
|
long DegCod;
|
||||||
|
@ -4064,7 +4063,7 @@ int swad__getTrivialQuestion (struct soap *soap,
|
||||||
{
|
{
|
||||||
sprintf (DegStr,",'%ld'",DegCod);
|
sprintf (DegStr,",'%ld'",DegCod);
|
||||||
Str_Concat (DegreesStr,DegStr,
|
Str_Concat (DegreesStr,DegStr,
|
||||||
Svc_MAX_LENGTH_DEGREES_STR);
|
Svc_MAX_BYTES_DEGREES_STR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4128,10 +4127,10 @@ int swad__getTrivialQuestion (struct soap *soap,
|
||||||
|
|
||||||
/* Get answer type (row[1]) */
|
/* Get answer type (row[1]) */
|
||||||
AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
|
AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
|
||||||
getTrivialQuestionOut->question.answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_LENGTH_ANSWER_TYPE + 1);
|
getTrivialQuestionOut->question.answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_ANSWER_TYPE + 1);
|
||||||
Str_Copy (getTrivialQuestionOut->question.answerType,
|
Str_Copy (getTrivialQuestionOut->question.answerType,
|
||||||
Tst_StrAnswerTypesXML[AnswerType],
|
Tst_StrAnswerTypesXML[AnswerType],
|
||||||
Tst_MAX_LENGTH_ANSWER_TYPE);
|
Tst_MAX_BYTES_ANSWER_TYPE);
|
||||||
|
|
||||||
/* Get shuffle (row[2]) */
|
/* Get shuffle (row[2]) */
|
||||||
getTrivialQuestionOut->question.shuffle = (row[2][0] == 'Y') ? 1 :
|
getTrivialQuestionOut->question.shuffle = (row[2][0] == 'Y') ? 1 :
|
||||||
|
|
Loading…
Reference in New Issue
Block a user