mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-03 07:15:26 +02:00
Version 18.7.36
This commit is contained in:
parent
251f67c893
commit
65c3e99394
51
swad_MFU.c
51
swad_MFU.c
|
@ -25,6 +25,12 @@
|
||||||
/*********************************** Headers *********************************/
|
/*********************************** Headers *********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE // For asprintf
|
||||||
|
#include <mysql/mysql.h> // To access MySQL databases
|
||||||
|
#include <stdio.h> // For asprintf
|
||||||
|
#include <stdlib.h> // For malloc and free
|
||||||
|
#include <string.h> // For string functions
|
||||||
|
|
||||||
#include "swad_action.h"
|
#include "swad_action.h"
|
||||||
#include "swad_box.h"
|
#include "swad_box.h"
|
||||||
#include "swad_config.h"
|
#include "swad_config.h"
|
||||||
|
@ -34,10 +40,6 @@
|
||||||
#include "swad_tab.h"
|
#include "swad_tab.h"
|
||||||
#include "swad_theme.h"
|
#include "swad_theme.h"
|
||||||
|
|
||||||
#include <mysql/mysql.h> // To access MySQL databases
|
|
||||||
#include <stdlib.h> // For malloc and free
|
|
||||||
#include <string.h> // For string functions
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -98,7 +100,7 @@ void MFU_FreeMFUActions (struct MFU_ListMFUActions *ListMFUActions)
|
||||||
void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxActionsShown)
|
void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxActionsShown)
|
||||||
{
|
{
|
||||||
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
|
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
|
||||||
char Query[512];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned long NumRow,NumRows;
|
unsigned long NumRow,NumRows;
|
||||||
|
@ -106,10 +108,11 @@ void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxAc
|
||||||
Act_Action_t Action;
|
Act_Action_t Action;
|
||||||
|
|
||||||
/***** Get most frequently used actions *****/
|
/***** Get most frequently used actions *****/
|
||||||
sprintf (Query,"SELECT ActCod FROM actions_MFU"
|
if (asprintf (&Query,"SELECT ActCod FROM actions_MFU"
|
||||||
" WHERE UsrCod=%ld ORDER BY Score DESC,LastClick DESC",
|
" WHERE UsrCod=%ld ORDER BY Score DESC,LastClick DESC",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
Gbl.Usrs.Me.UsrDat.UsrCod) < 0)
|
||||||
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get most frequently used actions");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get most frequently used actions");
|
||||||
|
|
||||||
/***** Write list of frequently used actions *****/
|
/***** Write list of frequently used actions *****/
|
||||||
for (NumRow = 0, ListMFUActions->NumActions = 0;
|
for (NumRow = 0, ListMFUActions->NumActions = 0;
|
||||||
|
@ -138,7 +141,7 @@ void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxAc
|
||||||
Act_Action_t MFU_GetMyLastActionInCurrentTab (void)
|
Act_Action_t MFU_GetMyLastActionInCurrentTab (void)
|
||||||
{
|
{
|
||||||
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
|
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
|
||||||
char Query[512];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned NumActions;
|
unsigned NumActions;
|
||||||
|
@ -150,11 +153,12 @@ Act_Action_t MFU_GetMyLastActionInCurrentTab (void)
|
||||||
if (Gbl.Usrs.Me.UsrDat.UsrCod > 0)
|
if (Gbl.Usrs.Me.UsrDat.UsrCod > 0)
|
||||||
{
|
{
|
||||||
/***** Get my most frequently used actions *****/
|
/***** Get my most frequently used actions *****/
|
||||||
sprintf (Query,"SELECT ActCod FROM actions_MFU"
|
if (asprintf (&Query,"SELECT ActCod FROM actions_MFU"
|
||||||
" WHERE UsrCod=%ld"
|
" WHERE UsrCod=%ld"
|
||||||
" ORDER BY LastClick DESC,Score DESC",
|
" ORDER BY LastClick DESC,Score DESC",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
Gbl.Usrs.Me.UsrDat.UsrCod) < 0)
|
||||||
NumActions = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get most frequently used actions");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
NumActions = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get most frequently used actions");
|
||||||
|
|
||||||
/***** Loop over list of frequently used actions *****/
|
/***** Loop over list of frequently used actions *****/
|
||||||
for (NumAct = 0;
|
for (NumAct = 0;
|
||||||
|
@ -332,7 +336,7 @@ void MFU_WriteSmallMFUActions (struct MFU_ListMFUActions *ListMFUActions)
|
||||||
|
|
||||||
void MFU_UpdateMFUActions (void)
|
void MFU_UpdateMFUActions (void)
|
||||||
{
|
{
|
||||||
char Query[1024];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
float Score;
|
float Score;
|
||||||
|
@ -353,10 +357,11 @@ void MFU_UpdateMFUActions (void)
|
||||||
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
|
Str_SetDecimalPointToUS (); // To get the decimal point as a dot
|
||||||
|
|
||||||
/***** Get current score *****/
|
/***** Get current score *****/
|
||||||
sprintf (Query,"SELECT Score FROM actions_MFU"
|
if (asprintf (&Query,"SELECT Score FROM actions_MFU"
|
||||||
" WHERE UsrCod=%ld AND ActCod=%ld",
|
" WHERE UsrCod=%ld AND ActCod=%ld",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,ActCod);
|
Gbl.Usrs.Me.UsrDat.UsrCod,ActCod) < 0)
|
||||||
if (DB_QuerySELECT (Query,&mysql_res,"can not get score for current action"))
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
if (DB_QuerySELECT_free (Query,&mysql_res,"can not get score for current action"))
|
||||||
{
|
{
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
if (sscanf (row[0],"%f",&Score) != 1)
|
if (sscanf (row[0],"%f",&Score) != 1)
|
||||||
|
@ -372,19 +377,21 @@ void MFU_UpdateMFUActions (void)
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
||||||
/***** Update score for the current action *****/
|
/***** Update score for the current action *****/
|
||||||
sprintf (Query,"REPLACE INTO actions_MFU"
|
if (asprintf (&Query,"REPLACE INTO actions_MFU"
|
||||||
" (UsrCod,ActCod,Score,LastClick)"
|
" (UsrCod,ActCod,Score,LastClick)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,%ld,'%f',NOW())",
|
" (%ld,%ld,'%f',NOW())",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,ActCod,Score);
|
Gbl.Usrs.Me.UsrDat.UsrCod,ActCod,Score) < 0)
|
||||||
DB_QueryREPLACE (Query,"can not update most frequently used actions");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
DB_QueryREPLACE_free (Query,"can not update most frequently used actions");
|
||||||
|
|
||||||
/***** Update score for other actions *****/
|
/***** Update score for other actions *****/
|
||||||
sprintf (Query,"UPDATE actions_MFU SET Score=GREATEST(Score*'%f','%f')"
|
if (asprintf (&Query,"UPDATE actions_MFU SET Score=GREATEST(Score*'%f','%f')"
|
||||||
" WHERE UsrCod=%ld AND ActCod<>%ld",
|
" WHERE UsrCod=%ld AND ActCod<>%ld",
|
||||||
MFU_DECREASE_FACTOR,MFU_MIN_SCORE,
|
MFU_DECREASE_FACTOR,MFU_MIN_SCORE,
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,ActCod);
|
Gbl.Usrs.Me.UsrDat.UsrCod,ActCod) < 0)
|
||||||
DB_QueryUPDATE (Query,"can not update most frequently used actions");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
DB_QueryUPDATE_free (Query,"can not update most frequently used actions");
|
||||||
|
|
||||||
Str_SetDecimalPointToLocal (); // Return to local system
|
Str_SetDecimalPointToLocal (); // Return to local system
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,10 +355,11 @@ En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 18.7.35 (2018-10-23)"
|
#define Log_PLATFORM_VERSION "SWAD 18.7.36 (2018-10-23)"
|
||||||
#define CSS_FILE "swad18.4.css"
|
#define CSS_FILE "swad18.4.css"
|
||||||
#define JS_FILE "swad17.17.1.js"
|
#define JS_FILE "swad17.17.1.js"
|
||||||
/*
|
/*
|
||||||
|
Version 18.7.36: Oct 23, 2018 Some sprintf for database queries changed by asprintf. (237905 lines)
|
||||||
Version 18.7.35: Oct 23, 2018 Some sprintf for database queries changed by asprintf. (237876 lines)
|
Version 18.7.35: Oct 23, 2018 Some sprintf for database queries changed by asprintf. (237876 lines)
|
||||||
Version 18.7.34: Oct 22, 2018 Some sprintf for database queries changed by asprintf. (237814 lines)
|
Version 18.7.34: Oct 22, 2018 Some sprintf for database queries changed by asprintf. (237814 lines)
|
||||||
Version 18.7.33: Oct 22, 2018 Some sprintf for database queries changed by asprintf. (237796 lines)
|
Version 18.7.33: Oct 22, 2018 Some sprintf for database queries changed by asprintf. (237796 lines)
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
/********************************* Headers ***********************************/
|
/********************************* Headers ***********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE // For asprintf
|
||||||
|
#include <stdio.h> // For asprintf
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "swad_box.h"
|
#include "swad_box.h"
|
||||||
|
@ -203,7 +205,7 @@ static void Net_GetMyWebsAndSocialNetsFromForm (void);
|
||||||
|
|
||||||
void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat)
|
void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat)
|
||||||
{
|
{
|
||||||
char Query[256 + Cns_MAX_BYTES_WWW];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
Net_WebsAndSocialNetworks_t NumURL;
|
Net_WebsAndSocialNetworks_t NumURL;
|
||||||
|
@ -222,12 +224,13 @@ void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat)
|
||||||
NumURL++)
|
NumURL++)
|
||||||
{
|
{
|
||||||
/***** Get user's web / social network from database *****/
|
/***** Get user's web / social network from database *****/
|
||||||
sprintf (Query,"SELECT URL FROM usr_webs"
|
if (asprintf (&Query,"SELECT URL FROM usr_webs"
|
||||||
" WHERE UsrCod=%ld AND Web='%s'",
|
" WHERE UsrCod=%ld AND Web='%s'",
|
||||||
UsrDat->UsrCod,Net_WebsAndSocialNetworksDB[NumURL]);
|
UsrDat->UsrCod,Net_WebsAndSocialNetworksDB[NumURL]) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
/***** Check if exists the web / social network for this user *****/
|
/***** Check if exists the web / social network for this user *****/
|
||||||
if (DB_QuerySELECT (Query,&mysql_res,"can not get user's web / social network"))
|
if (DB_QuerySELECT_free (Query,&mysql_res,"can not get user's web / social network"))
|
||||||
{
|
{
|
||||||
/* Get URL */
|
/* Get URL */
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
@ -278,7 +281,7 @@ void Net_ShowFormMyWebsAndSocialNets (void)
|
||||||
extern const char *Hlp_PROFILE_Webs;
|
extern const char *Hlp_PROFILE_Webs;
|
||||||
extern const char *The_ClassForm[The_NUM_THEMES];
|
extern const char *The_ClassForm[The_NUM_THEMES];
|
||||||
extern const char *Txt_Webs_social_networks;
|
extern const char *Txt_Webs_social_networks;
|
||||||
char Query[256 + Cns_MAX_BYTES_WWW];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
Net_WebsAndSocialNetworks_t NumURL;
|
Net_WebsAndSocialNetworks_t NumURL;
|
||||||
|
@ -301,13 +304,14 @@ void Net_ShowFormMyWebsAndSocialNets (void)
|
||||||
NumURL++)
|
NumURL++)
|
||||||
{
|
{
|
||||||
/***** Get user's web / social network from database *****/
|
/***** Get user's web / social network from database *****/
|
||||||
sprintf (Query,"SELECT URL FROM usr_webs"
|
if (asprintf (&Query,"SELECT URL FROM usr_webs"
|
||||||
" WHERE UsrCod=%ld AND Web='%s'",
|
" WHERE UsrCod=%ld AND Web='%s'",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
Net_WebsAndSocialNetworksDB[NumURL]);
|
Net_WebsAndSocialNetworksDB[NumURL]) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
/***** Check number of rows in result *****/
|
/***** Check number of rows in result *****/
|
||||||
if (DB_QuerySELECT (Query,&mysql_res,"can not get user's web / social network"))
|
if (DB_QuerySELECT_free (Query,&mysql_res,"can not get user's web / social network"))
|
||||||
{
|
{
|
||||||
/***** Read the data comunes a all the users *****/
|
/***** Read the data comunes a all the users *****/
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
@ -390,7 +394,7 @@ void Net_UpdateMyWebsAndSocialNets (void)
|
||||||
|
|
||||||
static void Net_GetMyWebsAndSocialNetsFromForm (void)
|
static void Net_GetMyWebsAndSocialNetsFromForm (void)
|
||||||
{
|
{
|
||||||
char Query[256 + Cns_MAX_BYTES_WWW];
|
char *Query;
|
||||||
Net_WebsAndSocialNetworks_t Web;
|
Net_WebsAndSocialNetworks_t Web;
|
||||||
char URL[Cns_MAX_BYTES_WWW + 1];
|
char URL[Cns_MAX_BYTES_WWW + 1];
|
||||||
|
|
||||||
|
@ -406,22 +410,24 @@ static void Net_GetMyWebsAndSocialNetsFromForm (void)
|
||||||
if (URL[0])
|
if (URL[0])
|
||||||
{
|
{
|
||||||
/***** Insert or replace web / social network *****/
|
/***** Insert or replace web / social network *****/
|
||||||
sprintf (Query,"REPLACE INTO usr_webs"
|
if (asprintf (&Query,"REPLACE INTO usr_webs"
|
||||||
" (UsrCod,Web,URL)"
|
" (UsrCod,Web,URL)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,'%s','%s')",
|
" (%ld,'%s','%s')",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
Net_WebsAndSocialNetworksDB[Web],
|
Net_WebsAndSocialNetworksDB[Web],
|
||||||
URL);
|
URL) < 0)
|
||||||
DB_QueryREPLACE (Query,"can not update user's web / social network");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
DB_QueryREPLACE_free (Query,"can not update user's web / social network");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/***** Remove web / social network *****/
|
/***** Remove web / social network *****/
|
||||||
sprintf (Query,"DELETE FROM usr_webs WHERE UsrCod=%ld AND Web='%s'",
|
if (asprintf (&Query,"DELETE FROM usr_webs WHERE UsrCod=%ld AND Web='%s'",
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
Net_WebsAndSocialNetworksDB[Web]);
|
Net_WebsAndSocialNetworksDB[Web]) < 0)
|
||||||
DB_QueryREPLACE (Query,"can not remove user's web / social network");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
DB_QueryREPLACE_free (Query,"can not remove user's web / social network");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,7 +442,7 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
||||||
extern const char *Txt_Web_social_network;
|
extern const char *Txt_Web_social_network;
|
||||||
extern const char *Txt_No_of_users;
|
extern const char *Txt_No_of_users;
|
||||||
extern const char *Txt_PERCENT_of_users;
|
extern const char *Txt_PERCENT_of_users;
|
||||||
char Query[512];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned NumRows;
|
unsigned NumRows;
|
||||||
|
@ -457,13 +463,14 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
||||||
switch (Gbl.Scope.Current)
|
switch (Gbl.Scope.Current)
|
||||||
{
|
{
|
||||||
case Sco_SCOPE_SYS:
|
case Sco_SCOPE_SYS:
|
||||||
sprintf (Query,"SELECT Web,COUNT(*) AS N"
|
if (asprintf (&Query,"SELECT Web,COUNT(*) AS N"
|
||||||
" FROM usr_webs"
|
" FROM usr_webs"
|
||||||
" GROUP BY Web"
|
" GROUP BY Web"
|
||||||
" ORDER BY N DESC,Web");
|
" ORDER BY N DESC,Web") < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CTY:
|
case Sco_SCOPE_CTY:
|
||||||
sprintf (Query,"SELECT usr_webs.Web,"
|
if (asprintf (&Query,"SELECT usr_webs.Web,"
|
||||||
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
||||||
" FROM institutions,centres,degrees,courses,crs_usr,usr_webs"
|
" FROM institutions,centres,degrees,courses,crs_usr,usr_webs"
|
||||||
" WHERE institutions.CtyCod=%ld"
|
" WHERE institutions.CtyCod=%ld"
|
||||||
|
@ -474,10 +481,11 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
||||||
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
||||||
" GROUP BY usr_webs.Web"
|
" GROUP BY usr_webs.Web"
|
||||||
" ORDER BY N DESC,usr_webs.Web",
|
" ORDER BY N DESC,usr_webs.Web",
|
||||||
Gbl.CurrentCty.Cty.CtyCod);
|
Gbl.CurrentCty.Cty.CtyCod) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_INS:
|
case Sco_SCOPE_INS:
|
||||||
sprintf (Query,"SELECT usr_webs.Web,"
|
if (asprintf (&Query,"SELECT usr_webs.Web,"
|
||||||
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
||||||
" FROM centres,degrees,courses,crs_usr,usr_webs"
|
" FROM centres,degrees,courses,crs_usr,usr_webs"
|
||||||
" WHERE centres.InsCod=%ld"
|
" WHERE centres.InsCod=%ld"
|
||||||
|
@ -487,10 +495,11 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
||||||
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
||||||
" GROUP BY usr_webs.Web"
|
" GROUP BY usr_webs.Web"
|
||||||
" ORDER BY N DESC,usr_webs.Web",
|
" ORDER BY N DESC,usr_webs.Web",
|
||||||
Gbl.CurrentIns.Ins.InsCod);
|
Gbl.CurrentIns.Ins.InsCod) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CTR:
|
case Sco_SCOPE_CTR:
|
||||||
sprintf (Query,"SELECT usr_webs.Web,"
|
if (asprintf (&Query,"SELECT usr_webs.Web,"
|
||||||
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
||||||
" FROM degrees,courses,crs_usr,usr_webs"
|
" FROM degrees,courses,crs_usr,usr_webs"
|
||||||
" WHERE degrees.CtrCod=%ld"
|
" WHERE degrees.CtrCod=%ld"
|
||||||
|
@ -499,10 +508,11 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
||||||
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
||||||
" GROUP BY usr_webs.Web"
|
" GROUP BY usr_webs.Web"
|
||||||
" ORDER BY N DESC,usr_webs.Web",
|
" ORDER BY N DESC,usr_webs.Web",
|
||||||
Gbl.CurrentCtr.Ctr.CtrCod);
|
Gbl.CurrentCtr.Ctr.CtrCod) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_DEG:
|
case Sco_SCOPE_DEG:
|
||||||
sprintf (Query,"SELECT usr_webs.Web,"
|
if (asprintf (&Query,"SELECT usr_webs.Web,"
|
||||||
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
||||||
" FROM courses,crs_usr,usr_webs"
|
" FROM courses,crs_usr,usr_webs"
|
||||||
" WHERE courses.DegCod=%ld"
|
" WHERE courses.DegCod=%ld"
|
||||||
|
@ -510,23 +520,25 @@ void Net_ShowWebAndSocialNetworksStats (void)
|
||||||
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
||||||
" GROUP BY usr_webs.Web"
|
" GROUP BY usr_webs.Web"
|
||||||
" ORDER BY N DESC,usr_webs.Web",
|
" ORDER BY N DESC,usr_webs.Web",
|
||||||
Gbl.CurrentDeg.Deg.DegCod);
|
Gbl.CurrentDeg.Deg.DegCod) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CRS:
|
case Sco_SCOPE_CRS:
|
||||||
sprintf (Query,"SELECT usr_webs.Web,"
|
if (asprintf (&Query,"SELECT usr_webs.Web,"
|
||||||
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
"COUNT(DISTINCT usr_webs.UsrCod) AS N"
|
||||||
" FROM crs_usr,usr_webs"
|
" FROM crs_usr,usr_webs"
|
||||||
" WHERE crs_usr.CrsCod=%ld"
|
" WHERE crs_usr.CrsCod=%ld"
|
||||||
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
" AND crs_usr.UsrCod=usr_webs.UsrCod"
|
||||||
" GROUP BY usr_webs.Web"
|
" GROUP BY usr_webs.Web"
|
||||||
" ORDER BY N DESC,usr_webs.Web",
|
" ORDER BY N DESC,usr_webs.Web",
|
||||||
Gbl.CurrentCrs.Crs.CrsCod);
|
Gbl.CurrentCrs.Crs.CrsCod) < 0)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Lay_ShowErrorAndExit ("Wrong scope.");
|
Lay_ShowErrorAndExit ("Wrong scope.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
NumRows = (unsigned) DB_QuerySELECT (Query,&mysql_res,
|
NumRows = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,
|
||||||
"can not get number of users with webs / social networks");
|
"can not get number of users with webs / social networks");
|
||||||
|
|
||||||
/***** Start box and table *****/
|
/***** Start box and table *****/
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
/********************************* Headers ***********************************/
|
/********************************* Headers ***********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE // For asprintf
|
||||||
|
#include <stdio.h> // For asprintf
|
||||||
#include <string.h> // For string functions
|
#include <string.h> // For string functions
|
||||||
|
|
||||||
#include "swad_account.h"
|
#include "swad_account.h"
|
||||||
|
@ -113,16 +115,17 @@ bool Nck_CheckIfNickWithArrobaIsValid (const char *NicknameWithArroba)
|
||||||
bool Nck_GetNicknameFromUsrCod (long UsrCod,
|
bool Nck_GetNicknameFromUsrCod (long UsrCod,
|
||||||
char Nickname[Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 1])
|
char Nickname[Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 1])
|
||||||
{
|
{
|
||||||
char Query[256];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
bool Found;
|
bool Found;
|
||||||
|
|
||||||
/***** Get current (last updated) user's nickname from database *****/
|
/***** Get current (last updated) user's nickname from database *****/
|
||||||
sprintf (Query,"SELECT Nickname FROM usr_nicknames"
|
if (asprintf (&Query,"SELECT Nickname FROM usr_nicknames"
|
||||||
" WHERE UsrCod=%ld ORDER BY CreatTime DESC LIMIT 1",
|
" WHERE UsrCod=%ld ORDER BY CreatTime DESC LIMIT 1",
|
||||||
UsrCod);
|
UsrCod) < 0)
|
||||||
if (DB_QuerySELECT (Query,&mysql_res,"can not get nickname"))
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
if (DB_QuerySELECT_free (Query,&mysql_res,"can not get nickname"))
|
||||||
{
|
{
|
||||||
/* Get nickname */
|
/* Get nickname */
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
@ -151,7 +154,7 @@ bool Nck_GetNicknameFromUsrCod (long UsrCod,
|
||||||
long Nck_GetUsrCodFromNickname (const char *Nickname)
|
long Nck_GetUsrCodFromNickname (const char *Nickname)
|
||||||
{
|
{
|
||||||
char NicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
char NicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
||||||
char Query[512];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
long UsrCod = -1L;
|
long UsrCod = -1L;
|
||||||
|
@ -166,12 +169,13 @@ long Nck_GetUsrCodFromNickname (const char *Nickname)
|
||||||
|
|
||||||
/***** Get user's code from database *****/
|
/***** Get user's code from database *****/
|
||||||
/* Check if user code from table usr_nicknames is also in table usr_data */
|
/* Check if user code from table usr_nicknames is also in table usr_data */
|
||||||
sprintf (Query,"SELECT usr_nicknames.UsrCod"
|
if (asprintf (&Query,"SELECT usr_nicknames.UsrCod"
|
||||||
" FROM usr_nicknames,usr_data"
|
" FROM usr_nicknames,usr_data"
|
||||||
" WHERE usr_nicknames.Nickname='%s'"
|
" WHERE usr_nicknames.Nickname='%s'"
|
||||||
" AND usr_nicknames.UsrCod=usr_data.UsrCod",
|
" AND usr_nicknames.UsrCod=usr_data.UsrCod",
|
||||||
NicknameWithoutArroba);
|
NicknameWithoutArroba) < 0)
|
||||||
if (DB_QuerySELECT (Query,&mysql_res,"can not get user's code"))
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
if (DB_QuerySELECT_free (Query,&mysql_res,"can not get user's code"))
|
||||||
{
|
{
|
||||||
/* Get row */
|
/* Get row */
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
@ -226,7 +230,7 @@ static void Nck_ShowFormChangeUsrNickname (const struct UsrData *UsrDat,bool Its
|
||||||
extern const char *Txt_New_nickname;
|
extern const char *Txt_New_nickname;
|
||||||
extern const char *Txt_Change_nickname;
|
extern const char *Txt_Change_nickname;
|
||||||
extern const char *Txt_Save;
|
extern const char *Txt_Save;
|
||||||
char Query[256];
|
char *Query;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
char StrRecordWidth[10 + 1];
|
char StrRecordWidth[10 + 1];
|
||||||
|
@ -238,11 +242,12 @@ static void Nck_ShowFormChangeUsrNickname (const struct UsrData *UsrDat,bool Its
|
||||||
Lay_StartSection (Nck_NICKNAME_SECTION_ID);
|
Lay_StartSection (Nck_NICKNAME_SECTION_ID);
|
||||||
|
|
||||||
/***** Get my nicknames *****/
|
/***** Get my nicknames *****/
|
||||||
sprintf (Query,"SELECT Nickname FROM usr_nicknames"
|
if (asprintf (&Query,"SELECT Nickname FROM usr_nicknames"
|
||||||
" WHERE UsrCod=%ld"
|
" WHERE UsrCod=%ld"
|
||||||
" ORDER BY CreatTime DESC",
|
" ORDER BY CreatTime DESC",
|
||||||
UsrDat->UsrCod);
|
UsrDat->UsrCod) < 0)
|
||||||
NumNicks = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get nicknames of a user");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
NumNicks = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get nicknames of a user");
|
||||||
|
|
||||||
/***** Start box *****/
|
/***** Start box *****/
|
||||||
snprintf (StrRecordWidth,sizeof (StrRecordWidth),
|
snprintf (StrRecordWidth,sizeof (StrRecordWidth),
|
||||||
|
@ -499,13 +504,14 @@ void Nck_RemoveOtherUsrNick (void)
|
||||||
|
|
||||||
static void Nck_RemoveNicknameFromDB (long UsrCod,const char *Nickname)
|
static void Nck_RemoveNicknameFromDB (long UsrCod,const char *Nickname)
|
||||||
{
|
{
|
||||||
char Query[256];
|
char *Query;
|
||||||
|
|
||||||
/***** Remove a nickname *****/
|
/***** Remove a nickname *****/
|
||||||
sprintf (Query,"DELETE FROM usr_nicknames"
|
if (asprintf (&Query,"DELETE FROM usr_nicknames"
|
||||||
" WHERE UsrCod=%ld AND Nickname='%s'",
|
" WHERE UsrCod=%ld AND Nickname='%s'",
|
||||||
UsrCod,Nickname);
|
UsrCod,Nickname) < 0)
|
||||||
DB_QueryREPLACE (Query,"can not remove a nickname");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
DB_QueryREPLACE_free (Query,"can not remove a nickname");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -557,7 +563,7 @@ static void Nck_UpdateUsrNick (struct UsrData *UsrDat)
|
||||||
extern const char *Txt_The_nickname_X_had_been_registered_by_another_user;
|
extern const char *Txt_The_nickname_X_had_been_registered_by_another_user;
|
||||||
extern const char *Txt_The_nickname_X_has_been_registered_successfully;
|
extern const char *Txt_The_nickname_X_has_been_registered_successfully;
|
||||||
extern const char *Txt_The_nickname_entered_X_is_not_valid_;
|
extern const char *Txt_The_nickname_entered_X_is_not_valid_;
|
||||||
char Query[128 + Nck_MAX_BYTES_NICKNAME_FROM_FORM];
|
char *Query;
|
||||||
char NewNicknameWithArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
char NewNicknameWithArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
||||||
char NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
char NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
|
||||||
|
|
||||||
|
@ -583,16 +589,18 @@ static void Nck_UpdateUsrNick (struct UsrData *UsrDat)
|
||||||
else if (strcasecmp (UsrDat->Nickname,NewNicknameWithoutArroba)) // User's nickname does not match, not even case insensitive, the new nickname
|
else if (strcasecmp (UsrDat->Nickname,NewNicknameWithoutArroba)) // User's nickname does not match, not even case insensitive, the new nickname
|
||||||
{
|
{
|
||||||
/***** Check if the new nickname matches any of my old nicknames *****/
|
/***** Check if the new nickname matches any of my old nicknames *****/
|
||||||
sprintf (Query,"SELECT COUNT(*) FROM usr_nicknames"
|
if (asprintf (&Query,"SELECT COUNT(*) FROM usr_nicknames"
|
||||||
" WHERE UsrCod=%ld AND Nickname='%s'",
|
" WHERE UsrCod=%ld AND Nickname='%s'",
|
||||||
UsrDat->UsrCod,NewNicknameWithoutArroba);
|
UsrDat->UsrCod,NewNicknameWithoutArroba) < 0)
|
||||||
if (!DB_QueryCOUNT (Query,"can not check if nickname already existed")) // No matches
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
if (!DB_QueryCOUNT_free (Query,"can not check if nickname already existed")) // No matches
|
||||||
{
|
{
|
||||||
/***** Check if the new nickname matches any of the nicknames of other users *****/
|
/***** Check if the new nickname matches any of the nicknames of other users *****/
|
||||||
sprintf (Query,"SELECT COUNT(*) FROM usr_nicknames"
|
if (asprintf (&Query,"SELECT COUNT(*) FROM usr_nicknames"
|
||||||
" WHERE Nickname='%s' AND UsrCod<>%ld",
|
" WHERE Nickname='%s' AND UsrCod<>%ld",
|
||||||
NewNicknameWithoutArroba,UsrDat->UsrCod);
|
NewNicknameWithoutArroba,UsrDat->UsrCod) < 0)
|
||||||
if (DB_QueryCOUNT (Query,"can not check if nickname already existed")) // A nickname of another user is the same that user's nickname
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
if (DB_QueryCOUNT_free (Query,"can not check if nickname already existed")) // A nickname of another user is the same that user's nickname
|
||||||
{
|
{
|
||||||
Gbl.Alert.Type = Ale_WARNING;
|
Gbl.Alert.Type = Ale_WARNING;
|
||||||
Gbl.Alert.Section = Nck_NICKNAME_SECTION_ID;
|
Gbl.Alert.Section = Nck_NICKNAME_SECTION_ID;
|
||||||
|
@ -635,13 +643,14 @@ static void Nck_UpdateUsrNick (struct UsrData *UsrDat)
|
||||||
|
|
||||||
void Nck_UpdateNickInDB (long UsrCod,const char *NewNickname)
|
void Nck_UpdateNickInDB (long UsrCod,const char *NewNickname)
|
||||||
{
|
{
|
||||||
char Query[512];
|
char *Query;
|
||||||
|
|
||||||
/***** Update user's nickname in database *****/
|
/***** Update user's nickname in database *****/
|
||||||
sprintf (Query,"REPLACE INTO usr_nicknames"
|
if (asprintf (&Query,"REPLACE INTO usr_nicknames"
|
||||||
" (UsrCod,Nickname,CreatTime)"
|
" (UsrCod,Nickname,CreatTime)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,'%s',NOW())",
|
" (%ld,'%s',NOW())",
|
||||||
UsrCod,NewNickname);
|
UsrCod,NewNickname) < 0)
|
||||||
DB_QueryREPLACE (Query,"can not update nickname");
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
DB_QueryREPLACE_free (Query,"can not update nickname");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user