Version 15.233

This commit is contained in:
Antonio Cañas Vargas 2016-06-27 14:30:53 +02:00
parent a4f4f22181
commit 0a3a973e9d
2 changed files with 103 additions and 712 deletions

View File

@ -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)

View File

@ -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;
}