Version 21.27.1: Oct 07, 2021 Queries moved to module swad_profile_database.

This commit is contained in:
acanas 2021-10-07 23:29:41 +02:00
parent d2fad3d9d4
commit 03fde989df
4 changed files with 365 additions and 353 deletions

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
#define Log_PLATFORM_VERSION "SWAD 21.27 (2021-10-07)"
#define Log_PLATFORM_VERSION "SWAD 21.27.1 (2021-10-07)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 21.27.1: Oct 07, 2021 Queries moved to module swad_profile_database. (318855 lines)
Version 21.27: Oct 07, 2021 New module swad_profile_database for database queries related to user's public profile. (318846 lines)
Version 21.26: Oct 06, 2021 New module swad_plugin_database for database queries related to plugins. (318680 lines)
Version 21.25: Oct 05, 2021 New module swad_place_database for database queries related to places. (318514 lines)

View File

@ -119,8 +119,6 @@ static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod);
static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod);
static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures);
static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures,
bool CreatingMyOwnAccount);
static void Prf_GetAndShowRankingFigure (const char *FieldName);
static void Prf_ShowUsrInRanking (struct UsrData *UsrDat,unsigned Rank,bool ItsMe);
@ -595,7 +593,7 @@ static void Prf_ShowNumClicks (const struct UsrData *UsrDat,
{
HTM_Long (UsrFigures->NumClicks);
HTM_TxtF (" %s ",Txt_clicks);
Prf_ShowRanking (Prf_DB_GetRankingFigure (UsrDat->UsrCod,"NumClicks"),
Prf_ShowRanking (Prf_DB_GetUsrRankingFigure (UsrDat->UsrCod,"NumClicks"),
Prf_DB_GetNumUsrsWithFigure ("NumClicks"));
if (UsrFigures->NumDays > 0)
{
@ -635,7 +633,7 @@ static void Prf_ShowNumFileViews (const struct UsrData *UsrDat,
HTM_Long (UsrFigures->NumFileViews);
HTM_TxtF (" %s ",(UsrFigures->NumFileViews == 1) ? Txt_download :
Txt_downloads);
Prf_ShowRanking (Prf_DB_GetRankingFigure (UsrDat->UsrCod,"NumFileViews"),
Prf_ShowRanking (Prf_DB_GetUsrRankingFigure (UsrDat->UsrCod,"NumFileViews"),
Prf_DB_GetNumUsrsWithFigure ("NumFileViews"));
if (UsrFigures->NumDays > 0)
{
@ -672,7 +670,7 @@ static void Prf_ShowNumTimelinePubs (const struct UsrData *UsrDat,
HTM_Int (UsrFigures->NumTimelinePubs);
HTM_TxtF (" %s ",UsrFigures->NumTimelinePubs == 1 ? Txt_TIMELINE_post :
Txt_TIMELINE_posts);
Prf_ShowRanking (Prf_DB_GetRankingFigure (UsrDat->UsrCod,"NumSocPub"),
Prf_ShowRanking (Prf_DB_GetUsrRankingFigure (UsrDat->UsrCod,"NumSocPub"),
Prf_DB_GetNumUsrsWithFigure ("NumSocPub"));
if (UsrFigures->NumDays > 0)
{
@ -709,7 +707,7 @@ static void Prf_ShowNumForumPosts (const struct UsrData *UsrDat,
HTM_Long (UsrFigures->NumForumPosts);
HTM_TxtF (" %s ",UsrFigures->NumForumPosts == 1 ? Txt_FORUM_post :
Txt_FORUM_posts);
Prf_ShowRanking (Prf_DB_GetRankingFigure (UsrDat->UsrCod,"NumForPst"),
Prf_ShowRanking (Prf_DB_GetUsrRankingFigure (UsrDat->UsrCod,"NumForPst"),
Prf_DB_GetNumUsrsWithFigure ("NumForPst"));
if (UsrFigures->NumDays > 0)
{
@ -746,7 +744,7 @@ static void Prf_ShowNumMessagesSent (const struct UsrData *UsrDat,
HTM_Long (UsrFigures->NumMessagesSent);
HTM_TxtF (" %s ",UsrFigures->NumMessagesSent == 1 ? Txt_message :
Txt_messages);
Prf_ShowRanking (Prf_DB_GetRankingFigure (UsrDat->UsrCod,"NumMsgSnt"),
Prf_ShowRanking (Prf_DB_GetUsrRankingFigure (UsrDat->UsrCod,"NumMsgSnt"),
Prf_DB_GetNumUsrsWithFigure ("NumMsgSnt"));
if (UsrFigures->NumDays > 0)
{
@ -978,7 +976,7 @@ static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod)
if (Prf_DB_CheckIfUsrFiguresExists (UsrCod))
Prf_DB_UpdateFirstClickTimeUsr (UsrCod,UsrFigures.FirstClickTimeUTC);
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures,false);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,false);
}
}
@ -1002,7 +1000,7 @@ static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod)
if (Prf_DB_CheckIfUsrFiguresExists (UsrCod))
Prf_DB_UpdateNumClicksUsr (UsrCod,UsrFigures.NumClicks);
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures,false);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,false);
}
}
@ -1026,7 +1024,7 @@ static void Prf_GetNumTimelinePubsAndStoreAsUsrFigure (long UsrCod)
if (Prf_DB_CheckIfUsrFiguresExists (UsrCod))
Prf_DB_UpdateNumTimelinePubsUsr (UsrCod,UsrFigures.NumTimelinePubs);
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures,false);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,false);
}
}
@ -1050,7 +1048,7 @@ static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod)
if (Prf_DB_CheckIfUsrFiguresExists (UsrCod))
Prf_DB_UpdateNumFileViewsUsr (UsrCod,UsrFigures.NumFileViews);
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures,false);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,false);
}
}
@ -1074,7 +1072,7 @@ static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod)
if (Prf_DB_CheckIfUsrFiguresExists (UsrCod))
Prf_DB_UpdateNumForumPostsUsr (UsrCod,UsrFigures.NumForumPosts);
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures,false);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,false);
}
}
@ -1098,7 +1096,7 @@ static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod)
if (Prf_DB_CheckIfUsrFiguresExists (UsrCod))
Prf_DB_UpdateNumMessagesSentUsr (UsrCod,UsrFigures.NumMessagesSent);
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures,false);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,false);
}
}
@ -1119,7 +1117,7 @@ void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount)
UsrFigures.NumMessagesSent = 0; // set number of messages sent to 0
/***** Create user's figures *****/
Prf_CreateUsrFigures (UsrCod,&UsrFigures,CreatingMyOwnAccount);
Prf_DB_CreateUsrFigures (UsrCod,&UsrFigures,CreatingMyOwnAccount);
}
/*****************************************************************************/
@ -1137,41 +1135,6 @@ static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures)
UsrFigures->NumMessagesSent = -1; // unknown number of messages sent
}
/*****************************************************************************/
/***** Get number of messages sent by a user and store in user's figures *****/
/*****************************************************************************/
#define Prf_MAX_BYTES_SUBQUERY_FIRST_CLICK_TIME (64 - 1)
static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures,
bool CreatingMyOwnAccount)
{
char SubQueryFirstClickTime[Prf_MAX_BYTES_SUBQUERY_FIRST_CLICK_TIME + 1];
if (CreatingMyOwnAccount)
// This is the first click
Str_Copy (SubQueryFirstClickTime,"NOW()",sizeof (SubQueryFirstClickTime) - 1);
else
sprintf (SubQueryFirstClickTime,"FROM_UNIXTIME(%ld)",
(long) UsrFigures->FirstClickTimeUTC); // 0 ==> unknown first click time or user never logged
/***** Create user's figures *****/
DB_QueryINSERT ("can not create user's figures",
"INSERT INTO usr_figures"
" (UsrCod,FirstClickTime,"
"NumClicks,NumSocPub,NumFileViews,NumForPst,NumMsgSnt)"
" VALUES"
" (%ld,%s,"
"%d,%d,%d,%d,%d)",
UsrCod,
SubQueryFirstClickTime,
UsrFigures->NumClicks, // -1 ==> unknown number of clicks
UsrFigures->NumTimelinePubs, // -1 ==> unknown number of timeline publications
UsrFigures->NumFileViews, // -1 ==> unknown number of file views
UsrFigures->NumForumPosts, // -1 ==> unknown number of forum posts
UsrFigures->NumMessagesSent); // -1 ==> unknown number of messages sent
}
/*****************************************************************************/
/******** Get and show ranking of users attending to number of clicks ********/
/*****************************************************************************/
@ -1204,159 +1167,10 @@ void Prf_GetAndShowRankingMsgsSnt (void)
static void Prf_GetAndShowRankingFigure (const char *FieldName)
{
MYSQL_RES *mysql_res;
unsigned NumUsrs = 0; // Initialized to avoid warning
unsigned NumUsrs;
/***** Get ranking from database *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT UsrCod," // row[0]
"%s" // row[1]
" FROM usr_figures"
" WHERE %s>0"
" AND UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY %s DESC,"
"UsrCod"
" LIMIT 100",
FieldName,
FieldName,
FieldName);
break;
case HieLvl_CTY:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Cty.CtyCod,
FieldName,
FieldName);
break;
case HieLvl_INS:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Ins.InsCod,
FieldName,
FieldName);
break;
case HieLvl_CTR:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Ctr.CtrCod,
FieldName,FieldName);
break;
case HieLvl_DEG:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM crs_courses,"
"crs_users,"
"usr_figures"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Deg.DegCod,
FieldName,FieldName);
break;
case HieLvl_CRS:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM crs_users,"
"usr_figures"
" WHERE crs_users.CrsCod=%ld"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Crs.CrsCod,
FieldName,FieldName);
break;
default:
Err_WrongScopeExit ();
break;
}
NumUsrs = Prf_DB_GetRankingFigure (&mysql_res,FieldName);
Prf_ShowRankingFigure (&mysql_res,NumUsrs);
}
@ -1441,160 +1255,14 @@ void Prf_GetAndShowRankingClicksPerDay (void)
double NumClicksPerDay;
/***** Get ranking from database *****/
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT UsrCod," // row[0]
"NumClicks/(DATEDIFF(NOW(),"
"FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM usr_figures"
" WHERE NumClicks>0"
" AND FirstClickTime>FROM_UNIXTIME(0)"
" AND UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"UsrCod"
" LIMIT 100");
break;
case HieLvl_CTY:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Cty.CtyCod);
break;
case HieLvl_INS:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Ins.InsCod);
break;
case HieLvl_CTR:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Ctr.CtrCod);
break;
case HieLvl_DEG:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM crs_courses,"
"crs_users,"
"usr_figures"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Deg.DegCod);
break;
case HieLvl_CRS:
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM crs_users,"
"usr_figures"
" WHERE crs_users.CrsCod=%ld"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Crs.CrsCod);
break;
default:
Err_WrongScopeExit ();
break;
}
if (NumUsrs)
if ((NumUsrs = Prf_DB_GetRankingClicksPerDay (&mysql_res)))
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
HTM_TABLE_Begin (NULL);
for (NumUsr = 1, Rank = 1, Gbl.RowEvenOdd = 0;
for (NumUsr = 1, Rank = 1, Gbl.RowEvenOdd = 0;
NumUsr <= NumUsrs;
NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd)
{

View File

@ -26,6 +26,8 @@
/*****************************************************************************/
#include "swad_database.h"
#include "swad_error.h"
#include "swad_global.h"
#include "swad_profile_database.h"
/*****************************************************************************/
@ -44,7 +46,7 @@
/************** External global variables from others modules ****************/
/*****************************************************************************/
// extern struct Globals Gbl;
extern struct Globals Gbl;
/*****************************************************************************/
/************************* Private global variables **************************/
@ -54,6 +56,39 @@
/***************************** Private prototypes ****************************/
/*****************************************************************************/
/*****************************************************************************/
/**************************** Create user's figures **************************/
/*****************************************************************************/
void Prf_DB_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures,
bool CreatingMyOwnAccount)
{
char SubQueryFirstClickTime[64];
if (CreatingMyOwnAccount)
// This is the first click
Str_Copy (SubQueryFirstClickTime,"NOW()",sizeof (SubQueryFirstClickTime) - 1);
else
snprintf (SubQueryFirstClickTime,sizeof (SubQueryFirstClickTime),
"FROM_UNIXTIME(%ld)",
(long) UsrFigures->FirstClickTimeUTC); // 0 ==> unknown first click time or user never logged
DB_QueryINSERT ("can not create user's figures",
"INSERT INTO usr_figures"
" (UsrCod,FirstClickTime,"
"NumClicks,NumSocPub,NumFileViews,NumForPst,NumMsgSnt)"
" VALUES"
" (%ld,%s,"
"%d,%d,%d,%d,%d)",
UsrCod,
SubQueryFirstClickTime,
UsrFigures->NumClicks, // -1 ==> unknown number of clicks
UsrFigures->NumTimelinePubs, // -1 ==> unknown number of timeline publications
UsrFigures->NumFileViews, // -1 ==> unknown number of file views
UsrFigures->NumForumPosts, // -1 ==> unknown number of forum posts
UsrFigures->NumMessagesSent); // -1 ==> unknown number of messages sent
}
/*****************************************************************************/
/****************** Update first click time in user's figures ****************/
/*****************************************************************************/
@ -219,10 +254,10 @@ void Prf_DB_IncrementNumMsgSntUsr (long UsrCod)
}
/*****************************************************************************/
/********** Get ranking of a user according to the number of clicks **********/
/***************** Get ranking of a user according to a figure ***************/
/*****************************************************************************/
unsigned Prf_DB_GetRankingFigure (long UsrCod,const char *FieldName)
unsigned Prf_DB_GetUsrRankingFigure (long UsrCod,const char *FieldName)
{
/***** Select number of rows with figure
greater than the figure of this user *****/
@ -240,6 +275,308 @@ unsigned Prf_DB_GetRankingFigure (long UsrCod,const char *FieldName)
UsrCod);
}
/*****************************************************************************/
/************************** Get ranking of a figure **************************/
/*****************************************************************************/
unsigned Prf_DB_GetRankingFigure (MYSQL_RES **mysql_res,const char *FieldName)
{
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT UsrCod," // row[0]
"%s" // row[1]
" FROM usr_figures"
" WHERE %s>0"
" AND UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY %s DESC,"
"UsrCod"
" LIMIT 100",
FieldName,
FieldName,
FieldName);
case HieLvl_CTY:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Cty.CtyCod,
FieldName,
FieldName);
case HieLvl_INS:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Ins.InsCod,
FieldName,
FieldName);
case HieLvl_CTR:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Ctr.CtrCod,
FieldName,
FieldName);
case HieLvl_DEG:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM crs_courses,"
"crs_users,"
"usr_figures"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Deg.DegCod,
FieldName,
FieldName);
case HieLvl_CRS:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.%s" // row[1]
" FROM crs_users,"
"usr_figures"
" WHERE crs_users.CrsCod=%ld"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.%s>0"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY usr_figures.%s DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
FieldName,
Gbl.Hierarchy.Crs.CrsCod,
FieldName,
FieldName);
default:
Err_WrongScopeExit ();
return 0; // Not reached
}
}
/*****************************************************************************/
/********* Get ranking of users attending to number of clicks per day ********/
/*****************************************************************************/
unsigned Prf_DB_GetRankingClicksPerDay (MYSQL_RES **mysql_res)
{
switch (Gbl.Scope.Current)
{
case HieLvl_SYS:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT UsrCod," // row[0]
"NumClicks/(DATEDIFF(NOW(),"
"FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM usr_figures"
" WHERE NumClicks>0"
" AND FirstClickTime>FROM_UNIXTIME(0)"
" AND UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"UsrCod"
" LIMIT 100");
case HieLvl_CTY:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Cty.CtyCod);
case HieLvl_INS:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Ins.InsCod);
case HieLvl_CTR:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM deg_degrees,"
"crs_courses,"
"crs_users,"
"usr_figures"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Ctr.CtrCod);
case HieLvl_DEG:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM crs_courses,"
"crs_users,"
"usr_figures"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Deg.DegCod);
case HieLvl_CRS:
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get ranking",
"SELECT DISTINCTROW "
"usr_figures.UsrCod," // row[0]
"usr_figures.NumClicks/(DATEDIFF(NOW(),"
"usr_figures.FirstClickTime)+1) AS NumClicksPerDay" // row[1]
" FROM crs_users,"
"usr_figures"
" WHERE crs_users.CrsCod=%ld"
" AND crs_users.UsrCod=usr_figures.UsrCod"
" AND usr_figures.NumClicks>0"
" AND usr_figures.FirstClickTime>FROM_UNIXTIME(0)"
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
" ORDER BY NumClicksPerDay DESC,"
"usr_figures.UsrCod"
" LIMIT 100",
Gbl.Hierarchy.Crs.CrsCod);
default:
Err_WrongScopeExit ();
return 0; // Not reached
}
}
/*****************************************************************************/
/********************* Get number of users with a figure *********************/
/*****************************************************************************/

View File

@ -27,6 +27,8 @@
/********************************** Headers **********************************/
/*****************************************************************************/
#include "swad_profile.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
@ -39,6 +41,8 @@
/****************************** Public prototypes ****************************/
/*****************************************************************************/
void Prf_DB_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures,
bool CreatingMyOwnAccount);
void Prf_DB_UpdateFirstClickTimeUsr (long UsrCod,time_t FirstClickTimeUTC);
void Prf_DB_UpdateNumClicksUsr (long UsrCod,int NumClicks);
void Prf_DB_UpdateNumTimelinePubsUsr (long UsrCod,int NumTimelinePubs);
@ -51,7 +55,9 @@ void Prf_DB_IncrementNumFileViewsUsr (long UsrCod);
void Prf_DB_IncrementNumForPstUsr (long UsrCod);
void Prf_DB_IncrementNumMsgSntUsr (long UsrCod);
unsigned Prf_DB_GetRankingFigure (long UsrCod,const char *FieldName);
unsigned Prf_DB_GetUsrRankingFigure (long UsrCod,const char *FieldName);
unsigned Prf_DB_GetRankingFigure (MYSQL_RES **mysql_res,const char *FieldName);
unsigned Prf_DB_GetRankingClicksPerDay (MYSQL_RES **mysql_res);
unsigned Prf_DB_GetNumUsrsWithFigure (const char *FieldName);
unsigned Prf_DB_GetRankingNumClicksPerDay (long UsrCod);
unsigned Prf_DB_GetNumUsrsWithNumClicksPerDay (void);