From 0a3a973e9d8e3ff4a7ce8632cc88984c9060af96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Mon, 27 Jun 2016 14:30:53 +0200 Subject: [PATCH] Version 15.233 --- swad_changelog.h | 3 +- swad_user.c | 812 ++++++----------------------------------------- 2 files changed, 103 insertions(+), 712 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index ea0bdae7a..7b4dff547 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -130,13 +130,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.232.1 (2016-06-27)" +#define Log_PLATFORM_VERSION "SWAD 15.233 (2016-06-27)" #define CSS_FILE "swad15.229.css" #define JS_FILE "swad15.226.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 15.233: Jun 27, 2015 Simplified search for users with a role. Now all users can be found. (203103 lines) Version 15.232.1: Jun 27, 2015 Fixed bug in search of any user (acceptation of enrollment was wrong). (203702 lines) Version 15.232: Jun 27, 2015 Search any user, independently on role. (203657 lines) Version 15.231.4: Jun 24, 2015 Fix bug (buffer overflow) when getting users. (203474 lines) diff --git a/swad_user.c b/swad_user.c index ef4c0380f..d7df818f8 100644 --- a/swad_user.c +++ b/swad_user.c @@ -144,9 +144,7 @@ static void Usr_WriteUsrData (const char *BgColor, static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,char *Query); static void Usr_SearchListUsrs (Rol_Role_t Role); static void Usr_CreateTmpTableAndSearchCandidateUsrs (const char *UsrQuery); -static void Usr_CreateExtraTmpTablesForSearch (void); -static void Usr_CloneTmpTableCandidateUsers (unsigned NumCopy); -static void Usr_DropTmpTablesWithCandidateUsrs (void); +static void Usr_DropTmpTableWithCandidateUsrs (void); static void Usr_GetAdmsLst (Sco_Scope_t Scope); static void Usr_GetGstsLst (Sco_Scope_t Scope); @@ -3806,7 +3804,6 @@ void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope) static void Usr_SearchListUsrs (Rol_Role_t Role) { - extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY]; char Query[4*1024]; /***** Build query *****/ @@ -3917,672 +3914,128 @@ static void Usr_SearchListUsrs (Rol_Role_t Role) break; case Rol__GUEST_: // Guests (scope is not used) /* Search users with no courses */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Guests whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,usr_data" - " WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_SYS_ADM: - // Any guest - sprintf (Query,"SELECT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,usr_data" - " WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod"); - break; - default: // I am logged - // Guests whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,usr_data" - " WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%s')" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ]); - break; - } + sprintf (Query,"SELECT candidate_users.UsrCod,usr_data.Sex" + " FROM candidate_users,usr_data" + " WHERE candidate_users.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod"); break; case Rol_STUDENT: case Rol_TEACHER: /* To achieve maximum speed, it's important to do the things in this order: 1) Search for user's name (UsrQuery) getting candidate users - (this search is not stored in a temporary table - because MySQL does not allow temporary tables - to be used more than once in the same query) 2) Filter the candidate users according to scope */ switch (Gbl.Scope.Current) { case Sco_SCOPE_SYS: /* Search users in courses from the whole platform */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Users whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_SYS_ADM: - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role); - break; - default: // I am logged - Usr_CreateExtraTmpTablesForSearch (); - sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM " - "(" - // Users whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%s')" - " UNION " - // Users who share any course with me - // and whose privacy is Pri_VISIBILITY_COURSE - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_2,crs_usr,my_crs,usr_data" - " WHERE candidate_users_2.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs.CrsCod" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " UNION " - // Users who share any course with me with another role - // and whose privacy is Pri_VISIBILITY_USER - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_3,crs_usr,my_crs_role,usr_data" - " WHERE candidate_users_3.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs_role.CrsCod" - " AND crs_usr.Role<>my_crs_role.Role" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - ") " - "AS list_usrs,usr_data" - " WHERE list_usrs.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ], - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_COURSE], - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_USER ]); - break; - } + sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" + " FROM candidate_users,crs_usr,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role='%u'" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + (unsigned) Role); break; case Sco_SCOPE_CTY: /* Search users in courses from the current country */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Users whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data" - " WHERE candidate_users.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'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentCty.Cty.CtyCod, - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_SYS_ADM: - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data" - " WHERE candidate_users.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'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentCty.Cty.CtyCod); - break; - default: // I am logged - Usr_CreateExtraTmpTablesForSearch (); - sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM " - "(" - // Users whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users,crs_usr,usr_data,courses,degrees,centres,institutions" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%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'" - " UNION " - // Users who share any course with me - // and whose privacy is Pri_VISIBILITY_COURSE - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_2,crs_usr,my_crs,usr_data,courses,degrees,centres,institutions" - " WHERE candidate_users_2.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs.CrsCod" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%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'" - " UNION " - // Users who share any course with me with another role - // and whose privacy is Pri_VISIBILITY_USER - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_3,crs_usr,my_crs_role,usr_data,courses,degrees,centres,institutions" - " WHERE candidate_users_3.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs_role.CrsCod" - " AND crs_usr.Role<>my_crs_role.Role" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%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'" - ") " - "AS list_usrs,usr_data" - " WHERE list_usrs.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ], - Gbl.CurrentCty.Cty.CtyCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_COURSE], - Gbl.CurrentCty.Cty.CtyCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_USER ], - Gbl.CurrentCty.Cty.CtyCod); - break; - } + sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" + " FROM candidate_users,crs_usr,courses,degrees,centres,institutions,usr_data" + " WHERE candidate_users.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'" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + (unsigned) Role, + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: /* Search users in courses from the current institution */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Users whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,degrees,centres,usr_data" - " WHERE candidate_users.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'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentIns.Ins.InsCod, - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_INS_ADM: - case Rol_SYS_ADM: - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,degrees,centres,usr_data" - " WHERE candidate_users.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'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentIns.Ins.InsCod); - break; - default: // I am logged - Usr_CreateExtraTmpTablesForSearch (); - sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM " - "(" - // Users whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users,crs_usr,usr_data,courses,degrees,centres" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%s')" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod='%ld'" - " UNION " - // Users who share any course with me - // and whose privacy is Pri_VISIBILITY_COURSE - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_2,crs_usr,my_crs,usr_data,courses,degrees,centres" - " WHERE candidate_users_2.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs.CrsCod" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod='%ld'" - " UNION " - // Users who share any course with me with another role - // and whose privacy is Pri_VISIBILITY_USER - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_3,crs_usr,my_crs_role,usr_data,courses,degrees,centres" - " WHERE candidate_users_3.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs_role.CrsCod" - " AND crs_usr.Role<>my_crs_role.Role" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND centres.InsCod='%ld'" - ") " - "AS list_usrs,usr_data" - " WHERE list_usrs.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ], - Gbl.CurrentIns.Ins.InsCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_COURSE], - Gbl.CurrentIns.Ins.InsCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_USER ], - Gbl.CurrentIns.Ins.InsCod); - break; - } + sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" + " FROM candidate_users,crs_usr,courses,degrees,centres,usr_data" + " WHERE candidate_users.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'" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + (unsigned) Role, + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: /* Search users in courses from the current centre */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Users whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,degrees,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod='%ld'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentCtr.Ctr.CtrCod, - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_CTR_ADM: - case Rol_INS_ADM: - case Rol_SYS_ADM: - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,degrees,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod='%ld'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentCtr.Ctr.CtrCod); - break; - default: // I am logged - Usr_CreateExtraTmpTablesForSearch (); - sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM " - "(" - // Users whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users,crs_usr,usr_data,courses,degrees" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%s')" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod='%ld'" - " UNION " - // Users who share any course with me - // and whose privacy is Pri_VISIBILITY_COURSE - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_2,crs_usr,my_crs,usr_data,courses,degrees" - " WHERE candidate_users_2.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs.CrsCod" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod='%ld'" - " UNION " - // Users who share any course with me with another role - // and whose privacy is Pri_VISIBILITY_USER - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_3,crs_usr,my_crs_role,usr_data,courses,degrees" - " WHERE candidate_users_3.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs_role.CrsCod" - " AND crs_usr.Role<>my_crs_role.Role" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod=degrees.DegCod" - " AND degrees.CtrCod='%ld'" - ") " - "AS list_usrs,usr_data" - " WHERE list_usrs.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ], - Gbl.CurrentCtr.Ctr.CtrCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_COURSE], - Gbl.CurrentCtr.Ctr.CtrCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_USER ], - Gbl.CurrentCtr.Ctr.CtrCod); - break; - } + sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" + " FROM candidate_users,crs_usr,courses,degrees,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod=degrees.DegCod" + " AND degrees.CtrCod='%ld'" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + (unsigned) Role, + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: /* Search users in courses from the current degree */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Users whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod='%ld'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentDeg.Deg.DegCod, - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_DEG_ADM: - case Rol_CTR_ADM: - case Rol_INS_ADM: - case Rol_SYS_ADM: - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" - " FROM candidate_users,crs_usr,courses,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod='%ld'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentDeg.Deg.DegCod); - break; - default: // I am logged - Usr_CreateExtraTmpTablesForSearch (); - sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM " - "(" - // Users whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users,crs_usr,usr_data,courses" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%s')" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod='%ld'" - " UNION " - // Users who share any course with me - // and whose privacy is Pri_VISIBILITY_COURSE - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_2,crs_usr,my_crs,usr_data,courses" - " WHERE candidate_users_2.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs.CrsCod" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod='%ld'" - " UNION " - // Users who share any course with me with another role - // and whose privacy is Pri_VISIBILITY_USER - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_3,crs_usr,my_crs_role,usr_data,courses" - " WHERE candidate_users_3.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs_role.CrsCod" - " AND crs_usr.Role<>my_crs_role.Role" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod='%ld'" - ") " - "AS list_usrs,usr_data" - " WHERE list_usrs.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ], - Gbl.CurrentDeg.Deg.DegCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_COURSE], - Gbl.CurrentDeg.Deg.DegCod, - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_USER ], - Gbl.CurrentDeg.Deg.DegCod); - break; - } + sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex" + " FROM candidate_users,crs_usr,courses,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.CrsCod=courses.CrsCod" + " AND courses.DegCod='%ld'" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + (unsigned) Role, + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: /* Search users in courses from the current course */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_UNKNOWN: // I am not logged - // Users whose privacy is Pri_VISIBILITY_WORLD - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex,crs_usr.Accepted" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod='%ld'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentCrs.Crs.CrsCod, - Pri_VisibilityDB[Pri_VISIBILITY_WORLD]); - break; - case Rol_DEG_ADM: - case Rol_CTR_ADM: - case Rol_INS_ADM: - case Rol_SYS_ADM: - sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex,crs_usr.Accepted" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod='%ld'" - " AND candidate_users.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Gbl.CurrentCrs.Crs.CrsCod); - break; - default: // I am logged - Usr_CreateExtraTmpTablesForSearch (); - sprintf (Query,"SELECT DISTINCT list_usrs.UsrCod,usr_data.Sex,crs_usr.Accepted FROM " - "(" - // Users whose privacy is - // Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users,crs_usr,usr_data" - " WHERE candidate_users.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility IN ('%s','%s')" - " UNION " - // Users who share any course with me - // and whose privacy is Pri_VISIBILITY_COURSE - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_2,crs_usr,my_crs,usr_data" - " WHERE candidate_users_2.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs.CrsCod" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - " UNION " - // Users who share any course with me with another role - // and whose privacy is Pri_VISIBILITY_USER - "SELECT DISTINCT crs_usr.UsrCod" - " FROM candidate_users_3,crs_usr,my_crs_role,usr_data" - " WHERE candidate_users_3.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role='%u'" - " AND crs_usr.CrsCod=my_crs_role.CrsCod" - " AND crs_usr.Role<>my_crs_role.Role" - " AND crs_usr.UsrCod=usr_data.UsrCod" - " AND usr_data.ProfileVisibility='%s'" - ") " - "AS list_usrs,crs_usr,usr_data" - " WHERE list_usrs.UsrCod=crs_usr.UsrCod" - " AND crs_usr.CrsCod='%ld'" - " AND list_usrs.UsrCod=usr_data.UsrCod" - " ORDER BY " - "usr_data.Surname1," - "usr_data.Surname2," - "usr_data.FirstName," - "usr_data.UsrCod", - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM], - Pri_VisibilityDB[Pri_VISIBILITY_WORLD ], - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_COURSE], - (unsigned) Role, - Pri_VisibilityDB[Pri_VISIBILITY_USER ], - Gbl.CurrentCrs.Crs.CrsCod); - } + sprintf (Query,"SELECT DISTINCT candidate_users.UsrCod,usr_data.Sex,crs_usr.Accepted" + " FROM candidate_users,crs_usr,usr_data" + " WHERE candidate_users.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role='%u'" + " AND crs_usr.CrsCod='%ld'" + " AND candidate_users.UsrCod=usr_data.UsrCod" + " ORDER BY " + "usr_data.Surname1," + "usr_data.Surname2," + "usr_data.FirstName," + "usr_data.UsrCod", + (unsigned) Role, + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_ShowErrorAndExit ("Wrong scope."); @@ -4614,9 +4067,6 @@ static void Usr_CreateTmpTableAndSearchCandidateUsrs (const char *UsrQuery) - Search is faster (aproximately x2) using temporary tables. - Searching for names is made in the whole platform and stored in this table. - - In some cases, this temporary table will be replicated - into other two tables because one temporary table - can not be used more than once in the same query. */ sprintf (Query,"CREATE TEMPORARY TABLE candidate_users" " (UsrCod INT NOT NULL,UNIQUE INDEX(UsrCod)) ENGINE=MEMORY" @@ -4627,76 +4077,16 @@ static void Usr_CreateTmpTableAndSearchCandidateUsrs (const char *UsrQuery) } /*****************************************************************************/ -/************** Create more temporary tables for search users ****************/ +/***************** Drop temporary table with candidate users *****************/ /*****************************************************************************/ -static void Usr_CreateExtraTmpTablesForSearch (void) - { - char Query[256]; - - /***** Clone temporary table with candidate users *****/ - Usr_CloneTmpTableCandidateUsers (2); - Usr_CloneTmpTableCandidateUsers (3); - - /***** Create temporary table with my courses and my roles in them *****/ - sprintf (Query,"CREATE TEMPORARY TABLE my_crs_role" - " (CrsCod INT NOT NULL,UNIQUE INDEX(CrsCod,Role)) ENGINE=MEMORY" - " SELECT CrsCod,Role FROM crs_usr WHERE UsrCod='%ld'", - Gbl.Usrs.Me.UsrDat.UsrCod); - if (mysql_query (&Gbl.mysql,Query)) - DB_ExitOnMySQLError ("can not create temporary table"); - - /***** Create temporary table with my courses *****/ - sprintf (Query,"CREATE TEMPORARY TABLE my_crs" - " (CrsCod INT NOT NULL,UNIQUE INDEX(CrsCod)) ENGINE=MEMORY" - " SELECT CrsCod FROM my_crs_role"); - if (mysql_query (&Gbl.mysql,Query)) - DB_ExitOnMySQLError ("can not create temporary table"); - } - -/*****************************************************************************/ -/**************** Clone temporary table with candidate users *****************/ -/*****************************************************************************/ - -static void Usr_CloneTmpTableCandidateUsers (unsigned NumCopy) +static void Usr_DropTmpTableWithCandidateUsrs (void) { char Query[128]; - /* Creating a table identical to other table with indexes - and copying the data from the other table - can not be made in the same query. - Two queries are necessary. */ - - /***** 1. Create temporary table *****/ - sprintf (Query,"CREATE TEMPORARY TABLE candidate_users_%u" - " LIKE candidate_users", - NumCopy); + sprintf (Query,"DROP TEMPORARY TABLE IF EXISTS candidate_users"); if (mysql_query (&Gbl.mysql,Query)) - DB_ExitOnMySQLError ("can not create temporary table"); - - /***** 2. Copy data from original table to clone *****/ - sprintf (Query,"INSERT INTO candidate_users_%u" - " SELECT * FROM candidate_users", - NumCopy); - DB_QueryINSERT (Query,"can not duplicate table"); - } - -/*****************************************************************************/ -/**************** Drop temporary tables with candidate users *****************/ -/*****************************************************************************/ - -static void Usr_DropTmpTablesWithCandidateUsrs (void) - { - char Query[128]; - - sprintf (Query,"DROP TEMPORARY TABLE IF EXISTS " - "candidate_users," - "candidate_users_2," - "candidate_users_3," - "my_crs_role," - "my_crs"); - if (mysql_query (&Gbl.mysql,Query)) - DB_ExitOnMySQLError ("can not remove temporary tables"); + DB_ExitOnMySQLError ("can not remove temporary table"); } /*****************************************************************************/ @@ -6541,7 +5931,7 @@ unsigned Usr_ListUsrsFound (Rol_Role_t Role,const char *UsrQuery) Usr_FreeUsrsList (Role); /***** Drop temporary tables *****/ - Usr_DropTmpTablesWithCandidateUsrs (); + Usr_DropTmpTableWithCandidateUsrs (); return NumUsrs; }