diff --git a/swad_changelog.h b/swad_changelog.h index 5741237f..45f018db 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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) diff --git a/swad_profile.c b/swad_profile.c index 3216e8fa..d7baee8c 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -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) { diff --git a/swad_profile_database.c b/swad_profile_database.c index 0289984d..cb778858 100644 --- a/swad_profile_database.c +++ b/swad_profile_database.c @@ -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 *********************/ /*****************************************************************************/ diff --git a/swad_profile_database.h b/swad_profile_database.h index e96f6e0e..388aa9e8 100644 --- a/swad_profile_database.h +++ b/swad_profile_database.h @@ -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);