From e9cb6f21dc367d08fbf84163706722839c0c2819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Tue, 30 Oct 2018 02:37:09 +0100 Subject: [PATCH] Version 18.10 --- swad_ID.c | 25 +- swad_attendance.c | 10 +- swad_changelog.h | 3 +- swad_database.c | 87 ++++- swad_database.h | 5 + swad_search.c | 4 - swad_statistic.c | 126 ++++---- swad_test.c | 92 +++--- swad_user.c | 772 +++++++++++++++++++++++---------------------- swad_web_service.c | 39 +-- 10 files changed, 632 insertions(+), 531 deletions(-) diff --git a/swad_ID.c b/swad_ID.c index 8863d91c7..63dd961c7 100644 --- a/swad_ID.c +++ b/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,34 +191,34 @@ 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" - " WHERE usr_IDs.UsrID IN (" : - "SELECT DISTINCT(UsrCod) FROM usr_IDs" - " WHERE UsrID IN (", + 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 (", MaxLength); for (NumID = 0; NumID < UsrDat->IDs.Num; 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 *****/ diff --git a/swad_attendance.c b/swad_attendance.c index 960192c90..17c397101 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -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; diff --git a/swad_changelog.h b/swad_changelog.h index be192a43e..a97524a79 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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) diff --git a/swad_database.c b/swad_database.c index 748f3cb96..61101586f 100644 --- a/swad_database.c +++ b/swad_database.c @@ -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."); diff --git a/swad_database.h b/swad_database.h index d5ff4e79d..40f7b590d 100644 --- a/swad_database.h +++ b/swad_database.h @@ -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); diff --git a/swad_search.c b/swad_search.c index 0343d2f47..d0f6382ea 100644 --- a/swad_search.c +++ b/swad_search.c @@ -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); } diff --git a/swad_statistic.c b/swad_statistic.c index 82c646794..c745f15ee 100644 --- a/swad_statistic.c +++ b/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) diff --git a/swad_test.c b/swad_test.c index 68d3bd533..e2b4501b9 100644 --- a/swad_test.c +++ b/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"); } /*****************************************************************************/ diff --git a/swad_user.c b/swad_user.c index 0c2a37394..b48dab9ce 100644 --- a/swad_user.c +++ b/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,8 +4241,8 @@ 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" - " (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE", + 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; for (NumGrpSel = 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='" : - " 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,29 +4274,29 @@ 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" - " (SELECT DISTINCT crs_grp_usr.UsrCod" - " FROM crs_grp,crs_grp_usr" - " WHERE crs_grp.GrpTypCod='", + Str_Concat (*Query,"crs_usr.UsrCod NOT IN" + " (SELECT DISTINCT crs_grp_usr.UsrCod" + " FROM crs_grp,crs_grp_usr" + " WHERE crs_grp.GrpTypCod='", Usr_MAX_BYTES_QUERY_GET_LIST_USRS); 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,11 +4307,11 @@ 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 " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", + Str_Concat (*Query," ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", Usr_MAX_BYTES_QUERY_GET_LIST_USRS); } @@ -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,95 +4359,100 @@ 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" - " FROM usr_data,crs_usr" - " WHERE usr_data.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - QueryFields, - (unsigned) Role); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM usr_data,crs_usr" + " WHERE usr_data.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role=%u" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + QueryFields, + (unsigned) Role); break; case Sco_SCOPE_CTY: /* Get users in courses from the current country */ - DB_BuildQuery ("SELECT %s" - " FROM usr_data,crs_usr,courses,degrees,centres,institutions" - " WHERE usr_data.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=institutions.InsCod" - " AND institutions.CtyCod=%ld" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - QueryFields, - (unsigned) Role, - Gbl.CurrentCty.Cty.CtyCod); + 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" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=institutions.InsCod" + " AND institutions.CtyCod=%ld" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + QueryFields, + (unsigned) Role, + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: /* Get users in courses from the current institution */ - DB_BuildQuery ("SELECT %s" - " FROM usr_data,crs_usr,courses,degrees,centres" - " WHERE usr_data.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=%ld" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - QueryFields, - (unsigned) Role, - Gbl.CurrentIns.Ins.InsCod); + 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" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=%ld" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + QueryFields, + (unsigned) Role, + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: /* Get users in courses from the current centre */ - DB_BuildQuery ("SELECT %s" - " FROM usr_data,crs_usr,courses,degrees" - " WHERE usr_data.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=%ld" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - QueryFields, - (unsigned) Role, - Gbl.CurrentCtr.Ctr.CtrCod); + 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" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=%ld" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + QueryFields, + (unsigned) Role, + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: /* Get users in courses from the current degree */ - DB_BuildQuery ("SELECT %s" - " FROM usr_data,crs_usr,courses" - " WHERE usr_data.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=%ld" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - QueryFields, - (unsigned) Role, - Gbl.CurrentDeg.Deg.DegCod); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM usr_data,crs_usr,courses" + " WHERE usr_data.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role=%u" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=%ld" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + QueryFields, + (unsigned) Role, + Gbl.CurrentDeg.Deg.DegCod); 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,75 +4519,81 @@ void Usr_SearchListUsrs (Rol_Role_t Role) { case Sco_SCOPE_SYS: /* Search users from the whole platform */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,usr_data" - " WHERE %s", - QueryFields,OrderQuery); + 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" - " FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=institutions.InsCod" - " AND institutions.CtyCod=%ld" - " AND %s", - QueryFields, - Gbl.CurrentCty.Cty.CtyCod, - OrderQuery); + 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" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=institutions.InsCod" + " AND institutions.CtyCod=%ld" + " AND %s", + QueryFields, + Gbl.CurrentCty.Cty.CtyCod, + OrderQuery); break; case Sco_SCOPE_INS: /* Search users in courses from the current institution */ - DB_BuildQuery ("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" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=%ld" - " AND %s", - QueryFields, - Gbl.CurrentIns.Ins.InsCod, - OrderQuery); + 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" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=%ld" + " AND %s", + QueryFields, + Gbl.CurrentIns.Ins.InsCod, + OrderQuery); break; case Sco_SCOPE_CTR: /* Search users in courses from the current centre */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,courses,degrees,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=%ld" - " AND %s", - QueryFields, - Gbl.CurrentCtr.Ctr.CtrCod, - OrderQuery); + 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" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=%ld" + " AND %s", + QueryFields, + Gbl.CurrentCtr.Ctr.CtrCod, + OrderQuery); break; case Sco_SCOPE_DEG: /* Search users in courses from the current degree */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,courses,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=%ld" - " AND %s", - QueryFields, - Gbl.CurrentDeg.Deg.DegCod, - OrderQuery); + 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" + " AND courses.DegCod=%ld" + " AND %s", + QueryFields, + Gbl.CurrentDeg.Deg.DegCod, + OrderQuery); break; case Sco_SCOPE_CRS: /* Search users in courses from the current course */ - DB_BuildQuery ("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" - " AND %s", - QueryFields, - Gbl.CurrentCrs.Crs.CrsCod, - OrderQuery); + 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" + " AND %s", + QueryFields, + Gbl.CurrentCrs.Crs.CrsCod, + OrderQuery); break; default: Lay_WrongScopeExit (); @@ -4588,12 +4602,13 @@ 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" - " FROM candidate_users,usr_data" - " WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " AND %s", - QueryFields, - OrderQuery); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM candidate_users,usr_data" + " WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" + " AND %s", + QueryFields, + OrderQuery); break; case Rol_STD: // Student case Rol_NET: // Non-editing teacher @@ -4622,89 +4637,95 @@ void Usr_SearchListUsrs (Rol_Role_t Role) { case Sco_SCOPE_SYS: /* Search users in courses from the whole platform */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - "%s" - " AND %s", - QueryFields, - SubQueryRole, - OrderQuery); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM candidate_users,crs_usr,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + "%s" + " AND %s", + QueryFields, + SubQueryRole, + OrderQuery); break; case Sco_SCOPE_CTY: /* Search users in courses from the current country */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - "%s" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=institutions.InsCod" - " AND institutions.CtyCod=%ld" - " AND %s", - QueryFields, - SubQueryRole, - Gbl.CurrentCty.Cty.CtyCod, - OrderQuery); + 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" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=institutions.InsCod" + " AND institutions.CtyCod=%ld" + " AND %s", + QueryFields, + SubQueryRole, + Gbl.CurrentCty.Cty.CtyCod, + OrderQuery); break; case Sco_SCOPE_INS: /* Search users in courses from the current institution */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,courses,degrees,centres,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - "%s" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=%ld" - " AND %s", - QueryFields, - SubQueryRole, - Gbl.CurrentIns.Ins.InsCod, - OrderQuery); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM candidate_users,crs_usr,courses,degrees,centres,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + "%s" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=%ld" + " AND %s", + QueryFields, + SubQueryRole, + Gbl.CurrentIns.Ins.InsCod, + OrderQuery); break; case Sco_SCOPE_CTR: /* Search users in courses from the current centre */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,courses,degrees,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - "%s" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=%ld" - " AND %s", - QueryFields, - SubQueryRole, - Gbl.CurrentCtr.Ctr.CtrCod, - OrderQuery); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM candidate_users,crs_usr,courses,degrees,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + "%s" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod=%ld" + " AND %s", + QueryFields, + SubQueryRole, + Gbl.CurrentCtr.Ctr.CtrCod, + OrderQuery); break; case Sco_SCOPE_DEG: /* Search users in courses from the current degree */ - DB_BuildQuery ("SELECT %s" - " FROM candidate_users,crs_usr,courses,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - "%s" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=%ld" - " AND %s", - QueryFields, - SubQueryRole, - Gbl.CurrentDeg.Deg.DegCod, - OrderQuery); + DB_BuildQuery_old (&Query, + "SELECT %s" + " FROM candidate_users,crs_usr,courses,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + "%s" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=%ld" + " AND %s", + QueryFields, + SubQueryRole, + Gbl.CurrentDeg.Deg.DegCod, + OrderQuery); break; case Sco_SCOPE_CRS: /* Search users in courses from the current course */ - DB_BuildQuery ("SELECT %s,crs_usr.Role,crs_usr.Accepted" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - "%s" - " AND crs_usr.CrsCod=%ld" - " AND %s", - QueryFields, - SubQueryRole, - Gbl.CurrentCrs.Crs.CrsCod, - OrderQuery); + 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" + " AND crs_usr.CrsCod=%ld" + " AND %s", + QueryFields, + SubQueryRole, + Gbl.CurrentCrs.Crs.CrsCod, + OrderQuery); break; default: Lay_WrongScopeExit (); @@ -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,118 +4821,123 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: // All admins - DB_BuildQuery ("SELECT %s FROM usr_data" - " WHERE UsrCod IN " - "(SELECT DISTINCT UsrCod FROM admin)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields); + DB_BuildQuery_old (&Query, + "SELECT %s FROM usr_data" + " WHERE UsrCod IN " + "(SELECT DISTINCT UsrCod FROM admin)" + " ORDER BY Surname1,Surname2,FirstName,UsrCod", + QueryFields); 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" - " WHERE UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s')" - " OR UsrCod IN " - "(SELECT admin.UsrCod FROM admin,institutions" - " WHERE admin.Scope='%s'" - " AND admin.Cod=institutions.InsCod" - " AND institutions.CtyCod=%ld)" - " OR UsrCod IN " - "(SELECT admin.UsrCod FROM admin,centres,institutions" - " WHERE admin.Scope='%s'" - " AND admin.Cod=centres.CtrCod" - " AND centres.InsCod=institutions.InsCod" - " AND institutions.CtyCod=%ld)" - " OR UsrCod IN " - "(SELECT admin.UsrCod FROM admin,degrees,centres,institutions" - " WHERE admin.Scope='%s'" - " AND admin.Cod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=institutions.InsCod" - " AND institutions.CtyCod=%ld)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Sco_ScopeDB[Sco_SCOPE_SYS], - Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentCty.Cty.CtyCod, - Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCty.Cty.CtyCod, - Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentCty.Cty.CtyCod); + DB_BuildQuery_old (&Query, + "SELECT %s FROM usr_data" + " WHERE UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s')" + " OR UsrCod IN " + "(SELECT admin.UsrCod FROM admin,institutions" + " WHERE admin.Scope='%s'" + " AND admin.Cod=institutions.InsCod" + " AND institutions.CtyCod=%ld)" + " OR UsrCod IN " + "(SELECT admin.UsrCod FROM admin,centres,institutions" + " WHERE admin.Scope='%s'" + " AND admin.Cod=centres.CtrCod" + " AND centres.InsCod=institutions.InsCod" + " AND institutions.CtyCod=%ld)" + " OR UsrCod IN " + "(SELECT admin.UsrCod FROM admin,degrees,centres,institutions" + " WHERE admin.Scope='%s'" + " AND admin.Cod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=institutions.InsCod" + " AND institutions.CtyCod=%ld)" + " ORDER BY Surname1,Surname2,FirstName,UsrCod", + QueryFields, + Sco_ScopeDB[Sco_SCOPE_SYS], + Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentCty.Cty.CtyCod, + Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCty.Cty.CtyCod, + Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentCty.Cty.CtyCod); break; 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" - " WHERE UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s')" - " OR UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s' AND Cod=%ld)" - " OR UsrCod IN " - "(SELECT admin.UsrCod FROM admin,centres" - " WHERE admin.Scope='%s'" - " AND admin.Cod=centres.CtrCod" - " AND centres.InsCod=%ld)" - " OR UsrCod IN " - "(SELECT admin.UsrCod FROM admin,degrees,centres" - " WHERE admin.Scope='%s'" - " AND admin.Cod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod=%ld)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Sco_ScopeDB[Sco_SCOPE_SYS], - Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentIns.Ins.InsCod); + DB_BuildQuery_old (&Query, + "SELECT %s FROM usr_data" + " WHERE UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s')" + " OR UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s' AND Cod=%ld)" + " OR UsrCod IN " + "(SELECT admin.UsrCod FROM admin,centres" + " WHERE admin.Scope='%s'" + " AND admin.Cod=centres.CtrCod" + " AND centres.InsCod=%ld)" + " OR UsrCod IN " + "(SELECT admin.UsrCod FROM admin,degrees,centres" + " WHERE admin.Scope='%s'" + " AND admin.Cod=degrees.DegCod" + " AND degrees.CtrCod=centres.CtrCod" + " AND centres.InsCod=%ld)" + " ORDER BY Surname1,Surname2,FirstName,UsrCod", + QueryFields, + Sco_ScopeDB[Sco_SCOPE_SYS], + Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: // System admins, // 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" - " WHERE UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s')" - " OR UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s' AND Cod=%ld)" - " OR UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s' AND Cod=%ld)" - " OR UsrCod IN " - "(SELECT admin.UsrCod FROM admin,degrees" - " WHERE admin.Scope='%s'" - " AND admin.Cod=degrees.DegCod" - " AND degrees.CtrCod=%ld)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Sco_ScopeDB[Sco_SCOPE_SYS], - Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCtr.Ctr.CtrCod, - Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentCtr.Ctr.CtrCod); + DB_BuildQuery_old (&Query, + "SELECT %s FROM usr_data" + " WHERE UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s')" + " OR UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s' AND Cod=%ld)" + " OR UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s' AND Cod=%ld)" + " OR UsrCod IN " + "(SELECT admin.UsrCod FROM admin,degrees" + " WHERE admin.Scope='%s'" + " AND admin.Cod=degrees.DegCod" + " AND degrees.CtrCod=%ld)" + " ORDER BY Surname1,Surname2,FirstName,UsrCod", + QueryFields, + Sco_ScopeDB[Sco_SCOPE_SYS], + Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCtr.Ctr.CtrCod, + Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: // System admins // and admins of the current institution, centre or degree - DB_BuildQuery ("SELECT %s FROM usr_data" - " WHERE UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s')" - " OR UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s' AND Cod=%ld)" - " OR UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s' AND Cod=%ld)" - " OR UsrCod IN " - "(SELECT UsrCod FROM admin" - " WHERE Scope='%s' AND Cod=%ld)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Sco_ScopeDB[Sco_SCOPE_SYS], - Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod, - Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCtr.Ctr.CtrCod, - Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentDeg.Deg.DegCod); + DB_BuildQuery_old (&Query, + "SELECT %s FROM usr_data" + " WHERE UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s')" + " OR UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s' AND Cod=%ld)" + " OR UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s' AND Cod=%ld)" + " OR UsrCod IN " + "(SELECT UsrCod FROM admin" + " WHERE Scope='%s' AND Cod=%ld)" + " ORDER BY Surname1,Surname2,FirstName,UsrCod", + QueryFields, + Sco_ScopeDB[Sco_SCOPE_SYS], + Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod, + Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCtr.Ctr.CtrCod, + Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentDeg.Deg.DegCod); break; default: // not aplicable Lay_WrongScopeExit (); @@ -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,47 +4979,52 @@ 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" - " WHERE UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields); + 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" - " WHERE (CtyCod=%ld OR InsCtyCod=%ld)" - " AND UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Gbl.CurrentCty.Cty.CtyCod, - Gbl.CurrentCty.Cty.CtyCod); + 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", + QueryFields, + Gbl.CurrentCty.Cty.CtyCod, + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: - DB_BuildQuery ("SELECT %s FROM usr_data" - " WHERE InsCod=%ld" - " AND UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Gbl.CurrentIns.Ins.InsCod); + 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", + QueryFields, + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - DB_BuildQuery ("SELECT %s FROM usr_data" - " WHERE CtrCod=%ld" - " AND UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " ORDER BY Surname1,Surname2,FirstName,UsrCod", - QueryFields, - Gbl.CurrentCtr.Ctr.CtrCod); + 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", + QueryFields, + Gbl.CurrentCtr.Ctr.CtrCod); break; default: // not aplicable return; } /***** Get list of students from database *****/ - Usr_GetListUsrsFromQuery (Rol_GST,Scope); + Usr_GetListUsrsFromQuery (&Query,Rol_GST,Scope); } /*****************************************************************************/ @@ -5026,22 +5058,24 @@ 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" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=usr_data.UsrCod", - QueryFields, - DegCod,(unsigned) Rol_STD); + 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" + " AND crs_usr.UsrCod=usr_data.UsrCod", + QueryFields, + 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) { diff --git a/swad_web_service.c b/swad_web_service.c index c05fb0ad9..0812c7063 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -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,12 +2734,12 @@ 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'" - " WHERE AttCod=%ld", + 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;