Version 21.40: Oct 24, 2021 Queries moved to module swad_survey_database.

This commit is contained in:
acanas 2021-10-24 16:55:47 +02:00
parent b8e24424ed
commit 2f208d16b0
32 changed files with 568 additions and 410 deletions

View File

@ -1269,8 +1269,8 @@ void Agd_HideEvent (void)
AgdEvent.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
Agd_GetDataOfEventByCod (&AgdEvent);
/***** Set event private *****/
Agd_DB_HideEvent (&AgdEvent);
/***** Hide event *****/
Agd_DB_HideOrUnhideEvent (AgdEvent.AgdCod,AgdEvent.UsrCod,true);
/***** Show events again *****/
Agd_ShowMyAgenda (&Agenda);
@ -1299,8 +1299,8 @@ void Agd_UnhideEvent (void)
AgdEvent.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
Agd_GetDataOfEventByCod (&AgdEvent);
/***** Set event public *****/
Agd_DB_UnhideEvent (&AgdEvent);
/***** Unhide event *****/
Agd_DB_HideOrUnhideEvent (AgdEvent.AgdCod,AgdEvent.UsrCod,false);
/***** Show events again *****/
Agd_ShowMyAgenda (&Agenda);

View File

@ -289,29 +289,20 @@ void Agd_DB_UpdateEvent (const struct Agd_Event *AgdEvent,const char *Txt)
}
/*****************************************************************************/
/**************** Set an existing event as hidden/not hidden *****************/
/*************************** Hide/unhide an event ****************************/
/*****************************************************************************/
void Agd_DB_HideEvent (const struct Agd_Event *AgdEvent)
void Agd_DB_HideOrUnhideEvent (long AgdCod,long UsrCod,bool Hide)
{
DB_QueryUPDATE ("can not hide event",
DB_QueryUPDATE ("can not hide/unhide event",
"UPDATE agd_agendas"
" SET Hidden='Y'"
" SET Hidden='%c'"
" WHERE AgdCod=%ld"
" AND UsrCod=%ld",
AgdEvent->AgdCod,
AgdEvent->UsrCod);
}
void Agd_DB_UnhideEvent (const struct Agd_Event *AgdEvent)
{
DB_QueryUPDATE ("can not unhide event",
"UPDATE agd_agendas"
" SET Hidden='N'"
" WHERE AgdCod=%ld"
" AND UsrCod=%ld",
AgdEvent->AgdCod,
AgdEvent->UsrCod);
Hide ? 'Y' :
'N',
AgdCod,
UsrCod);
}
/*****************************************************************************/

View File

@ -52,8 +52,7 @@ void Agd_DB_RemoveEvent (const struct Agd_Event *AgdEvent);
long Agd_DB_CreateEvent (const struct Agd_Event *AgdEvent,const char *Txt);
void Agd_DB_UpdateEvent (const struct Agd_Event *AgdEvent,const char *Txt);
void Agd_DB_HideEvent (const struct Agd_Event *AgdEvent);
void Agd_DB_UnhideEvent (const struct Agd_Event *AgdEvent);
void Agd_DB_HideOrUnhideEvent (long AgdCod,long UsrCod,bool Hide);
void Agd_DB_MakeEventPublic (const struct Agd_Event *AgdEvent);
void Agd_DB_MakeEventPrivate (const struct Agd_Event *AgdEvent);

View File

@ -1029,7 +1029,7 @@ void Asg_HideAssignment (void)
Asg_GetDataOfAssignmentByCod (&Asg);
/***** Hide assignment *****/
Asg_DB_HideAssignment (Asg.AsgCod);
Asg_DB_HideOrUnhideAssignment (Asg.AsgCod,true);
/***** Show all assignments again *****/
Asg_ShowAllAssignments (&Assignments);
@ -1060,7 +1060,7 @@ void Asg_UnhideAssignment (void)
Asg_GetDataOfAssignmentByCod (&Asg);
/***** Unhide assignment *****/
Asg_DB_UnhideAssignment (Asg.AsgCod);
Asg_DB_HideOrUnhideAssignment (Asg.AsgCod,false);
/***** Show all assignments again *****/
Asg_ShowAllAssignments (&Assignments);

View File

@ -278,27 +278,18 @@ void Asg_DB_UpdateAssignment (const struct Asg_Assignment *Asg,const char *Txt)
}
/*****************************************************************************/
/************************** Hide/unhide an assignment ************************/
/************************* Hide/unhide an assignment *************************/
/*****************************************************************************/
void Asg_DB_HideAssignment (long AsgCod)
void Asg_DB_HideOrUnhideAssignment (long AsgCod,bool Hide)
{
DB_QueryUPDATE ("can not hide assignment",
DB_QueryUPDATE ("can not hide/unhide assignment",
"UPDATE asg_assignments"
" SET Hidden='Y'"
" WHERE AsgCod=%ld"
" AND CrsCod=%ld", // Extra check
AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
}
void Asg_DB_UnhideAssignment (long AsgCod)
{
DB_QueryUPDATE ("can not unhide assignment",
"UPDATE asg_assignments"
" SET Hidden='N'"
" SET Hidden='%c'"
" WHERE AsgCod=%ld"
" AND CrsCod=%ld",
Hide ? 'Y' :
'N',
AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
}

View File

@ -57,8 +57,7 @@ bool Asg_DB_CheckIfSimilarAssignmentExists (const char *Field,const char *Value,
long Asg_DB_CreateAssignment (const struct Asg_Assignment *Asg,const char *Txt);
void Asg_DB_UpdateAssignment (const struct Asg_Assignment *Asg,const char *Txt);
void Asg_DB_HideAssignment (long AsgCod);
void Asg_DB_UnhideAssignment (long AsgCod);
void Asg_DB_HideOrUnhideAssignment (long AsgCod,bool Hide);
void Asg_DB_RemoveAssignment (long AsgCod);

View File

@ -932,7 +932,7 @@ void Att_HideAttEvent (void)
Att_GetDataOfAttEventByCodAndCheckCrs (&Event);
/***** Hide attendance event *****/
Att_DB_HideAttEvent (Event.AttCod);
Att_DB_HideOrUnhideAttEvent (Event.AttCod,true);
/***** Show attendance events again *****/
Att_SeeAttEvents ();
@ -954,7 +954,7 @@ void Att_UnhideAttEvent (void)
Att_GetDataOfAttEventByCodAndCheckCrs (&Event);
/***** Unhide attendance event *****/
Att_DB_UnhideAttEvent (Event.AttCod);
Att_DB_HideOrUnhideAttEvent (Event.AttCod,false);
/***** Show attendance events again *****/
Att_SeeAttEvents ();

View File

@ -261,24 +261,15 @@ void Att_DB_UpdateAttEvent (const struct Att_Event *Event,const char *Descriptio
/********************** Hide/unhide an attendance event **********************/
/*****************************************************************************/
void Att_DB_HideAttEvent (long AttCod)
void Att_DB_HideOrUnhideAttEvent (long AttCod,bool Hide)
{
DB_QueryUPDATE ("can not hide attendance event",
DB_QueryUPDATE ("can not hide/unhide assignment",
"UPDATE att_events"
" SET Hidden='Y'"
" WHERE AttCod=%ld"
" AND CrsCod=%ld", // Extra check
AttCod,
Gbl.Hierarchy.Crs.CrsCod);
}
void Att_DB_UnhideAttEvent (long AttCod)
{
DB_QueryUPDATE ("can not unhide attendance event",
"UPDATE att_events"
" SET Hidden='N'"
" SET Hidden='%c'"
" WHERE AttCod=%ld"
" AND CrsCod=%ld",
Hide ? 'Y' :
'N',
AttCod,
Gbl.Hierarchy.Crs.CrsCod);
}

View File

@ -54,8 +54,7 @@ bool Att_DB_CheckIfSimilarAttEventExists (const char *Field,const char *Value,lo
long Att_DB_CreateAttEvent (const struct Att_Event *Event,const char *Description);
void Att_DB_UpdateAttEvent (const struct Att_Event *Event,const char *Description);
void Att_DB_HideAttEvent (long AttCod);
void Att_DB_UnhideAttEvent (long AttCod);
void Att_DB_HideOrUnhideAttEvent (long AttCod,bool Hide);
void Att_DB_CreateGroup (long AttCod,long GrpCod);
unsigned Att_DB_GetGrpCodsAssociatedToEvent (MYSQL_RES **mysql_res,long AttCod);

View File

@ -613,7 +613,7 @@ static void Ban_ShowOrHideBanner (struct Ban_Banner *Ban,bool Hide)
/***** Mark file as hidden/visible in database *****/
if (Ban->Hidden != Hide)
Ban_DB_ShowOrHideBanner (Ban->BanCod,Hide);
Ban_DB_HideOrUnhideBanner (Ban->BanCod,Hide);
}
/*****************************************************************************/

View File

@ -167,12 +167,12 @@ void Ban_DB_CreateBanner (const struct Ban_Banner *Ban)
}
/*****************************************************************************/
/************************* Change hiddeness of banner ************************/
/**************************** Hide/unhide a banner ***************************/
/*****************************************************************************/
void Ban_DB_ShowOrHideBanner (long BanCod,bool Hide)
void Ban_DB_HideOrUnhideBanner (long BanCod,bool Hide)
{
DB_QueryUPDATE ("can not change status of a banner in database",
DB_QueryUPDATE ("can not hide/unhide banner",
"UPDATE ban_banners"
" SET Hidden='%c'"
" WHERE BanCod=%ld",

View File

@ -46,7 +46,7 @@ unsigned Ban_DB_GetDataOfBannerByCod (MYSQL_RES **mysql_res,long BanCod);
bool Ban_DB_CheckIfBannerNameExists (const char *FieldName,const char *Name,long BanCod);
void Ban_DB_CreateBanner (const struct Ban_Banner *Ban);
void Ban_DB_ShowOrHideBanner (long BanCod,bool Hide);
void Ban_DB_HideOrUnhideBanner (long BanCod,bool Hide);
void Ban_DB_UpdateBanName (long BanCod,const char *FieldName,
const char *NewBanName);
void Ban_DB_UpdateBanImg (long BanCod,

View File

@ -7741,7 +7741,7 @@ void Brw_SetDocumentAsVisible (void)
/***** Change file to visible *****/
if (Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Gbl.FileBrowser.FilFolLnk.Type,
Gbl.FileBrowser.FilFolLnk.Full))
Brw_DB_ChangeFileOrFolderHidden (Gbl.FileBrowser.FilFolLnk.Full,false);
Brw_DB_HideOrUnhideFileOrFolder (Gbl.FileBrowser.FilFolLnk.Full,false);
/***** Remove the affected clipboards *****/
Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type,
@ -7765,7 +7765,7 @@ void Brw_SetDocumentAsHidden (void)
set it as hidden *****/
if (!Brw_CheckIfFileOrFolderIsSetAsHiddenInDB (Gbl.FileBrowser.FilFolLnk.Type,
Gbl.FileBrowser.FilFolLnk.Full))
Brw_DB_ChangeFileOrFolderHidden (Gbl.FileBrowser.FilFolLnk.Full,true);
Brw_DB_HideOrUnhideFileOrFolder (Gbl.FileBrowser.FilFolLnk.Full,true);
/***** Remove the affected clipboards *****/
Brw_DB_RemoveAffectedClipboards (Gbl.FileBrowser.Type,

View File

@ -2264,24 +2264,24 @@ unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod)
}
/*****************************************************************************/
/***************** Change hiddeness of file in the database ******************/
/************************ Hide/unhide file or folder *************************/
/*****************************************************************************/
void Brw_DB_ChangeFileOrFolderHidden (const char Path[PATH_MAX + 1],bool IsHidden)
void Brw_DB_HideOrUnhideFileOrFolder (const char Path[PATH_MAX + 1],bool Hide)
{
long Cod = Brw_GetCodForFileBrowser ();
long ZoneUsrCod = Brw_GetZoneUsrCodForFileBrowser ();
/***** Mark file as hidden/unhidden in database *****/
DB_QueryUPDATE ("can not change status of a file in database",
DB_QueryUPDATE ("can not hide/unhide file/folder",
"UPDATE brw_files"
" SET Hidden='%c'"
" WHERE FileBrowser=%u"
" AND Cod=%ld"
" AND ZoneUsrCod=%ld"
" AND Path='%s'",
IsHidden ? 'Y' :
'N',
Hide ? 'Y' :
'N',
(unsigned) Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type],
Cod,
ZoneUsrCod,

View File

@ -104,7 +104,7 @@ unsigned Brw_DB_GetFileViewsFromNonLoggedUsrs (long FilCod);
unsigned Brw_DB_GetNumFileViewsUsr (long UsrCod);
//------------------------------- Hidden files --------------------------------
void Brw_DB_ChangeFileOrFolderHidden (const char Path[PATH_MAX + 1],bool IsHidden);
void Brw_DB_HideOrUnhideFileOrFolder (const char Path[PATH_MAX + 1],bool Hide);
unsigned Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingPath (MYSQL_RES **mysql_res,
const char *Path);
bool Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (const struct FileMetadata *FileMetadata);

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
#define Log_PLATFORM_VERSION "SWAD 21.39.2 (2021-10-22)"
#define Log_PLATFORM_VERSION "SWAD 21.40 (2021-10-24)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 21.40: Oct 24, 2021 Queries moved to module swad_survey_database. (320673 lines)
Version 21.39.2: Oct 22, 2021 Fixed bug in settings. (320544 lines)
Version 21.39.1: Oct 21, 2021 Queries moved to module swad_survey_database. (320540 lines)
Version 21.39: Oct 21, 2021 Fixed bug in nicknames. Reported by Ana Ollarves Reyes. (320487 lines)

View File

@ -1255,7 +1255,7 @@ static void Exa_HideUnhideExam (bool Hide)
Exams.ExaCod = Exam.ExaCod;
/***** Unhide exam *****/
Exa_DB_HideUnhideExam (Exam.ExaCod,Hide);
Exa_DB_HideOrUnhideExam (Exam.ExaCod,Hide);
/***** Show exams again *****/
Exa_ListAllExams (&Exams);

View File

@ -115,12 +115,12 @@ void Exa_DB_UpdateExam (const struct Exa_Exam *Exam,const char *Txt)
}
/*****************************************************************************/
/***************************** Hide/unhide exam ******************************/
/*************************** Hide/unhide an exam *****************************/
/*****************************************************************************/
void Exa_DB_HideUnhideExam (long ExaCod,bool Hide)
void Exa_DB_HideOrUnhideExam (long ExaCod,bool Hide)
{
DB_QueryUPDATE ("can not hide exam",
DB_QueryUPDATE ("can not hide/unhide exam",
"UPDATE exa_exams"
" SET Hidden='%c'"
" WHERE ExaCod=%ld",
@ -767,7 +767,6 @@ long Exa_DB_GetSetCodFromSetInd (long ExaCod,unsigned SetInd)
unsigned Exa_DB_GetMaxSetIndexInExam (long ExaCod)
{
/***** Get maximum set index in an exam from database *****/
return DB_QuerySELECTUnsigned ("can not get max set index",
"SELECT MAX(SetInd)"
" FROM exa_sets"

View File

@ -44,7 +44,7 @@
//---------------------------- Exams ------------------------------------------
long Exa_DB_CreateExam (const struct Exa_Exam *Exam,const char *Txt);
void Exa_DB_UpdateExam (const struct Exa_Exam *Exam,const char *Txt);
void Exa_DB_HideUnhideExam (long ExaCod,bool Hide);
void Exa_DB_HideOrUnhideExam (long ExaCod,bool Hide);
unsigned Exa_DB_GetListExams (MYSQL_RES **mysql_res,Exa_Order_t SelectedOrder);
unsigned Exa_DB_GetDataOfExamByCod (MYSQL_RES **mysql_res,long ExaCod);
unsigned Exa_DB_GetExamStartEnd (MYSQL_RES **mysql_res,long ExaCod);

View File

@ -1187,7 +1187,7 @@ void Gam_HideGame (void)
Err_NoPermissionExit ();
/***** Hide game *****/
Gam_DB_HideGame (Game.GamCod);
Gam_DB_HideOrUnhideGame (Game.GamCod,true);
/***** Show games again *****/
Gam_ListAllGames (&Games);
@ -1218,7 +1218,7 @@ void Gam_UnhideGame (void)
Err_NoPermissionExit ();
/***** Unhide game *****/
Gam_DB_UnhideGame (Game.GamCod);
Gam_DB_HideOrUnhideGame (Game.GamCod,false);
/***** Show games again *****/
Gam_ListAllGames (&Games);

View File

@ -109,28 +109,17 @@ void Gam_DB_UpdateGame (const struct Gam_Game *Game,const char *Txt)
}
/*****************************************************************************/
/********************************** Hide a game ******************************/
/*************************** Hide/unhide a game ******************************/
/*****************************************************************************/
void Gam_DB_HideGame (long GamCod)
void Gam_DB_HideOrUnhideGame (long GamCod,bool Hide)
{
DB_QueryUPDATE ("can not hide game",
DB_QueryUPDATE ("can not hide/unhide game",
"UPDATE gam_games"
" SET Hidden='Y'"
" WHERE GamCod=%ld",
GamCod);
}
/*****************************************************************************/
/******************************** Unhide a game ******************************/
/*****************************************************************************/
void Gam_DB_UnhideGame (long GamCod)
{
DB_QueryUPDATE ("can not show game",
"UPDATE gam_games"
" SET Hidden='N'"
" SET Hidden='%c'"
" WHERE GamCod=%ld",
Hide ? 'Y' :
'N',
GamCod);
}

View File

@ -40,8 +40,7 @@
//--------------------------------- Games -------------------------------------
long Gam_DB_CreateGame (const struct Gam_Game *Game,const char *Txt);
void Gam_DB_UpdateGame (const struct Gam_Game *Game,const char *Txt);
void Gam_DB_HideGame (long GamCod);
void Gam_DB_UnhideGame (long GamCod);
void Gam_DB_HideOrUnhideGame (long GamCod,bool Hide);
unsigned Gam_DB_GetListGames (MYSQL_RES **mysql_res,Gam_Order_t SelectedOrder);
unsigned Gam_DB_GetDataOfGameByCod (MYSQL_RES **mysql_res,long GamCod);

View File

@ -166,7 +166,7 @@ static long Prg_GetParamItmCod (void);
static unsigned Prg_GetNumItemFromItmCod (long ItmCod);
static void Prg_HideUnhideItem (char YN);
static void Prg_HideOrUnhideItem (bool Hide);
static void Prg_MoveUpDownItem (Prg_MoveUpDown_t UpDown);
static bool Prg_ExchangeItemRanges (int NumItemTop,int NumItemBottom);
@ -1205,15 +1205,15 @@ void Prg_RemoveItem (void)
void Prg_HideItem (void)
{
Prg_HideUnhideItem ('Y');
Prg_HideOrUnhideItem (true);
}
void Prg_UnhideItem (void)
{
Prg_HideUnhideItem ('N');
Prg_HideOrUnhideItem (false);
}
static void Prg_HideUnhideItem (char YN)
static void Prg_HideOrUnhideItem (bool Hide)
{
struct Prg_Item Item;
struct Prg_ItemRange ToHighlight;
@ -1228,7 +1228,7 @@ static void Prg_HideUnhideItem (char YN)
Err_WrongItemExit ();
/***** Hide/unhide program item *****/
Prg_DB_HideUnhideItem (Item.Hierarchy.ItmCod,YN);
Prg_DB_HideOrUnhideItem (Item.Hierarchy.ItmCod,Hide);
/***** Show program items highlighting subtree *****/
Prg_SetItemRangeWithAllChildren (Prg_GetNumItemFromItmCod (Item.Hierarchy.ItmCod),

View File

@ -100,18 +100,19 @@ void Prg_DB_UpdateItem (const struct Prg_Item *Item,const char *Txt)
}
/*****************************************************************************/
/************************* Hide/unhide program item **************************/
/************************* Hide/unhide a program item *************************/
/*****************************************************************************/
void Prg_DB_HideUnhideItem (long ItmCod,char YN)
void Prg_DB_HideOrUnhideItem (long ItmCod,bool Hide)
{
DB_QueryUPDATE ("can not change program item",
DB_QueryUPDATE ("can not hide/unhide program item",
"UPDATE prg_items"
" SET Hidden='%c'"
" WHERE ItmCod=%ld"
" AND CrsCod=%ld", // Extra check
YN,
ItmCod,
Hide ? 'Y' :
'N',
ItmCod,
Gbl.Hierarchy.Crs.CrsCod);
}

View File

@ -40,7 +40,7 @@
long Prg_DB_InsertItem (const struct Prg_Item *Item,const char *Txt);
void Prg_DB_UpdateItem (const struct Prg_Item *Item,const char *Txt);
void Prg_DB_HideUnhideItem (long ItmCod,char YN);
void Prg_DB_HideOrUnhideItem (long ItmCod,bool Hide);
void Prg_DB_UpdateIndexRange (long Diff,long Begin,long End);
void Prg_DB_LockTable (void);
void Prg_DB_UnlockTable (void);

View File

@ -3113,7 +3113,7 @@ void Prj_HideProject (void)
/***** Hide project *****/
if (Prj_CheckIfICanEditProject (&Prj))
Prj_DB_HideUnhideProject (Prj.PrjCod,'Y');
Prj_DB_HideOrUnhideProject (Prj.PrjCod,true);
else
Err_NoPermissionExit ();
@ -3149,7 +3149,7 @@ void Prj_UnhideProject (void)
/***** Unhide project *****/
if (Prj_CheckIfICanEditProject (&Prj))
Prj_DB_HideUnhideProject (Prj.PrjCod,'N');
Prj_DB_HideOrUnhideProject (Prj.PrjCod,false);
else
Err_NoPermissionExit ();

View File

@ -201,14 +201,15 @@ void Prj_DB_AddUsrToPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,long UsrC
/****************************** Hide a project *******************************/
/*****************************************************************************/
void Prj_DB_HideUnhideProject (long PrjCod,char YN)
void Prj_DB_HideOrUnhideProject (long PrjCod,bool Hide)
{
DB_QueryUPDATE ("can not hide project",
DB_QueryUPDATE ("can not hide/unhide project",
"UPDATE prj_projects"
" SET Hidden='%c'"
" WHERE PrjCod=%ld"
" AND CrsCod=%ld", // Extra check
YN,
Hide ? 'Y' :
'N',
PrjCod,
Gbl.Hierarchy.Crs.CrsCod);
}

View File

@ -43,7 +43,7 @@ void Prj_DB_UnlockProjectEdition (long PrjCod);
long Prj_DB_CreateProject (const struct Prj_Project *Prj);
void Prj_DB_UpdateProject (const struct Prj_Project *Prj);
void Prj_DB_AddUsrToPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,long UsrCod);
void Prj_DB_HideUnhideProject (long PrjCod,char YN);
void Prj_DB_HideOrUnhideProject (long PrjCod,bool Hide);
unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res,
const struct Prj_Projects *Projects,

View File

@ -66,12 +66,6 @@ extern struct Globals Gbl;
#define Svy_MAX_BYTES_LIST_ANSWER_TYPES (Svy_NUM_ANS_TYPES * (Cns_MAX_DECIMAL_DIGITS_UINT + 1))
const char *Svy_StrAnswerTypesDB[Svy_NUM_ANS_TYPES] =
{
[Svy_ANS_UNIQUE_CHOICE ] = "unique_choice",
[Svy_ANS_MULTIPLE_CHOICE] = "multiple_choice",
};
#define Svy_MAX_ANSWERS_PER_QUESTION 10
struct Svy_Question // Must be initialized to 0 before using it
@ -138,11 +132,10 @@ static void Svy_GetAndWriteNamesOfGrpsAssociatedToSvy (struct Svy_Survey *Svy);
static void Svy_ShowFormEditOneQst (struct Svy_Surveys *Surveys,
long SvyCod,struct Svy_Question *SvyQst,
char Txt[Cns_MAX_BYTES_TEXT + 1]);
char Stem[Cns_MAX_BYTES_TEXT + 1]);
static void Svy_InitQst (struct Svy_Question *SvyQst);
static void Svy_PutParamQstCod (long QstCod);
static long Svy_GetParamQstCod (void);
static Svy_AnswerType_t Svy_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD);
static bool Svy_AllocateTextChoiceAnswer (struct Svy_Question *SvyQst,unsigned NumAns);
static void Svy_FreeTextChoiceAnswers (struct Svy_Question *SvyQst,unsigned NumAnswers);
static void Svy_FreeTextChoiceAnswer (struct Svy_Question *SvyQst,unsigned NumAns);
@ -150,6 +143,9 @@ static void Svy_FreeTextChoiceAnswer (struct Svy_Question *SvyQst,unsigned NumAn
static unsigned Svy_GetNextQuestionIndexInSvy (long SvyCod);
static void Svy_ListSvyQuestions (struct Svy_Surveys *Surveys,
struct Svy_Survey *Svy);
static void Svy_GetDataOfQstFromRow (struct Svy_Question *SvyQst,
char Stem[Cns_MAX_BYTES_TEXT + 1],
MYSQL_ROW row);
static void Svy_PutParamsToEditQuestion (void *Surveys);
static void Svy_PutIconToAddNewQuestion (void *Surveys);
static void Svy_PutButtonToCreateNewQuestion (struct Svy_Surveys *Surveys);
@ -505,7 +501,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
(Svy.Status.Open ? "DATE_GREEN_LIGHT" :
"DATE_RED_LIGHT"),
Gbl.RowEvenOdd);
Dat_WriteLocalDateHMSFromUTC (Id,Svy.TimeUTC[Svy_START_TIME],
Dat_WriteLocalDateHMSFromUTC (Id,Svy.TimeUTC[Dat_STR_TIME],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,true,true,0x7);
HTM_TD_End ();
@ -529,7 +525,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
(Svy.Status.Open ? "DATE_GREEN_LIGHT" :
"DATE_RED_LIGHT"),
Gbl.RowEvenOdd);
Dat_WriteLocalDateHMSFromUTC (Id,Svy.TimeUTC[Svy_END_TIME],
Dat_WriteLocalDateHMSFromUTC (Id,Svy.TimeUTC[Dat_END_TIME],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,false,true,0x7);
HTM_TD_End ();
@ -1300,15 +1296,15 @@ void Svy_GetDataOfSurveyByCod (struct Svy_Survey *Svy)
else
{
/* Initialize to empty survey */
Svy->SvyCod = -1L;
Svy->Scope = HieLvl_UNK;
Svy->Roles = 0;
Svy->UsrCod = -1L;
Svy->TimeUTC[Svy_START_TIME] =
Svy->TimeUTC[Svy_END_TIME ] = (time_t) 0;
Svy->Title[0] = '\0';
Svy->NumQsts = 0;
Svy->NumUsrs = 0;
Svy->SvyCod = -1L;
Svy->Scope = HieLvl_UNK;
Svy->Roles = 0;
Svy->UsrCod = -1L;
Svy->TimeUTC[Dat_STR_TIME] =
Svy->TimeUTC[Dat_END_TIME] = (time_t) 0;
Svy->Title[0] = '\0';
Svy->NumQsts = 0;
Svy->NumUsrs = 0;
Svy->Status.Visible = true;
Svy->Status.Open = false;
Svy->Status.IAmLoggedWithAValidRoleToAnswer = false;
@ -1609,11 +1605,7 @@ void Svy_HideSurvey (void)
Err_NoPermissionExit ();
/***** Hide survey *****/
DB_QueryUPDATE ("can not hide survey",
"UPDATE svy_surveys"
" SET Hidden='Y'"
" WHERE SvyCod=%ld",
Svy.SvyCod);
Svy_DB_HideOrUnhideSurvey (Svy.SvyCod,true);
/***** Show surveys again *****/
Svy_ListAllSurveys (&Surveys);
@ -1646,11 +1638,7 @@ void Svy_UnhideSurvey (void)
Err_NoPermissionExit ();
/***** Show survey *****/
DB_QueryUPDATE ("can not show survey",
"UPDATE svy_surveys"
" SET Hidden='N'"
" WHERE SvyCod=%ld",
Svy.SvyCod);
Svy_DB_HideOrUnhideSurvey (Svy.SvyCod,false);
/***** Show surveys again *****/
Svy_ListAllSurveys (&Surveys);
@ -1706,8 +1694,8 @@ void Svy_RequestCreatOrEditSvy (void)
Svy.Scope = HieLvl_UNK;
Svy.Roles = (1 << Rol_STD);
Svy.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
Svy.TimeUTC[Svy_START_TIME] = Gbl.StartExecutionTimeUTC;
Svy.TimeUTC[Svy_END_TIME ] = Gbl.StartExecutionTimeUTC + (24 * 60 * 60); // +24 hours
Svy.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
Svy.TimeUTC[Dat_END_TIME] = Gbl.StartExecutionTimeUTC + (24 * 60 * 60); // +24 hours
Svy.Title[0] = '\0';
Svy.NumQsts = 0;
Svy.NumUsrs = 0;
@ -2078,10 +2066,10 @@ void Svy_ReceiveFormSurvey (void)
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
/***** Adjust dates *****/
if (NewSvy.TimeUTC[Svy_START_TIME] == 0)
NewSvy.TimeUTC[Svy_START_TIME] = Gbl.StartExecutionTimeUTC;
if (NewSvy.TimeUTC[Svy_END_TIME] == 0)
NewSvy.TimeUTC[Svy_END_TIME] = NewSvy.TimeUTC[Svy_START_TIME] + 24 * 60 * 60; // +24 hours
if (NewSvy.TimeUTC[Dat_STR_TIME] == 0)
NewSvy.TimeUTC[Dat_STR_TIME] = Gbl.StartExecutionTimeUTC;
if (NewSvy.TimeUTC[Dat_END_TIME] == 0)
NewSvy.TimeUTC[Dat_END_TIME] = NewSvy.TimeUTC[Dat_STR_TIME] + 24 * 60 * 60; // +24 hours
/***** Get users who can answer this survey *****/
NewSvy.Roles = Rol_GetSelectedRoles ();
@ -2138,24 +2126,7 @@ static void Svy_CreateSurvey (struct Svy_Survey *Svy,const char *Txt)
extern const char *Txt_Created_new_survey_X;
/***** Create a new survey *****/
Svy->SvyCod =
DB_QueryINSERTandReturnCode ("can not create new survey",
"INSERT INTO svy_surveys"
" (Scope,Cod,Hidden,Roles,UsrCod,"
"StartTime,EndTime,"
"Title,Txt)"
" VALUES"
" ('%s',%ld,'N',%u,%ld,"
"FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
"'%s','%s')",
Sco_GetDBStrFromScope (Svy->Scope),
Svy->Cod,
Svy->Roles,
Gbl.Usrs.Me.UsrDat.UsrCod,
Svy->TimeUTC[Svy_START_TIME],
Svy->TimeUTC[Svy_END_TIME ],
Svy->Title,
Txt);
Svy->SvyCod = Svy_DB_CreateSurvey (Svy,Txt);
/***** Create groups *****/
if (Gbl.Crs.Grps.LstGrpsSel.NumGrps)
@ -2175,24 +2146,7 @@ static void Svy_UpdateSurvey (struct Svy_Survey *Svy,const char *Txt)
extern const char *Txt_The_survey_has_been_modified;
/***** Update the data of the survey *****/
DB_QueryUPDATE ("can not update survey",
"UPDATE svy_surveys"
" SET Scope='%s',"
"Cod=%ld,"
"Roles=%u,"
"StartTime=FROM_UNIXTIME(%ld),"
"EndTime=FROM_UNIXTIME(%ld),"
"Title='%s',"
"Txt='%s'"
" WHERE SvyCod=%ld",
Sco_GetDBStrFromScope (Svy->Scope),
Svy->Cod,
Svy->Roles,
Svy->TimeUTC[Svy_START_TIME],
Svy->TimeUTC[Svy_END_TIME ],
Svy->Title,
Txt,
Svy->SvyCod);
Svy_DB_UpdateSurvey (Svy,Txt);
/***** Update groups *****/
/* Remove old groups */
@ -2218,14 +2172,7 @@ static void Svy_CreateGrps (long SvyCod)
for (NumGrpSel = 0;
NumGrpSel < Gbl.Crs.Grps.LstGrpsSel.NumGrps;
NumGrpSel++)
/* Create group */
DB_QueryINSERT ("can not associate a group to a survey",
"INSERT INTO svy_groups"
" (SvyCod,GrpCod)"
" VALUES"
" (%ld,%ld)",
SvyCod,
Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel]);
Svy_DB_CreateGrp (SvyCod,Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel]);
}
/*****************************************************************************/
@ -2240,36 +2187,25 @@ static void Svy_GetAndWriteNamesOfGrpsAssociatedToSvy (struct Svy_Survey *Svy)
extern const char *Txt_The_whole_course;
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRow;
unsigned long NumRows;
unsigned NumGrps;
unsigned NumGrp;
/***** Get groups associated to a survey from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get groups of a survey",
"SELECT grp_types.GrpTypName," // row[0]
"grp_groups.GrpName" // row[1]
" FROM svy_groups,"
"grp_groups,"
"grp_types"
" WHERE svy_groups.SvyCod=%ld"
" AND svy_groups.GrpCod=grp_groups.GrpCod"
" AND grp_groups.GrpTypCod=grp_types.GrpTypCod"
" ORDER BY grp_types.GrpTypName,"
"grp_groups.GrpName",
Svy->SvyCod);
NumGrps = Svy_DB_GetGrpNamesAssociatedToSvy (&mysql_res,Svy->SvyCod);
/***** Write heading *****/
HTM_DIV_Begin ("class=\"%s\"",Svy->Status.Visible ? "ASG_GRP" :
"ASG_GRP_LIGHT");
HTM_TxtColonNBSP (NumRows == 1 ? Txt_Group :
HTM_TxtColonNBSP (NumGrps == 1 ? Txt_Group :
Txt_Groups);
/***** Write groups *****/
if (NumRows) // Groups found...
if (NumGrps) // Groups found...
{
/* Get and write the group types and names */
for (NumRow = 0;
NumRow < NumRows;
NumRow++)
for (NumGrp = 0;
NumGrp < NumGrps;
NumGrp++)
{
/* Get next group */
row = mysql_fetch_row (mysql_res);
@ -2277,12 +2213,12 @@ static void Svy_GetAndWriteNamesOfGrpsAssociatedToSvy (struct Svy_Survey *Svy)
/* Write group type name and group name */
HTM_TxtF ("%s&nbsp;%s",row[0],row[1]);
if (NumRows >= 2)
if (NumGrps >= 2)
{
if (NumRow == NumRows - 2)
if (NumGrp == NumGrps - 2)
HTM_TxtF (" %s ",Txt_and);
if (NumRows >= 3)
if (NumRow < NumRows - 2)
if (NumGrps >= 3)
if (NumGrp < NumGrps - 2)
HTM_Txt (", ");
}
}
@ -2303,64 +2239,20 @@ static void Svy_GetAndWriteNamesOfGrpsAssociatedToSvy (struct Svy_Survey *Svy)
void Svy_RemoveSurveys (HieLvl_Level_t Scope,long Cod)
{
/***** Remove all the users in course surveys *****/
DB_QueryDELETE ("can not remove users"
" who had answered surveys in a place on the hierarchy",
"DELETE FROM svy_users"
" USING svy_surveys,"
"svy_users"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_users.SvyCod",
Sco_GetDBStrFromScope (Scope),
Cod);
/***** Remove all users in surveys *****/
Svy_DB_RemoveUsrsWhoHaveAnsweredSvysIn (Scope,Cod);
/***** Remove all the answers in course surveys *****/
DB_QueryDELETE ("can not remove answers of surveys"
" in a place on the hierarchy",
"DELETE FROM svy_answers"
" USING svy_surveys,"
"svy_questions,"
"svy_answers"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_questions.SvyCod"
" AND svy_questions.QstCod=svy_answers.QstCod",
Sco_GetDBStrFromScope (Scope),
Cod);
/***** Remove all answers in surveys *****/
Svy_DB_RemoveAnswersSvysIn (Scope,Cod);
/***** Remove all the questions in course surveys *****/
DB_QueryDELETE ("can not remove questions of surveys"
" in a place on the hierarchy",
"DELETE FROM svy_questions"
" USING svy_surveys,"
"svy_questions"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_questions.SvyCod",
Sco_GetDBStrFromScope (Scope),
Cod);
/***** Remove all questions in surveys *****/
Svy_DB_RemoveQstsSvysIn (Scope,Cod);
/***** Remove groups *****/
DB_QueryDELETE ("can not remove all the groups"
" associated to surveys of a course",
"DELETE FROM svy_groups"
" USING svy_surveys,"
"svy_groups"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_groups.SvyCod",
Sco_GetDBStrFromScope (Scope),
Cod);
/***** Remove all groups *****/
Svy_DB_RemoveGrpsSvysIn (Scope,Cod);
/***** Remove course surveys *****/
DB_QueryDELETE ("can not remove all the surveys"
" in a place on the hierarchy",
"DELETE FROM svy_surveys"
" WHERE Scope='%s'"
" AND Cod=%ld",
Sco_GetDBStrFromScope (Scope),
Cod);
/***** Remove all surveys *****/
Svy_DB_RemoveSvysIn (Scope,Cod);
}
/*****************************************************************************/
@ -2372,7 +2264,7 @@ void Svy_RequestEditQuestion (void)
struct Svy_Surveys Surveys;
struct Svy_Question SvyQst;
long SvyCod;
char Txt[Cns_MAX_BYTES_TEXT + 1];
char Stem[Cns_MAX_BYTES_TEXT + 1];
/***** Reset surveys *****/
Svy_ResetSurveys (&Surveys);
@ -2381,7 +2273,7 @@ void Svy_RequestEditQuestion (void)
Svy_InitQst (&SvyQst);
/***** Initialize text to empty string *****/
Txt[0] = '\0';
Stem[0] = '\0';
/***** Get survey code *****/
if ((SvyCod = Svy_GetParamSvyCod ()) <= 0)
@ -2396,7 +2288,7 @@ void Svy_RequestEditQuestion (void)
Surveys.CurrentPage = Pag_GetParamPagNum (Pag_SURVEYS);
/***** Show form to create a new question in this survey *****/
Svy_ShowFormEditOneQst (&Surveys,SvyCod,&SvyQst,Txt);
Svy_ShowFormEditOneQst (&Surveys,SvyCod,&SvyQst,Stem);
/***** Show current survey *****/
Svy_ShowOneSurvey (&Surveys,SvyCod,true);
@ -2408,7 +2300,7 @@ void Svy_RequestEditQuestion (void)
static void Svy_ShowFormEditOneQst (struct Svy_Surveys *Surveys,
long SvyCod,struct Svy_Question *SvyQst,
char Txt[Cns_MAX_BYTES_TEXT + 1])
char Stem[Cns_MAX_BYTES_TEXT + 1])
{
extern const char *Hlp_ASSESSMENT_Surveys_questions;
extern const char *The_ClassFormInBox[The_NUM_THEMES];
@ -2430,28 +2322,14 @@ static void Svy_ShowFormEditOneQst (struct Svy_Surveys *Surveys,
{
if ((SvyQst->QstCod > 0)) // If parameter QstCod received ==> question already exists in the database
{
/***** Get the type of answer and the stem from the database *****/
/* Get the question from database */
DB_QuerySELECT (&mysql_res,"can not get a question",
"SELECT QstInd," // row[0]
"AnsType," // row[1]
"Stem" // row[2]
" FROM svy_questions"
" WHERE QstCod=%ld"
" AND SvyCod=%ld",
SvyQst->QstCod,
SvyCod);
row = mysql_fetch_row (mysql_res);
/* Get question index inside survey (row[0]) */
SvyQst->QstInd = Str_ConvertStrToUnsigned (row[0]);
/* Get the type of answer (row[1]) */
SvyQst->AnswerType = Svy_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
/* Get the stem of the question from the database (row[2]) */
Str_Copy (Txt,row[2],Cns_MAX_BYTES_TEXT);
/***** Get question data from database *****/
if (Svy_DB_GetQstDataByCod (&mysql_res,SvyQst->QstCod,SvyCod))
{
row = mysql_fetch_row (mysql_res);
Svy_GetDataOfQstFromRow (SvyQst,Stem,row);
}
else
Err_WrongQuestionExit ();
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
@ -2514,7 +2392,7 @@ static void Svy_ShowFormEditOneQst (struct Svy_Surveys *Surveys,
/* Data */
HTM_TD_Begin ("class=\"LT\"");
HTM_TEXTAREA_Begin ("id=\"Txt\" name=\"Txt\" cols=\"60\" rows=\"4\"");
HTM_Txt (Txt);
HTM_Txt (Stem);
HTM_TEXTAREA_End ();
HTM_TD_End ();
@ -2638,23 +2516,6 @@ static long Svy_GetParamQstCod (void)
return Par_GetParToLong ("QstCod");
}
/*****************************************************************************/
/*********** Convert a string with the answer type to answer type ************/
/*****************************************************************************/
static Svy_AnswerType_t Svy_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD)
{
Svy_AnswerType_t AnsType;
for (AnsType = (Svy_AnswerType_t) 0;
AnsType <= (Svy_AnswerType_t) (Svy_NUM_ANS_TYPES - 1);
AnsType++)
if (!strcmp (StrAnsTypeBD,Svy_StrAnswerTypesDB[AnsType]))
return AnsType;
return (Svy_AnswerType_t) 0;
}
/*****************************************************************************/
/******************* Allocate memory for a choice answer *********************/
/*****************************************************************************/
@ -2713,7 +2574,7 @@ void Svy_ReceiveQst (void)
struct Svy_Surveys Surveys;
struct Svy_Question SvyQst;
long SvyCod;
char Txt[Cns_MAX_BYTES_TEXT + 1];
char Stem[Cns_MAX_BYTES_TEXT + 1];
unsigned NumAns;
char AnsStr[8 + 10 + 1];
unsigned NumLastAns;
@ -2742,7 +2603,7 @@ void Svy_ReceiveQst (void)
(unsigned long) Svy_ANSWER_TYPE_DEFAULT);
/* Get question text */
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT);
Par_GetParToHTML ("Txt",Stem,Cns_MAX_BYTES_TEXT);
/* Get the texts of the answers */
for (NumAns = 0;
@ -2757,7 +2618,7 @@ void Svy_ReceiveQst (void)
}
/***** Make sure that stem and answer are not empty *****/
if (Txt[0])
if (Stem[0])
{
if (SvyQst.AnsChoice[0].Text[0]) // If the first answer has been filled
{
@ -2798,37 +2659,19 @@ void Svy_ReceiveQst (void)
}
if (Error)
Svy_ShowFormEditOneQst (&Surveys,SvyCod,&SvyQst,Txt);
Svy_ShowFormEditOneQst (&Surveys,SvyCod,&SvyQst,Stem);
else
{
/***** Form is received OK ==> insert question and answer in the database *****/
if (SvyQst.QstCod < 0) // It's a new question
{
SvyQst.QstInd = Svy_GetNextQuestionIndexInSvy (SvyCod);
/* Insert question in the table of questions */
SvyQst.QstCod =
DB_QueryINSERTandReturnCode ("can not create question",
"INSERT INTO svy_questions"
" (SvyCod,QstInd,AnsType,Stem)"
" VALUES"
" (%ld,%u,'%s','%s')",
SvyCod,SvyQst.QstInd,
Svy_StrAnswerTypesDB[SvyQst.AnswerType],
Txt);
SvyQst.QstCod = Svy_DB_CreateQuestion (SvyCod,SvyQst.QstInd,
SvyQst.AnswerType,Stem);
}
else // It's an existing question
/* Update question */
DB_QueryUPDATE ("can not update question",
"UPDATE svy_questions"
" SET Stem='%s',"
"AnsType='%s'"
" WHERE QstCod=%ld"
" AND SvyCod=%ld",
Txt,
Svy_StrAnswerTypesDB[SvyQst.AnswerType],
SvyQst.QstCod,
SvyCod);
Svy_DB_UpdateQuestion (SvyCod,SvyQst.QstCod,SvyQst.AnswerType,Stem);
/* Insert, update or delete answers in the answers table */
for (NumAns = 0;
@ -2838,34 +2681,18 @@ void Svy_ReceiveQst (void)
{
if (SvyQst.AnsChoice[NumAns].Text[0]) // Answer is not empty
/* Update answer text */
DB_QueryUPDATE ("can not update answer",
"UPDATE svy_answers"
" SET Answer='%s'"
" WHERE QstCod=%ld"
" AND AnsInd=%u",
SvyQst.AnsChoice[NumAns].Text,
SvyQst.QstCod,NumAns);
else // Answer is empty
Svy_DB_UpdateAnswerText (SvyQst.QstCod,NumAns,
SvyQst.AnsChoice[NumAns].Text);
else // Answer is empty
/* Delete answer from database */
DB_QueryDELETE ("can not delete answer",
"DELETE FROM svy_answers"
" WHERE QstCod=%ld"
" AND AnsInd=%u",
SvyQst.QstCod,
NumAns);
Svy_DB_RemoveAnswerQst (SvyQst.QstCod,NumAns);
}
else // If this answer does not exist...
{
if (SvyQst.AnsChoice[NumAns].Text[0]) // Answer is not empty
/* Create answer into database */
DB_QueryINSERT ("can not create answer",
"INSERT INTO svy_answers"
" (QstCod,AnsInd,NumUsrs,Answer)"
" VALUES"
" (%ld,%u,0,'%s')",
SvyQst.QstCod,
NumAns,
SvyQst.AnsChoice[NumAns].Text);
Svy_DB_CreateAnswer (SvyQst.QstCod,NumAns,
SvyQst.AnsChoice[NumAns].Text);
}
/***** List the questions of this survey, including the new one just inserted into the database *****/
@ -2889,20 +2716,16 @@ static unsigned Svy_GetNextQuestionIndexInSvy (long SvyCod)
MYSQL_ROW row;
unsigned QstInd = 0;
/***** Get number of surveys with a field value from database *****/
DB_QuerySELECT (&mysql_res,"can not get last question index",
"SELECT MAX(QstInd)" // row[0]
" FROM svy_questions"
" WHERE SvyCod=%ld",
SvyCod);
/***** Get number of users *****/
row = mysql_fetch_row (mysql_res);
if (row[0]) // There are questions
/***** Get last question index *****/
if (Svy_DB_GetLastQstInd (&mysql_res,SvyCod))
{
if (sscanf (row[0],"%u",&QstInd) != 1)
Err_ShowErrorAndExit ("Error when getting last question index.");
QstInd++;
row = mysql_fetch_row (mysql_res);
if (row[0]) // There are questions
{
if (sscanf (row[0],"%u",&QstInd) != 1)
Err_WrongQuestionIndexExit ();
QstInd++;
}
}
/***** Free structure that stores the query result *****/
@ -2931,6 +2754,7 @@ static void Svy_ListSvyQuestions (struct Svy_Surveys *Surveys,
unsigned NumQsts;
unsigned NumQst;
struct Svy_Question SvyQst;
char Stem[Cns_MAX_BYTES_TEXT + 1];
bool Editing = (Gbl.Action.Act == ActEdiOneSvy ||
Gbl.Action.Act == ActEdiOneSvyQst ||
Gbl.Action.Act == ActRcvSvyQst);
@ -2976,14 +2800,12 @@ static void Svy_ListSvyQuestions (struct Svy_Surveys *Surveys,
{
Gbl.RowEvenOdd = (int) (NumQst % 2);
row = mysql_fetch_row (mysql_res);
/* Initialize question to zero */
Svy_InitQst (&SvyQst);
/* row[0] holds the code of the question */
if (sscanf (row[0],"%ld",&(SvyQst.QstCod)) != 1)
Err_WrongQuestionExit ();
/* Get question data from row */
row = mysql_fetch_row (mysql_res);
Svy_GetDataOfQstFromRow (&SvyQst,Stem,row);
HTM_TR_Begin (NULL);
@ -3006,21 +2828,19 @@ static void Svy_ListSvyQuestions (struct Svy_Surveys *Surveys,
HTM_TD_End ();
}
/* Write index of question inside survey (row[1]) */
/* Write index of question inside survey */
HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd);
SvyQst.QstInd = Str_ConvertStrToUnsigned (row[1]);
HTM_Unsigned (SvyQst.QstInd + 1);
HTM_TD_End ();
/* Write the question type (row[2]) */
HTM_TD_Begin ("class=\"DAT_SMALL CT COLOR%u\"",Gbl.RowEvenOdd);
SvyQst.AnswerType = Svy_ConvertFromStrAnsTypDBToAnsTyp (row[2]);
HTM_Txt (Txt_SURVEY_STR_ANSWER_TYPES[SvyQst.AnswerType]);
HTM_TD_End ();
/* Write the stem (row[3]) and the answers of this question */
/* Write the stem and the answers of this question */
HTM_TD_Begin ("class=\"DAT LT COLOR%u\"",Gbl.RowEvenOdd);
Svy_WriteQstStem (row[3]);
Svy_WriteQstStem (Stem);
Svy_WriteAnswersOfAQst (Svy,&SvyQst,PutFormAnswerSurvey);
HTM_TD_End ();
@ -3054,6 +2874,28 @@ static void Svy_ListSvyQuestions (struct Svy_Surveys *Surveys,
Box_BoxEnd ();
}
/*****************************************************************************/
/************************* Get question data from row ************************/
/*****************************************************************************/
static void Svy_GetDataOfQstFromRow (struct Svy_Question *SvyQst,
char Stem[Cns_MAX_BYTES_TEXT + 1],
MYSQL_ROW row)
{
/***** Get the code of the question (row[0]) *****/
if (sscanf (row[0],"%ld",&(SvyQst->QstCod)) != 1)
Err_WrongQuestionExit ();
/***** Get the index of the question inside the survey (row[1]) *****/
SvyQst->QstInd = Str_ConvertStrToUnsigned (row[1]);
/***** Get the answer type (row[2]) *****/
SvyQst->AnswerType = Svy_DB_ConvertFromStrAnsTypDBToAnsTyp (row[2]);
/***** Get the stem of the question from the database (row[2]) *****/
Str_Copy (Stem,row[2],Cns_MAX_BYTES_TEXT);
}
/*****************************************************************************/
/******************** Put parameters to edit a question **********************/
/*****************************************************************************/

View File

@ -36,12 +36,6 @@
#define Svy_MAX_CHARS_SURVEY_TITLE (128 - 1) // 127
#define Svy_MAX_BYTES_SURVEY_TITLE ((Svy_MAX_CHARS_SURVEY_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Svy_NUM_DATES 2
typedef enum
{
Svy_START_TIME = 0,
Svy_END_TIME = 1,
} Svy_StartOrEndTime_t;
#define Svy_ORDER_DEFAULT Dat_STR_TIME
struct Svy_Surveys
@ -63,7 +57,7 @@ struct Svy_Survey
unsigned Roles; // Example: if survey can be made by students, Roles == (1 << Rol_STD)
long UsrCod;
char Title[Svy_MAX_BYTES_SURVEY_TITLE + 1];
time_t TimeUTC[Svy_NUM_DATES];
time_t TimeUTC[Dat_NUM_START_END_TIME];
unsigned NumQsts; // Number of questions in the survey
unsigned NumUsrs; // Number of distinct users who have already answered the survey
struct

View File

@ -30,7 +30,7 @@
// #include <stddef.h> // For NULL
#include <stdio.h> // For asprintf
#include <stdlib.h> // For free
// #include <string.h> // For string functions
#include <string.h> // For string functions
// #include "swad_attendance.h"
// #include "swad_box.h"
@ -61,6 +61,12 @@ extern struct Globals Gbl;
/***************************** Private constants *****************************/
/*****************************************************************************/
const char *Svy_DB_StrAnswerTypes[Svy_NUM_ANS_TYPES] =
{
[Svy_ANS_UNIQUE_CHOICE ] = "unique_choice",
[Svy_ANS_MULTIPLE_CHOICE] = "multiple_choice",
};
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
@ -73,6 +79,73 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/
/*****************************************************************************/
/*****************************************************************************/
/*************************** Create a new survey *****************************/
/*****************************************************************************/
long Svy_DB_CreateSurvey (const struct Svy_Survey *Svy,const char *Txt)
{
return
DB_QueryINSERTandReturnCode ("can not create new survey",
"INSERT INTO svy_surveys"
" (Scope,Cod,Hidden,Roles,UsrCod,"
"StartTime,EndTime,"
"Title,Txt)"
" VALUES"
" ('%s',%ld,'N',%u,%ld,"
"FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
"'%s','%s')",
Sco_GetDBStrFromScope (Svy->Scope),
Svy->Cod,
Svy->Roles,
Gbl.Usrs.Me.UsrDat.UsrCod,
Svy->TimeUTC[Dat_STR_TIME],
Svy->TimeUTC[Dat_END_TIME],
Svy->Title,
Txt);
}
/*****************************************************************************/
/************************* Update an existing survey *************************/
/*****************************************************************************/
void Svy_DB_UpdateSurvey (const struct Svy_Survey *Svy,const char *Txt)
{
DB_QueryUPDATE ("can not update survey",
"UPDATE svy_surveys"
" SET Scope='%s',"
"Cod=%ld,"
"Roles=%u,"
"StartTime=FROM_UNIXTIME(%ld),"
"EndTime=FROM_UNIXTIME(%ld),"
"Title='%s',"
"Txt='%s'"
" WHERE SvyCod=%ld",
Sco_GetDBStrFromScope (Svy->Scope),
Svy->Cod,
Svy->Roles,
Svy->TimeUTC[Dat_STR_TIME],
Svy->TimeUTC[Dat_END_TIME],
Svy->Title,
Txt,
Svy->SvyCod);
}
/*****************************************************************************/
/****************************** Hide a project *******************************/
/*****************************************************************************/
void Svy_DB_HideOrUnhideSurvey (long SvyCod,bool Hide)
{
DB_QueryUPDATE ("can not hide/unhide survey",
"UPDATE svy_surveys"
" SET Hidden='%c'"
" WHERE SvyCod=%ld",
Hide ? 'Y' :
'N',
SvyCod);
}
/*****************************************************************************/
/*********** Update number of users notified in table of surveys *************/
/*****************************************************************************/
@ -634,6 +707,58 @@ void Svy_DB_RemoveSvy (long SvyCod)
SvyCod);
}
/*****************************************************************************/
/************* Remove all surveys of a place on the hierarchy **************/
/************* (country, institution, center, degree or course) **************/
/*****************************************************************************/
void Svy_DB_RemoveSvysIn (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove all the surveys"
" in a place on the hierarchy",
"DELETE FROM svy_surveys"
" WHERE Scope='%s'"
" AND Cod=%ld",
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/************************ Create groups of a survey **************************/
/*****************************************************************************/
void Svy_DB_CreateGrp (long SvyCod,long GrpCod)
{
DB_QueryINSERT ("can not associate a group to a survey",
"INSERT INTO svy_groups"
" (SvyCod,GrpCod)"
" VALUES"
" (%ld,%ld)",
SvyCod,
GrpCod);
}
/*****************************************************************************/
/****************** Get group names associated to a survey *******************/
/*****************************************************************************/
unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get groups of a survey",
"SELECT grp_types.GrpTypName," // row[0]
"grp_groups.GrpName" // row[1]
" FROM svy_groups,"
"grp_groups,"
"grp_types"
" WHERE svy_groups.SvyCod=%ld"
" AND svy_groups.GrpCod=grp_groups.GrpCod"
" AND grp_groups.GrpTypCod=grp_types.GrpTypCod"
" ORDER BY grp_types.GrpTypName,"
"grp_groups.GrpName",
SvyCod);
}
/*****************************************************************************/
/************ Check if I belong to any of the groups of a survey *************/
/*****************************************************************************/
@ -658,18 +783,6 @@ bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod)
Gbl.Usrs.Me.UsrDat.UsrCod) != 0);
}
/*****************************************************************************/
/************************* Remove groups of a survey *************************/
/*****************************************************************************/
void Svy_DB_RemoveGrpsAssociatedToSurvey (long SvyCod)
{
DB_QueryDELETE ("can not remove the groups associated to a survey",
"DELETE FROM svy_groups"
" WHERE SvyCod=%ld",
SvyCod);
}
/*****************************************************************************/
/*************** Remove groups of one type from all the surveys **************/
/*****************************************************************************/
@ -701,6 +814,77 @@ void Svy_DB_RemoveGroup (long GrpCod)
GrpCod);
}
/*****************************************************************************/
/************************* Remove groups of a survey *************************/
/*****************************************************************************/
void Svy_DB_RemoveGrpsAssociatedToSurvey (long SvyCod)
{
DB_QueryDELETE ("can not remove the groups associated to a survey",
"DELETE FROM svy_groups"
" WHERE SvyCod=%ld",
SvyCod);
}
/*****************************************************************************/
/********** Remove groups of all surveys of a place on the hierarchy *********/
/********** (country, institution, center, degree or course) *********/
/*****************************************************************************/
void Svy_DB_RemoveGrpsSvysIn (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove all the groups"
" associated to surveys of a course",
"DELETE FROM svy_groups"
" USING svy_surveys,"
"svy_groups"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_groups.SvyCod",
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/*************************** Create a new question ***************************/
/*****************************************************************************/
long Svy_DB_CreateQuestion (long SvyCod,unsigned QstInd,
Svy_AnswerType_t AnswerType,
const char Stem[Cns_MAX_BYTES_TEXT + 1])
{
return
DB_QueryINSERTandReturnCode ("can not create question",
"INSERT INTO svy_questions"
" (SvyCod,QstInd,AnsType,Stem)"
" VALUES"
" (%ld,%u,'%s','%s')",
SvyCod,
QstInd,
Svy_DB_StrAnswerTypes[AnswerType],
Stem);
}
/*****************************************************************************/
/************************ Create an existing question ************************/
/*****************************************************************************/
void Svy_DB_UpdateQuestion (long SvyCod,long QstCod,
Svy_AnswerType_t AnswerType,
const char Stem[Cns_MAX_BYTES_TEXT + 1])
{
DB_QueryUPDATE ("can not update question",
"UPDATE svy_questions"
" SET Stem='%s',"
"AnsType='%s'"
" WHERE QstCod=%ld"
" AND SvyCod=%ld", // Extra check
Stem,
Svy_DB_StrAnswerTypes[AnswerType],
QstCod,
SvyCod);
}
/*****************************************************************************/
/*********** Change indexes of questions greater than a given one ************/
/*****************************************************************************/
@ -763,6 +947,24 @@ unsigned Svy_DB_GetSurveyQsts (MYSQL_RES **mysql_res,long SvyCod)
SvyCod);
}
/*****************************************************************************/
/************ Get question data from question code in a survey ***************/
/*****************************************************************************/
unsigned Svy_DB_GetQstDataByCod (MYSQL_RES **mysql_res,long QstCod,long SvyCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get a question",
"SELECT QstInd," // row[0]
"AnsType," // row[1]
"Stem" // row[2]
" FROM svy_questions"
" WHERE QstCod=%ld"
" AND SvyCod=%ld", // Extra check
QstCod,
SvyCod);
}
/*****************************************************************************/
/************ Get question index from question code in a survey **************/
/*****************************************************************************/
@ -776,6 +978,20 @@ unsigned Svy_DB_GetQstIndFromQstCod (long QstCod)
QstCod);
}
/*****************************************************************************/
/*********************** Get last question index *****************************/
/*****************************************************************************/
unsigned Svy_DB_GetLastQstInd (MYSQL_RES **mysql_res,long SvyCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get last question index",
"SELECT MAX(QstInd)" // row[0]
" FROM svy_questions"
" WHERE SvyCod=%ld",
SvyCod);
}
/*****************************************************************************/
/****************************** Remove a question ****************************/
/*****************************************************************************/
@ -800,6 +1016,57 @@ void Svy_DB_RemoveQstsSvy (long SvyCod)
SvyCod);
}
/*****************************************************************************/
/******** Remove questions in all surveys of a place on the hierarchy ********/
/******** (country, institution, center, degree or course) ********/
/*****************************************************************************/
void Svy_DB_RemoveQstsSvysIn (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove questions of surveys"
" in a place on the hierarchy",
"DELETE FROM svy_questions"
" USING svy_surveys,"
"svy_questions"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_questions.SvyCod",
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/******************************* Create answer *******************************/
/*****************************************************************************/
void Svy_DB_CreateAnswer (long QstCod,unsigned AnsInd,const char *Text)
{
DB_QueryINSERT ("can not create answer",
"INSERT INTO svy_answers"
" (QstCod,AnsInd,NumUsrs,Answer)"
" VALUES"
" (%ld,%u,0,'%s')",
QstCod,
AnsInd,
Text);
}
/*****************************************************************************/
/**************************** Update answer text *****************************/
/*****************************************************************************/
void Svy_DB_UpdateAnswerText (long QstCod,unsigned AnsInd,const char *Text)
{
DB_QueryUPDATE ("can not update answer",
"UPDATE svy_answers"
" SET Answer='%s'"
" WHERE QstCod=%ld"
" AND AnsInd=%u",
Text,
QstCod,
AnsInd);
}
/*****************************************************************************/
/********************** Reset all answers in a survey ************************/
/*****************************************************************************/
@ -871,6 +1138,37 @@ unsigned Svy_DB_GetAnswersQst (MYSQL_RES **mysql_res,long QstCod)
return NumAnswers;
}
/*****************************************************************************/
/*********** Convert a string with the answer type to answer type ************/
/*****************************************************************************/
Svy_AnswerType_t Svy_DB_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeDB)
{
Svy_AnswerType_t AnsType;
for (AnsType = (Svy_AnswerType_t) 0;
AnsType <= (Svy_AnswerType_t) (Svy_NUM_ANS_TYPES - 1);
AnsType++)
if (!strcmp (StrAnsTypeDB,Svy_DB_StrAnswerTypes[AnsType]))
return AnsType;
return (Svy_AnswerType_t) 0;
}
/*****************************************************************************/
/********************** Remove an answer from a question *********************/
/*****************************************************************************/
void Svy_DB_RemoveAnswerQst (long QstCod,unsigned AnsInd)
{
DB_QueryDELETE ("can not delete answer",
"DELETE FROM svy_answers"
" WHERE QstCod=%ld"
" AND AnsInd=%u",
QstCod,
AnsInd);
}
/*****************************************************************************/
/********************* Remove answers of a survey question *******************/
/*****************************************************************************/
@ -898,6 +1196,27 @@ void Svy_DB_RemoveAnswersSvy (long SvyCod)
SvyCod);
}
/*****************************************************************************/
/********* Remove answers to all surveys of a place on the hierarchy *********/
/********* (country, institution, center, degree or course) *********/
/*****************************************************************************/
void Svy_DB_RemoveAnswersSvysIn (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove answers of surveys"
" in a place on the hierarchy",
"DELETE FROM svy_answers"
" USING svy_surveys,"
"svy_questions,"
"svy_answers"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_questions.SvyCod"
" AND svy_questions.QstCod=svy_answers.QstCod",
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/***************** Register that I have answered this survey *****************/
/*****************************************************************************/
@ -943,7 +1262,7 @@ unsigned Svy_DB_GetNumUsrsWhoHaveAnsweredSvy (long SvyCod)
}
/*****************************************************************************/
/******************** Remove all the users in this survey ********************/
/********************** Remove all users in this survey **********************/
/*****************************************************************************/
void Svy_DB_RemoveUsrsWhoHaveAnsweredSvy (long SvyCod)
@ -953,3 +1272,22 @@ void Svy_DB_RemoveUsrsWhoHaveAnsweredSvy (long SvyCod)
" WHERE SvyCod=%ld",
SvyCod);
}
/*****************************************************************************/
/************ Remove all the surveys of a place on the hierarchy *************/
/************ (country, institution, center, degree or course) *************/
/*****************************************************************************/
void Svy_DB_RemoveUsrsWhoHaveAnsweredSvysIn (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove users"
" who had answered surveys in a place on the hierarchy",
"DELETE FROM svy_users"
" USING svy_surveys,"
"svy_users"
" WHERE svy_surveys.Scope='%s'"
" AND svy_surveys.Cod=%ld"
" AND svy_surveys.SvyCod=svy_users.SvyCod",
Sco_GetDBStrFromScope (Scope),
Cod);
}

View File

@ -41,8 +41,12 @@
/*****************************************************************************/
//-------------------------------- Surveys ------------------------------------
long Svy_DB_CreateSurvey (const struct Svy_Survey *Svy,const char *Txt);
void Svy_DB_UpdateSurvey (const struct Svy_Survey *Svy,const char *Txt);
void Svy_DB_HideOrUnhideSurvey (long SvyCod,bool Hide);
void Svy_DB_UpdateNumUsrsNotifiedByEMailAboutSurvey (long SvyCod,
unsigned NumUsrsToBeNotifiedByEMail);
unsigned Svy_DB_GetListSurveys (MYSQL_RES **mysql_res,
unsigned ScopesAllowed,
unsigned HiddenAllowed,
@ -57,34 +61,53 @@ double Svy_DB_GetNumQstsPerCrsSurvey (HieLvl_Level_t Scope);
unsigned Svy_DB_GetUsrsFromSurveyExceptMe (MYSQL_RES **mysql_res,long SvyCod);
void Svy_DB_RemoveSvy (long SvyCod);
void Svy_DB_RemoveSvysIn (HieLvl_Level_t Scope,long Cod);
//---------------------------- Surveys groups ---------------------------------
void Svy_DB_CreateGrp (long SvyCod,long GrpCod);
unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod);
bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod);
void Svy_DB_RemoveGrpsAssociatedToSurvey (long SvyCod);
void Svy_DB_RemoveGroupsOfType (long GrpTypCod);
void Svy_DB_RemoveGroup (long GrpCod);
void Svy_DB_RemoveGrpsAssociatedToSurvey (long SvyCod);
void Svy_DB_RemoveGrpsSvysIn (HieLvl_Level_t Scope,long Cod);
//--------------------------- Surveys questions -------------------------------
long Svy_DB_CreateQuestion (long SvyCod,unsigned QstInd,
Svy_AnswerType_t AnswerType,
const char Stem[Cns_MAX_BYTES_TEXT + 1]);
void Svy_DB_UpdateQuestion (long SvyCod,long QstCod,
Svy_AnswerType_t AnswerType,
const char Stem[Cns_MAX_BYTES_TEXT + 1]);
void Svy_DB_ChangeIndexesQsts (long SvyCod,unsigned QstInd);
unsigned Svy_DB_GetNumQstsSvy (long SvyCod);
unsigned Svy_DB_GetSurveyQstsCodes (MYSQL_RES **mysql_res,long SvyCod);
unsigned Svy_DB_GetSurveyQsts (MYSQL_RES **mysql_res,long SvyCod);
unsigned Svy_DB_GetQstDataByCod (MYSQL_RES **mysql_res,long QstCod,long SvyCod);
unsigned Svy_DB_GetQstIndFromQstCod (long QstCod);
unsigned Svy_DB_GetLastQstInd (MYSQL_RES **mysql_res,long SvyCod);
void Svy_DB_RemoveQst (long QstCod);
void Svy_DB_RemoveQstsSvy (long SvyCod);
void Svy_DB_RemoveQstsSvysIn (HieLvl_Level_t Scope,long Cod);
//---------------------------- Surveys answers --------------------------------
void Svy_DB_CreateAnswer (long QstCod,unsigned AnsInd,const char *Text);
void Svy_DB_UpdateAnswerText (long QstCod,unsigned AnsInd,const char *Text);
void Svy_DB_ResetAnswersSvy (long SvyCod);
void Svy_DB_IncreaseAnswer (long QstCod,unsigned AnsInd);
bool Svy_DB_CheckIfAnswerExists (long QstCod,unsigned AnsInd);
unsigned Svy_DB_GetAnswersQst (MYSQL_RES **mysql_res,long QstCod);
Svy_AnswerType_t Svy_DB_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeDB);
void Svy_DB_RemoveAnswerQst (long QstCod,unsigned AnsInd);
void Svy_DB_RemoveAnswersQst (long QstCod);
void Svy_DB_RemoveAnswersSvy (long SvyCod);
void Svy_DB_RemoveAnswersSvysIn (HieLvl_Level_t Scope,long Cod);
//--------------------- Users who have answered surveys -----------------------
void Svy_DB_RegisterIHaveAnsweredSvy (long SvyCod);
@ -93,5 +116,6 @@ bool Svy_DB_CheckIfIHaveAnsweredSvy (long SvyCod);
unsigned Svy_DB_GetNumUsrsWhoHaveAnsweredSvy (long SvyCod);
void Svy_DB_RemoveUsrsWhoHaveAnsweredSvy (long SvyCod);
void Svy_DB_RemoveUsrsWhoHaveAnsweredSvysIn (HieLvl_Level_t Scope,long Cod);
#endif