mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-05 08:15:25 +02:00
Version 18.10
This commit is contained in:
parent
132a181191
commit
e9cb6f21dc
19
swad_ID.c
19
swad_ID.c
|
@ -174,6 +174,7 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
|
|||
struct ListUsrCods *ListUsrCods,
|
||||
bool OnlyConfirmedIDs)
|
||||
{
|
||||
char *Query;
|
||||
char SubQuery[256];
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
|
@ -190,11 +191,11 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
|
|||
|
||||
/***** Allocate memory for query string *****/
|
||||
MaxLength = 512 + UsrDat->IDs.Num * (1 + ID_MAX_BYTES_USR_ID + 1) - 1;
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/***** Get user's code(s) from database *****/
|
||||
Str_Copy (Gbl.DB.QueryPtr,CheckPassword ? "SELECT DISTINCT(usr_IDs.UsrCod) FROM usr_IDs,usr_data"
|
||||
Str_Copy (Query,CheckPassword ? "SELECT DISTINCT(usr_IDs.UsrCod) FROM usr_IDs,usr_data"
|
||||
" WHERE usr_IDs.UsrID IN (" :
|
||||
"SELECT DISTINCT(UsrCod) FROM usr_IDs"
|
||||
" WHERE UsrID IN (",
|
||||
|
@ -204,20 +205,20 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
|
|||
NumID++)
|
||||
{
|
||||
if (NumID)
|
||||
Str_Concat (Gbl.DB.QueryPtr,",",
|
||||
Str_Concat (Query,",",
|
||||
MaxLength);
|
||||
sprintf (SubQuery,"'%s'",UsrDat->IDs.List[NumID].ID);
|
||||
|
||||
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
|
||||
Str_Concat (Query,SubQuery,
|
||||
MaxLength);
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
MaxLength);
|
||||
|
||||
if (CheckPassword)
|
||||
{
|
||||
if (OnlyConfirmedIDs)
|
||||
Str_Concat (Gbl.DB.QueryPtr," AND usr_IDs.Confirmed='Y'",
|
||||
Str_Concat (Query," AND usr_IDs.Confirmed='Y'",
|
||||
MaxLength);
|
||||
|
||||
// Get user's code if I have written the correct password
|
||||
|
@ -225,14 +226,14 @@ unsigned ID_GetListUsrCodsFromUsrID (struct UsrData *UsrDat,
|
|||
sprintf (SubQuery," AND usr_IDs.UsrCod=usr_data.UsrCod"
|
||||
" AND (usr_data.Password='%s' OR usr_data.Password='')",
|
||||
EncryptedPassword);
|
||||
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
|
||||
Str_Concat (Query,SubQuery,
|
||||
MaxLength);
|
||||
}
|
||||
else if (OnlyConfirmedIDs)
|
||||
Str_Concat (Gbl.DB.QueryPtr," AND Confirmed='Y'",
|
||||
Str_Concat (Query," AND Confirmed='Y'",
|
||||
MaxLength);
|
||||
|
||||
ListUsrCods->NumUsrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get user's codes");
|
||||
ListUsrCods->NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get user's codes");
|
||||
if (ListUsrCods->NumUsrs)
|
||||
{
|
||||
/***** Allocate space for the list of users' codes *****/
|
||||
|
|
|
@ -2418,6 +2418,7 @@ static void Att_GetNumStdsTotalWhoAreInAttEvent (struct AttendanceEvent *Att)
|
|||
|
||||
static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSelectedUsrCods[],unsigned NumStdsInList)
|
||||
{
|
||||
char *Query;
|
||||
char SubQuery[1 + 1 + 10 + 1];
|
||||
unsigned NumStd;
|
||||
unsigned NumStdsInAttEvent = 0;
|
||||
|
@ -2427,11 +2428,11 @@ static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSel
|
|||
{
|
||||
/***** Allocate space for query *****/
|
||||
MaxLength = 256 + NumStdsInList * (1 + 1 + 10);
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/***** Count number of students registered in an event in database *****/
|
||||
snprintf (Gbl.DB.QueryPtr,MaxLength + 1,
|
||||
snprintf (Query,MaxLength + 1,
|
||||
"SELECT COUNT(*) FROM att_usr"
|
||||
" WHERE AttCod=%ld"
|
||||
" AND UsrCod IN (",
|
||||
|
@ -2444,12 +2445,13 @@ static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSel
|
|||
NumStd ? ",%ld" :
|
||||
"%ld",
|
||||
LstSelectedUsrCods[NumStd]);
|
||||
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
|
||||
Str_Concat (Query,SubQuery,
|
||||
MaxLength);
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,") AND Present='Y'",
|
||||
Str_Concat (Query,") AND Present='Y'",
|
||||
MaxLength);
|
||||
|
||||
|
||||
NumStdsInAttEvent = (unsigned) DB_QueryCOUNT_new ("can not get number of students from a list who are registered in an event");
|
||||
}
|
||||
return NumStdsInAttEvent;
|
||||
|
|
|
@ -355,10 +355,11 @@ En OpenSWAD:
|
|||
ps2pdf source.ps destination.pdf
|
||||
*/
|
||||
|
||||
#define Log_PLATFORM_VERSION "SWAD 18.9.10 (2018-10-30)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 18.10 (2018-10-30)"
|
||||
#define CSS_FILE "swad18.4.css"
|
||||
#define JS_FILE "swad17.17.1.js"
|
||||
/*
|
||||
Version 18.10: Oct 30, 2018 Fixing bugs in access to database. Not finished. (235399 lines)
|
||||
Version 18.9.10: Oct 30, 2018 Some sprintf for database queries changed by asprintf. (235311 lines)
|
||||
Version 18.9.8: Oct 30, 2018 Cleaning unused functions. (235694 lines)
|
||||
Version 18.9.7: Oct 29, 2018 Some sprintf for database queries changed by internal function. (235705 lines)
|
||||
|
|
|
@ -3084,6 +3084,25 @@ void DB_BuildQuery (const char *fmt,...)
|
|||
// vasprintf will return -1
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
}
|
||||
|
||||
void DB_BuildQuery_old (char **Query,const char *fmt,...)
|
||||
{
|
||||
int NumBytesPrinted;
|
||||
va_list ap;
|
||||
|
||||
if (*Query != NULL)
|
||||
Lay_ShowErrorAndExit ("Error building query.");
|
||||
|
||||
va_start (ap,fmt);
|
||||
NumBytesPrinted = vasprintf (Query,fmt,ap);
|
||||
va_end (ap);
|
||||
|
||||
if (NumBytesPrinted < 0) // If memory allocation wasn't possible,
|
||||
// or some other error occurs,
|
||||
// vasprintf will return -1
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
}
|
||||
|
||||
/*
|
||||
static void DB_QueryPrintf (char **strp,const char *fmt,...)
|
||||
{
|
||||
|
@ -3105,18 +3124,23 @@ static void DB_QueryPrintf (char **strp,const char *fmt,...)
|
|||
/*****************************************************************************/
|
||||
|
||||
unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError)
|
||||
{
|
||||
return DB_QuerySELECT (&Gbl.DB.QueryPtr,mysql_res,MsgError);
|
||||
}
|
||||
|
||||
unsigned long DB_QuerySELECT (char **Query,MYSQL_RES **mysql_res,const char *MsgError)
|
||||
{
|
||||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
does point to an allocated string *****/
|
||||
if (*Query == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
/***** Query database and free query string pointer *****/
|
||||
Result = mysql_query (&Gbl.mysql,Gbl.DB.QueryPtr); // Returns 0 on success
|
||||
free ((void *) Gbl.DB.QueryPtr);
|
||||
Gbl.DB.QueryPtr = NULL;
|
||||
Result = mysql_query (&Gbl.mysql,*Query); // Returns 0 on success
|
||||
free ((void *) *Query);
|
||||
*Query = NULL;
|
||||
if (Result)
|
||||
DB_ExitOnMySQLError (MsgError);
|
||||
|
||||
|
@ -3133,13 +3157,18 @@ unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError)
|
|||
/*****************************************************************************/
|
||||
|
||||
unsigned long DB_QueryCOUNT_new (const char *MsgError)
|
||||
{
|
||||
return DB_QueryCOUNT (&Gbl.DB.QueryPtr,MsgError);
|
||||
}
|
||||
|
||||
unsigned long DB_QueryCOUNT (char **Query,const char *MsgError)
|
||||
{
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
unsigned long NumRows;
|
||||
|
||||
/***** Make query "SELECT COUNT(*) FROM..." *****/
|
||||
DB_QuerySELECT_new (&mysql_res,MsgError);
|
||||
DB_QuerySELECT (Query,&mysql_res,MsgError);
|
||||
|
||||
/***** Get number of rows *****/
|
||||
row = mysql_fetch_row (mysql_res);
|
||||
|
@ -3161,7 +3190,7 @@ void DB_QueryINSERT_new (const char *MsgError)
|
|||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
does point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
|
@ -3173,6 +3202,27 @@ void DB_QueryINSERT_new (const char *MsgError)
|
|||
DB_ExitOnMySQLError (MsgError);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************** Make an INSERT query in database ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void DB_QueryINSERT (char **Query,const char *MsgError)
|
||||
{
|
||||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does point to an allocated string *****/
|
||||
if (*Query == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
/***** Query database and free query string pointer *****/
|
||||
Result = mysql_query (&Gbl.mysql,*Query); // Returns 0 on success
|
||||
free ((void *) *Query);
|
||||
*Query = NULL;
|
||||
if (Result)
|
||||
DB_ExitOnMySQLError (MsgError);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/** Make an INSERT query in database and return code of last inserted item ***/
|
||||
/*****************************************************************************/
|
||||
|
@ -3182,7 +3232,7 @@ long DB_QueryINSERTandReturnCode_new (const char *MsgError)
|
|||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
does point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
|
@ -3206,7 +3256,7 @@ void DB_QueryREPLACE_new (const char *MsgError)
|
|||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
does point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
|
@ -3223,18 +3273,23 @@ void DB_QueryREPLACE_new (const char *MsgError)
|
|||
/*****************************************************************************/
|
||||
|
||||
void DB_QueryUPDATE_new (const char *MsgError)
|
||||
{
|
||||
DB_QueryUPDATE (&Gbl.DB.QueryPtr,MsgError);
|
||||
}
|
||||
|
||||
void DB_QueryUPDATE (char **Query,const char *MsgError)
|
||||
{
|
||||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
does point to an allocated string *****/
|
||||
if (*Query == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
/***** Query database and free query string pointer *****/
|
||||
Result = mysql_query (&Gbl.mysql,Gbl.DB.QueryPtr); // Returns 0 on success
|
||||
free ((void *) Gbl.DB.QueryPtr);
|
||||
Gbl.DB.QueryPtr = NULL;
|
||||
Result = mysql_query (&Gbl.mysql,*Query); // Returns 0 on success
|
||||
free ((void *) *Query);
|
||||
*Query = NULL;
|
||||
if (Result)
|
||||
DB_ExitOnMySQLError (MsgError);
|
||||
|
||||
|
@ -3251,7 +3306,7 @@ void DB_QueryDELETE_new (const char *MsgError)
|
|||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
does point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
|
@ -3272,7 +3327,7 @@ void DB_Query_new (const char *MsgError)
|
|||
int Result;
|
||||
|
||||
/***** Check that query string pointer
|
||||
does not point to an allocated string *****/
|
||||
does point to an allocated string *****/
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
Lay_ShowErrorAndExit ("Wrong query string.");
|
||||
|
||||
|
|
|
@ -38,18 +38,23 @@ void DB_OpenDBConnection (void);
|
|||
void DB_CloseDBConnection (void);
|
||||
|
||||
void DB_BuildQuery (const char *fmt,...);
|
||||
void DB_BuildQuery_old (char **Query,const char *fmt,...);
|
||||
|
||||
unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError);
|
||||
unsigned long DB_QuerySELECT (char **Query,MYSQL_RES **mysql_res,const char *MsgError);
|
||||
|
||||
unsigned long DB_QueryCOUNT_new (const char *MsgError);
|
||||
unsigned long DB_QueryCOUNT (char **Query,const char *MsgError);
|
||||
|
||||
void DB_QueryINSERT_new (const char *MsgError);
|
||||
void DB_QueryINSERT (char **Query,const char *MsgError);
|
||||
|
||||
long DB_QueryINSERTandReturnCode_new (const char *MsgError);
|
||||
|
||||
void DB_QueryREPLACE_new (const char *MsgError);
|
||||
|
||||
void DB_QueryUPDATE_new (const char *MsgError);
|
||||
void DB_QueryUPDATE (char **Query,const char *MsgError);
|
||||
|
||||
void DB_QueryDELETE_new (const char *MsgError);
|
||||
|
||||
|
|
|
@ -1022,8 +1022,6 @@ static unsigned Sch_SearchDocumentsInMyCoursesInDB (const char *RangeQuery)
|
|||
RangeQuery);
|
||||
|
||||
/***** Query database and list documents found *****/
|
||||
/* if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
|
||||
Lay_ShowAlert (Lay_INFO,Gbl.DB.QueryPtr); */
|
||||
NumDocs = Brw_ListDocsFound (Txt_document_in_my_courses,
|
||||
Txt_documents_in_my_courses);
|
||||
|
||||
|
@ -1178,8 +1176,6 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery)
|
|||
(unsigned) Brw_ADMI_BRF_USR);
|
||||
|
||||
/***** Query database and list documents found *****/
|
||||
/* if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
|
||||
Lay_ShowAlert (Lay_INFO,Gbl.DB.QueryPtr); */
|
||||
return Brw_ListDocsFound (Txt_document_from_me,
|
||||
Txt_documents_from_me);
|
||||
}
|
||||
|
|
126
swad_statistic.c
126
swad_statistic.c
|
@ -284,6 +284,7 @@ void Sta_GetRemoteAddr (void)
|
|||
void Sta_LogAccess (const char *Comments)
|
||||
{
|
||||
size_t MaxLength;
|
||||
char *Query;
|
||||
long LogCod;
|
||||
long ActCod = Act_GetActCod (Gbl.Action.Act);
|
||||
Rol_Role_t RoleToStore = (Gbl.Action.Act == ActLogOut) ? Gbl.Usrs.Me.Role.LoggedBeforeCloseSession :
|
||||
|
@ -334,42 +335,42 @@ void Sta_LogAccess (const char *Comments)
|
|||
{
|
||||
/* Allocate space for query */
|
||||
MaxLength = 512 + strlen (Comments);
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/* Log comments */
|
||||
snprintf (Gbl.DB.QueryPtr,MaxLength,
|
||||
snprintf (Query,MaxLength,
|
||||
"INSERT INTO log_comments"
|
||||
" (LogCod,Comments)"
|
||||
" VALUES"
|
||||
" (%ld,'",
|
||||
LogCod);
|
||||
Str_AddStrToQuery (Gbl.DB.QueryPtr,Comments,MaxLength);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"')",
|
||||
Str_AddStrToQuery (Query,Comments,MaxLength);
|
||||
Str_Concat (Query,"')",
|
||||
MaxLength);
|
||||
|
||||
DB_QueryINSERT_new ("can not log access (comments)");
|
||||
DB_QueryINSERT (Query,"can not log access (comments)");
|
||||
}
|
||||
|
||||
if (Gbl.Search.LogSearch && Gbl.Search.Str[0])
|
||||
{
|
||||
/* Allocate space for query */
|
||||
MaxLength = 512 + strlen (Gbl.Search.Str);
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (MaxLength + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/* Log search string */
|
||||
snprintf (Gbl.DB.QueryPtr,MaxLength,
|
||||
snprintf (Query,MaxLength,
|
||||
"INSERT INTO log_search"
|
||||
" (LogCod,SearchStr)"
|
||||
" VALUES"
|
||||
" (%ld,'",
|
||||
LogCod);
|
||||
Str_AddStrToQuery (Gbl.DB.QueryPtr,Gbl.Search.Str,MaxLength);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"')",
|
||||
Str_AddStrToQuery (Query,Gbl.Search.Str,MaxLength);
|
||||
Str_Concat (Query,"')",
|
||||
MaxLength);
|
||||
|
||||
DB_QueryINSERT_new ("can not log access (search)");
|
||||
DB_QueryINSERT (Query,"can not log access (search)");
|
||||
}
|
||||
|
||||
if (Gbl.WebService.IsWebService)
|
||||
|
@ -869,6 +870,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
extern const char *Txt_List_of_detailed_clicks;
|
||||
extern const char *Txt_STAT_TYPE_COUNT_CAPS[Sta_NUM_COUNT_TYPES];
|
||||
extern const char *Txt_Time_zone_used_in_the_calculation_of_these_statistics;
|
||||
char *Query;
|
||||
char QueryAux[512];
|
||||
long LengthQuery;
|
||||
MYSQL_RES *mysql_res;
|
||||
|
@ -1053,26 +1055,26 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
|
||||
/***** Select clicks from the table of log *****/
|
||||
/* Allocate memory for the query */
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (Sta_MAX_BYTES_QUERY_ACCESS + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (Sta_MAX_BYTES_QUERY_ACCESS + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/* Start the query */
|
||||
switch (Gbl.Stat.ClicksGroupedBy)
|
||||
{
|
||||
case Sta_CLICKS_CRS_DETAILED_LIST:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE LogCod,UsrCod,Role,"
|
||||
"UNIX_TIMESTAMP(ClickTime) AS F,ActCod FROM %s",
|
||||
LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_USR:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE UsrCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_DAY:
|
||||
case Sta_CLICKS_GBL_PER_DAY:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE "
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y%%m%%d') AS Day,"
|
||||
"%s FROM %s",
|
||||
|
@ -1081,7 +1083,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
break;
|
||||
case Sta_CLICKS_CRS_PER_DAY_AND_HOUR:
|
||||
case Sta_CLICKS_GBL_PER_DAY_AND_HOUR:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE "
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y%%m%%d') AS Day,"
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%H') AS Hour,"
|
||||
|
@ -1094,7 +1096,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
case Sta_CLICKS_GBL_PER_WEEK:
|
||||
/* With %x%v the weeks are counted from monday to sunday.
|
||||
With %X%V the weeks are counted from sunday to saturday. */
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
(Gbl.Prefs.FirstDayOfWeek == 0) ?
|
||||
"SELECT SQL_NO_CACHE " // Weeks start on monday
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%x%%v') AS Week,"
|
||||
|
@ -1107,7 +1109,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
break;
|
||||
case Sta_CLICKS_CRS_PER_MONTH:
|
||||
case Sta_CLICKS_GBL_PER_MONTH:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE "
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y%%m') AS Month,"
|
||||
"%s FROM %s",
|
||||
|
@ -1116,7 +1118,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
break;
|
||||
case Sta_CLICKS_CRS_PER_YEAR:
|
||||
case Sta_CLICKS_GBL_PER_YEAR:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE "
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%Y') AS Year,"
|
||||
"%s FROM %s",
|
||||
|
@ -1125,7 +1127,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
break;
|
||||
case Sta_CLICKS_CRS_PER_HOUR:
|
||||
case Sta_CLICKS_GBL_PER_HOUR:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE "
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%H') AS Hour,"
|
||||
"%s FROM %s",
|
||||
|
@ -1134,7 +1136,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
break;
|
||||
case Sta_CLICKS_CRS_PER_MINUTE:
|
||||
case Sta_CLICKS_GBL_PER_MINUTE:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE "
|
||||
"DATE_FORMAT(CONVERT_TZ(ClickTime,@@session.time_zone,'%s'),'%%H%%i') AS Minute,"
|
||||
"%s FROM %s",
|
||||
|
@ -1143,47 +1145,47 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
break;
|
||||
case Sta_CLICKS_CRS_PER_ACTION:
|
||||
case Sta_CLICKS_GBL_PER_ACTION:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE ActCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_PLUGIN:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE log_ws.PlgCod,%s AS Num FROM %s,log_ws",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_API_FUNCTION:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE log_ws.FunCod,%s AS Num FROM %s,log_ws",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_BANNER:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE log_banners.BanCod,%s AS Num FROM %s,log_banners",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_COUNTRY:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE CtyCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_INSTITUTION:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE InsCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_CENTRE:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE CtrCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_DEGREE:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE DegCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_COURSE:
|
||||
snprintf (Gbl.DB.QueryPtr,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
snprintf (Query,Sta_MAX_BYTES_QUERY_ACCESS + 1,
|
||||
"SELECT SQL_NO_CACHE CrsCod,%s AS Num FROM %s",
|
||||
StrQueryCountType,LogTable);
|
||||
break;
|
||||
|
@ -1193,7 +1195,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
LogTable,
|
||||
(long) Gbl.DateRange.TimeUTC[0],
|
||||
(long) Gbl.DateRange.TimeUTC[1]);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
|
||||
switch (GlobalOrCourse)
|
||||
|
@ -1210,7 +1212,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
{
|
||||
sprintf (QueryAux," AND %s.CtyCod=%ld",
|
||||
LogTable,Gbl.CurrentCty.Cty.CtyCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
}
|
||||
break;
|
||||
|
@ -1219,7 +1221,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
{
|
||||
sprintf (QueryAux," AND %s.InsCod=%ld",
|
||||
LogTable,Gbl.CurrentIns.Ins.InsCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
}
|
||||
break;
|
||||
|
@ -1228,7 +1230,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
{
|
||||
sprintf (QueryAux," AND %s.CtrCod=%ld",
|
||||
LogTable,Gbl.CurrentCtr.Ctr.CtrCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
}
|
||||
break;
|
||||
|
@ -1237,7 +1239,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
{
|
||||
sprintf (QueryAux," AND %s.DegCod=%ld",
|
||||
LogTable,Gbl.CurrentDeg.Deg.DegCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
}
|
||||
break;
|
||||
|
@ -1246,7 +1248,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
{
|
||||
sprintf (QueryAux," AND %s.CrsCod=%ld",
|
||||
LogTable,Gbl.CurrentCrs.Crs.CrsCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
}
|
||||
break;
|
||||
|
@ -1315,7 +1317,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
LogTable,Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
break;
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,StrRole,
|
||||
Str_Concat (Query,StrRole,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
|
||||
switch (Gbl.Stat.ClicksGroupedBy)
|
||||
|
@ -1324,13 +1326,13 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
case Sta_CLICKS_GBL_PER_API_FUNCTION:
|
||||
sprintf (QueryAux," AND %s.LogCod=log_ws.LogCod",
|
||||
LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_BANNER:
|
||||
sprintf (QueryAux," AND %s.LogCod=log_banners.LogCod",
|
||||
LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
default:
|
||||
|
@ -1340,13 +1342,13 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
case Sta_SHOW_COURSE_ACCESSES:
|
||||
sprintf (QueryAux," AND %s.CrsCod=%ld",
|
||||
LogTable,Gbl.CurrentCrs.Crs.CrsCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
|
||||
/***** Initialize data structure of the user *****/
|
||||
Usr_UsrDataConstructor (&UsrDat);
|
||||
|
||||
LengthQuery = strlen (Gbl.DB.QueryPtr);
|
||||
LengthQuery = strlen (Query);
|
||||
NumUsr = 0;
|
||||
Ptr = Gbl.Usrs.Select[Rol_UNK];
|
||||
while (*Ptr)
|
||||
|
@ -1363,12 +1365,12 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
NumUsr ? " OR %s.UsrCod=%ld" :
|
||||
" AND (%s.UsrCod=%ld",
|
||||
LogTable,UsrDat.UsrCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
NumUsr++;
|
||||
}
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
|
||||
/***** Free memory used by the data of the user *****/
|
||||
|
@ -1381,7 +1383,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
{
|
||||
sprintf (QueryAux," AND %s.ActCod=%ld",
|
||||
LogTable,Act_GetActCod (Gbl.Stat.NumAction));
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
}
|
||||
|
||||
|
@ -1389,90 +1391,90 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
switch (Gbl.Stat.ClicksGroupedBy)
|
||||
{
|
||||
case Sta_CLICKS_CRS_DETAILED_LIST:
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY F",
|
||||
Str_Concat (Query," ORDER BY F",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_USR:
|
||||
sprintf (QueryAux," GROUP BY %s.UsrCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_DAY:
|
||||
case Sta_CLICKS_GBL_PER_DAY:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Day DESC",
|
||||
Str_Concat (Query," GROUP BY Day DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_DAY_AND_HOUR:
|
||||
case Sta_CLICKS_GBL_PER_DAY_AND_HOUR:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Day DESC,Hour",
|
||||
Str_Concat (Query," GROUP BY Day DESC,Hour",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_WEEK:
|
||||
case Sta_CLICKS_GBL_PER_WEEK:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Week DESC",
|
||||
Str_Concat (Query," GROUP BY Week DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_MONTH:
|
||||
case Sta_CLICKS_GBL_PER_MONTH:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Month DESC",
|
||||
Str_Concat (Query," GROUP BY Month DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_YEAR:
|
||||
case Sta_CLICKS_GBL_PER_YEAR:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Year DESC",
|
||||
Str_Concat (Query," GROUP BY Year DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_HOUR:
|
||||
case Sta_CLICKS_GBL_PER_HOUR:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Hour",
|
||||
Str_Concat (Query," GROUP BY Hour",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_MINUTE:
|
||||
case Sta_CLICKS_GBL_PER_MINUTE:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY Minute",
|
||||
Str_Concat (Query," GROUP BY Minute",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_CRS_PER_ACTION:
|
||||
case Sta_CLICKS_GBL_PER_ACTION:
|
||||
sprintf (QueryAux," GROUP BY %s.ActCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_PLUGIN:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY log_ws.PlgCod ORDER BY Num DESC",
|
||||
Str_Concat (Query," GROUP BY log_ws.PlgCod ORDER BY Num DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_API_FUNCTION:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY log_ws.FunCod ORDER BY Num DESC",
|
||||
Str_Concat (Query," GROUP BY log_ws.FunCod ORDER BY Num DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_BANNER:
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY log_banners.BanCod ORDER BY Num DESC",
|
||||
Str_Concat (Query," GROUP BY log_banners.BanCod ORDER BY Num DESC",
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_COUNTRY:
|
||||
sprintf (QueryAux," GROUP BY %s.CtyCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_INSTITUTION:
|
||||
sprintf (QueryAux," GROUP BY %s.InsCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_CENTRE:
|
||||
sprintf (QueryAux," GROUP BY %s.CtrCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_DEGREE:
|
||||
sprintf (QueryAux," GROUP BY %s.DegCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
case Sta_CLICKS_GBL_PER_COURSE:
|
||||
sprintf (QueryAux," GROUP BY %s.CrsCod ORDER BY Num DESC",LogTable);
|
||||
Str_Concat (Gbl.DB.QueryPtr,QueryAux,
|
||||
Str_Concat (Query,QueryAux,
|
||||
Sta_MAX_BYTES_QUERY_ACCESS);
|
||||
break;
|
||||
}
|
||||
|
@ -1482,7 +1484,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
Ale_ShowAlert (Ale_INFO,Query);
|
||||
*/
|
||||
/***** Make the query *****/
|
||||
NumRows = DB_QuerySELECT_new (&mysql_res,"can not get clicks");
|
||||
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get clicks");
|
||||
|
||||
/***** Count the number of rows in result *****/
|
||||
if (NumRows == 0)
|
||||
|
|
92
swad_test.c
92
swad_test.c
|
@ -2469,6 +2469,7 @@ void Tst_ListQuestionsToSelect (void)
|
|||
static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
||||
{
|
||||
extern const char *Txt_No_questions_found_matching_your_search_criteria;
|
||||
char *Query;
|
||||
unsigned long NumRows;
|
||||
long LengthQuery;
|
||||
unsigned NumItemInList;
|
||||
|
@ -2480,7 +2481,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
char CrsCodStr[1 + 10 + 1];
|
||||
|
||||
/***** Allocate space for query *****/
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/***** Select questions *****/
|
||||
|
@ -2499,7 +2500,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
row[10] NumHitsNotBlank
|
||||
row[11] Score
|
||||
*/
|
||||
snprintf (Gbl.DB.QueryPtr,Tst_MAX_BYTES_QUERY_TEST + 1,
|
||||
snprintf (Query,Tst_MAX_BYTES_QUERY_TEST + 1,
|
||||
"SELECT tst_questions.QstCod,"
|
||||
"UNIX_TIMESTAMP(tst_questions.EditTime) AS F,"
|
||||
"tst_questions.AnsType,tst_questions.Shuffle,"
|
||||
|
@ -2511,45 +2512,45 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
"tst_questions.Score"
|
||||
" FROM tst_questions");
|
||||
if (!Gbl.Test.Tags.All)
|
||||
Str_Concat (Gbl.DB.QueryPtr,",tst_question_tags,tst_tags",
|
||||
Str_Concat (Query,",tst_question_tags,tst_tags",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
|
||||
Str_Concat (Gbl.DB.QueryPtr," WHERE tst_questions.CrsCod='",
|
||||
Str_Concat (Query," WHERE tst_questions.CrsCod='",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
snprintf (CrsCodStr,sizeof (CrsCodStr),
|
||||
"%ld",
|
||||
Gbl.CurrentCrs.Crs.CrsCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,CrsCodStr,
|
||||
Str_Concat (Query,CrsCodStr,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
|
||||
Str_Concat (Query,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
snprintf (LongStr,sizeof (LongStr),
|
||||
"%ld",
|
||||
(long) Gbl.DateRange.TimeUTC[0]);
|
||||
Str_Concat (Gbl.DB.QueryPtr,LongStr,
|
||||
Str_Concat (Query,LongStr,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
|
||||
Str_Concat (Query,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
snprintf (LongStr,sizeof (LongStr),
|
||||
"%ld",
|
||||
(long) Gbl.DateRange.TimeUTC[1]);
|
||||
Str_Concat (Gbl.DB.QueryPtr,LongStr,
|
||||
Str_Concat (Query,LongStr,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"')",
|
||||
Str_Concat (Query,"')",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
|
||||
/* Add the tags selected */
|
||||
if (!Gbl.Test.Tags.All)
|
||||
{
|
||||
Str_Concat (Gbl.DB.QueryPtr," AND tst_questions.QstCod=tst_question_tags.QstCod"
|
||||
Str_Concat (Query," AND tst_questions.QstCod=tst_question_tags.QstCod"
|
||||
" AND tst_question_tags.TagCod=tst_tags.TagCod"
|
||||
" AND tst_tags.CrsCod='",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,CrsCodStr,
|
||||
Str_Concat (Query,CrsCodStr,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (Query,"'",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
LengthQuery = strlen (Gbl.DB.QueryPtr);
|
||||
LengthQuery = strlen (Query);
|
||||
NumItemInList = 0;
|
||||
Ptr = Gbl.Test.Tags.List;
|
||||
while (*Ptr)
|
||||
|
@ -2558,24 +2559,24 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
|
||||
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
|
||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||
Str_Concat (Gbl.DB.QueryPtr,
|
||||
Str_Concat (Query,
|
||||
NumItemInList ? " OR tst_tags.TagTxt='" :
|
||||
" AND (tst_tags.TagTxt='",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,TagText,
|
||||
Str_Concat (Query,TagText,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (Query,"'",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
NumItemInList++;
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
}
|
||||
|
||||
/* Add the types of answer selected */
|
||||
if (!Gbl.Test.AllAnsTypes)
|
||||
{
|
||||
LengthQuery = strlen (Gbl.DB.QueryPtr);
|
||||
LengthQuery = strlen (Query);
|
||||
NumItemInList = 0;
|
||||
Ptr = Gbl.Test.ListAnsTypes;
|
||||
while (*Ptr)
|
||||
|
@ -2585,48 +2586,48 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
|
||||
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
|
||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||
Str_Concat (Gbl.DB.QueryPtr,
|
||||
Str_Concat (Query,
|
||||
NumItemInList ? " OR tst_questions.AnsType='" :
|
||||
" AND (tst_questions.AnsType='",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,Tst_StrAnswerTypesDB[AnsType],
|
||||
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (Query,"'",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
NumItemInList++;
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
}
|
||||
|
||||
/* End the query */
|
||||
Str_Concat (Gbl.DB.QueryPtr," GROUP BY tst_questions.QstCod",
|
||||
Str_Concat (Query," GROUP BY tst_questions.QstCod",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
|
||||
switch (Gbl.Test.SelectedOrder)
|
||||
{
|
||||
case Tst_ORDER_STEM:
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.Stem",
|
||||
Str_Concat (Query," ORDER BY tst_questions.Stem",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
break;
|
||||
case Tst_ORDER_NUM_HITS:
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.NumHits DESC,"
|
||||
Str_Concat (Query," ORDER BY tst_questions.NumHits DESC,"
|
||||
"tst_questions.Stem",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
break;
|
||||
case Tst_ORDER_AVERAGE_SCORE:
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
|
||||
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
|
||||
"tst_questions.NumHits DESC,"
|
||||
"tst_questions.Stem",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
break;
|
||||
case Tst_ORDER_NUM_HITS_NOT_BLANK:
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.NumHitsNotBlank DESC,"
|
||||
Str_Concat (Query," ORDER BY tst_questions.NumHitsNotBlank DESC,"
|
||||
"tst_questions.Stem",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
break;
|
||||
case Tst_ORDER_AVERAGE_SCORE_NOT_BLANK:
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
|
||||
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
|
||||
"tst_questions.NumHitsNotBlank DESC,"
|
||||
"tst_questions.Stem",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
|
@ -2634,7 +2635,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
}
|
||||
|
||||
/* Make the query */
|
||||
NumRows = DB_QuerySELECT_new (mysql_res,"can not get questions");
|
||||
NumRows = DB_QuerySELECT (Query,mysql_res,"can not get questions");
|
||||
|
||||
if (NumRows == 0)
|
||||
Ale_ShowAlert (Ale_INFO,Txt_No_questions_found_matching_your_search_criteria);
|
||||
|
@ -2648,6 +2649,7 @@ static unsigned long Tst_GetQuestions (MYSQL_RES **mysql_res)
|
|||
|
||||
static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
||||
{
|
||||
char *Query;
|
||||
long LengthQuery;
|
||||
unsigned NumItemInList;
|
||||
const char *Ptr;
|
||||
|
@ -2657,7 +2659,7 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
|||
char StrNumQsts[10 + 1];
|
||||
|
||||
/***** Allocate space for query *****/
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (Tst_MAX_BYTES_QUERY_TEST + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/***** Select questions without hidden tags *****/
|
||||
|
@ -2679,7 +2681,7 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
|||
// Reject questions with any tag hidden
|
||||
// Select only questions with tags
|
||||
// DISTINCTROW is necessary to not repeat questions
|
||||
snprintf (Gbl.DB.QueryPtr,Tst_MAX_BYTES_QUERY_TEST + 1,
|
||||
snprintf (Query,Tst_MAX_BYTES_QUERY_TEST + 1,
|
||||
"SELECT DISTINCTROW tst_questions.QstCod,"
|
||||
"UNIX_TIMESTAMP(tst_questions.EditTime),"
|
||||
"tst_questions.AnsType,tst_questions.Shuffle,"
|
||||
|
@ -2706,7 +2708,7 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
|||
if (!Gbl.Test.Tags.All) // User has not selected all the tags
|
||||
{
|
||||
/* Add selected tags */
|
||||
LengthQuery = strlen (Gbl.DB.QueryPtr);
|
||||
LengthQuery = strlen (Query);
|
||||
NumItemInList = 0;
|
||||
Ptr = Gbl.Test.Tags.List;
|
||||
while (*Ptr)
|
||||
|
@ -2715,24 +2717,24 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
|||
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
|
||||
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
|
||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||
Str_Concat (Gbl.DB.QueryPtr,
|
||||
Str_Concat (Query,
|
||||
NumItemInList ? " OR tst_tags.TagTxt='" :
|
||||
" AND (tst_tags.TagTxt='",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,TagText,
|
||||
Str_Concat (Query,TagText,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (Query,"'",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
NumItemInList++;
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
}
|
||||
|
||||
/* Add answer types selected */
|
||||
if (!Gbl.Test.AllAnsTypes)
|
||||
{
|
||||
LengthQuery = strlen (Gbl.DB.QueryPtr);
|
||||
LengthQuery = strlen (Query);
|
||||
NumItemInList = 0;
|
||||
Ptr = Gbl.Test.ListAnsTypes;
|
||||
while (*Ptr)
|
||||
|
@ -2742,34 +2744,34 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
|
|||
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
|
||||
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
|
||||
Lay_ShowErrorAndExit ("Query size exceed.");
|
||||
Str_Concat (Gbl.DB.QueryPtr,
|
||||
Str_Concat (Query,
|
||||
NumItemInList ? " OR tst_questions.AnsType='" :
|
||||
" AND (tst_questions.AnsType='",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,Tst_StrAnswerTypesDB[AnsType],
|
||||
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (Query,"'",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
NumItemInList++;
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
}
|
||||
|
||||
/* End query */
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY RAND(NOW()) LIMIT ",
|
||||
Str_Concat (Query," ORDER BY RAND(NOW()) LIMIT ",
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
snprintf (StrNumQsts,sizeof (StrNumQsts),
|
||||
"%u",
|
||||
Gbl.Test.NumQsts);
|
||||
Str_Concat (Gbl.DB.QueryPtr,StrNumQsts,
|
||||
Str_Concat (Query,StrNumQsts,
|
||||
Tst_MAX_BYTES_QUERY_TEST);
|
||||
/*
|
||||
if (Gbl.Usrs.Me.Roles.LoggedRole == Rol_SYS_ADM)
|
||||
Lay_ShowAlert (Lay_INFO,Query);
|
||||
*/
|
||||
/* Make the query */
|
||||
return DB_QuerySELECT_new (mysql_res,"can not get questions");
|
||||
return DB_QuerySELECT (Query,mysql_res,"can not get questions");
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
154
swad_user.c
154
swad_user.c
|
@ -181,11 +181,11 @@ static void Usr_WriteUsrData (const char *BgColor,
|
|||
const char *Data,const char *Link,
|
||||
bool NonBreak,bool Accepted);
|
||||
|
||||
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role);
|
||||
static void Usr_BuildQueryToGetUsrsLstCrs (char **Query,Rol_Role_t Role);
|
||||
|
||||
static void Usr_GetAdmsLst (Sco_Scope_t Scope);
|
||||
static void Usr_GetGstsLst (Sco_Scope_t Scope);
|
||||
static void Usr_GetListUsrsFromQuery (Rol_Role_t Role,Sco_Scope_t Scope);
|
||||
static void Usr_GetListUsrsFromQuery (char **Query,Rol_Role_t Role,Sco_Scope_t Scope);
|
||||
static void Usr_AllocateUsrsList (Rol_Role_t Role);
|
||||
|
||||
static void Usr_PutButtonToConfirmIWantToSeeBigList (unsigned NumUsrs,const char *OnSubmit);
|
||||
|
@ -4130,7 +4130,7 @@ unsigned Usr_GetNumberOfTeachersInCentre (long CtrCod)
|
|||
/******* Build query to get list with data of users in current course ********/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
||||
static void Usr_BuildQueryToGetUsrsLstCrs (char **Query,Rol_Role_t Role)
|
||||
{
|
||||
unsigned NumPositiveCods = 0;
|
||||
unsigned NumNegativeCods = 0;
|
||||
|
@ -4173,17 +4173,21 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
if (!Gbl.Usrs.ClassPhoto.AllGroups &&
|
||||
!Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps)
|
||||
{
|
||||
Gbl.DB.QueryPtr = NULL;
|
||||
*Query = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/***** Get list of groups types in current course *****/
|
||||
if (!Gbl.Usrs.ClassPhoto.AllGroups)
|
||||
Grp_GetListGrpTypesInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
|
||||
|
||||
/***** Allocate space for query *****/
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1)) == NULL)
|
||||
if ((*Query = (char *) malloc (Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/***** Create query for users in the course *****/
|
||||
if (Gbl.Action.Act == ActReqMsgUsr) // Selecting users to write a message
|
||||
snprintf (Gbl.DB.QueryPtr,Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1,
|
||||
snprintf (*Query,Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1,
|
||||
"SELECT %s FROM crs_usr,usr_data"
|
||||
" WHERE crs_usr.CrsCod=%ld"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4194,7 +4198,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Role,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
else
|
||||
snprintf (Gbl.DB.QueryPtr,Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1,
|
||||
snprintf (*Query,Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1,
|
||||
"SELECT %s FROM crs_usr,usr_data"
|
||||
" WHERE crs_usr.CrsCod=%ld"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4205,9 +4209,6 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
/***** Select users in selected groups *****/
|
||||
if (!Gbl.Usrs.ClassPhoto.AllGroups)
|
||||
{
|
||||
/***** Get list of groups types in current course *****/
|
||||
Grp_GetListGrpTypesInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
|
||||
|
||||
/***** Allocate memory for list of booleans AddStdsWithoutGroupOf *****/
|
||||
if ((AddStdsWithoutGroupOf = (bool *) calloc (Gbl.CurrentCrs.Grps.GrpTypes.Num,sizeof (bool))) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
@ -4240,7 +4241,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
/* If there are positive codes, add the students who belong to groups with those codes */
|
||||
if (NumPositiveCods)
|
||||
{
|
||||
Str_Concat (Gbl.DB.QueryPtr," AND (crs_usr.UsrCod IN"
|
||||
Str_Concat (*Query," AND (crs_usr.UsrCod IN"
|
||||
" (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
NumPositiveCods = 0;
|
||||
|
@ -4249,19 +4250,19 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
NumGrpSel++)
|
||||
if ((GrpCod = Gbl.CurrentCrs.Grps.LstGrpsSel.GrpCods[NumGrpSel]) > 0)
|
||||
{
|
||||
Str_Concat (Gbl.DB.QueryPtr,NumPositiveCods ? " OR GrpCod='" :
|
||||
Str_Concat (*Query,NumPositiveCods ? " OR GrpCod='" :
|
||||
" GrpCod='",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
snprintf (LongStr,sizeof (LongStr),
|
||||
"%ld",
|
||||
GrpCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,LongStr,
|
||||
Str_Concat (*Query,LongStr,
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (*Query,"'",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
NumPositiveCods++;
|
||||
}
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (*Query,")",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
}
|
||||
}
|
||||
|
@ -4273,13 +4274,13 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
if (AddStdsWithoutGroupOf[NumGrpTyp])
|
||||
{
|
||||
if (NumPositiveCods || NumNegativeCods)
|
||||
Str_Concat (Gbl.DB.QueryPtr," OR ",
|
||||
Str_Concat (*Query," OR ",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
else
|
||||
Str_Concat (Gbl.DB.QueryPtr," AND (",
|
||||
Str_Concat (*Query," AND (",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
/* Select all the students of the course who don't belong to any group of type GrpTypCod */
|
||||
Str_Concat (Gbl.DB.QueryPtr,"crs_usr.UsrCod NOT IN"
|
||||
Str_Concat (*Query,"crs_usr.UsrCod NOT IN"
|
||||
" (SELECT DISTINCT crs_grp_usr.UsrCod"
|
||||
" FROM crs_grp,crs_grp_usr"
|
||||
" WHERE crs_grp.GrpTypCod='",
|
||||
|
@ -4287,15 +4288,15 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
snprintf (LongStr,sizeof (LongStr),
|
||||
"%ld",
|
||||
Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,LongStr,
|
||||
Str_Concat (*Query,LongStr,
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"' AND crs_grp.GrpCod=crs_grp_usr.GrpCod)",
|
||||
Str_Concat (*Query,"' AND crs_grp.GrpCod=crs_grp_usr.GrpCod)",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
NumNegativeCods++;
|
||||
}
|
||||
if (NumPositiveCods ||
|
||||
NumNegativeCods)
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (*Query,")",
|
||||
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
|
||||
|
||||
/***** Free memory used by the list of booleans AddStdsWithoutGroupOf *****/
|
||||
|
@ -4306,7 +4307,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
}
|
||||
|
||||
/***** The last part of the query is for ordering the list *****/
|
||||
Str_Concat (Gbl.DB.QueryPtr," ORDER BY "
|
||||
Str_Concat (*Query," ORDER BY "
|
||||
"usr_data.Surname1,"
|
||||
"usr_data.Surname2,"
|
||||
"usr_data.FirstName,"
|
||||
|
@ -4324,6 +4325,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role)
|
|||
|
||||
void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
||||
{
|
||||
char *Query;
|
||||
const char *QueryFields =
|
||||
"DISTINCT usr_data.UsrCod,"
|
||||
"usr_data.EncryptedUsrCod,"
|
||||
|
@ -4357,7 +4359,8 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
{
|
||||
case Sco_SCOPE_SYS:
|
||||
/* Get users in courses from the whole platform */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM usr_data,crs_usr"
|
||||
" WHERE usr_data.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4371,7 +4374,8 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CTY:
|
||||
/* Get users in courses from the current country */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM usr_data,crs_usr,courses,degrees,centres,institutions"
|
||||
" WHERE usr_data.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4391,7 +4395,8 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_INS:
|
||||
/* Get users in courses from the current institution */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM usr_data,crs_usr,courses,degrees,centres"
|
||||
" WHERE usr_data.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4410,7 +4415,8 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CTR:
|
||||
/* Get users in courses from the current centre */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM usr_data,crs_usr,courses,degrees"
|
||||
" WHERE usr_data.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4428,7 +4434,8 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_DEG:
|
||||
/* Get users in courses from the current degree */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM usr_data,crs_usr,courses"
|
||||
" WHERE usr_data.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -4445,7 +4452,7 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CRS:
|
||||
/* Get users from the current course */
|
||||
Usr_BuildQueryToGetUsrsLstCrs (Role);
|
||||
Usr_BuildQueryToGetUsrsLstCrs (&Query,Role);
|
||||
break;
|
||||
default:
|
||||
Lay_WrongScopeExit ();
|
||||
|
@ -4456,7 +4463,7 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
Lay_ShowAlert (Lay_INFO,Query);
|
||||
*/
|
||||
/***** Get list of users from database given a query *****/
|
||||
Usr_GetListUsrsFromQuery (Role,Scope);
|
||||
Usr_GetListUsrsFromQuery (&Query,Role,Scope);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -4465,6 +4472,7 @@ void Usr_GetListUsrs (Sco_Scope_t Scope,Rol_Role_t Role)
|
|||
|
||||
void Usr_SearchListUsrs (Rol_Role_t Role)
|
||||
{
|
||||
char *Query;
|
||||
char SubQueryRole[64];
|
||||
const char *QueryFields =
|
||||
"DISTINCT usr_data.UsrCod,"
|
||||
|
@ -4511,14 +4519,16 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
{
|
||||
case Sco_SCOPE_SYS:
|
||||
/* Search users from the whole platform */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,usr_data"
|
||||
" WHERE %s",
|
||||
QueryFields,OrderQuery);
|
||||
break;
|
||||
case Sco_SCOPE_CTY:
|
||||
/* Search users in courses from the current country */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||
|
@ -4533,7 +4543,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_INS:
|
||||
/* Search users in courses from the current institution */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,degrees,centres,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||
|
@ -4547,7 +4558,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CTR:
|
||||
/* Search users in courses from the current centre */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,degrees,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||
|
@ -4560,7 +4572,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_DEG:
|
||||
/* Search users in courses from the current degree */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||
|
@ -4572,7 +4585,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CRS:
|
||||
/* Search users in courses from the current course */
|
||||
DB_BuildQuery ("SELECT %s,crs_usr.Role,crs_usr.Accepted"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s,crs_usr.Role,crs_usr.Accepted"
|
||||
" FROM candidate_users,crs_usr,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
" AND crs_usr.CrsCod=%ld"
|
||||
|
@ -4588,7 +4602,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Rol_GST: // Guests (scope is not used)
|
||||
/* Search users with no courses */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,usr_data"
|
||||
" WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
|
||||
" AND %s",
|
||||
|
@ -4622,7 +4637,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
{
|
||||
case Sco_SCOPE_SYS:
|
||||
/* Search users in courses from the whole platform */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
"%s"
|
||||
|
@ -4633,7 +4649,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CTY:
|
||||
/* Search users in courses from the current country */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
"%s"
|
||||
|
@ -4650,7 +4667,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_INS:
|
||||
/* Search users in courses from the current institution */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,degrees,centres,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
"%s"
|
||||
|
@ -4666,7 +4684,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CTR:
|
||||
/* Search users in courses from the current centre */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,degrees,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
"%s"
|
||||
|
@ -4681,7 +4700,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_DEG:
|
||||
/* Search users in courses from the current degree */
|
||||
DB_BuildQuery ("SELECT %s"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s"
|
||||
" FROM candidate_users,crs_usr,courses,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
"%s"
|
||||
|
@ -4695,7 +4715,8 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
break;
|
||||
case Sco_SCOPE_CRS:
|
||||
/* Search users in courses from the current course */
|
||||
DB_BuildQuery ("SELECT %s,crs_usr.Role,crs_usr.Accepted"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s,crs_usr.Role,crs_usr.Accepted"
|
||||
" FROM candidate_users,crs_usr,usr_data"
|
||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||
"%s"
|
||||
|
@ -4720,7 +4741,7 @@ void Usr_SearchListUsrs (Rol_Role_t Role)
|
|||
// Lay_ShowAlert (Lay_INFO,Query);
|
||||
|
||||
/***** Get list of users from database given a query *****/
|
||||
Usr_GetListUsrsFromQuery (Role,Gbl.Scope.Current);
|
||||
Usr_GetListUsrsFromQuery (&Query,Role,Gbl.Scope.Current);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -4790,6 +4811,7 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
row[ 9]: usr_data.CtyCod
|
||||
row[10]: usr_data.InsCod
|
||||
*/
|
||||
char *Query;
|
||||
|
||||
/***** Build query *****/
|
||||
// Important: it is better to use:
|
||||
|
@ -4799,7 +4821,8 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
switch (Scope)
|
||||
{
|
||||
case Sco_SCOPE_SYS: // All admins
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE UsrCod IN "
|
||||
"(SELECT DISTINCT UsrCod FROM admin)"
|
||||
" ORDER BY Surname1,Surname2,FirstName,UsrCod",
|
||||
|
@ -4807,7 +4830,8 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
break;
|
||||
case Sco_SCOPE_CTY: // System admins
|
||||
// and admins of the institutions, centres and degrees in the current country
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE UsrCod IN "
|
||||
"(SELECT UsrCod FROM admin"
|
||||
" WHERE Scope='%s')"
|
||||
|
@ -4839,7 +4863,8 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
case Sco_SCOPE_INS: // System admins,
|
||||
// admins of the current institution,
|
||||
// and admins of the centres and degrees in the current institution
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE UsrCod IN "
|
||||
"(SELECT UsrCod FROM admin"
|
||||
" WHERE Scope='%s')"
|
||||
|
@ -4868,7 +4893,8 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
// admins of the current institution,
|
||||
// admins and the current centre,
|
||||
// and admins of the degrees in the current centre
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE UsrCod IN "
|
||||
"(SELECT UsrCod FROM admin"
|
||||
" WHERE Scope='%s')"
|
||||
|
@ -4892,7 +4918,8 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
break;
|
||||
case Sco_SCOPE_DEG: // System admins
|
||||
// and admins of the current institution, centre or degree
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE UsrCod IN "
|
||||
"(SELECT UsrCod FROM admin"
|
||||
" WHERE Scope='%s')"
|
||||
|
@ -4918,7 +4945,7 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
|
|||
}
|
||||
|
||||
/***** Get list of administrators from database *****/
|
||||
Usr_GetListUsrsFromQuery (Rol_DEG_ADM,Scope);
|
||||
Usr_GetListUsrsFromQuery (&Query,Rol_DEG_ADM,Scope);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -4952,18 +4979,21 @@ static void Usr_GetGstsLst (Sco_Scope_t Scope)
|
|||
row[ 9]: usr_data.CtyCod
|
||||
row[10]: usr_data.InsCod
|
||||
*/
|
||||
char *Query;
|
||||
|
||||
/***** Build query *****/
|
||||
switch (Scope)
|
||||
{
|
||||
case Sco_SCOPE_SYS:
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
|
||||
" ORDER BY Surname1,Surname2,FirstName,UsrCod",
|
||||
QueryFields);
|
||||
break;
|
||||
case Sco_SCOPE_CTY:
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE (CtyCod=%ld OR InsCtyCod=%ld)"
|
||||
" AND UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
|
||||
" ORDER BY Surname1,Surname2,FirstName,UsrCod",
|
||||
|
@ -4972,7 +5002,8 @@ static void Usr_GetGstsLst (Sco_Scope_t Scope)
|
|||
Gbl.CurrentCty.Cty.CtyCod);
|
||||
break;
|
||||
case Sco_SCOPE_INS:
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE InsCod=%ld"
|
||||
" AND UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
|
||||
" ORDER BY Surname1,Surname2,FirstName,UsrCod",
|
||||
|
@ -4980,7 +5011,8 @@ static void Usr_GetGstsLst (Sco_Scope_t Scope)
|
|||
Gbl.CurrentIns.Ins.InsCod);
|
||||
break;
|
||||
case Sco_SCOPE_CTR:
|
||||
DB_BuildQuery ("SELECT %s FROM usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM usr_data"
|
||||
" WHERE CtrCod=%ld"
|
||||
" AND UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
|
||||
" ORDER BY Surname1,Surname2,FirstName,UsrCod",
|
||||
|
@ -4992,7 +5024,7 @@ static void Usr_GetGstsLst (Sco_Scope_t Scope)
|
|||
}
|
||||
|
||||
/***** Get list of students from database *****/
|
||||
Usr_GetListUsrsFromQuery (Rol_GST,Scope);
|
||||
Usr_GetListUsrsFromQuery (&Query,Rol_GST,Scope);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -5026,13 +5058,15 @@ void Usr_GetUnorderedStdsCodesInDeg (long DegCod)
|
|||
row[ 9]: usr_data.CtyCod
|
||||
row[10]: usr_data.InsCod
|
||||
*/
|
||||
char *Query;
|
||||
|
||||
Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs = 0;
|
||||
|
||||
if (Usr_GetNumUsrsInCrssOfDeg (Rol_STD,DegCod))
|
||||
{
|
||||
/***** Get the students in a degree from database *****/
|
||||
DB_BuildQuery ("SELECT %s FROM courses,crs_usr,usr_data"
|
||||
DB_BuildQuery_old (&Query,
|
||||
"SELECT %s FROM courses,crs_usr,usr_data"
|
||||
" WHERE courses.DegCod=%ld"
|
||||
" AND courses.CrsCod=crs_usr.CrsCod"
|
||||
" AND crs_usr.Role=%u"
|
||||
|
@ -5041,7 +5075,7 @@ void Usr_GetUnorderedStdsCodesInDeg (long DegCod)
|
|||
DegCod,(unsigned) Rol_STD);
|
||||
|
||||
/***** Get list of students from database *****/
|
||||
Usr_GetListUsrsFromQuery (Rol_STD,Sco_SCOPE_DEG);
|
||||
Usr_GetListUsrsFromQuery (&Query,Rol_STD,Sco_SCOPE_DEG);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5049,7 +5083,7 @@ void Usr_GetUnorderedStdsCodesInDeg (long DegCod)
|
|||
/********************** Get list of users from database **********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Usr_GetListUsrsFromQuery (Rol_Role_t Role,Sco_Scope_t Scope)
|
||||
static void Usr_GetListUsrsFromQuery (char **Query,Rol_Role_t Role,Sco_Scope_t Scope)
|
||||
{
|
||||
extern const char *Txt_The_list_of_X_users_is_too_large_to_be_displayed;
|
||||
MYSQL_RES *mysql_res;
|
||||
|
@ -5058,20 +5092,20 @@ static void Usr_GetListUsrsFromQuery (Rol_Role_t Role,Sco_Scope_t Scope)
|
|||
struct UsrInList *UsrInList;
|
||||
bool Abort = false;
|
||||
|
||||
if (Gbl.DB.QueryPtr == NULL)
|
||||
if (*Query == NULL)
|
||||
{
|
||||
Gbl.Usrs.LstUsrs[Role].NumUsrs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Gbl.DB.QueryPtr[0])
|
||||
if (!*Query[0])
|
||||
{
|
||||
Gbl.Usrs.LstUsrs[Role].NumUsrs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/***** Query database *****/
|
||||
if ((Gbl.Usrs.LstUsrs[Role].NumUsrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get list of users")))
|
||||
if ((Gbl.Usrs.LstUsrs[Role].NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get list of users")))
|
||||
{
|
||||
if (Gbl.Usrs.LstUsrs[Role].NumUsrs > Cfg_MAX_USRS_IN_LIST)
|
||||
{
|
||||
|
|
|
@ -2680,6 +2680,7 @@ int swad__sendAttendanceUsers (struct soap *soap,
|
|||
char LongStr[1 + 10 + 1];
|
||||
struct UsrData UsrDat;
|
||||
unsigned NumCodsInList;
|
||||
char *Query;
|
||||
char SubQuery[256];
|
||||
size_t Length = 0; // Initialized to avoid warning
|
||||
|
||||
|
@ -2733,11 +2734,11 @@ int swad__sendAttendanceUsers (struct soap *soap,
|
|||
|
||||
/* Start query used to mark not present users as absent */
|
||||
Length = 256 + NumCodsInList * (1 + 1 + 10 + 1) - 1;
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (Length + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (Length + 1)) == NULL)
|
||||
return soap_receiver_fault (Gbl.soap,
|
||||
"Not enough memory",
|
||||
"Not enough memory to store list of users");
|
||||
sprintf (Gbl.DB.QueryPtr,"UPDATE att_usr SET Present='N'"
|
||||
sprintf (Query,"UPDATE att_usr SET Present='N'"
|
||||
" WHERE AttCod=%ld",
|
||||
Att.AttCod);
|
||||
}
|
||||
|
@ -2763,7 +2764,7 @@ int swad__sendAttendanceUsers (struct soap *soap,
|
|||
sprintf (SubQuery,sendAttendanceUsersOut->numUsers ? ",%ld" :
|
||||
" AND UsrCod NOT IN (%ld",
|
||||
UsrDat.UsrCod);
|
||||
Str_Concat (Gbl.DB.QueryPtr,SubQuery,
|
||||
Str_Concat (Query,SubQuery,
|
||||
Length);
|
||||
}
|
||||
|
||||
|
@ -2775,10 +2776,10 @@ int swad__sendAttendanceUsers (struct soap *soap,
|
|||
{
|
||||
/* Mark not present users as absent in table of users */
|
||||
if (sendAttendanceUsersOut->numUsers)
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Length);
|
||||
|
||||
DB_QueryUPDATE_new ("can not set other users as absent");
|
||||
DB_QueryUPDATE (Query,"can not set other users as absent");
|
||||
|
||||
/* Clean table att_usr */
|
||||
Att_RemoveUsrsAbsentWithoutCommentsFromAttEvent (Att.AttCod);
|
||||
|
@ -3145,9 +3146,11 @@ int swad__sendMessage (struct soap *soap,
|
|||
int ReturnCode;
|
||||
long ReplyUsrCod = -1L;
|
||||
char Nickname[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
||||
char *Query;
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
unsigned NumRow,NumRows;
|
||||
unsigned NumRow;
|
||||
unsigned NumRows;
|
||||
bool FirstNickname = true;
|
||||
bool ThereAreNicknames = false;
|
||||
const char *Ptr;
|
||||
|
@ -3229,17 +3232,17 @@ int swad__sendMessage (struct soap *soap,
|
|||
}
|
||||
|
||||
/***** Allocate space for query *****/
|
||||
if ((Gbl.DB.QueryPtr = (char *) malloc (Svc_MAX_BYTES_QUERY_RECIPIENTS + 1)) == NULL)
|
||||
if ((Query = (char *) malloc (Svc_MAX_BYTES_QUERY_RECIPIENTS + 1)) == NULL)
|
||||
Lay_NotEnoughMemoryExit ();
|
||||
|
||||
/***** Build query for recipients from database *****/
|
||||
if (ReplyUsrCod > 0)
|
||||
snprintf (Gbl.DB.QueryPtr,Svc_MAX_BYTES_QUERY_RECIPIENTS + 1,
|
||||
snprintf (Query,Svc_MAX_BYTES_QUERY_RECIPIENTS + 1,
|
||||
"SELECT UsrCod FROM usr_data"
|
||||
" WHERE UsrCod=%ld",
|
||||
ReplyUsrCod);
|
||||
else
|
||||
Gbl.DB.QueryPtr[0] = '\0';
|
||||
Query[0] = '\0';
|
||||
|
||||
/***** Loop over recipients' nicknames building query *****/
|
||||
Ptr = to;
|
||||
|
@ -3254,7 +3257,7 @@ int swad__sendMessage (struct soap *soap,
|
|||
Str_RemoveLeadingArrobas (Nickname);
|
||||
|
||||
/* Check for overflow in query */
|
||||
if (strlen (Gbl.DB.QueryPtr) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
|
||||
if (strlen (Query) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS)
|
||||
return soap_sender_fault (Gbl.soap,
|
||||
"Can not send message",
|
||||
|
@ -3264,25 +3267,25 @@ int swad__sendMessage (struct soap *soap,
|
|||
if (FirstNickname)
|
||||
{
|
||||
if (ReplyUsrCod > 0)
|
||||
Str_Concat (Gbl.DB.QueryPtr," UNION ",
|
||||
Str_Concat (Query," UNION ",
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"SELECT UsrCod FROM usr_nicknames"
|
||||
Str_Concat (Query,"SELECT UsrCod FROM usr_nicknames"
|
||||
" WHERE Nickname IN ('",
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||
FirstNickname = false;
|
||||
ThereAreNicknames = true;
|
||||
}
|
||||
else
|
||||
Str_Concat (Gbl.DB.QueryPtr,",'",
|
||||
Str_Concat (Query,",'",
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||
Str_Concat (Gbl.DB.QueryPtr,Nickname,
|
||||
Str_Concat (Query,Nickname,
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||
Str_Concat (Gbl.DB.QueryPtr,"'",
|
||||
Str_Concat (Query,"'",
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||
}
|
||||
}
|
||||
if (ThereAreNicknames)
|
||||
Str_Concat (Gbl.DB.QueryPtr,")",
|
||||
Str_Concat (Query,")",
|
||||
Svc_MAX_BYTES_QUERY_RECIPIENTS);
|
||||
|
||||
/***** Initialize output structure *****/
|
||||
|
@ -3293,7 +3296,7 @@ int swad__sendMessage (struct soap *soap,
|
|||
if (ReplyUsrCod > 0 || ThereAreNicknames) // There are a recipient to reply or nicknames in "to"
|
||||
{
|
||||
/***** Get users *****/
|
||||
NumRows = DB_QuerySELECT_new (&mysql_res,"can not get users");
|
||||
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get users");
|
||||
|
||||
sendMessageOut->numUsers = (int) NumRows;
|
||||
sendMessageOut->usersArray.__size = (int) NumRows;
|
||||
|
|
Loading…
Reference in New Issue
Block a user