Version 18.7.8

This commit is contained in:
Antonio Cañas Vargas 2018-10-18 23:38:06 +02:00
parent 16272ff23e
commit 7c17769d68
2 changed files with 301 additions and 261 deletions

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
@ -621,7 +623,7 @@ void Asg_GetListAssignments (void)
{ {
char HiddenSubQuery[256]; char HiddenSubQuery[256];
char OrderBySubQuery[256]; char OrderBySubQuery[256];
char Query[2048]; char *Query;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -651,24 +653,30 @@ void Asg_GetListAssignments (void)
break; break;
} }
if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS)
sprintf (Query,"SELECT AsgCod" {
" FROM assignments" if (asprintf (&Query,"SELECT AsgCod"
" WHERE CrsCod=%ld%s" " FROM assignments"
" AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR" " WHERE CrsCod=%ld%s"
" AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" " AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR"
" WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))" " AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr"
" ORDER BY %s", " WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))"
Gbl.CurrentCrs.Crs.CrsCod, " ORDER BY %s",
HiddenSubQuery, Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod, HiddenSubQuery,
OrderBySubQuery); Gbl.Usrs.Me.UsrDat.UsrCod,
OrderBySubQuery) < 0)
Lay_NotEnoughMemoryExit ();
}
else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS
sprintf (Query,"SELECT AsgCod" {
" FROM assignments" if (asprintf (&Query,"SELECT AsgCod"
" WHERE CrsCod=%ld%s" " FROM assignments"
" ORDER BY %s", " WHERE CrsCod=%ld%s"
Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery); " ORDER BY %s",
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get assignments"); Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery) < 0)
Lay_NotEnoughMemoryExit ();
}
NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get assignments");
if (NumRows) // Assignments found... if (NumRows) // Assignments found...
{ {
@ -704,19 +712,20 @@ void Asg_GetListAssignments (void)
void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg) void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg)
{ {
char Query[1024]; char *Query;
if (Asg->AsgCod > 0) if (Asg->AsgCod > 0)
{ {
/***** Build query *****/ /***** Build query *****/
sprintf (Query,"SELECT AsgCod,Hidden,UsrCod," if (asprintf (&Query,"SELECT AsgCod,Hidden,UsrCod,"
"UNIX_TIMESTAMP(StartTime)," "UNIX_TIMESTAMP(StartTime),"
"UNIX_TIMESTAMP(EndTime)," "UNIX_TIMESTAMP(EndTime),"
"NOW() BETWEEN StartTime AND EndTime," "NOW() BETWEEN StartTime AND EndTime,"
"Title,Folder" "Title,Folder"
" FROM assignments" " FROM assignments"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld AND CrsCod=%ld",
Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0)
Lay_NotEnoughMemoryExit ();
/***** Get data of assignment *****/ /***** Get data of assignment *****/
Asg_GetDataOfAssignment (Asg,Query); Asg_GetDataOfAssignment (Asg,Query);
@ -735,19 +744,20 @@ void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg)
void Asg_GetDataOfAssignmentByFolder (struct Assignment *Asg) void Asg_GetDataOfAssignmentByFolder (struct Assignment *Asg)
{ {
char Query[1024 + Brw_MAX_BYTES_FOLDER]; char *Query;
if (Asg->Folder[0]) if (Asg->Folder[0])
{ {
/***** Query database *****/ /***** Query database *****/
sprintf (Query,"SELECT AsgCod,Hidden,UsrCod," if (asprintf (&Query,"SELECT AsgCod,Hidden,UsrCod,"
"UNIX_TIMESTAMP(StartTime)," "UNIX_TIMESTAMP(StartTime),"
"UNIX_TIMESTAMP(EndTime)," "UNIX_TIMESTAMP(EndTime),"
"NOW() BETWEEN StartTime AND EndTime," "NOW() BETWEEN StartTime AND EndTime,"
"Title,Folder" "Title,Folder"
" FROM assignments" " FROM assignments"
" WHERE CrsCod=%ld AND Folder='%s'", " WHERE CrsCod=%ld AND Folder='%s'",
Gbl.CurrentCrs.Crs.CrsCod,Asg->Folder); Gbl.CurrentCrs.Crs.CrsCod,Asg->Folder) < 0)
Lay_NotEnoughMemoryExit ();
/***** Get data of assignment *****/ /***** Get data of assignment *****/
Asg_GetDataOfAssignment (Asg,Query); Asg_GetDataOfAssignment (Asg,Query);
@ -773,7 +783,7 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query)
Asg_ResetAssignment (Asg); Asg_ResetAssignment (Asg);
/***** Get data of assignment from database *****/ /***** Get data of assignment from database *****/
if (DB_QuerySELECT (Query,&mysql_res,"can not get assignment data")) // Assignment found... if (DB_QuerySELECT_free (Query,&mysql_res,"can not get assignment data")) // Assignment found...
{ {
/* Get row */ /* Get row */
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
@ -855,15 +865,16 @@ void Asg_FreeListAssignments (void)
static void Asg_GetAssignmentTxtFromDB (long AsgCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) static void Asg_GetAssignmentTxtFromDB (long AsgCod,char Txt[Cns_MAX_BYTES_TEXT + 1])
{ {
char Query[512]; char *Query;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
/***** Get text of assignment from database *****/ /***** Get text of assignment from database *****/
sprintf (Query,"SELECT Txt FROM assignments" if (asprintf (&Query,"SELECT Txt FROM assignments"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld AND CrsCod=%ld",
AsgCod,Gbl.CurrentCrs.Crs.CrsCod); AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0)
Lay_NotEnoughMemoryExit ();
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get assignment text"); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get assignment text");
/***** The result of the query must have one row or none *****/ /***** The result of the query must have one row or none *****/
@ -893,41 +904,43 @@ void Asg_GetNotifAssignment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr, char **ContentStr,
long AsgCod,bool GetContent) long AsgCod,bool GetContent)
{ {
char Query[512]; char *Query;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows;
size_t Length; size_t Length;
SummaryStr[0] = '\0'; // Return nothing on error SummaryStr[0] = '\0'; // Return nothing on error
/***** Build query *****/ /***** Build query *****/
sprintf (Query,"SELECT Title,Txt FROM assignments WHERE AsgCod=%ld", if (asprintf (&Query,"SELECT Title,Txt FROM assignments WHERE AsgCod=%ld",
AsgCod); AsgCod) < 0)
if (!mysql_query (&Gbl.mysql,Query)) Lay_NotEnoughMemoryExit ();
if ((mysql_res = mysql_store_result (&Gbl.mysql)) != NULL) NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get assignment title and text");
{
/***** Result should have a unique row *****/
if (mysql_num_rows (mysql_res) == 1)
{
/***** Get row *****/
row = mysql_fetch_row (mysql_res);
/***** Get summary *****/ /***** Result should have a unique row *****/
Str_Copy (SummaryStr,row[0], if (NumRows == 1)
Ntf_MAX_BYTES_SUMMARY); {
/***** Get row *****/
row = mysql_fetch_row (mysql_res);
/***** Get content *****/ /***** Get summary *****/
if (GetContent) Str_Copy (SummaryStr,row[0],
{ Ntf_MAX_BYTES_SUMMARY);
Length = strlen (row[1]);
if ((*ContentStr = (char *) malloc (Length + 1)) == NULL) /***** Get content *****/
Lay_ShowErrorAndExit ("Error allocating memory for notification content."); if (GetContent)
Str_Copy (*ContentStr,row[1], {
Length); Length = strlen (row[1]);
} if ((*ContentStr = (char *) malloc (Length + 1)) == NULL)
} Lay_ShowErrorAndExit ("Error allocating memory for notification content.");
mysql_free_result (mysql_res); Str_Copy (*ContentStr,row[1],
} Length);
}
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -991,7 +1004,7 @@ void Asg_ReqRemAssignment (void)
void Asg_RemoveAssignment (void) void Asg_RemoveAssignment (void)
{ {
extern const char *Txt_Assignment_X_removed; extern const char *Txt_Assignment_X_removed;
char Query[512]; char *Query;
struct Assignment Asg; struct Assignment Asg;
/***** Get assignment code *****/ /***** Get assignment code *****/
@ -1009,10 +1022,11 @@ void Asg_RemoveAssignment (void)
Asg_RemoveAllTheGrpsAssociatedToAnAssignment (Asg.AsgCod); Asg_RemoveAllTheGrpsAssociatedToAnAssignment (Asg.AsgCod);
/***** Remove assignment *****/ /***** Remove assignment *****/
sprintf (Query,"DELETE FROM assignments" if (asprintf (&Query,"DELETE FROM assignments"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld AND CrsCod=%ld",
Asg.AsgCod,Gbl.CurrentCrs.Crs.CrsCod); Asg.AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0)
DB_QueryDELETE (Query,"can not remove assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryDELETE_free (Query,"can not remove assignment");
/***** Mark possible notifications as removed *****/ /***** Mark possible notifications as removed *****/
Ntf_MarkNotifAsRemoved (Ntf_EVENT_ASSIGNMENT,Asg.AsgCod); Ntf_MarkNotifAsRemoved (Ntf_EVENT_ASSIGNMENT,Asg.AsgCod);
@ -1034,7 +1048,7 @@ void Asg_RemoveAssignment (void)
void Asg_HideAssignment (void) void Asg_HideAssignment (void)
{ {
extern const char *Txt_Assignment_X_is_now_hidden; extern const char *Txt_Assignment_X_is_now_hidden;
char Query[512]; char *Query;
struct Assignment Asg; struct Assignment Asg;
/***** Get assignment code *****/ /***** Get assignment code *****/
@ -1045,10 +1059,11 @@ void Asg_HideAssignment (void)
Asg_GetDataOfAssignmentByCod (&Asg); Asg_GetDataOfAssignmentByCod (&Asg);
/***** Hide assignment *****/ /***** Hide assignment *****/
sprintf (Query,"UPDATE assignments SET Hidden='Y'" if (asprintf (&Query,"UPDATE assignments SET Hidden='Y'"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld AND CrsCod=%ld",
Asg.AsgCod,Gbl.CurrentCrs.Crs.CrsCod); Asg.AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0)
DB_QueryUPDATE (Query,"can not hide assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryUPDATE_free (Query,"can not hide assignment");
/***** Write message to show the change made *****/ /***** Write message to show the change made *****/
snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt), snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt),
@ -1067,7 +1082,7 @@ void Asg_HideAssignment (void)
void Asg_ShowAssignment (void) void Asg_ShowAssignment (void)
{ {
extern const char *Txt_Assignment_X_is_now_visible; extern const char *Txt_Assignment_X_is_now_visible;
char Query[512]; char *Query;
struct Assignment Asg; struct Assignment Asg;
/***** Get assignment code *****/ /***** Get assignment code *****/
@ -1078,10 +1093,11 @@ void Asg_ShowAssignment (void)
Asg_GetDataOfAssignmentByCod (&Asg); Asg_GetDataOfAssignmentByCod (&Asg);
/***** Hide assignment *****/ /***** Hide assignment *****/
sprintf (Query,"UPDATE assignments SET Hidden='N'" if (asprintf (&Query,"UPDATE assignments SET Hidden='N'"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld AND CrsCod=%ld",
Asg.AsgCod,Gbl.CurrentCrs.Crs.CrsCod); Asg.AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0)
DB_QueryUPDATE (Query,"can not show assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryUPDATE_free (Query,"can not show assignment");
/***** Write message to show the change made *****/ /***** Write message to show the change made *****/
snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt), snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt),
@ -1099,13 +1115,14 @@ void Asg_ShowAssignment (void)
static bool Asg_CheckIfSimilarAssignmentExists (const char *Field,const char *Value,long AsgCod) static bool Asg_CheckIfSimilarAssignmentExists (const char *Field,const char *Value,long AsgCod)
{ {
char Query[256 + Asg_MAX_BYTES_ASSIGNMENT_TITLE]; char *Query;
/***** Get number of assignments with a field value from database *****/ /***** Get number of assignments with a field value from database *****/
sprintf (Query,"SELECT COUNT(*) FROM assignments" if (asprintf (&Query,"SELECT COUNT(*) FROM assignments"
" WHERE CrsCod=%ld AND %s='%s' AND AsgCod<>%ld", " WHERE CrsCod=%ld AND %s='%s' AND AsgCod<>%ld",
Gbl.CurrentCrs.Crs.CrsCod,Field,Value,AsgCod); Gbl.CurrentCrs.Crs.CrsCod,Field,Value,AsgCod) < 0)
return (DB_QueryCOUNT (Query,"can not get similar assignments") != 0); Lay_NotEnoughMemoryExit ();
return (DB_QueryCOUNT_free (Query,"can not get similar assignments") != 0);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1469,13 +1486,14 @@ void Asg_RecFormAssignment (void)
static void Asg_UpdateNumUsrsNotifiedByEMailAboutAssignment (long AsgCod,unsigned NumUsrsToBeNotifiedByEMail) static void Asg_UpdateNumUsrsNotifiedByEMailAboutAssignment (long AsgCod,unsigned NumUsrsToBeNotifiedByEMail)
{ {
char Query[512]; char *Query;
/***** Update number of users notified *****/ /***** Update number of users notified *****/
sprintf (Query,"UPDATE assignments SET NumNotif=NumNotif+%u" if (asprintf (&Query,"UPDATE assignments SET NumNotif=NumNotif+%u"
" WHERE AsgCod=%ld", " WHERE AsgCod=%ld",
NumUsrsToBeNotifiedByEMail,AsgCod); NumUsrsToBeNotifiedByEMail,AsgCod) < 0)
DB_QueryUPDATE (Query,"can not update the number of notifications of an assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryUPDATE_free (Query,"can not update the number of notifications of an assignment");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1484,24 +1502,23 @@ static void Asg_UpdateNumUsrsNotifiedByEMailAboutAssignment (long AsgCod,unsigne
static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt)
{ {
char Query[1024 + char *Query;
Asg_MAX_BYTES_ASSIGNMENT_TITLE +
Cns_MAX_BYTES_TEXT];
/***** Create a new assignment *****/ /***** Create a new assignment *****/
sprintf (Query,"INSERT INTO assignments" if (asprintf (&Query,"INSERT INTO assignments"
" (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)" " (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)"
" VALUES" " VALUES"
" (%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld)," " (%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
"'%s','%s','%s')", "'%s','%s','%s')",
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
Asg->TimeUTC[Dat_START_TIME], Asg->TimeUTC[Dat_START_TIME],
Asg->TimeUTC[Dat_END_TIME ], Asg->TimeUTC[Dat_END_TIME ],
Asg->Title, Asg->Title,
Asg->Folder, Asg->Folder,
Txt); Txt) < 0)
Asg->AsgCod = DB_QueryINSERTandReturnCode (Query,"can not create new assignment"); Lay_NotEnoughMemoryExit ();
Asg->AsgCod = DB_QueryINSERTandReturnCode_free (Query,"can not create new assignment");
/***** Create groups *****/ /***** Create groups *****/
if (Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps) if (Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps)
@ -1514,23 +1531,22 @@ static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt)
static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt) static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt)
{ {
char Query[1024 + char *Query;
Asg_MAX_BYTES_ASSIGNMENT_TITLE +
Cns_MAX_BYTES_TEXT];
/***** Update the data of the assignment *****/ /***** Update the data of the assignment *****/
sprintf (Query,"UPDATE assignments SET " if (asprintf (&Query,"UPDATE assignments SET "
"StartTime=FROM_UNIXTIME(%ld)," "StartTime=FROM_UNIXTIME(%ld),"
"EndTime=FROM_UNIXTIME(%ld)," "EndTime=FROM_UNIXTIME(%ld),"
"Title='%s',Folder='%s',Txt='%s'" "Title='%s',Folder='%s',Txt='%s'"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld AND CrsCod=%ld",
Asg->TimeUTC[Dat_START_TIME], Asg->TimeUTC[Dat_START_TIME],
Asg->TimeUTC[Dat_END_TIME ], Asg->TimeUTC[Dat_END_TIME ],
Asg->Title, Asg->Title,
Asg->Folder, Asg->Folder,
Txt, Txt,
Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0)
DB_QueryUPDATE (Query,"can not update assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryUPDATE_free (Query,"can not update assignment");
/***** Update groups *****/ /***** Update groups *****/
/* Remove old groups */ /* Remove old groups */
@ -1547,12 +1563,13 @@ static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt)
static bool Asg_CheckIfAsgIsAssociatedToGrps (long AsgCod) static bool Asg_CheckIfAsgIsAssociatedToGrps (long AsgCod)
{ {
char Query[256]; char *Query;
/***** Get if an assignment is associated to a group from database *****/ /***** Get if an assignment is associated to a group from database *****/
sprintf (Query,"SELECT COUNT(*) FROM asg_grp WHERE AsgCod=%ld", if (asprintf (&Query,"SELECT COUNT(*) FROM asg_grp WHERE AsgCod=%ld",
AsgCod); AsgCod) < 0)
return (DB_QueryCOUNT (Query,"can not check if an assignment is associated to groups") != 0); Lay_NotEnoughMemoryExit ();
return (DB_QueryCOUNT_free (Query,"can not check if an assignment is associated to groups") != 0);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1561,13 +1578,14 @@ static bool Asg_CheckIfAsgIsAssociatedToGrps (long AsgCod)
bool Asg_CheckIfAsgIsAssociatedToGrp (long AsgCod,long GrpCod) bool Asg_CheckIfAsgIsAssociatedToGrp (long AsgCod,long GrpCod)
{ {
char Query[256]; char *Query;
/***** Get if an assignment is associated to a group from database *****/ /***** Get if an assignment is associated to a group from database *****/
sprintf (Query,"SELECT COUNT(*) FROM asg_grp" if (asprintf (&Query,"SELECT COUNT(*) FROM asg_grp"
" WHERE AsgCod=%ld AND GrpCod=%ld", " WHERE AsgCod=%ld AND GrpCod=%ld",
AsgCod,GrpCod); AsgCod,GrpCod) < 0)
return (DB_QueryCOUNT (Query,"can not check if an assignment is associated to a group") != 0); Lay_NotEnoughMemoryExit ();
return (DB_QueryCOUNT_free (Query,"can not check if an assignment is associated to a group") != 0);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1576,11 +1594,12 @@ bool Asg_CheckIfAsgIsAssociatedToGrp (long AsgCod,long GrpCod)
static void Asg_RemoveAllTheGrpsAssociatedToAnAssignment (long AsgCod) static void Asg_RemoveAllTheGrpsAssociatedToAnAssignment (long AsgCod)
{ {
char Query[256]; char *Query;
/***** Remove groups of the assignment *****/ /***** Remove groups of the assignment *****/
sprintf (Query,"DELETE FROM asg_grp WHERE AsgCod=%ld",AsgCod); if (asprintf (&Query,"DELETE FROM asg_grp WHERE AsgCod=%ld",AsgCod) < 0)
DB_QueryDELETE (Query,"can not remove the groups associated to an assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryDELETE_free (Query,"can not remove the groups associated to an assignment");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1589,11 +1608,12 @@ static void Asg_RemoveAllTheGrpsAssociatedToAnAssignment (long AsgCod)
void Asg_RemoveGroup (long GrpCod) void Asg_RemoveGroup (long GrpCod)
{ {
char Query[256]; char *Query;
/***** Remove group from all the assignments *****/ /***** Remove group from all the assignments *****/
sprintf (Query,"DELETE FROM asg_grp WHERE GrpCod=%ld",GrpCod); if (asprintf (&Query,"DELETE FROM asg_grp WHERE GrpCod=%ld",GrpCod) < 0)
DB_QueryDELETE (Query,"can not remove group from the associations between assignments and groups"); Lay_NotEnoughMemoryExit ();
DB_QueryDELETE_free (Query,"can not remove group from the associations between assignments and groups");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1602,14 +1622,15 @@ void Asg_RemoveGroup (long GrpCod)
void Asg_RemoveGroupsOfType (long GrpTypCod) void Asg_RemoveGroupsOfType (long GrpTypCod)
{ {
char Query[256]; char *Query;
/***** Remove group from all the assignments *****/ /***** Remove group from all the assignments *****/
sprintf (Query,"DELETE FROM asg_grp USING crs_grp,asg_grp" if (asprintf (&Query,"DELETE FROM asg_grp USING crs_grp,asg_grp"
" WHERE crs_grp.GrpTypCod=%ld" " WHERE crs_grp.GrpTypCod=%ld"
" AND crs_grp.GrpCod=asg_grp.GrpCod", " AND crs_grp.GrpCod=asg_grp.GrpCod",
GrpTypCod); GrpTypCod) < 0)
DB_QueryDELETE (Query,"can not remove groups of a type from the associations between assignments and groups"); Lay_NotEnoughMemoryExit ();
DB_QueryDELETE_free (Query,"can not remove groups of a type from the associations between assignments and groups");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1619,7 +1640,7 @@ void Asg_RemoveGroupsOfType (long GrpTypCod)
static void Asg_CreateGrps (long AsgCod) static void Asg_CreateGrps (long AsgCod)
{ {
unsigned NumGrpSel; unsigned NumGrpSel;
char Query[256]; char *Query;
/***** Create groups of the assignment *****/ /***** Create groups of the assignment *****/
for (NumGrpSel = 0; for (NumGrpSel = 0;
@ -1627,12 +1648,13 @@ static void Asg_CreateGrps (long AsgCod)
NumGrpSel++) NumGrpSel++)
{ {
/* Create group */ /* Create group */
sprintf (Query,"INSERT INTO asg_grp" if (asprintf (&Query,"INSERT INTO asg_grp"
" (AsgCod,GrpCod)" " (AsgCod,GrpCod)"
" VALUES" " VALUES"
" (%ld,%ld)", " (%ld,%ld)",
AsgCod,Gbl.CurrentCrs.Grps.LstGrpsSel.GrpCods[NumGrpSel]); AsgCod,Gbl.CurrentCrs.Grps.LstGrpsSel.GrpCods[NumGrpSel]) < 0)
DB_QueryINSERT (Query,"can not associate a group to an assignment"); Lay_NotEnoughMemoryExit ();
DB_QueryINSERT_free (Query,"can not associate a group to an assignment");
} }
} }
@ -1646,21 +1668,22 @@ static void Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (struct Assignment *Asg)
extern const char *Txt_Groups; extern const char *Txt_Groups;
extern const char *Txt_and; extern const char *Txt_and;
extern const char *Txt_The_whole_course; extern const char *Txt_The_whole_course;
char Query[512]; char *Query;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRow; unsigned long NumRow;
unsigned long NumRows; unsigned long NumRows;
/***** Get groups associated to an assignment from database *****/ /***** Get groups associated to an assignment from database *****/
sprintf (Query,"SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" if (asprintf (&Query,"SELECT crs_grp_types.GrpTypName,crs_grp.GrpName"
" FROM asg_grp,crs_grp,crs_grp_types" " FROM asg_grp,crs_grp,crs_grp_types"
" WHERE asg_grp.AsgCod=%ld" " WHERE asg_grp.AsgCod=%ld"
" AND asg_grp.GrpCod=crs_grp.GrpCod" " AND asg_grp.GrpCod=crs_grp.GrpCod"
" AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod"
" ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName",
Asg->AsgCod); Asg->AsgCod) < 0)
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get groups of an assignment"); Lay_NotEnoughMemoryExit ();
NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get groups of an assignment");
/***** Write heading *****/ /***** Write heading *****/
fprintf (Gbl.F.Out,"<div class=\"%s\">%s: ", fprintf (Gbl.F.Out,"<div class=\"%s\">%s: ",
@ -1709,18 +1732,20 @@ static void Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (struct Assignment *Asg)
void Asg_RemoveCrsAssignments (long CrsCod) void Asg_RemoveCrsAssignments (long CrsCod)
{ {
char Query[512]; char *Query;
/***** Remove groups *****/ /***** Remove groups *****/
sprintf (Query,"DELETE FROM asg_grp USING assignments,asg_grp" if (asprintf (&Query,"DELETE FROM asg_grp USING assignments,asg_grp"
" WHERE assignments.CrsCod=%ld" " WHERE assignments.CrsCod=%ld"
" AND assignments.AsgCod=asg_grp.AsgCod", " AND assignments.AsgCod=asg_grp.AsgCod",
CrsCod); CrsCod) < 0)
DB_QueryDELETE (Query,"can not remove all the groups associated to assignments of a course"); Lay_NotEnoughMemoryExit ();
DB_QueryDELETE_free (Query,"can not remove all the groups associated to assignments of a course");
/***** Remove assignments *****/ /***** Remove assignments *****/
sprintf (Query,"DELETE FROM assignments WHERE CrsCod=%ld",CrsCod); if (asprintf (&Query,"DELETE FROM assignments WHERE CrsCod=%ld",CrsCod) < 0)
DB_QueryDELETE (Query,"can not remove all the assignments of a course"); Lay_NotEnoughMemoryExit ();
DB_QueryDELETE_free (Query,"can not remove all the assignments of a course");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1729,7 +1754,7 @@ void Asg_RemoveCrsAssignments (long CrsCod)
static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod) static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
{ {
char Query[512]; char *Query;
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
@ -1738,19 +1763,20 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
case Rol_TCH: case Rol_TCH:
// Students and teachers can do assignments depending on groups // Students and teachers can do assignments depending on groups
/***** Get if I can do an assignment from database *****/ /***** Get if I can do an assignment from database *****/
sprintf (Query,"SELECT COUNT(*) FROM assignments" if (asprintf (&Query,"SELECT COUNT(*) FROM assignments"
" WHERE AsgCod=%ld" " WHERE AsgCod=%ld"
" AND " " AND "
"(" "("
"AsgCod NOT IN (SELECT AsgCod FROM asg_grp)" // Assignment is for the whole course "AsgCod NOT IN (SELECT AsgCod FROM asg_grp)" // Assignment is for the whole course
" OR " " OR "
"AsgCod IN" // Assignment is for specific groups "AsgCod IN" // Assignment is for specific groups
" (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" " (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr"
" WHERE crs_grp_usr.UsrCod=%ld" " WHERE crs_grp_usr.UsrCod=%ld"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod)" " AND asg_grp.GrpCod=crs_grp_usr.GrpCod)"
")", ")",
AsgCod,Gbl.Usrs.Me.UsrDat.UsrCod); AsgCod,Gbl.Usrs.Me.UsrDat.UsrCod) < 0)
return (DB_QueryCOUNT (Query,"can not check if I can do an assignment") != 0); Lay_NotEnoughMemoryExit ();
return (DB_QueryCOUNT_free (Query,"can not check if I can do an assignment") != 0);
case Rol_DEG_ADM: case Rol_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
@ -1768,12 +1794,13 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
unsigned Asg_GetNumAssignmentsInCrs (long CrsCod) unsigned Asg_GetNumAssignmentsInCrs (long CrsCod)
{ {
char Query[256]; char *Query;
/***** Get number of assignments in a course from database *****/ /***** Get number of assignments in a course from database *****/
sprintf (Query,"SELECT COUNT(*) FROM assignments WHERE CrsCod=%ld", if (asprintf (&Query,"SELECT COUNT(*) FROM assignments WHERE CrsCod=%ld",
CrsCod); CrsCod) < 0)
return (unsigned) DB_QueryCOUNT (Query,"can not get number of assignments in course"); Lay_NotEnoughMemoryExit ();
return (unsigned) DB_QueryCOUNT_free (Query,"can not get number of assignments in course");
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1784,7 +1811,7 @@ unsigned Asg_GetNumAssignmentsInCrs (long CrsCod)
unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope) unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope)
{ {
char Query[1024]; char *Query;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumCourses; unsigned NumCourses;
@ -1793,59 +1820,65 @@ unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope)
switch (Scope) switch (Scope)
{ {
case Sco_SCOPE_SYS: case Sco_SCOPE_SYS:
sprintf (Query,"SELECT COUNT(DISTINCT CrsCod)" if (asprintf (&Query,"SELECT COUNT(DISTINCT CrsCod)"
" FROM assignments" " FROM assignments"
" WHERE CrsCod>0"); " WHERE CrsCod>0") < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_CTY: case Sco_SCOPE_CTY:
sprintf (Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)"
" FROM institutions,centres,degrees,courses,assignments" " FROM institutions,centres,degrees,courses,assignments"
" WHERE institutions.CtyCod=%ld" " WHERE institutions.CtyCod=%ld"
" AND institutions.InsCod=centres.InsCod" " AND institutions.InsCod=centres.InsCod"
" AND centres.CtrCod=degrees.CtrCod" " AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.Status=0" " AND courses.Status=0"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentCty.Cty.CtyCod); Gbl.CurrentCty.Cty.CtyCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_INS: case Sco_SCOPE_INS:
sprintf (Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)"
" FROM centres,degrees,courses,assignments" " FROM centres,degrees,courses,assignments"
" WHERE centres.InsCod=%ld" " WHERE centres.InsCod=%ld"
" AND centres.CtrCod=degrees.CtrCod" " AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.Status=0" " AND courses.Status=0"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentIns.Ins.InsCod); Gbl.CurrentIns.Ins.InsCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_CTR: case Sco_SCOPE_CTR:
sprintf (Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)"
" FROM degrees,courses,assignments" " FROM degrees,courses,assignments"
" WHERE degrees.CtrCod=%ld" " WHERE degrees.CtrCod=%ld"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.Status=0" " AND courses.Status=0"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentCtr.Ctr.CtrCod); Gbl.CurrentCtr.Ctr.CtrCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_DEG: case Sco_SCOPE_DEG:
sprintf (Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)"
" FROM courses,assignments" " FROM courses,assignments"
" WHERE courses.DegCod=%ld" " WHERE courses.DegCod=%ld"
" AND courses.Status=0" " AND courses.Status=0"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentDeg.Deg.DegCod); Gbl.CurrentDeg.Deg.DegCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_CRS: case Sco_SCOPE_CRS:
sprintf (Query,"SELECT COUNT(DISTINCT CrsCod)" if (asprintf (&Query,"SELECT COUNT(DISTINCT CrsCod)"
" FROM assignments" " FROM assignments"
" WHERE CrsCod=%ld", " WHERE CrsCod=%ld",
Gbl.CurrentCrs.Crs.CrsCod); Gbl.CurrentCrs.Crs.CrsCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
default: default:
Lay_ShowErrorAndExit ("Wrong scope."); Lay_ShowErrorAndExit ("Wrong scope.");
break; break;
} }
DB_QuerySELECT (Query,&mysql_res,"can not get number of courses with assignments"); DB_QuerySELECT_free (Query,&mysql_res,"can not get number of courses with assignments");
/***** Get number of courses *****/ /***** Get number of courses *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
@ -1866,7 +1899,7 @@ unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope)
unsigned Asg_GetNumAssignments (Sco_Scope_t Scope,unsigned *NumNotif) unsigned Asg_GetNumAssignments (Sco_Scope_t Scope,unsigned *NumNotif)
{ {
char Query[1024]; char *Query;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumAssignments; unsigned NumAssignments;
@ -1875,55 +1908,61 @@ unsigned Asg_GetNumAssignments (Sco_Scope_t Scope,unsigned *NumNotif)
switch (Scope) switch (Scope)
{ {
case Sco_SCOPE_SYS: case Sco_SCOPE_SYS:
sprintf (Query,"SELECT COUNT(*),SUM(NumNotif)" if (asprintf (&Query,"SELECT COUNT(*),SUM(NumNotif)"
" FROM assignments" " FROM assignments"
" WHERE CrsCod>0"); " WHERE CrsCod>0") < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_CTY: case Sco_SCOPE_CTY:
sprintf (Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)"
" FROM institutions,centres,degrees,courses,assignments" " FROM institutions,centres,degrees,courses,assignments"
" WHERE institutions.CtyCod=%ld" " WHERE institutions.CtyCod=%ld"
" AND institutions.InsCod=centres.InsCod" " AND institutions.InsCod=centres.InsCod"
" AND centres.CtrCod=degrees.CtrCod" " AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentCty.Cty.CtyCod); Gbl.CurrentCty.Cty.CtyCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_INS: case Sco_SCOPE_INS:
sprintf (Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)"
" FROM centres,degrees,courses,assignments" " FROM centres,degrees,courses,assignments"
" WHERE centres.InsCod=%ld" " WHERE centres.InsCod=%ld"
" AND centres.CtrCod=degrees.CtrCod" " AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentIns.Ins.InsCod); Gbl.CurrentIns.Ins.InsCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_CTR: case Sco_SCOPE_CTR:
sprintf (Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)"
" FROM degrees,courses,assignments" " FROM degrees,courses,assignments"
" WHERE degrees.CtrCod=%ld" " WHERE degrees.CtrCod=%ld"
" AND degrees.DegCod=courses.DegCod" " AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentCtr.Ctr.CtrCod); Gbl.CurrentCtr.Ctr.CtrCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_DEG: case Sco_SCOPE_DEG:
sprintf (Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)"
" FROM courses,assignments" " FROM courses,assignments"
" WHERE courses.DegCod=%ld" " WHERE courses.DegCod=%ld"
" AND courses.CrsCod=assignments.CrsCod", " AND courses.CrsCod=assignments.CrsCod",
Gbl.CurrentDeg.Deg.DegCod); Gbl.CurrentDeg.Deg.DegCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
case Sco_SCOPE_CRS: case Sco_SCOPE_CRS:
sprintf (Query,"SELECT COUNT(*),SUM(NumNotif)" if (asprintf (&Query,"SELECT COUNT(*),SUM(NumNotif)"
" FROM assignments" " FROM assignments"
" WHERE CrsCod=%ld", " WHERE CrsCod=%ld",
Gbl.CurrentCrs.Crs.CrsCod); Gbl.CurrentCrs.Crs.CrsCod) < 0)
Lay_NotEnoughMemoryExit ();
break; break;
default: default:
Lay_ShowErrorAndExit ("Wrong scope."); Lay_ShowErrorAndExit ("Wrong scope.");
break; break;
} }
DB_QuerySELECT (Query,&mysql_res,"can not get number of assignments"); DB_QuerySELECT_free (Query,&mysql_res,"can not get number of assignments");
/***** Get number of assignments *****/ /***** Get number of assignments *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);

View File

@ -355,10 +355,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 18.7.7 (2018-10-18)" #define Log_PLATFORM_VERSION "SWAD 18.7.8 (2018-10-18)"
#define CSS_FILE "swad18.4.css" #define CSS_FILE "swad18.4.css"
#define JS_FILE "swad17.17.1.js" #define JS_FILE "swad17.17.1.js"
/* /*
Version 18.7.8: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236788 lines)
Version 18.7.7: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236750 lines) Version 18.7.7: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236750 lines)
Version 18.7.6: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236722 lines) Version 18.7.6: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236722 lines)
Version 18.7.5: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236688 lines) Version 18.7.5: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236688 lines)