Version 18.27.1

This commit is contained in:
Antonio Cañas Vargas 2019-01-03 15:25:18 +01:00
parent 300c651135
commit 68198c046e
19 changed files with 464 additions and 376 deletions

View File

@ -273,6 +273,7 @@ Centre:
NEW. ActRenClaSho Change short name of a classroom NEW. ActRenClaSho Change short name of a classroom
NEW. ActRenClaFul Change full name of a classroom NEW. ActRenClaFul Change full name of a classroom
NEW. ActChgClaMaxStd Change number of students in a classroom NEW. ActChgClaMaxStd Change number of students in a classroom
NEW. ActRenClaLoc Change location of a classroom
148. ActPrnCtrCrs Show print view of the academic calendar 148. ActPrnCtrCrs Show print view of the academic calendar
149. ActChgCtrCrs1stDay Change first day of week and show academic calendar 149. ActChgCtrCrs1stDay Change first day of week and show academic calendar
@ -1808,7 +1809,8 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActRemCla */{1747,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_RemoveClassroom ,NULL}, /* ActRemCla */{1747,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_RemoveClassroom ,NULL},
/* ActRenClaSho */{1748,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_RenameClassroomShort ,NULL}, /* ActRenClaSho */{1748,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_RenameClassroomShort ,NULL},
/* ActRenClaFul */{1749,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_RenameClassroomFull ,NULL}, /* ActRenClaFul */{1749,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_RenameClassroomFull ,NULL},
/* ActChgClaMaxStd */{1750,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_ChangeMaxStudents ,NULL}, /* ActChgClaMaxStd */{1750,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_ChangeCapacity ,NULL},
/* ActRenClaLoc */{1751,-1,TabUnk,ActSeeCla , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cla_ChangeClassroomLocation ,NULL},
/* ActPrnCalCtr */{1632,-1,TabUnk,ActSeeCalCtr , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Cal_PrintCalendar ,NULL}, /* ActPrnCalCtr */{1632,-1,TabUnk,ActSeeCalCtr , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Cal_PrintCalendar ,NULL},
/* ActChgCalCtr1stDay*/{1633,-1,TabUnk,ActSeeCalCtr , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Cal_ChangeFirstDayOfWeek ,Cal_DrawCalendarCtr ,NULL}, /* ActChgCalCtr1stDay*/{1633,-1,TabUnk,ActSeeCalCtr , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Cal_ChangeFirstDayOfWeek ,Cal_DrawCalendarCtr ,NULL},
@ -4955,6 +4957,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActRenClaSho, // #1748 ActRenClaSho, // #1748
ActRenClaFul, // #1749 ActRenClaFul, // #1749
ActChgClaMaxStd, // #1750 ActChgClaMaxStd, // #1750
ActRenClaLoc, // #1751
}; };
/*****************************************************************************/ /*****************************************************************************/

View File

@ -61,9 +61,9 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (1 + 9 + 43 + 17 + 47 + 40 + 24 + 115 + 157 + 437 + 165 + 172 + 42 + 14 + 76) #define Act_NUM_ACTIONS (1 + 9 + 43 + 17 + 47 + 41 + 24 + 115 + 157 + 437 + 165 + 172 + 42 + 14 + 76)
#define Act_MAX_ACTION_COD 1750 #define Act_MAX_ACTION_COD 1751
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -272,9 +272,10 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActRenClaSho (ActChgCalIns1stDay + 36) #define ActRenClaSho (ActChgCalIns1stDay + 36)
#define ActRenClaFul (ActChgCalIns1stDay + 37) #define ActRenClaFul (ActChgCalIns1stDay + 37)
#define ActChgClaMaxStd (ActChgCalIns1stDay + 38) #define ActChgClaMaxStd (ActChgCalIns1stDay + 38)
#define ActRenClaLoc (ActChgCalIns1stDay + 39)
#define ActPrnCalCtr (ActChgCalIns1stDay + 39) #define ActPrnCalCtr (ActChgCalIns1stDay + 40)
#define ActChgCalCtr1stDay (ActChgCalIns1stDay + 40) #define ActChgCalCtr1stDay (ActChgCalIns1stDay + 41)
/*****************************************************************************/ /*****************************************************************************/
/********************************* Degree tab ********************************/ /********************************* Degree tab ********************************/

View File

@ -987,7 +987,11 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType)
char Past__FutureEventsSubQuery[Agd_MAX_BYTES_SUBQUERY]; char Past__FutureEventsSubQuery[Agd_MAX_BYTES_SUBQUERY];
char PrivatPublicEventsSubQuery[Agd_MAX_BYTES_SUBQUERY]; char PrivatPublicEventsSubQuery[Agd_MAX_BYTES_SUBQUERY];
char HiddenVisiblEventsSubQuery[Agd_MAX_BYTES_SUBQUERY]; char HiddenVisiblEventsSubQuery[Agd_MAX_BYTES_SUBQUERY];
char *OrderBySubQuery; static const char *OrderBySubQuery[Agd_NUM_ORDERS] =
{
"StartTime,EndTime,Event,Location", // Agd_ORDER_BY_START_DATE
"EndTime,StartTime,Event,Location", // Agd_ORDER_BY_END_DATE
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -1086,26 +1090,7 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType)
if (DoQuery) if (DoQuery)
{ {
/* Build order subquery */ /* Make query */
switch (Gbl.Agenda.SelectedOrder)
{
case Agd_ORDER_BY_START_DATE:
if (asprintf (&OrderBySubQuery,"StartTime,"
"EndTime,"
"Event,"
"Location") < 0)
Lay_NotEnoughMemoryExit ();
break;
case Agd_ORDER_BY_END_DATE:
if (asprintf (&OrderBySubQuery,"EndTime,"
"StartTime,"
"Event,"
"Location") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
/* Build full query */
NumRows = DB_QuerySELECT (&mysql_res,"can not get agenda events", NumRows = DB_QuerySELECT (&mysql_res,"can not get agenda events",
"SELECT AgdCod FROM agendas" "SELECT AgdCod FROM agendas"
" WHERE %s%s%s%s" " WHERE %s%s%s%s"
@ -1114,10 +1099,9 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType)
Past__FutureEventsSubQuery, Past__FutureEventsSubQuery,
PrivatPublicEventsSubQuery, PrivatPublicEventsSubQuery,
HiddenVisiblEventsSubQuery, HiddenVisiblEventsSubQuery,
OrderBySubQuery); OrderBySubQuery[Gbl.Agenda.SelectedOrder]);
/* Free allocated memory for subqueries */ /* Free allocated memory for subquery */
free ((void *) OrderBySubQuery);
free ((void *) UsrSubQuery); free ((void *) UsrSubQuery);
if (NumRows) // Events found... if (NumRows) // Events found...

View File

@ -25,10 +25,8 @@
/********************************* Headers ***********************************/ /********************************* Headers ***********************************/
/*****************************************************************************/ /*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include <linux/limits.h> // For PATH_MAX #include <linux/limits.h> // For PATH_MAX
#include <linux/stddef.h> // For NULL #include <linux/stddef.h> // For NULL
#include <stdio.h> // For asprintf
#include <stdlib.h> // For calloc #include <stdlib.h> // For calloc
#include <string.h> // For string functions #include <string.h> // For string functions
@ -624,8 +622,24 @@ static void Asg_PutParams (void)
void Asg_GetListAssignments (void) void Asg_GetListAssignments (void)
{ {
char *HiddenSubQuery; static const char *HiddenSubQuery[Rol_NUM_ROLES] =
char *OrderBySubQuery; {
" AND Hidden='N'", // Rol_UNK
" AND Hidden='N'", // Rol_GST
" AND Hidden='N'", // Rol_USR
" AND Hidden='N'", // Rol_STD
" AND Hidden='N'", // Rol_NET
"", // Rol_TCH
" AND Hidden='N'", // Rol_DEG_ADM
" AND Hidden='N'", // Rol_CTR_ADM
" AND Hidden='N'", // Rol_INS_ADM
"", // Rol_SYS_ADM
};
static const char *OrderBySubQuery[Dat_NUM_START_END_TIME] =
{
"StartTime DESC,EndTime DESC,Title DESC", // Dat_START_TIME
"EndTime DESC,StartTime DESC,Title DESC", // Dat_END_TIME
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -635,31 +649,6 @@ void Asg_GetListAssignments (void)
Asg_FreeListAssignments (); Asg_FreeListAssignments ();
/***** Get list of assignments from database *****/ /***** Get list of assignments from database *****/
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_TCH:
case Rol_SYS_ADM:
if (asprintf (&HiddenSubQuery,"%s","") < 0)
Lay_NotEnoughMemoryExit ();
break;
default:
if (asprintf (&HiddenSubQuery," AND Hidden='N'") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
switch (Gbl.Asgs.SelectedOrder)
{
case Dat_START_TIME:
if (asprintf (&OrderBySubQuery,
"StartTime DESC,EndTime DESC,Title DESC") < 0)
Lay_NotEnoughMemoryExit ();
break;
case Dat_END_TIME:
if (asprintf (&OrderBySubQuery,
"EndTime DESC,StartTime DESC,Title DESC") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS)
NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments", NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments",
"SELECT AsgCod" "SELECT AsgCod"
@ -669,21 +658,17 @@ void Asg_GetListAssignments (void)
" AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" " AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr"
" WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))" " WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))"
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery, Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery[Gbl.Usrs.Me.Role.Logged],
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Asgs.SelectedOrder]);
else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS
NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments", NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments",
"SELECT AsgCod" "SELECT AsgCod"
" FROM assignments" " FROM assignments"
" WHERE CrsCod=%ld%s" " WHERE CrsCod=%ld%s"
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery, Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery[Gbl.Usrs.Me.Role.Logged],
OrderBySubQuery); OrderBySubQuery[Gbl.Asgs.SelectedOrder]);
/* Free allocated memory for subqueries */
free ((void *) OrderBySubQuery);
free ((void *) HiddenSubQuery);
if (NumRows) // Assignments found... if (NumRows) // Assignments found...
{ {

View File

@ -95,7 +95,7 @@ static void Att_PutFormToListStdsParams (void);
static void Att_PutFormsToRemEditOneAttEvent (long AttCod,bool Hidden); static void Att_PutFormsToRemEditOneAttEvent (long AttCod,bool Hidden);
static void Att_PutParams (void); static void Att_PutParams (void);
static void Att_GetListAttEvents (Att_OrderTime_t Order); static void Att_GetListAttEvents (Att_OrderNewestOldest_t OrderNewestOldest);
static void Att_GetDataOfAttEventByCodAndCheckCrs (struct AttendanceEvent *Att); static void Att_GetDataOfAttEventByCodAndCheckCrs (struct AttendanceEvent *Att);
static void Att_ResetAttendanceEvent (struct AttendanceEvent *Att); static void Att_ResetAttendanceEvent (struct AttendanceEvent *Att);
static void Att_GetAttEventTxtFromDB (long AttCod,char Txt[Cns_MAX_BYTES_TEXT + 1]); static void Att_GetAttEventTxtFromDB (long AttCod,char Txt[Cns_MAX_BYTES_TEXT + 1]);
@ -600,10 +600,32 @@ static void Att_PutParams (void)
/********************* List all the attendance events ************************/ /********************* List all the attendance events ************************/
/*****************************************************************************/ /*****************************************************************************/
static void Att_GetListAttEvents (Att_OrderTime_t Order) static void Att_GetListAttEvents (Att_OrderNewestOldest_t OrderNewestOldest)
{ {
char *HiddenSubQuery; static const char *HiddenSubQuery[Rol_NUM_ROLES] =
char *OrderBySubQuery; {
" AND Hidden='N'", // Rol_UNK
" AND Hidden='N'", // Rol_GST
" AND Hidden='N'", // Rol_USR
" AND Hidden='N'", // Rol_STD
" AND Hidden='N'", // Rol_NET
"", // Rol_TCH
" AND Hidden='N'", // Rol_DEG_ADM
" AND Hidden='N'", // Rol_CTR_ADM
" AND Hidden='N'", // Rol_INS_ADM
"", // Rol_SYS_ADM
};
static const char *OrderBySubQuery[Dat_NUM_START_END_TIME][Att_NUM_ORDERS_NEWEST_OLDEST] =
{
{ // Dat_START_TIME
"StartTime DESC,EndTime DESC,Title DESC", // Att_NEWEST_FIRST
"StartTime,EndTime,Title", // Att_OLDEST_FIRST
},
{ // Dat_END_TIME
"EndTime DESC,StartTime DESC,Title DESC", // Att_NEWEST_FIRST
"EndTime,StartTime,Title", // Att_OLDEST_FIRST
}
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -613,33 +635,6 @@ static void Att_GetListAttEvents (Att_OrderTime_t Order)
Att_FreeListAttEvents (); Att_FreeListAttEvents ();
/***** Get list of attendance events from database *****/ /***** Get list of attendance events from database *****/
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_TCH:
case Rol_SYS_ADM:
if (asprintf (&HiddenSubQuery,"%s","") < 0)
Lay_NotEnoughMemoryExit ();
break;
default:
if (asprintf (&HiddenSubQuery," AND Hidden='N'") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
switch (Gbl.AttEvents.SelectedOrder)
{
case Dat_START_TIME:
if (asprintf (&OrderBySubQuery,
(Order == Att_NEWEST_FIRST) ? "StartTime DESC,EndTime DESC,Title DESC" :
"StartTime,EndTime,Title") < 0)
Lay_NotEnoughMemoryExit ();
break;
case Dat_END_TIME:
if (asprintf (&OrderBySubQuery,
(Order == Att_NEWEST_FIRST) ? "EndTime DESC,StartTime DESC,Title DESC" :
"EndTime,StartTime,Title") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS)
NumRows = DB_QuerySELECT (&mysql_res,"can not get attendance events", NumRows = DB_QuerySELECT (&mysql_res,"can not get attendance events",
"SELECT AttCod" "SELECT AttCod"
@ -650,19 +645,19 @@ static void Att_GetListAttEvents (Att_OrderTime_t Order)
" WHERE crs_grp_usr.UsrCod=%ld" " WHERE crs_grp_usr.UsrCod=%ld"
" AND att_grp.GrpCod=crs_grp_usr.GrpCod))" " AND att_grp.GrpCod=crs_grp_usr.GrpCod))"
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery, Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod,OrderBySubQuery); HiddenSubQuery[Gbl.Usrs.Me.Role.Logged],
Gbl.Usrs.Me.UsrDat.UsrCod,
OrderBySubQuery[Gbl.AttEvents.SelectedOrder][OrderNewestOldest]);
else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS
NumRows = DB_QuerySELECT (&mysql_res,"can not get attendance events", NumRows = DB_QuerySELECT (&mysql_res,"can not get attendance events",
"SELECT AttCod" "SELECT AttCod"
" FROM att_events" " FROM att_events"
" WHERE CrsCod=%ld%s" " WHERE CrsCod=%ld%s"
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery); Gbl.CurrentCrs.Crs.CrsCod,
HiddenSubQuery[Gbl.Usrs.Me.Role.Logged],
/* Free allocated memory for subqueries */ OrderBySubQuery[Gbl.AttEvents.SelectedOrder][OrderNewestOldest]);
free ((void *) OrderBySubQuery);
free ((void *) HiddenSubQuery);
if (NumRows) // Attendance events found... if (NumRows) // Attendance events found...
{ {

View File

@ -62,11 +62,12 @@ struct AttendanceEvent
bool Selected; // I have selected this attendance event bool Selected; // I have selected this attendance event
}; };
#define Att_NUM_ORDERS_NEWEST_OLDEST 2
typedef enum typedef enum
{ {
Att_NEWEST_FIRST, Att_NEWEST_FIRST,
Att_OLDEST_FIRST, Att_OLDEST_FIRST,
} Att_OrderTime_t; } Att_OrderNewestOldest_t;
#define Att_ORDER_DEFAULT Dat_START_TIME #define Att_ORDER_DEFAULT Dat_START_TIME

View File

@ -1048,7 +1048,11 @@ void Ctr_PutIconToViewCentres (void)
void Ctr_GetListCentres (long InsCod) void Ctr_GetListCentres (long InsCod)
{ {
char *OrderBySubQuery; static const char *OrderBySubQuery[Ctr_NUM_ORDERS] =
{
"FullName", // Ctr_ORDER_BY_CENTRE
"NumUsrs DESC,FullName", // Ctr_ORDER_BY_NUM_TCHS
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -1056,17 +1060,6 @@ void Ctr_GetListCentres (long InsCod)
struct Centre *Ctr; struct Centre *Ctr;
/***** Get centres from database *****/ /***** Get centres from database *****/
switch (Gbl.Ctrs.SelectedOrder)
{
case Ctr_ORDER_BY_CENTRE:
if (asprintf (&OrderBySubQuery,"FullName") < 0)
Lay_NotEnoughMemoryExit ();
break;
case Ctr_ORDER_BY_NUM_TCHS:
if (asprintf (&OrderBySubQuery,"NumUsrs DESC,FullName") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
NumRows = DB_QuerySELECT (&mysql_res,"can not get centres", NumRows = DB_QuerySELECT (&mysql_res,"can not get centres",
"(SELECT centres.CtrCod,centres.InsCod,centres.PlcCod," "(SELECT centres.CtrCod,centres.InsCod,centres.PlcCod,"
"centres.Status,centres.RequesterUsrCod," "centres.Status,centres.RequesterUsrCod,"
@ -1086,8 +1079,7 @@ void Ctr_GetListCentres (long InsCod)
" ORDER BY %s", " ORDER BY %s",
InsCod, InsCod,
InsCod, InsCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Ctrs.SelectedOrder]);
free ((void *) OrderBySubQuery);
if (NumRows) // Centres found... if (NumRows) // Centres found...
{ {

View File

@ -345,8 +345,6 @@ Buenos d
// TODO: Que un grupo tenga asociado un lugar, como un aula, así al hacer un evento de asistencia, podría tener por defecto el lugar asignado al grupo elegido. // TODO: Que un grupo tenga asociado un lugar, como un aula, así al hacer un evento de asistencia, podría tener por defecto el lugar asignado al grupo elegido.
// TODO: Refactorize OrderBySubQuery
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -366,10 +364,15 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 18.26.3 (2019-01-03)" #define Log_PLATFORM_VERSION "SWAD 18.27.1 (2019-01-03)"
#define CSS_FILE "swad18.22.css" #define CSS_FILE "swad18.22.css"
#define JS_FILE "swad17.17.1.js" #define JS_FILE "swad17.17.1.js"
/* /*
Version 18.27.1: Jan 03, 2019 New field in forms of classrooms for location. (238800 lines)
1 change necessary in database:
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1751','es','N','Cambiar ubicaci&oacute;n aula');
Version 18.27: Jan 03, 2019 Subqueries refactorized. (238667 lines)
Version 18.26.3: Jan 03, 2019 New column location in classrooms listing. (238725 lines) Version 18.26.3: Jan 03, 2019 New column location in classrooms listing. (238725 lines)
Version 18.26.2: Jan 02, 2019 New column location in classrooms table. (238711 lines) Version 18.26.2: Jan 02, 2019 New column location in classrooms table. (238711 lines)
1 change necessary in database: 1 change necessary in database:
@ -385,11 +388,11 @@ UPDATE actions SET Txt='Cambiar aforo de aula' WHERE ActCod='1750' AND Language=
DROP INDEX NumStds ON classrooms; DROP INDEX NumStds ON classrooms;
ALTER TABLE classrooms CHANGE COLUMN NumStds MaxStudents INT NOT NULL; ALTER TABLE classrooms CHANGE COLUMN NumStds MaxStudents INT NOT NULL;
UPDATE actions SET Txt='Cambiar m&aacute;x. estudiantes en grupo' WHERE ActCod='106' AND Language='es'; UPDATE actions SET Txt='Cambiar m&aacute;x. estudiantes en grupo' WHERE ActCod='106' AND Language='es';
UPDATE actions SET Txt='Cambiar m&aacute;x. estudiantes en aula' WHERE ActCod='1750' AND Language='es'; INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1750','es','N','Cambiar m&aacute;x. estudiantes en aula');
Version 18.25.3: Dec 30, 2018 Fixed bugs in classrooms. (238514 lines) Version 18.25.3: Dec 30, 2018 Fixed bugs in classrooms. (238514 lines)
Version 18.25.2: Dec 30, 2018 New database table for classrooms. (238525 lines) Version 18.25.2: Dec 30, 2018 New database table for classrooms. (238525 lines)
8 changes necessary in database: 7 changes necessary in database:
CREATE TABLE IF NOT EXISTS classrooms (ClaCod INT NOT NULL AUTO_INCREMENT,CtrCod INT NOT NULL,ShortName VARCHAR(511) NOT NULL,FullName VARCHAR(2047) NOT NULL,NumStds INT NOT NULL,UNIQUE INDEX(ClaCod),INDEX(CtrCod),INDEX(NumStds)); CREATE TABLE IF NOT EXISTS classrooms (ClaCod INT NOT NULL AUTO_INCREMENT,CtrCod INT NOT NULL,ShortName VARCHAR(511) NOT NULL,FullName VARCHAR(2047) NOT NULL,NumStds INT NOT NULL,UNIQUE INDEX(ClaCod),INDEX(CtrCod),INDEX(NumStds));
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1744','es','N','Ver aulas'); INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1744','es','N','Ver aulas');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1745','es','N','Editar aulas'); INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1745','es','N','Editar aulas');

View File

@ -25,9 +25,7 @@
/********************************** Headers **********************************/ /********************************** Headers **********************************/
/*****************************************************************************/ /*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include <linux/stddef.h> // For NULL #include <linux/stddef.h> // For NULL
#include <stdio.h> // For asprintf
#include <string.h> // For string functions #include <string.h> // For string functions
#include "swad_box.h" #include "swad_box.h"
@ -267,7 +265,12 @@ void Cla_PutIconToViewClassrooms (void)
void Cla_GetListClassrooms (void) void Cla_GetListClassrooms (void)
{ {
char *OrderBySubQuery; static const char *OrderBySubQuery[Cla_NUM_ORDERS] =
{
"FullName", // Cla_ORDER_BY_CLASSROOM
"Capacity DESC,FullName", // Cla_ORDER_BY_CAPACITY
"Location,FullName", // Cla_ORDER_BY_LOCATION
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -275,26 +278,6 @@ void Cla_GetListClassrooms (void)
struct Classroom *Cla; struct Classroom *Cla;
/***** Get classrooms from database *****/ /***** Get classrooms from database *****/
/* Build order subquery */
switch (Gbl.Classrooms.SelectedOrder)
{
case Cla_ORDER_BY_CLASSROOM:
if (asprintf (&OrderBySubQuery,"FullName") < 0)
Lay_NotEnoughMemoryExit ();
break;
case Cla_ORDER_BY_CAPACITY:
if (asprintf (&OrderBySubQuery,"Capacity DESC,"
"FullName") < 0)
Lay_NotEnoughMemoryExit ();
break;
case Cla_ORDER_BY_LOCATION:
if (asprintf (&OrderBySubQuery,"Location DESC,"
"FullName") < 0)
Lay_NotEnoughMemoryExit ();
break;
}
/* Build query */
NumRows = DB_QuerySELECT (&mysql_res,"can not get classrooms", NumRows = DB_QuerySELECT (&mysql_res,"can not get classrooms",
"SELECT ClaCod," "SELECT ClaCod,"
"ShortName," "ShortName,"
@ -305,10 +288,7 @@ void Cla_GetListClassrooms (void)
" WHERE CtrCod=%ld" " WHERE CtrCod=%ld"
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCtr.Ctr.CtrCod, Gbl.CurrentCtr.Ctr.CtrCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Classrooms.SelectedOrder]);
/* Free allocated memory for subquery */
free ((void *) OrderBySubQuery);
/***** Count number of rows in result *****/ /***** Count number of rows in result *****/
if (NumRows) // Classrooms found... if (NumRows) // Classrooms found...
@ -469,7 +449,7 @@ static void Cla_ListClassroomsForEdition (void)
Frm_StartForm (ActRenClaSho); Frm_StartForm (ActRenClaSho);
Cla_PutParamClaCod (Cla->ClaCod); Cla_PutParamClaCod (Cla->ClaCod);
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"ShortName\"" fprintf (Gbl.F.Out,"<input type=\"text\" name=\"ShortName\""
" maxlength=\"%u\" value=\"%s\"" " size=\"10\" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_SHORT_NAME\"" " class=\"INPUT_SHORT_NAME\""
" onchange=\"document.getElementById('%s').submit();\" />", " onchange=\"document.getElementById('%s').submit();\" />",
Cla_MAX_CHARS_SHRT_NAME,Cla->ShrtName,Gbl.Form.Id); Cla_MAX_CHARS_SHRT_NAME,Cla->ShrtName,Gbl.Form.Id);
@ -481,7 +461,7 @@ static void Cla_ListClassroomsForEdition (void)
Frm_StartForm (ActRenClaFul); Frm_StartForm (ActRenClaFul);
Cla_PutParamClaCod (Cla->ClaCod); Cla_PutParamClaCod (Cla->ClaCod);
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"FullName\"" fprintf (Gbl.F.Out,"<input type=\"text\" name=\"FullName\""
" maxlength=\"%u\" value=\"%s\"" " size=\"20\" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_FULL_NAME\"" " class=\"INPUT_FULL_NAME\""
" onchange=\"document.getElementById('%s').submit();\" />", " onchange=\"document.getElementById('%s').submit();\" />",
Cla_MAX_CHARS_FULL_NAME,Cla->FullName,Gbl.Form.Id); Cla_MAX_CHARS_FULL_NAME,Cla->FullName,Gbl.Form.Id);
@ -498,6 +478,18 @@ static void Cla_ListClassroomsForEdition (void)
fprintf (Gbl.F.Out,"\" onchange=\"document.getElementById('%s').submit();\" />", fprintf (Gbl.F.Out,"\" onchange=\"document.getElementById('%s').submit();\" />",
Gbl.Form.Id); Gbl.Form.Id);
Frm_EndForm (); Frm_EndForm ();
fprintf (Gbl.F.Out,"</td>");
/* Classroom location */
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">");
Frm_StartForm (ActRenClaLoc);
Cla_PutParamClaCod (Cla->ClaCod);
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Location\""
" size=\"15\" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_FULL_NAME\""
" onchange=\"document.getElementById('%s').submit();\" />",
Cla_MAX_CHARS_LOCATION,Cla->Location,Gbl.Form.Id);
Frm_EndForm ();
fprintf (Gbl.F.Out,"</td>" fprintf (Gbl.F.Out,"</td>"
"</tr>"); "</tr>");
} }
@ -697,10 +689,10 @@ static void Cla_UpdateClaNameDB (long ClaCod,const char *FieldName,const char *N
} }
/*****************************************************************************/ /*****************************************************************************/
/************** Change maximum number of students in a classroom *************/ /****************** Change sitting capacity of a classroom *******************/
/*****************************************************************************/ /*****************************************************************************/
void Cla_ChangeMaxStudents (void) void Cla_ChangeCapacity (void)
{ {
extern const char *Txt_The_capacity_of_classroom_X_has_not_changed; extern const char *Txt_The_capacity_of_classroom_X_has_not_changed;
extern const char *Txt_The_classroom_X_does_not_have_a_limited_capacity_now; extern const char *Txt_The_classroom_X_does_not_have_a_limited_capacity_now;
@ -771,6 +763,60 @@ static void Cla_WriteCapacity (unsigned Capacity)
fprintf (Gbl.F.Out,"%u",Capacity); fprintf (Gbl.F.Out,"%u",Capacity);
} }
/*****************************************************************************/
/******************** Change the location of a classroom *********************/
/*****************************************************************************/
void Cla_ChangeClassroomLocation (void)
{
extern const char *Txt_The_location_of_the_classroom_X_has_changed_to_Y;
extern const char *Txt_The_location_of_the_classroom_X_has_not_changed;
struct Classroom *Cla;
char NewLocation[Cla_MAX_BYTES_FULL_NAME + 1];
Cla = &Gbl.Classrooms.EditingCla;
/***** Get parameters from form *****/
/* Get the code of the classroom */
if ((Cla->ClaCod = Cla_GetParamClaCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of classroom is missing.");
/* Get the new location for the classroom */
Par_GetParToText ("Location",NewLocation,Cla_MAX_BYTES_LOCATION);
/***** Get from the database the old location of the classroom *****/
Cla_GetDataOfClassroomByCod (Cla);
/***** Check if old and new locations are the same
(this happens when return is pressed without changes) *****/
if (strcmp (Cla->Location,NewLocation)) // Different locations
{
/* Update the table changing old name by new name */
Cla_UpdateClaNameDB (Cla->ClaCod,"Location",NewLocation);
Str_Copy (Cla->Location,NewLocation,
Cla_MAX_BYTES_LOCATION);
/* Write message to show the change made */
Gbl.Alert.Type = Ale_SUCCESS;
snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt),
Txt_The_location_of_the_classroom_X_has_changed_to_Y,
Cla->FullName,NewLocation);
}
else // The same location
{
Gbl.Alert.Type = Ale_INFO;
snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt),
Txt_The_location_of_the_classroom_X_has_not_changed,
Cla->FullName);
}
/***** Write message to show the change made *****/
Ale_ShowAlert (Gbl.Alert.Type,Gbl.Alert.Txt);
/***** Show the form again *****/
Cla_EditClassrooms ();
}
/*****************************************************************************/ /*****************************************************************************/
/******************* Put a form to create a new classroom ********************/ /******************* Put a form to create a new classroom ********************/
/*****************************************************************************/ /*****************************************************************************/
@ -802,31 +848,39 @@ static void Cla_PutFormToCreateClassroom (void)
fprintf (Gbl.F.Out,"<td class=\"CODE\"></td>"); fprintf (Gbl.F.Out,"<td class=\"CODE\"></td>");
/***** Classroom short name *****/ /***** Classroom short name *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">" fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\" name=\"ShortName\"" "<input type=\"text\" name=\"ShortName\""
" maxlength=\"%u\" value=\"%s\"" " size=\"10\" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_SHORT_NAME\"" " class=\"INPUT_SHORT_NAME\""
" required=\"required\" />" " required=\"required\" />"
"</td>", "</td>",
Cla_MAX_CHARS_SHRT_NAME,Cla->ShrtName); Cla_MAX_CHARS_SHRT_NAME,Cla->ShrtName);
/***** Classroom full name *****/ /***** Classroom full name *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">" fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\" name=\"FullName\"" "<input type=\"text\" name=\"FullName\""
" maxlength=\"%u\" value=\"%s\"" " size=\"20\" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_FULL_NAME\"" " class=\"INPUT_FULL_NAME\""
" required=\"required\" />" " required=\"required\" />"
"</td>", "</td>",
Cla_MAX_CHARS_FULL_NAME,Cla->FullName); Cla_MAX_CHARS_FULL_NAME,Cla->FullName);
/***** Seating capacity *****/ /***** Seating capacity *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">" fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\" name=\"Capacity\"" "<input type=\"text\" name=\"Capacity\""
" size=\"3\" maxlength=\"10\" value=\""); " size=\"3\" maxlength=\"10\" value=\"");
Cla_WriteCapacity (Cla->Capacity); Cla_WriteCapacity (Cla->Capacity);
fprintf (Gbl.F.Out,"\" />" fprintf (Gbl.F.Out,"\" />"
"</td>");
/***** Classroom location *****/
fprintf (Gbl.F.Out,"<td class=\"LEFT_MIDDLE\">"
"<input type=\"text\" name=\"Location\""
" size=\"15\" maxlength=\"%u\" value=\"%s\""
" class=\"INPUT_FULL_NAME\" />"
"</td>" "</td>"
"</tr>"); "</tr>",
Cla_MAX_CHARS_LOCATION,Cla->Location);
/***** End table, send button and end box *****/ /***** End table, send button and end box *****/
Box_EndBoxTableWithButton (Btn_CREATE_BUTTON,Txt_Create_classroom); Box_EndBoxTableWithButton (Btn_CREATE_BUTTON,Txt_Create_classroom);
@ -845,6 +899,7 @@ static void Cla_PutHeadClassrooms (void)
extern const char *Txt_Short_name; extern const char *Txt_Short_name;
extern const char *Txt_Full_name; extern const char *Txt_Full_name;
extern const char *Txt_Capacity_OF_A_CLASSROOM; extern const char *Txt_Capacity_OF_A_CLASSROOM;
extern const char *Txt_Location;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<th class=\"BM\"></th>" "<th class=\"BM\"></th>"
@ -860,11 +915,15 @@ static void Cla_PutHeadClassrooms (void)
"<th class=\"LEFT_MIDDLE\">" "<th class=\"LEFT_MIDDLE\">"
"%s" "%s"
"</th>" "</th>"
"</tr>", "<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"</tr>",
Txt_Code, Txt_Code,
Txt_Short_name, Txt_Short_name,
Txt_Full_name, Txt_Full_name,
Txt_Capacity_OF_A_CLASSROOM); Txt_Capacity_OF_A_CLASSROOM,
Txt_Location);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -63,7 +63,7 @@ typedef enum
Cla_ORDER_BY_CAPACITY = 1, Cla_ORDER_BY_CAPACITY = 1,
Cla_ORDER_BY_LOCATION = 2, Cla_ORDER_BY_LOCATION = 2,
} Cla_Order_t; } Cla_Order_t;
#define Cla_ORDER_DEFAULT Cla_ORDER_BY_CLASSROOM #define Cla_ORDER_DEFAULT Cla_ORDER_BY_LOCATION
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
@ -76,10 +76,13 @@ void Cla_GetListClassrooms (void);
void Cla_FreeListClassrooms (void); void Cla_FreeListClassrooms (void);
void Cla_GetDataOfClassroomByCod (struct Classroom *Cla); void Cla_GetDataOfClassroomByCod (struct Classroom *Cla);
long Cla_GetParamClaCod (void); long Cla_GetParamClaCod (void);
void Cla_RemoveClassroom (void); void Cla_RemoveClassroom (void);
void Cla_RenameClassroomShort (void); void Cla_RenameClassroomShort (void);
void Cla_RenameClassroomFull (void); void Cla_RenameClassroomFull (void);
void Cla_ChangeMaxStudents (void); void Cla_ChangeCapacity (void);
void Cla_ChangeClassroomLocation (void);
void Cla_RecFormNewClassroom (void); void Cla_RecFormNewClassroom (void);
#endif #endif

View File

@ -261,7 +261,11 @@ void Dpt_EditDepartments (void)
void Dpt_GetListDepartments (long InsCod) void Dpt_GetListDepartments (long InsCod)
{ {
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Dpt_NUM_ORDERS] =
{
"FullName", // Dpt_ORDER_BY_DEPARTMENT
"NumTchs DESC,FullName", // Dpt_ORDER_BY_NUM_TCHS
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumDpt; unsigned NumDpt;
@ -273,15 +277,6 @@ void Dpt_GetListDepartments (long InsCod)
if (InsCod > 0) // Institution specified if (InsCod > 0) // Institution specified
{ {
/***** Get departments from database *****/ /***** Get departments from database *****/
switch (Gbl.Dpts.SelectedOrder)
{
case Dpt_ORDER_BY_DEPARTMENT:
sprintf (OrderBySubQuery,"FullName");
break;
case Dpt_ORDER_BY_NUM_TCHS:
sprintf (OrderBySubQuery,"NumTchs DESC,FullName");
break;
}
Gbl.Dpts.Num = (unsigned) DB_QuerySELECT (&mysql_res,"can not get departments", Gbl.Dpts.Num = (unsigned) DB_QuerySELECT (&mysql_res,"can not get departments",
"(SELECT departments.DptCod,departments.InsCod," "(SELECT departments.DptCod,departments.InsCod,"
"departments.ShortName,departments.FullName,departments.WWW," "departments.ShortName,departments.FullName,departments.WWW,"
@ -301,7 +296,7 @@ void Dpt_GetListDepartments (long InsCod)
" ORDER BY %s", " ORDER BY %s",
InsCod,(unsigned) Rol_NET,(unsigned) Rol_TCH, InsCod,(unsigned) Rol_NET,(unsigned) Rol_TCH,
InsCod,(unsigned) Rol_NET,(unsigned) Rol_TCH, InsCod,(unsigned) Rol_NET,(unsigned) Rol_TCH,
OrderBySubQuery); OrderBySubQuery[Gbl.Dpts.SelectedOrder]);
if (Gbl.Dpts.Num) // Departments found... if (Gbl.Dpts.Num) // Departments found...
{ {
/***** Create list with courses in degree *****/ /***** Create list with courses in degree *****/

View File

@ -885,8 +885,12 @@ static void Gam_PutParams (void)
void Gam_GetListGames (void) void Gam_GetListGames (void)
{ {
extern const char *Sco_ScopeDB[Sco_NUM_SCOPES]; extern const char *Sco_ScopeDB[Sco_NUM_SCOPES];
char SubQuery[Sco_NUM_SCOPES][256]; char *SubQuery[Sco_NUM_SCOPES];
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Gam_NUM_ORDERS] =
{
"StartTime DESC,EndTime DESC,Title DESC", // Gam_ORDER_BY_START_DATE
"EndTime DESC,StartTime DESC,Title DESC", // Gam_ORDER_BY_END_DATE
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows = 0; // Initialized to avoid warning unsigned long NumRows = 0; // Initialized to avoid warning
@ -895,7 +899,7 @@ void Gam_GetListGames (void)
unsigned HiddenAllowed = 0; unsigned HiddenAllowed = 0;
long Cods[Sco_NUM_SCOPES]; long Cods[Sco_NUM_SCOPES];
Sco_Scope_t Scope; Sco_Scope_t Scope;
bool SubQueryFilled; bool SubQueryFilled = false;
/***** Free list of games *****/ /***** Free list of games *****/
if (Gbl.Games.LstIsRead) if (Gbl.Games.LstIsRead)
@ -913,69 +917,72 @@ void Gam_GetListGames (void)
Cods[Sco_SCOPE_CRS] = Gbl.CurrentCrs.Crs.CrsCod; // Course Cods[Sco_SCOPE_CRS] = Gbl.CurrentCrs.Crs.CrsCod; // Course
/* Fill subqueries for system, country, institution, centre and degree */ /* Fill subqueries for system, country, institution, centre and degree */
for (Scope = Sco_SCOPE_SYS, SubQueryFilled = false; for (Scope = Sco_SCOPE_SYS;
Scope <= Sco_SCOPE_DEG; Scope <= Sco_SCOPE_DEG;
Scope++) Scope++)
if (ScopesAllowed & 1 << Scope) if (ScopesAllowed & 1 << Scope)
{ {
sprintf (SubQuery[Scope],"%s(Scope='%s' AND Cod=%ld%s)", if (asprintf (&SubQuery[Scope],"%s(Scope='%s' AND Cod=%ld%s)",
SubQueryFilled ? " OR " : SubQueryFilled ? " OR " :
"", "",
Sco_ScopeDB[Scope],Cods[Scope], Sco_ScopeDB[Scope],Cods[Scope],
(HiddenAllowed & 1 << Scope) ? "" : (HiddenAllowed & 1 << Scope) ? "" :
" AND Hidden='N'"); " AND Hidden='N'") < 0)
Lay_NotEnoughMemoryExit ();
SubQueryFilled = true; SubQueryFilled = true;
} }
else else
SubQuery[Scope][0] = '\0'; {
if (asprintf (&SubQuery[Scope],"%s","") < 0)
Lay_NotEnoughMemoryExit ();
}
/* Fill subquery for course */ /* Fill subquery for course */
if (ScopesAllowed & 1 << Sco_SCOPE_CRS) if (ScopesAllowed & 1 << Sco_SCOPE_CRS)
{ {
if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS)
sprintf (SubQuery[Sco_SCOPE_CRS],"%s(" {
"Scope='%s' AND Cod=%ld%s" if (asprintf (&SubQuery[Sco_SCOPE_CRS],"%s("
" AND " "Scope='%s' AND Cod=%ld%s"
"(GamCod NOT IN" " AND "
" (SELECT GamCod FROM gam_grp)" "(GamCod NOT IN"
" OR" " (SELECT GamCod FROM gam_grp)"
" GamCod IN" " OR"
" (SELECT gam_grp.GamCod" " GamCod IN"
" FROM gam_grp,crs_grp_usr" " (SELECT gam_grp.GamCod"
" WHERE crs_grp_usr.UsrCod=%ld" " FROM gam_grp,crs_grp_usr"
" AND gam_grp.GrpCod=crs_grp_usr.GrpCod))" " WHERE crs_grp_usr.UsrCod=%ld"
")", " AND gam_grp.GrpCod=crs_grp_usr.GrpCod))"
SubQueryFilled ? " OR " : ")",
"", SubQueryFilled ? " OR " :
Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS], "",
(HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" : Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS],
" AND Hidden='N'", (HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" :
Gbl.Usrs.Me.UsrDat.UsrCod); " AND Hidden='N'",
Gbl.Usrs.Me.UsrDat.UsrCod) < 0)
Lay_NotEnoughMemoryExit ();
}
else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS
sprintf (SubQuery[Sco_SCOPE_CRS],"%s(Scope='%s' AND Cod=%ld%s)", {
SubQueryFilled ? " OR " : if (asprintf (&SubQuery[Sco_SCOPE_CRS],"%s(Scope='%s' AND Cod=%ld%s)",
"", SubQueryFilled ? " OR " :
Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS], "",
(HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" : Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS],
" AND Hidden='N'"); (HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" :
" AND Hidden='N'") < 0)
Lay_NotEnoughMemoryExit ();
}
SubQueryFilled = true; SubQueryFilled = true;
} }
else else
SubQuery[Sco_SCOPE_CRS][0] = '\0'; {
if (asprintf (&SubQuery[Sco_SCOPE_CRS],"%s","") < 0)
Lay_NotEnoughMemoryExit ();
}
/* Build query */ /* Make query */
if (SubQueryFilled) if (SubQueryFilled)
{ {
switch (Gbl.Games.SelectedOrder)
{
case Gam_ORDER_BY_START_DATE:
sprintf (OrderBySubQuery,"StartTime DESC,EndTime DESC,Title DESC");
break;
case Gam_ORDER_BY_END_DATE:
sprintf (OrderBySubQuery,"EndTime DESC,StartTime DESC,Title DESC");
break;
}
/* Make query */ /* Make query */
NumRows = DB_QuerySELECT (&mysql_res,"can not get games", NumRows = DB_QuerySELECT (&mysql_res,"can not get games",
"SELECT GamCod FROM games" "SELECT GamCod FROM games"
@ -987,11 +994,17 @@ void Gam_GetListGames (void)
SubQuery[Sco_SCOPE_CTR], SubQuery[Sco_SCOPE_CTR],
SubQuery[Sco_SCOPE_DEG], SubQuery[Sco_SCOPE_DEG],
SubQuery[Sco_SCOPE_CRS], SubQuery[Sco_SCOPE_CRS],
OrderBySubQuery); OrderBySubQuery[Gbl.Games.SelectedOrder]);
} }
else else
Lay_ShowErrorAndExit ("Can not get list of games."); Lay_ShowErrorAndExit ("Can not get list of games.");
/* Free allocated memory for subqueries */
for (Scope = Sco_SCOPE_SYS;
Scope <= Sco_SCOPE_CRS;
Scope++)
free ((void *) SubQuery[Scope]);
if (NumRows) // Games found... if (NumRows) // Games found...
{ {
Gbl.Games.Num = (unsigned) NumRows; Gbl.Games.Num = (unsigned) NumRows;

View File

@ -249,7 +249,11 @@ void Hld_EditHolidays (void)
void Hld_GetListHolidays (void) void Hld_GetListHolidays (void)
{ {
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Hld_NUM_ORDERS] =
{
"Place,StartDate", // Hld_ORDER_BY_PLACE
"StartDate,Place", // Hld_ORDER_BY_START_DATE
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumHld; unsigned NumHld;
@ -261,15 +265,6 @@ void Hld_GetListHolidays (void)
Hld_FreeListHolidays (); Hld_FreeListHolidays ();
/***** Get holidays from database *****/ /***** Get holidays from database *****/
switch (Gbl.Hlds.SelectedOrder)
{
case Hld_ORDER_BY_PLACE:
sprintf (OrderBySubQuery,"Place,StartDate");
break;
case Hld_ORDER_BY_START_DATE:
sprintf (OrderBySubQuery,"StartDate,Place");
break;
}
Gbl.Hlds.Num = Gbl.Hlds.Num =
(unsigned) DB_QuerySELECT (&mysql_res,"can not get holidays", (unsigned) DB_QuerySELECT (&mysql_res,"can not get holidays",
"(SELECT holidays.HldCod," "(SELECT holidays.HldCod,"
@ -301,7 +296,7 @@ void Hld_GetListHolidays (void)
Gbl.CurrentIns.Ins.InsCod, Gbl.CurrentIns.Ins.InsCod,
Gbl.CurrentIns.Ins.InsCod, Gbl.CurrentIns.Ins.InsCod,
Gbl.CurrentIns.Ins.InsCod, Gbl.CurrentIns.Ins.InsCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Hlds.SelectedOrder]);
if (Gbl.Hlds.Num) // Holidays found... if (Gbl.Hlds.Num) // Holidays found...
{ {
/***** Create list of holidays *****/ /***** Create list of holidays *****/

View File

@ -995,7 +995,11 @@ static void Ins_PutIconToViewInstitutions (void)
void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData) void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
{ {
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Ins_NUM_ORDERS] =
{
"FullName", // Ins_ORDER_BY_INSTITUTION
"NumUsrs DESC,FullName", // Ins_ORDER_BY_NUM_USRS
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows = 0; // Initialized to avoid warning unsigned long NumRows = 0; // Initialized to avoid warning
@ -1014,15 +1018,6 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
CtyCod); CtyCod);
break; break;
case Ins_GET_EXTRA_DATA: case Ins_GET_EXTRA_DATA:
switch (Gbl.Inss.SelectedOrder)
{
case Ins_ORDER_BY_INSTITUTION:
sprintf (OrderBySubQuery,"FullName");
break;
case Ins_ORDER_BY_NUM_USRS:
sprintf (OrderBySubQuery,"NumUsrs DESC,FullName");
break;
}
NumRows = DB_QuerySELECT (&mysql_res,"can not get institutions", NumRows = DB_QuerySELECT (&mysql_res,"can not get institutions",
"(SELECT institutions.InsCod,institutions.CtyCod," "(SELECT institutions.InsCod,institutions.CtyCod,"
"institutions.Status,institutions.RequesterUsrCod," "institutions.Status,institutions.RequesterUsrCod,"
@ -1040,7 +1035,7 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
" (SELECT DISTINCT InsCod FROM usr_data))" " (SELECT DISTINCT InsCod FROM usr_data))"
" ORDER BY %s", " ORDER BY %s",
CtyCod,CtyCod, CtyCod,CtyCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Inss.SelectedOrder]);
break; break;
} }

View File

@ -218,7 +218,12 @@ void Mai_EditMailDomains (void)
static void Mai_GetListMailDomainsAllowedForNotif (void) static void Mai_GetListMailDomainsAllowedForNotif (void)
{ {
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Mai_NUM_ORDERS] =
{
"Domain,Info,N DESC", // Mai_ORDER_BY_DOMAIN
"Info,Domain,N DESC", // Mai_ORDER_BY_INFO
"N DESC,Info,Domain", // Mai_ORDER_BY_USERS
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -242,18 +247,6 @@ static void Mai_GetListMailDomainsAllowedForNotif (void)
"CREATE TEMPORARY TABLE T2 ENGINE=MEMORY SELECT * FROM T1"); "CREATE TEMPORARY TABLE T2 ENGINE=MEMORY SELECT * FROM T1");
/***** Get mail domains from database *****/ /***** Get mail domains from database *****/
switch (Gbl.Mails.SelectedOrder)
{
case Mai_ORDER_BY_DOMAIN:
sprintf (OrderBySubQuery,"Domain,Info,N DESC");
break;
case Mai_ORDER_BY_INFO:
sprintf (OrderBySubQuery,"Info,Domain,N DESC");
break;
case Mai_ORDER_BY_USERS:
sprintf (OrderBySubQuery,"N DESC,Info,Domain");
break;
}
NumRows = DB_QuerySELECT (&mysql_res,"can not get mail domains", NumRows = DB_QuerySELECT (&mysql_res,"can not get mail domains",
"(SELECT mail_domains.MaiCod," "(SELECT mail_domains.MaiCod,"
"mail_domains.Domain AS Domain," "mail_domains.Domain AS Domain,"
@ -270,7 +263,7 @@ static void Mai_GetListMailDomainsAllowedForNotif (void)
" WHERE Domain NOT IN" " WHERE Domain NOT IN"
" (SELECT Domain COLLATE 'latin1_bin' FROM T2))" " (SELECT Domain COLLATE 'latin1_bin' FROM T2))"
" ORDER BY %s", // COLLATE necessary to avoid error in comparisons " ORDER BY %s", // COLLATE necessary to avoid error in comparisons
OrderBySubQuery); OrderBySubQuery[Gbl.Mails.SelectedOrder]);
if (NumRows) // Mail domains found... if (NumRows) // Mail domains found...
{ {

View File

@ -311,7 +311,11 @@ void Plc_PutIconToViewPlaces (void)
void Plc_GetListPlaces (void) void Plc_GetListPlaces (void)
{ {
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Plc_NUM_ORDERS] =
{
"FullName", // Plc_ORDER_BY_PLACE
"NumCtrs DESC,FullName", // Plc_ORDER_BY_NUM_CTRS
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -319,15 +323,6 @@ void Plc_GetListPlaces (void)
struct Place *Plc; struct Place *Plc;
/***** Get places from database *****/ /***** Get places from database *****/
switch (Gbl.Plcs.SelectedOrder)
{
case Plc_ORDER_BY_PLACE:
sprintf (OrderBySubQuery,"FullName");
break;
case Plc_ORDER_BY_NUM_CTRS:
sprintf (OrderBySubQuery,"NumCtrs DESC,FullName");
break;
}
NumRows = DB_QuerySELECT (&mysql_res,"can not get places", NumRows = DB_QuerySELECT (&mysql_res,"can not get places",
"(SELECT places.PlcCod," "(SELECT places.PlcCod,"
"places.ShortName," "places.ShortName,"
@ -353,7 +348,7 @@ void Plc_GetListPlaces (void)
Gbl.CurrentIns.Ins.InsCod, Gbl.CurrentIns.Ins.InsCod,
Gbl.CurrentIns.Ins.InsCod, Gbl.CurrentIns.Ins.InsCod,
Gbl.CurrentIns.Ins.InsCod, Gbl.CurrentIns.Ins.InsCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Plcs.SelectedOrder]);
/***** Count number of rows in result *****/ /***** Count number of rows in result *****/
if (NumRows) // Places found... if (NumRows) // Places found...

View File

@ -2278,14 +2278,30 @@ static bool Prj_CheckIfICanEditProject (long PrjCod)
/************************** List all the projects ****************************/ /************************** List all the projects ****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Prj_MAX_BYTES_SUBQUERY 128
void Prj_GetListProjects (void) void Prj_GetListProjects (void)
{ {
char PreNonSubQuery[Prj_MAX_BYTES_SUBQUERY]; char *PreNonSubQuery;
char HidVisSubQuery[Prj_MAX_BYTES_SUBQUERY]; char *HidVisSubQuery;
char DptCodSubQuery[Prj_MAX_BYTES_SUBQUERY]; char *DptCodSubQuery;
char OrderBySubQuery[Prj_MAX_BYTES_SUBQUERY]; static const char *OrderBySubQuery[Prj_NUM_ORDERS] =
{
"projects.CreatTime DESC," // Prj_ORDER_START_TIME
"projects.ModifTime DESC,"
"projects.Title",
"projects.ModifTime DESC," // Prj_ORDER_END_TIME
"projects.CreatTime DESC,"
"projects.Title",
"projects.Title," // Prj_ORDER_TITLE
"projects.CreatTime DESC,"
"projects.ModifTime DESC",
"departments.FullName," // Prj_ORDER_DEPARTMENT
"projects.CreatTime DESC,"
"projects.ModifTime DESC,"
"projects.Title",
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows = 0; // Initialized to avoid warning unsigned long NumRows = 0; // Initialized to avoid warning
@ -2303,16 +2319,17 @@ void Prj_GetListProjects (void)
/* Preassigned subquery */ /* Preassigned subquery */
switch (Gbl.Prjs.Filter.PreNon) switch (Gbl.Prjs.Filter.PreNon)
{ {
case (1 << Prj_PREASSIGNED): case (1 << Prj_PREASSIGNED): // Preassigned projects
Str_Copy (PreNonSubQuery," AND projects.Preassigned='Y'", if (asprintf (&PreNonSubQuery," AND projects.Preassigned='Y'") < 0)
Prj_MAX_BYTES_SUBQUERY); // Preassigned projects Lay_NotEnoughMemoryExit ();
break; break;
case (1 << Prj_NONPREASSIG): case (1 << Prj_NONPREASSIG): // Non-preassigned projects
Str_Copy (PreNonSubQuery," AND projects.Preassigned='N'", if (asprintf (&PreNonSubQuery," AND projects.Preassigned='N'") < 0)
Prj_MAX_BYTES_SUBQUERY); // Non-preassigned projects Lay_NotEnoughMemoryExit ();
break; break;
default: default: // All projects
PreNonSubQuery[0] = '\0'; // All projects if (asprintf (&PreNonSubQuery,"%s","") < 0)
Lay_NotEnoughMemoryExit ();
break; break;
} }
@ -2320,24 +2337,25 @@ void Prj_GetListProjects (void)
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: // Students can view only visible projects case Rol_STD: // Students can view only visible projects
Str_Copy (HidVisSubQuery," AND projects.Hidden='N'", if (asprintf (&HidVisSubQuery," AND projects.Hidden='N'") < 0)
Prj_MAX_BYTES_SUBQUERY); // Visible projects Lay_NotEnoughMemoryExit ();
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
switch (Gbl.Prjs.Filter.HidVis) switch (Gbl.Prjs.Filter.HidVis)
{ {
case (1 << Prj_HIDDEN): case (1 << Prj_HIDDEN): // Hidden projects
Str_Copy (HidVisSubQuery," AND projects.Hidden='Y'", if (asprintf (&HidVisSubQuery," AND projects.Hidden='Y'") < 0)
Prj_MAX_BYTES_SUBQUERY); // Hidden projects Lay_NotEnoughMemoryExit ();
break; break;
case (1 << Prj_VISIBL): case (1 << Prj_VISIBL): // Visible projects
Str_Copy (HidVisSubQuery," AND projects.Hidden='N'", if (asprintf (&HidVisSubQuery," AND projects.Hidden='N'") < 0)
Prj_MAX_BYTES_SUBQUERY); // Visible projects Lay_NotEnoughMemoryExit ();
break; break;
default: default: // All projects
HidVisSubQuery[0] = '\0'; // All projects if (asprintf (&HidVisSubQuery,"%s","") < 0)
Lay_NotEnoughMemoryExit ();
break; break;
} }
break; break;
@ -2348,35 +2366,15 @@ void Prj_GetListProjects (void)
/* Department subquery */ /* Department subquery */
if (Gbl.Prjs.Filter.DptCod >= 0) if (Gbl.Prjs.Filter.DptCod >= 0)
sprintf (DptCodSubQuery," AND projects.DptCod=%ld", {
Gbl.Prjs.Filter.DptCod); if (asprintf (&DptCodSubQuery," AND projects.DptCod=%ld",
Gbl.Prjs.Filter.DptCod) < 0)
Lay_NotEnoughMemoryExit ();
}
else // Any department else // Any department
DptCodSubQuery[0] = '\0';
/* Order subquery */
switch (Gbl.Prjs.SelectedOrder)
{ {
case Prj_ORDER_START_TIME: if (asprintf (&DptCodSubQuery,"%s","") < 0)
sprintf (OrderBySubQuery,"projects.CreatTime DESC," Lay_NotEnoughMemoryExit ();
"projects.ModifTime DESC,"
"projects.Title");
break;
case Prj_ORDER_END_TIME:
sprintf (OrderBySubQuery,"projects.ModifTime DESC,"
"projects.CreatTime DESC,"
"projects.Title");
break;
case Prj_ORDER_TITLE:
sprintf (OrderBySubQuery,"projects.Title,"
"projects.CreatTime DESC,"
"projects.ModifTime DESC");
break;
case Prj_ORDER_DEPARTMENT:
sprintf (OrderBySubQuery,"departments.FullName,"
"projects.CreatTime DESC,"
"projects.ModifTime DESC,"
"projects.Title");
break;
} }
/* Query */ /* Query */
@ -2397,7 +2395,7 @@ void Prj_GetListProjects (void)
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, PreNonSubQuery,HidVisSubQuery,DptCodSubQuery,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Prjs.SelectedOrder]);
break; break;
case Prj_ORDER_DEPARTMENT: case Prj_ORDER_DEPARTMENT:
NumRows = DB_QuerySELECT (&mysql_res,"can not get projects", NumRows = DB_QuerySELECT (&mysql_res,"can not get projects",
@ -2412,7 +2410,7 @@ void Prj_GetListProjects (void)
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, PreNonSubQuery,HidVisSubQuery,DptCodSubQuery,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
OrderBySubQuery); OrderBySubQuery[Gbl.Prjs.SelectedOrder]);
break; break;
} }
else // Gbl.Prjs.My_All == Prj_ALL_PROJECTS else // Gbl.Prjs.My_All == Prj_ALL_PROJECTS
@ -2429,7 +2427,7 @@ void Prj_GetListProjects (void)
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, PreNonSubQuery,HidVisSubQuery,DptCodSubQuery,
OrderBySubQuery); OrderBySubQuery[Gbl.Prjs.SelectedOrder]);
break; break;
case Prj_ORDER_DEPARTMENT: case Prj_ORDER_DEPARTMENT:
NumRows = DB_QuerySELECT (&mysql_res,"can not get projects", NumRows = DB_QuerySELECT (&mysql_res,"can not get projects",
@ -2441,10 +2439,15 @@ void Prj_GetListProjects (void)
" ORDER BY %s", " ORDER BY %s",
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, PreNonSubQuery,HidVisSubQuery,DptCodSubQuery,
OrderBySubQuery); OrderBySubQuery[Gbl.Prjs.SelectedOrder]);
break; break;
} }
/* Free allocated memory for subqueries */
free ((void *) PreNonSubQuery);
free ((void *) HidVisSubQuery);
free ((void *) DptCodSubQuery);
if (NumRows) // Projects found... if (NumRows) // Projects found...
{ {
Gbl.Prjs.Num = (unsigned) NumRows; Gbl.Prjs.Num = (unsigned) NumRows;

View File

@ -25,8 +25,10 @@
/********************************* Headers ***********************************/ /********************************* Headers ***********************************/
/*****************************************************************************/ /*****************************************************************************/
#define _GNU_SOURCE // For asprintf
#include <linux/limits.h> // For PATH_MAX #include <linux/limits.h> // For PATH_MAX
#include <linux/stddef.h> // For NULL #include <linux/stddef.h> // For NULL
#include <stdio.h> // For asprintf
#include <stdlib.h> // For calloc #include <stdlib.h> // For calloc
#include <string.h> // For string functions #include <string.h> // For string functions
@ -846,8 +848,12 @@ static void Svy_PutParams (void)
void Svy_GetListSurveys (void) void Svy_GetListSurveys (void)
{ {
extern const char *Sco_ScopeDB[Sco_NUM_SCOPES]; extern const char *Sco_ScopeDB[Sco_NUM_SCOPES];
char SubQuery[Sco_NUM_SCOPES][256]; char *SubQuery[Sco_NUM_SCOPES];
char OrderBySubQuery[256]; static const char *OrderBySubQuery[Svy_NUM_ORDERS] =
{
"StartTime DESC,EndTime DESC,Title DESC", // Svy_ORDER_BY_START_DATE
"EndTime DESC,StartTime DESC,Title DESC", // Svy_ORDER_BY_END_DATE
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -856,7 +862,7 @@ void Svy_GetListSurveys (void)
unsigned HiddenAllowed = 0; unsigned HiddenAllowed = 0;
long Cods[Sco_NUM_SCOPES]; long Cods[Sco_NUM_SCOPES];
Sco_Scope_t Scope; Sco_Scope_t Scope;
bool SubQueryFilled; bool SubQueryFilled = false;
/***** Free list of surveys *****/ /***** Free list of surveys *****/
if (Gbl.Svys.LstIsRead) if (Gbl.Svys.LstIsRead)
@ -874,69 +880,71 @@ void Svy_GetListSurveys (void)
Cods[Sco_SCOPE_CRS] = Gbl.CurrentCrs.Crs.CrsCod; // Course Cods[Sco_SCOPE_CRS] = Gbl.CurrentCrs.Crs.CrsCod; // Course
/* Fill subqueries for system, country, institution, centre and degree */ /* Fill subqueries for system, country, institution, centre and degree */
for (Scope = Sco_SCOPE_SYS, SubQueryFilled = false; for (Scope = Sco_SCOPE_SYS;
Scope <= Sco_SCOPE_DEG; Scope <= Sco_SCOPE_DEG;
Scope++) Scope++)
if (ScopesAllowed & 1 << Scope) if (ScopesAllowed & 1 << Scope)
{ {
sprintf (SubQuery[Scope],"%s(Scope='%s' AND Cod=%ld%s)", if (asprintf (&SubQuery[Scope],"%s(Scope='%s' AND Cod=%ld%s)",
SubQueryFilled ? " OR " : SubQueryFilled ? " OR " :
"", "",
Sco_ScopeDB[Scope],Cods[Scope], Sco_ScopeDB[Scope],Cods[Scope],
(HiddenAllowed & 1 << Scope) ? "" : (HiddenAllowed & 1 << Scope) ? "" :
" AND Hidden='N'"); " AND Hidden='N'") < 0)
Lay_NotEnoughMemoryExit ();
SubQueryFilled = true; SubQueryFilled = true;
} }
else else
SubQuery[Scope][0] = '\0'; {
if (asprintf (&SubQuery[Scope],"%s","") < 0)
Lay_NotEnoughMemoryExit ();
}
/* Fill subquery for course */ /* Fill subquery for course */
if (ScopesAllowed & 1 << Sco_SCOPE_CRS) if (ScopesAllowed & 1 << Sco_SCOPE_CRS)
{ {
if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS)
sprintf (SubQuery[Sco_SCOPE_CRS],"%s(" {
"Scope='%s' AND Cod=%ld%s" if (asprintf (&SubQuery[Sco_SCOPE_CRS],"%s("
" AND " "Scope='%s' AND Cod=%ld%s"
"(SvyCod NOT IN" " AND "
" (SELECT SvyCod FROM svy_grp)" "(SvyCod NOT IN"
" OR" " (SELECT SvyCod FROM svy_grp)"
" SvyCod IN" " OR"
" (SELECT svy_grp.SvyCod" " SvyCod IN"
" FROM svy_grp,crs_grp_usr" " (SELECT svy_grp.SvyCod"
" WHERE crs_grp_usr.UsrCod=%ld" " FROM svy_grp,crs_grp_usr"
" AND svy_grp.GrpCod=crs_grp_usr.GrpCod))" " WHERE crs_grp_usr.UsrCod=%ld"
")", " AND svy_grp.GrpCod=crs_grp_usr.GrpCod))"
SubQueryFilled ? " OR " : ")",
"", SubQueryFilled ? " OR " :
Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS], "",
(HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" : Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS],
" AND Hidden='N'", (HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" :
Gbl.Usrs.Me.UsrDat.UsrCod); " AND Hidden='N'",
Gbl.Usrs.Me.UsrDat.UsrCod) < 0)
Lay_NotEnoughMemoryExit ();
}
else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS
sprintf (SubQuery[Sco_SCOPE_CRS],"%s(Scope='%s' AND Cod=%ld%s)", {
SubQueryFilled ? " OR " : if (asprintf (&SubQuery[Sco_SCOPE_CRS],"%s(Scope='%s' AND Cod=%ld%s)",
"", SubQueryFilled ? " OR " :
Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS], "",
(HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" : Sco_ScopeDB[Sco_SCOPE_CRS],Cods[Sco_SCOPE_CRS],
" AND Hidden='N'"); (HiddenAllowed & 1 << Sco_SCOPE_CRS) ? "" :
" AND Hidden='N'") < 0)
Lay_NotEnoughMemoryExit ();
}
SubQueryFilled = true; SubQueryFilled = true;
} }
else else
SubQuery[Sco_SCOPE_CRS][0] = '\0'; {
if (asprintf (&SubQuery[Sco_SCOPE_CRS],"%s","") < 0)
Lay_NotEnoughMemoryExit ();
}
/* Make query */ /* Make query */
if (SubQueryFilled) if (SubQueryFilled)
{
switch (Gbl.Svys.SelectedOrder)
{
case Svy_ORDER_BY_START_DATE:
sprintf (OrderBySubQuery,"StartTime DESC,EndTime DESC,Title DESC");
break;
case Svy_ORDER_BY_END_DATE:
sprintf (OrderBySubQuery,"EndTime DESC,StartTime DESC,Title DESC");
break;
}
NumRows = DB_QuerySELECT (&mysql_res,"can not get surveys", NumRows = DB_QuerySELECT (&mysql_res,"can not get surveys",
"SELECT SvyCod FROM surveys" "SELECT SvyCod FROM surveys"
" WHERE %s%s%s%s%s%s" " WHERE %s%s%s%s%s%s"
@ -947,14 +955,19 @@ void Svy_GetListSurveys (void)
SubQuery[Sco_SCOPE_CTR], SubQuery[Sco_SCOPE_CTR],
SubQuery[Sco_SCOPE_DEG], SubQuery[Sco_SCOPE_DEG],
SubQuery[Sco_SCOPE_CRS], SubQuery[Sco_SCOPE_CRS],
OrderBySubQuery); OrderBySubQuery[Gbl.Svys.SelectedOrder]);
}
else else
{ {
Lay_ShowErrorAndExit ("Can not get list of surveys."); Lay_ShowErrorAndExit ("Can not get list of surveys.");
NumRows = 0; // Not reached. Initialized to avoid warning NumRows = 0; // Not reached. Initialized to avoid warning
} }
/* Free allocated memory for subqueries */
for (Scope = Sco_SCOPE_SYS;
Scope <= Sco_SCOPE_CRS;
Scope++)
free ((void *) SubQuery[Scope]);
if (NumRows) // Surveys found... if (NumRows) // Surveys found...
{ {
Gbl.Svys.Num = (unsigned) NumRows; Gbl.Svys.Num = (unsigned) NumRows;

View File

@ -45575,6 +45575,66 @@ const char *Txt_The_list_of_X_users_is_too_large_to_be_displayed = // Warning: i
"A lista de %u usu&aacute;rios &eacute; muito grande para ser exibida."; "A lista de %u usu&aacute;rios &eacute; muito grande para ser exibida.";
#endif #endif
const char *Txt_The_location_of_the_classroom_X_has_changed_to_Y = // Warning: it is very important to include two %s in the following sentences
#if L==1 // ca
"La ubicaci&oacute; de l'aula <strong>%s</strong>"
" ha canviat a <strong>%s</strong>.";
#elif L==2 // de
"Der Standort des Klassenzimmer <strong>%s</strong>"
" wurde in <strong>%s</strong> ge&auml;ndert.";
#elif L==3 // en
"The location of the classroom <strong>%s</strong>"
" has changed to <strong>%s</strong>.";
#elif L==4 // es
"La ubicaci&oacute;n del aula <strong>%s</strong>"
" ha cambiado a <strong>%s</strong>.";
#elif L==5 // fr
"L'emplacement de la salle de classe <strong>%s</strong>"
" a &eacute;t&eacute; remplac&eacute; par <strong>%s</strong>.";
#elif L==6 // gn
"La ubicaci&oacute;n del aula <strong>%s</strong>"
" ha cambiado a <strong>%s</strong>."; // Okoteve traducción
#elif L==7 // it
"La posizione della aula <strong>%s</strong>"
" &egrave; cambiata in <strong>%s</strong>.";
#elif L==8 // pl
"Lokalizacja klasy <strong>%s</strong>"
" zmieni&lstrok;a si&eogon; na <strong>%s</strong>.";
#elif L==9 // pt
"A localiza&ccedil;&atilde;o da sala de clase <strong>%s</strong>"
" mudou para <strong>%s</strong>.";
#endif
const char *Txt_The_location_of_the_classroom_X_has_not_changed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La ubicaci&oacute; de l'aula <strong>%s</strong>"
" no ha canviat.";
#elif L==2 // de
"Der Standort des Klassenzimmer <strong>%s</strong>"
" hat sich nicht ge&auml;ndert.";
#elif L==3 // en
"The location of the classroom <strong>%s</strong>"
" has not changed.";
#elif L==4 // es
"La ubicaci&oacute;n del aula <strong>%s</strong>"
" no ha cambiado.";
#elif L==5 // fr
"L'emplacement de la salle de classe <strong>%s</strong>"
" n'a pas chang&eacute;.";
#elif L==6 // gn
"La ubicaci&oacute;n del aula <strong>%s</strong>"
" no ha cambiado."; // Okoteve traducción
#elif L==7 // it
"La posizione della aula <strong>%s</strong>"
" non &egrave; cambiata.";
#elif L==8 // pl
"Lokalizacja klasy <strong>%s</strong>"
" nie uleg&lstrok;a zmianie.";
#elif L==9 // pt
"A localiza&ccedil;&atilde;o da sala de clase <strong>%s</strong>"
" n&atilde;o foi alterada.";
#endif
const char *Txt_The_lower_limit_of_correct_answers_must_be_less_than_or_equal_to_the_upper_limit = const char *Txt_The_lower_limit_of_correct_answers_must_be_less_than_or_equal_to_the_upper_limit =
#if L==1 // ca #if L==1 // ca
"El l&iacute;mite inferior del intervalo de respuestas correctas" "El l&iacute;mite inferior del intervalo de respuestas correctas"
@ -45804,7 +45864,7 @@ const char *Txt_The_name_of_the_classroom_X_has_not_changed = // Warning: it is
#if L==1 // ca #if L==1 // ca
"El nom de l'aula <strong>%s</strong> no ha canviat."; "El nom de l'aula <strong>%s</strong> no ha canviat.";
#elif L==2 // de #elif L==2 // de
"Der Name von Klassenzimmer <strong>%s</strong> hat sich nicht ge&auml;ndert."; "Der Name des Klassenzimmer <strong>%s</strong> hat sich nicht ge&auml;ndert.";
#elif L==3 // en #elif L==3 // en
"The name of the classroom <strong>%s</strong> has not changed."; "The name of the classroom <strong>%s</strong> has not changed.";
#elif L==4 // es #elif L==4 // es