diff --git a/swad_changelog.h b/swad_changelog.h
index b6a99666d..0ba039ea6 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -119,12 +119,13 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 15.68 (2015/12/19)"
+#define Log_PLATFORM_VERSION "SWAD 15.68.1 (2015/12/20)"
#define CSS_FILE "swad15.65.1.css"
// 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.68.1: Dec 20, 2015 Fixed bugs in connected users. (187171 lines)
Version 15.68: Dec 19, 2015 Show guests in connected users.
Optimization in queries about connected users. (187158 lines)
Version 15.67.1: Dec 15, 2015 Changed some messages. (187141 lines)
diff --git a/swad_connected.c b/swad_connected.c
index 093a394ec..7214fb78a 100644
--- a/swad_connected.c
+++ b/swad_connected.c
@@ -52,13 +52,14 @@ extern struct Globals Gbl;
/*************************** Internal prototypes *****************************/
/*****************************************************************************/
-static void Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_Role_t Role);
+static void Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_Role_t Role);
+
static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (Rol_Role_t Role);
static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_Role_t Role);
static unsigned Con_GetConnectedGuestsTotal (void);
static unsigned Con_GetConnectedStdsTotal (void);
static unsigned Con_GetConnectedTchsTotal (void);
-static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,Usr_Sex_t *UsrSex);
+static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,struct ConnectedUsrs *Usrs);
static void Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Rol_Role_t Role);
static void Con_ShowConnectedUsrsCurrentCrsOneByOneOnRightColumn (Rol_Role_t Role);
static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role);
@@ -118,8 +119,8 @@ void Con_ShowConnectedUsrs (void)
/* Number of connected users in the whole platform */
Con_ShowGlobalConnectedUsrs ();
- /* Show connected users in the current course */
- Con_ShowConnectedUsrsBelongingToScope ();
+ /* Show connected users in the current location */
+ Con_ShowConnectedUsrsBelongingToLocation ();
/***** End frame *****/
Lay_EndRoundFrame ();
@@ -393,26 +394,46 @@ void Con_ShowGlobalConnectedUsrs (void)
void Con_ComputeConnectedUsrsBelongingToCurrentCrs (void)
{
- Gbl.Usrs.Connected.NumUsrs = 0;
- Gbl.Usrs.Connected.NumUsrsToList = 0;
+ if ((Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) && // Right column visible
+ Gbl.CurrentCrs.Crs.CrsCod > 0 && // There is a course selected
+ (Gbl.Usrs.Me.IBelongToCurrentCrs || // I can view users
+ Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM))
+ {
+ Gbl.Usrs.Connected.NumUsrs = 0;
+ Gbl.Usrs.Connected.NumUsrsToList = 0;
+ Gbl.Scope.Current = Sco_SCOPE_CRS;
- /***** Number of teachers *****/
- Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_TEACHER);
+ /***** Number of teachers *****/
+ Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_TEACHER);
- /***** Number of students *****/
- Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_STUDENT);
+ /***** Number of students *****/
+ Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_STUDENT);
+ }
}
/*****************************************************************************/
-/******** Show number of connected users who belong to current course ********/
+/** Compute number of connected users of a type who belong to current course */
/*****************************************************************************/
-void Con_ShowConnectedUsrsBelongingToScope (void)
+static void Con_ComputeConnectedUsrsWithARoleBelongingToCurrentCrs (Rol_Role_t Role)
+ {
+ /***** Get number of connected users who belong to current course *****/
+ Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Gbl.Usrs.Connected.Usrs[Role]);
+
+ /***** Get list connected users belonging to this course *****/
+ Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Role);
+ }
+
+/*****************************************************************************/
+/****** Show number of connected users who belong to current location ********/
+/*****************************************************************************/
+
+void Con_ShowConnectedUsrsBelongingToLocation (void)
{
extern const char *The_ClassConnected[The_NUM_THEMES];
extern const char *Txt_from;
char LocationName[Deg_MAX_LENGTH_LOCATION_SHORT_NAME_SPEC_CHAR+1];
- Usr_Sex_t UsrSex;
+ struct ConnectedUsrs Usrs;
switch (Gbl.Scope.Current)
{
@@ -443,7 +464,7 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
break;
}
- /***** Number of connected users who belong to current course *****/
+ /***** Number of connected users who belong to scope *****/
switch (Gbl.Scope.Current)
{
case Sco_SCOPE_SYS: // Show connected users in the whole platform
@@ -478,9 +499,10 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
Str_ReplaceSpecialCharByCodes (LocationName,Deg_MAX_LENGTH_LOCATION_SHORT_NAME_SPEC_CHAR);
break;
}
+ Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_UNKNOWN,&Usrs);
fprintf (Gbl.F.Out,"%u %s %s",
The_ClassConnected[Gbl.Prefs.Theme],
- Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_UNKNOWN,&UsrSex),
+ Usrs.NumUsrs,
Txt_from,
LocationName);
@@ -511,8 +533,6 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
Gbl.Usrs.Connected.NumUsrsToList = 0;
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_TEACHER);
Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol_STUDENT);
- if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
- Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColumn (Rol__GUEST_);
break;
}
@@ -521,33 +541,6 @@ void Con_ShowConnectedUsrsBelongingToScope (void)
"");
}
-/*****************************************************************************/
-/** Compute number of connected users of a type who belong to current course */
-/*****************************************************************************/
-
-static void Con_ComputeConnectedUsrsOfTypeBelongingToCurrentCrs (Rol_Role_t Role)
- {
- Gbl.Scope.Current = Sco_SCOPE_CRS;
-
- /***** Get number of connected users who belong to current course *****/
- switch (Role)
- {
- case Rol_TEACHER:
- Gbl.Usrs.Connected.NumTchs = Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Gbl.Usrs.Connected.SexTchs);
- break;
- case Rol_STUDENT:
- Gbl.Usrs.Connected.NumStds = Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Gbl.Usrs.Connected.SexStds);
- break;
- default:
- return;
- }
-
- /***** List connected users belonging to this course *****/
- if (Gbl.Usrs.Me.IBelongToCurrentCrs ||
- Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
- Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Role);
- }
-
/*****************************************************************************/
/* Show number of connected users with a role who belong to current location */
/*****************************************************************************/
@@ -556,19 +549,18 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone (
{
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
- unsigned NumUsrsThisRole;
- Usr_Sex_t UsrSex;
+ struct ConnectedUsrs Usrs;
/***** Write number of connected users who belong to current course *****/
- NumUsrsThisRole = Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&UsrSex);
+ Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Role,&Usrs);
fprintf (Gbl.F.Out,"
"
""
"%u %s"
" | "
"
",
- NumUsrsThisRole,
- (NumUsrsThisRole == 1) ? Txt_ROLES_SINGUL_abc[Role][UsrSex] :
- Txt_ROLES_PLURAL_abc [Role][UsrSex]);
+ Usrs.NumUsrs,
+ (Usrs.NumUsrs == 1) ? Txt_ROLES_SINGUL_abc[Role][Usrs.Sex] :
+ Txt_ROLES_PLURAL_abc[Role][Usrs.Sex]);
/***** List connected users belonging to this location *****/
switch (Gbl.Scope.Current)
@@ -613,27 +605,15 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColum
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_Connected_users;
- unsigned NumUsrsThisRole;
- Usr_Sex_t UsrSex;
+ unsigned NumUsrsThisRole = Gbl.Usrs.Connected.Usrs[Role].NumUsrs;
+ Usr_Sex_t UsrSex = Gbl.Usrs.Connected.Usrs[Role].Sex;
/***** Write number of connected users who belong to current course *****/
- switch (Role)
- {
- case Rol_TEACHER:
- NumUsrsThisRole = Gbl.Usrs.Connected.NumTchs;
- UsrSex = Gbl.Usrs.Connected.SexTchs;
- break;
- case Rol_STUDENT:
- NumUsrsThisRole = Gbl.Usrs.Connected.NumStds;
- UsrSex = Gbl.Usrs.Connected.SexStds;
- break;
- default:
- return;
- }
Gbl.Usrs.Connected.NumUsrs += NumUsrsThisRole;
Gbl.Usrs.Connected.NumUsrsToList += NumUsrsThisRole;
if (Gbl.Usrs.Connected.NumUsrsToList > Cfg_MAX_CONNECTED_SHOWN)
Gbl.Usrs.Connected.NumUsrsToList = Cfg_MAX_CONNECTED_SHOWN;
+
fprintf (Gbl.F.Out,""
""
"%u %s"
@@ -641,7 +621,7 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColum
" |
",
NumUsrsThisRole,
(NumUsrsThisRole == 1) ? Txt_ROLES_SINGUL_abc[Role][UsrSex] :
- Txt_ROLES_PLURAL_abc [Role][UsrSex]);
+ Txt_ROLES_PLURAL_abc[Role][UsrSex]);
/***** List connected users belonging to this location *****/
switch (Gbl.Scope.Current)
@@ -791,174 +771,207 @@ static unsigned Con_GetConnectedTchsTotal (void)
/*****************************************************************************/
// Return user's sex in UsrSex
-static unsigned Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,Usr_Sex_t *UsrSex)
+static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,struct ConnectedUsrs *Usrs)
{
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
- unsigned NumUsrs;
unsigned NumSexs;
Usr_Sex_t Sex;
/***** Get number of connected users who belong to current course from database *****/
- switch (Gbl.Scope.Current)
+ switch (Role)
{
- case Sco_SCOPE_SYS: // Show connected users in the whole platform
- if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM connected,usr_data"
- " WHERE connected.UsrCod=usr_data.UsrCod");
- else
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM connected,crs_usr,usr_data"
- " WHERE connected.UsrCod=crs_usr.UsrCod"
- " AND crs_usr.Role='%u'"
- " AND connected.UsrCod=usr_data.UsrCod",
- (unsigned) Role);
- break;
- case Sco_SCOPE_CTY: // Show connected users in the current country
- if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
- " WHERE institutions.CtyCod='%ld'"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentCty.Cty.CtyCod);
- else
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
- " WHERE institutions.CtyCod='%ld'"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.Role='%u'"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentCty.Cty.CtyCod,
- (unsigned) Role);
- break;
- case Sco_SCOPE_INS: // Show connected users in the current institution
- if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM centres,degrees,courses,crs_usr,connected,usr_data"
- " WHERE centres.InsCod='%ld'"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentIns.Ins.InsCod);
- else
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM centres,degrees,courses,crs_usr,connected,usr_data"
- " WHERE centres.InsCod='%ld'"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.Role='%u'"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentIns.Ins.InsCod,
- (unsigned) Role);
- break;
- case Sco_SCOPE_CTR: // Show connected users in the current centre
- if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM degrees,courses,crs_usr,connected,usr_data"
- " WHERE degrees.CtrCod='%ld'"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentCtr.Ctr.CtrCod);
- else
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM degrees,courses,crs_usr,connected,usr_data"
- " WHERE degrees.CtrCod='%ld'"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.Role='%u'"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentCtr.Ctr.CtrCod,
- (unsigned) Role);
- break;
- case Sco_SCOPE_DEG: // Show connected users in the current degree
- if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM courses,crs_usr,connected,usr_data"
- " WHERE courses.DegCod='%ld'"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentDeg.Deg.DegCod);
- else
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM courses,crs_usr,connected,usr_data"
- " WHERE courses.DegCod='%ld'"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.Role='%u'"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentDeg.Deg.DegCod,
- (unsigned) Role);
- break;
- case Sco_SCOPE_CRS: // Show connected users in the current course
- if (Role == Rol_UNKNOWN) // Here Rol_ROLE_UNKNOWN means "any role"
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM crs_usr,connected,usr_data"
- " WHERE crs_usr.CrsCod='%ld'"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentCrs.Crs.CrsCod);
- else
- sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
- " FROM crs_usr,connected,usr_data"
- " WHERE crs_usr.CrsCod='%ld'"
- " AND crs_usr.Role='%u'"
- " AND crs_usr.UsrCod=connected.UsrCod"
- " AND connected.UsrCod=usr_data.UsrCod",
- Gbl.CurrentCrs.Crs.CrsCod,
- (unsigned) Role);
- break;
+ case Rol_UNKNOWN: // Here Rol_ROLE_UNKNOWN means "any role"
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS: // Show connected users in the whole platform
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM connected,usr_data"
+ " WHERE connected.UsrCod=usr_data.UsrCod");
+ break;
+ case Sco_SCOPE_CTY: // Show connected users in the current country
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
+ " WHERE institutions.CtyCod='%ld'"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS: // Show connected users in the current institution
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM centres,degrees,courses,crs_usr,connected,usr_data"
+ " WHERE centres.InsCod='%ld'"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ case Sco_SCOPE_CTR: // Show connected users in the current centre
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM degrees,courses,crs_usr,connected,usr_data"
+ " WHERE degrees.CtrCod='%ld'"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentCtr.Ctr.CtrCod);
+ break;
+ case Sco_SCOPE_DEG: // Show connected users in the current degree
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM courses,crs_usr,connected,usr_data"
+ " WHERE courses.DegCod='%ld'"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentDeg.Deg.DegCod);
+ break;
+ case Sco_SCOPE_CRS: // Show connected users in the current course
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM crs_usr,connected,usr_data"
+ " WHERE crs_usr.CrsCod='%ld'"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentCrs.Crs.CrsCod);
+ break;
+ default:
+ Lay_ShowErrorAndExit ("Wrong scope.");
+ break;
+ }
+ break;
+ case Rol__GUEST_:
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM connected,usr_data"
+ " WHERE connected.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)"
+ " AND connected.UsrCod=usr_data.UsrCod");
+ break;
+ case Rol_STUDENT:
+ case Rol_TEACHER:
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS: // Show connected users in the whole platform
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM connected,crs_usr,usr_data"
+ " WHERE connected.UsrCod=crs_usr.UsrCod"
+ " AND crs_usr.Role='%u'"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ (unsigned) Role);
+ break;
+ case Sco_SCOPE_CTY: // Show connected users in the current country
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data"
+ " WHERE institutions.CtyCod='%ld'"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.Role='%u'"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentCty.Cty.CtyCod,
+ (unsigned) Role);
+ break;
+ case Sco_SCOPE_INS: // Show connected users in the current institution
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM centres,degrees,courses,crs_usr,connected,usr_data"
+ " WHERE centres.InsCod='%ld'"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.Role='%u'"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentIns.Ins.InsCod,
+ (unsigned) Role);
+ break;
+ case Sco_SCOPE_CTR: // Show connected users in the current centre
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM degrees,courses,crs_usr,connected,usr_data"
+ " WHERE degrees.CtrCod='%ld'"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.Role='%u'"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentCtr.Ctr.CtrCod,
+ (unsigned) Role);
+ break;
+ case Sco_SCOPE_DEG: // Show connected users in the current degree
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM courses,crs_usr,connected,usr_data"
+ " WHERE courses.DegCod='%ld'"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.Role='%u'"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentDeg.Deg.DegCod,
+ (unsigned) Role);
+ break;
+ case Sco_SCOPE_CRS: // Show connected users in the current course
+ sprintf (Query,"SELECT COUNT(DISTINCT connected.UsrCod),"
+ "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)"
+ " FROM crs_usr,connected,usr_data"
+ " WHERE crs_usr.CrsCod='%ld'"
+ " AND crs_usr.Role='%u'"
+ " AND crs_usr.UsrCod=connected.UsrCod"
+ " AND connected.UsrCod=usr_data.UsrCod",
+ Gbl.CurrentCrs.Crs.CrsCod,
+ (unsigned) Role);
+ break;
+ default:
+ Lay_ShowErrorAndExit ("Wrong scope.");
+ break;
+ }
+ break;
default:
- Lay_ShowErrorAndExit ("Wrong scope.");
+ Lay_ShowErrorAndExit ("Wrong role.");
break;
}
- DB_QuerySELECT (Query,&mysql_res,"can not get number of connected users who belong to this course");
+ DB_QuerySELECT (Query,&mysql_res,"can not get number of connected users who belong to this location");
row = mysql_fetch_row (mysql_res);
/***** Get number of users (row[0]) *****/
- if (sscanf (row[0],"%u",&NumUsrs) != 1)
- Lay_ShowErrorAndExit ("Error when getting number of connected users who belong to this course.");
+ if (sscanf (row[0],"%u",&(Usrs->NumUsrs)) != 1)
+ Lay_ShowErrorAndExit ("Error when getting number of connected users who belong to this location.");
/***** Get number of distinct sexs (row[1]) *****/
if (sscanf (row[1],"%u",&NumSexs) != 1)
- Lay_ShowErrorAndExit ("Error when getting number of sexs in connected users who belong to this course.");
+ Lay_ShowErrorAndExit ("Error when getting number of sexs in connected users who belong to this location.");
/***** Get users' sex (row[2]) *****/
- *UsrSex = Usr_SEX_UNKNOWN;
+ Usrs->Sex = Usr_SEX_UNKNOWN;
if (NumSexs == 1)
for (Sex = (Usr_Sex_t) 0;
Sex < Usr_NUM_SEXS;
Sex++)
if (!strcasecmp (row[2],Usr_StringsSexDB[Sex]))
{
- *UsrSex = Sex;
+ Usrs->Sex = Sex;
break;
}
/***** Free structure that stores the query result *****/
mysql_free_result (mysql_res);
-
- return NumUsrs;
}
/*****************************************************************************/
@@ -976,11 +989,12 @@ static void Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Rol_Role_t Role
/***** Get connected users who belong to current course from database *****/
sprintf (Query,"SELECT connected.UsrCod,connected.LastCrsCod,"
"UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif"
- " FROM connected,crs_usr,usr_data"
+ " FROM connected,crs_usr"
" WHERE crs_usr.CrsCod='%ld' AND crs_usr.Role='%u'"
" AND crs_usr.UsrCod=connected.UsrCod"
- " AND crs_usr.UsrCod=usr_data.UsrCod ORDER BY Dif",
- Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Role);
+ " ORDER BY Dif",
+ Gbl.CurrentCrs.Crs.CrsCod,
+ (unsigned) Role);
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get list of connected users who belong to this course");
Gbl.Usrs.Connected.NumUsrs += (unsigned) NumRows;
Gbl.Usrs.Connected.NumUsrsToList += (unsigned) NumRows;
diff --git a/swad_connected.h b/swad_connected.h
index 4c54ac597..301a84fd9 100644
--- a/swad_connected.h
+++ b/swad_connected.h
@@ -43,6 +43,12 @@ typedef enum
Con_SHOW_ON_RIGHT_COLUMN = 1,
} Con_WhereToShow_t;
+struct ConnectedUsrs
+ {
+ unsigned NumUsrs;
+ Usr_Sex_t Sex;
+ };
+
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
@@ -53,7 +59,7 @@ void Con_ShowLastClicks (void);
void Con_GetAndShowLastClicks (void);
void Con_ShowGlobalConnectedUsrs (void);
void Con_ComputeConnectedUsrsBelongingToCurrentCrs (void);
-void Con_ShowConnectedUsrsBelongingToScope (void);
+void Con_ShowConnectedUsrsBelongingToLocation (void);
void Con_UpdateMeInConnectedList (void);
void Con_RemoveOldConnected (void);
diff --git a/swad_global.h b/swad_global.h
index 63bb559d6..0b87a35ca 100644
--- a/swad_global.h
+++ b/swad_global.h
@@ -365,13 +365,10 @@ struct Globals
{
Con_WhereToShow_t WhereToShow;
unsigned long TimeToRefreshInMs;
- unsigned NumTchs;
- unsigned NumStds;
- unsigned SexTchs;
- unsigned SexStds;
unsigned NumUsr;
unsigned NumUsrs;
unsigned NumUsrsToList;
+ struct ConnectedUsrs Usrs[Rol_NUM_ROLES];
struct
{
long UsrCod;
diff --git a/swad_layout.c b/swad_layout.c
index 3c8634934..5b32c54fb 100644
--- a/swad_layout.c
+++ b/swad_layout.c
@@ -117,12 +117,8 @@ void Lay_WriteStartOfPage (void)
Gbl.Layout.HTMLStartWritten)
return;
- /***** Compute connected users *****/
- if (Gbl.CurrentAct == ActLstCon ||
- ((Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) &&
- Gbl.CurrentCrs.Crs.CrsCod > 0))
- // Right column visible && There is a course selected
- Con_ComputeConnectedUsrsBelongingToCurrentCrs ();
+ /***** Compute connected users to be displayed in right columns *****/
+ Con_ComputeConnectedUsrsBelongingToCurrentCrs ();
/***** Send head width the file type for the HTTP protocol *****/
if (Gbl.CurrentAct == ActRefCon ||
@@ -888,7 +884,7 @@ static void Lay_ShowRightColumn (void)
if (Gbl.CurrentCrs.Crs.CrsCod > 0) // There is a course selected
{
Gbl.Scope.Current = Sco_SCOPE_CRS;
- Con_ShowConnectedUsrsBelongingToScope ();
+ Con_ShowConnectedUsrsBelongingToLocation ();
}
fprintf (Gbl.F.Out,""); // Used for AJAX based refresh
@@ -1432,7 +1428,7 @@ void Lay_RefreshNotifsAndConnected (void)
if (ShowConnected)
{
Gbl.Scope.Current = Sco_SCOPE_CRS;
- Con_ShowConnectedUsrsBelongingToScope ();
+ Con_ShowConnectedUsrsBelongingToLocation ();
}
fprintf (Gbl.F.Out,"|");
if (ShowConnected)