mirror of
https://github.com/acanas/swad-core.git
synced 2024-09-24 00:01:03 +02:00
Version 15.116
This commit is contained in:
parent
8ae6904a57
commit
c836c63318
|
@ -122,13 +122,14 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 15.115.2 (2016-01-17)"
|
#define Log_PLATFORM_VERSION "SWAD 15.116 (2016-01-17)"
|
||||||
#define CSS_FILE "swad15.115.css"
|
#define CSS_FILE "swad15.115.css"
|
||||||
#define JS_FILE "swad15.115.js"
|
#define JS_FILE "swad15.115.js"
|
||||||
|
|
||||||
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
// 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
|
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
|
||||||
/*
|
/*
|
||||||
|
Version 15.116: Jan 17, 2016 Optimization in the query to get timeline. (192878 lines)
|
||||||
Version 15.115.2: Jan 17, 2016 Code refactoring in timeline. (192860 lines)
|
Version 15.115.2: Jan 17, 2016 Code refactoring in timeline. (192860 lines)
|
||||||
Version 15.115.1: Jan 17, 2016 Code refactoring in timeline. (192857 lines)
|
Version 15.115.1: Jan 17, 2016 Code refactoring in timeline. (192857 lines)
|
||||||
Version 15.115: Jan 17, 2016 Code refactoring in actions. (192823 lines)
|
Version 15.115: Jan 17, 2016 Code refactoring in actions. (192823 lines)
|
||||||
|
|
197
swad_social.c
197
swad_social.c
|
@ -51,8 +51,8 @@
|
||||||
|
|
||||||
#define Soc_WIDTH_TIMELINE "560px"
|
#define Soc_WIDTH_TIMELINE "560px"
|
||||||
#define Soc_MAX_NUM_SHARERS_SHOWN 10 // Maximum number of users shown who have share a social note
|
#define Soc_MAX_NUM_SHARERS_SHOWN 10 // Maximum number of users shown who have share a social note
|
||||||
#define Soc_MAX_BYTES_SUMMARY 100
|
|
||||||
|
|
||||||
|
#define Soc_MAX_BYTES_SUMMARY 1000
|
||||||
#define Soc_MAX_CHARS_IN_POST 1000
|
#define Soc_MAX_CHARS_IN_POST 1000
|
||||||
|
|
||||||
// Number of recent publishings got and shown the first time, before refreshing
|
// Number of recent publishings got and shown the first time, before refreshing
|
||||||
|
@ -446,16 +446,25 @@ static void Soc_BuildQueryToGetTimeline (Soc_TimelineUsrOrGbl_t TimelineUsrOrGbl
|
||||||
char *Query)
|
char *Query)
|
||||||
{
|
{
|
||||||
char SubQueryPublishers[128];
|
char SubQueryPublishers[128];
|
||||||
char SubQueryRangePubs[128];
|
char SubQueryRangeBottom[128];
|
||||||
|
char SubQueryRangeTop[128];
|
||||||
char SubQueryAlreadyExists[256];
|
char SubQueryAlreadyExists[256];
|
||||||
long LastPubCod;
|
struct
|
||||||
long FirstPubCod;
|
{
|
||||||
|
long Top;
|
||||||
|
long Bottom;
|
||||||
|
} RangePubsToGet;
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned MaxPubsToGet = 0; // Initialized to avoid warning
|
|
||||||
unsigned NumPub;
|
unsigned NumPub;
|
||||||
long PubCod;
|
long PubCod;
|
||||||
long NotCod;
|
long NotCod;
|
||||||
|
const unsigned MaxPubsToGet[3] =
|
||||||
|
{
|
||||||
|
Soc_MAX_NEW_PUBS_TO_GET_AND_SHOW, // Soc_GET_ONLY_NEW_PUBS
|
||||||
|
Soc_MAX_REC_PUBS_TO_GET_AND_SHOW, // Soc_GET_RECENT_TIMELINE
|
||||||
|
Soc_MAX_OLD_PUBS_TO_GET_AND_SHOW, // Soc_GET_ONLY_OLD_PUBS
|
||||||
|
};
|
||||||
|
|
||||||
/***** Clear social timeline for this session in database *****/
|
/***** Clear social timeline for this session in database *****/
|
||||||
if (WhatToGetFromTimeline == Soc_GET_RECENT_TIMELINE)
|
if (WhatToGetFromTimeline == Soc_GET_RECENT_TIMELINE)
|
||||||
|
@ -484,60 +493,6 @@ static void Soc_BuildQueryToGetTimeline (Soc_TimelineUsrOrGbl_t TimelineUsrOrGbl
|
||||||
if (mysql_query (&Gbl.mysql,Query))
|
if (mysql_query (&Gbl.mysql,Query))
|
||||||
DB_ExitOnMySQLError ("can not create temporary table");
|
DB_ExitOnMySQLError ("can not create temporary table");
|
||||||
|
|
||||||
|
|
||||||
/***** Create subquery with range of publishings to get from social_pubs *****/
|
|
||||||
switch (WhatToGetFromTimeline)
|
|
||||||
{
|
|
||||||
case Soc_GET_ONLY_NEW_PUBS: // Get the publishings (without limit) newer than LastPubCod
|
|
||||||
/* This query is made via AJAX automatically from time to time */
|
|
||||||
MaxPubsToGet = Soc_MAX_NEW_PUBS_TO_GET_AND_SHOW;
|
|
||||||
|
|
||||||
LastPubCod = Soc_GetPubCodFromSession ("LastPubCod");
|
|
||||||
if (LastPubCod > 0)
|
|
||||||
switch (TimelineUsrOrGbl)
|
|
||||||
{
|
|
||||||
case Soc_TIMELINE_USR: // Show the timeline of a user
|
|
||||||
sprintf (SubQueryRangePubs,"PubCod>'%ld' AND ",
|
|
||||||
LastPubCod);
|
|
||||||
break;
|
|
||||||
case Soc_TIMELINE_GBL: // Show the timeline of the users I follow
|
|
||||||
sprintf (SubQueryRangePubs,"social_pubs.PubCod>'%ld' AND ",
|
|
||||||
LastPubCod);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
SubQueryRangePubs[0] = '\0';
|
|
||||||
break;
|
|
||||||
case Soc_GET_RECENT_TIMELINE: // Get some limited recent publishings
|
|
||||||
/* This is the first query to get initial timeline shown
|
|
||||||
==> no notes yet in current timeline table */
|
|
||||||
MaxPubsToGet = Soc_MAX_REC_PUBS_TO_GET_AND_SHOW;
|
|
||||||
|
|
||||||
SubQueryRangePubs[0] = '\0';
|
|
||||||
break;
|
|
||||||
case Soc_GET_ONLY_OLD_PUBS: // Get some limited publishings older than FirstPubCod
|
|
||||||
/* This query is made via AJAX
|
|
||||||
when I click in link to get old publishings */
|
|
||||||
MaxPubsToGet = Soc_MAX_OLD_PUBS_TO_GET_AND_SHOW;
|
|
||||||
|
|
||||||
FirstPubCod = Soc_GetPubCodFromSession ("FirstPubCod");
|
|
||||||
if (FirstPubCod > 0)
|
|
||||||
switch (TimelineUsrOrGbl)
|
|
||||||
{
|
|
||||||
case Soc_TIMELINE_USR: // Show the timeline of a user
|
|
||||||
sprintf (SubQueryRangePubs,"PubCod<'%ld' AND ",
|
|
||||||
FirstPubCod);
|
|
||||||
break;
|
|
||||||
case Soc_TIMELINE_GBL: // Show the timeline of the users I follow
|
|
||||||
sprintf (SubQueryRangePubs,"social_pubs.PubCod<'%ld' AND ",
|
|
||||||
FirstPubCod);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
SubQueryRangePubs[0] = '\0';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Create temporary table and subquery with potential publishers *****/
|
/***** Create temporary table and subquery with potential publishers *****/
|
||||||
switch (TimelineUsrOrGbl)
|
switch (TimelineUsrOrGbl)
|
||||||
{
|
{
|
||||||
|
@ -594,10 +549,52 @@ static void Soc_BuildQueryToGetTimeline (Soc_TimelineUsrOrGbl_t TimelineUsrOrGbl
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Get the publishings in timeline *****/
|
/***** Get the publishings in timeline *****/
|
||||||
|
/* Initialize range of pubs:
|
||||||
|
|
||||||
|
social_pubs
|
||||||
|
_____
|
||||||
|
|_____|11
|
||||||
|
|_____|10
|
||||||
|
_|_____| 9 <-- RangePubsToGet.Top
|
||||||
|
Get / |_____| 8
|
||||||
|
pubs | |_____| 7
|
||||||
|
from < |_____| 6
|
||||||
|
this | |_____| 5
|
||||||
|
range \_|_____| 4
|
||||||
|
|_____| 3 <-- RangePubsToGet.Bottom
|
||||||
|
|_____| 2
|
||||||
|
|_____| 1
|
||||||
|
0
|
||||||
|
*/
|
||||||
|
switch (WhatToGetFromTimeline)
|
||||||
|
{
|
||||||
|
case Soc_GET_ONLY_NEW_PUBS: // Get the publishings (without limit) newer than LastPubCod
|
||||||
|
/* This query is made via AJAX automatically from time to time */
|
||||||
|
RangePubsToGet.Top = 0; // +Infinite
|
||||||
|
RangePubsToGet.Bottom = Soc_GetPubCodFromSession ("LastPubCod");
|
||||||
|
break;
|
||||||
|
case Soc_GET_RECENT_TIMELINE: // Get some limited recent publishings
|
||||||
|
/* This is the first query to get initial timeline shown
|
||||||
|
==> no notes yet in current timeline table */
|
||||||
|
RangePubsToGet.Top = 0; // +Infinite
|
||||||
|
RangePubsToGet.Bottom = 0; // -Infinite
|
||||||
|
break;
|
||||||
|
case Soc_GET_ONLY_OLD_PUBS: // Get some limited publishings older than FirstPubCod
|
||||||
|
/* This query is made via AJAX
|
||||||
|
when I click in link to get old publishings */
|
||||||
|
RangePubsToGet.Top = Soc_GetPubCodFromSession ("FirstPubCod");
|
||||||
|
RangePubsToGet.Bottom = 0; // -Infinite
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
With the current approach, we select one by one
|
With the current approach, we select one by one
|
||||||
the publishings and notes in a loop. In each iteration,
|
the publishings and notes in a loop. In each iteration,
|
||||||
we get the more recent note that is not already retrieved.
|
we get the more recent publishing (original, shared or commment)
|
||||||
|
of every set of publishings corresponding to the same note:
|
||||||
|
checking that the note is not already retrieved.
|
||||||
|
After getting a publishing, its note code is stored
|
||||||
|
in order to not get it again.
|
||||||
|
|
||||||
As an alternative, we tried to get the maximum PubCod,
|
As an alternative, we tried to get the maximum PubCod,
|
||||||
i.e more recent publishing (original, shared or commment),
|
i.e more recent publishing (original, shared or commment),
|
||||||
|
@ -607,24 +604,41 @@ static void Soc_BuildQueryToGetTimeline (Soc_TimelineUsrOrGbl_t TimelineUsrOrGbl
|
||||||
but this query is slow (several seconds) with a big table.
|
but this query is slow (several seconds) with a big table.
|
||||||
*/
|
*/
|
||||||
for (NumPub = 0;
|
for (NumPub = 0;
|
||||||
NumPub < MaxPubsToGet;
|
NumPub < MaxPubsToGet[WhatToGetFromTimeline];
|
||||||
NumPub++)
|
NumPub++)
|
||||||
{
|
{
|
||||||
|
/* Create subqueries with range of publishings to get from social_pubs */
|
||||||
|
if (RangePubsToGet.Bottom > 0)
|
||||||
|
sprintf (SubQueryRangeBottom,
|
||||||
|
TimelineUsrOrGbl == Soc_TIMELINE_USR ? "PubCod>'%ld' AND " :
|
||||||
|
"social_pubs.PubCod>'%ld' AND ",
|
||||||
|
RangePubsToGet.Bottom);
|
||||||
|
else
|
||||||
|
SubQueryRangeBottom[0] = '\0';
|
||||||
|
if (RangePubsToGet.Top > 0)
|
||||||
|
sprintf (SubQueryRangeTop,
|
||||||
|
TimelineUsrOrGbl == Soc_TIMELINE_USR ? "PubCod<'%ld' AND " :
|
||||||
|
"social_pubs.PubCod<'%ld' AND ",
|
||||||
|
RangePubsToGet.Top);
|
||||||
|
else
|
||||||
|
SubQueryRangeTop[0] = '\0';
|
||||||
|
|
||||||
|
/* Select the most recent publishing from social_pubs */
|
||||||
switch (TimelineUsrOrGbl)
|
switch (TimelineUsrOrGbl)
|
||||||
{
|
{
|
||||||
case Soc_TIMELINE_USR: // Show the timeline of a user
|
case Soc_TIMELINE_USR: // Show the timeline of a user
|
||||||
sprintf (Query,"SELECT PubCod,NotCod FROM social_pubs"
|
sprintf (Query,"SELECT PubCod,NotCod FROM social_pubs"
|
||||||
" WHERE %s%s%s"
|
" WHERE %s%s%s%s"
|
||||||
" ORDER BY PubCod DESC LIMIT 1",
|
" ORDER BY PubCod DESC LIMIT 1",
|
||||||
SubQueryRangePubs,
|
SubQueryRangeBottom,SubQueryRangeTop,
|
||||||
SubQueryPublishers,
|
SubQueryPublishers,
|
||||||
SubQueryAlreadyExists);
|
SubQueryAlreadyExists);
|
||||||
break;
|
break;
|
||||||
case Soc_TIMELINE_GBL: // Show the timeline of the users I follow
|
case Soc_TIMELINE_GBL: // Show the timeline of the users I follow
|
||||||
sprintf (Query,"SELECT PubCod,NotCod FROM social_pubs,publishers"
|
sprintf (Query,"SELECT PubCod,NotCod FROM social_pubs,publishers"
|
||||||
" WHERE %s%s%s"
|
" WHERE %s%s%s%s"
|
||||||
" ORDER BY social_pubs.PubCod DESC LIMIT 1",
|
" ORDER BY social_pubs.PubCod DESC LIMIT 1",
|
||||||
SubQueryRangePubs,
|
SubQueryRangeBottom,SubQueryRangeTop,
|
||||||
SubQueryPublishers,
|
SubQueryPublishers,
|
||||||
SubQueryAlreadyExists);
|
SubQueryAlreadyExists);
|
||||||
break;
|
break;
|
||||||
|
@ -637,6 +651,7 @@ static void Soc_BuildQueryToGetTimeline (Soc_TimelineUsrOrGbl_t TimelineUsrOrGbl
|
||||||
PubCod = Str_ConvertStrCodToLongCod (row[0]);
|
PubCod = Str_ConvertStrCodToLongCod (row[0]);
|
||||||
sprintf (Query,"INSERT INTO pub_codes SET PubCod='%ld'",PubCod);
|
sprintf (Query,"INSERT INTO pub_codes SET PubCod='%ld'",PubCod);
|
||||||
DB_QueryINSERT (Query,"can not store publishing code");
|
DB_QueryINSERT (Query,"can not store publishing code");
|
||||||
|
RangePubsToGet.Top = PubCod; // Narrow the range for the next iteration
|
||||||
|
|
||||||
/* Get social note code (row[1]) */
|
/* Get social note code (row[1]) */
|
||||||
NotCod = Str_ConvertStrCodToLongCod (row[1]);
|
NotCod = Str_ConvertStrCodToLongCod (row[1]);
|
||||||
|
@ -645,7 +660,7 @@ static void Soc_BuildQueryToGetTimeline (Soc_TimelineUsrOrGbl_t TimelineUsrOrGbl
|
||||||
sprintf (Query,"INSERT INTO current_timeline SET NotCod='%ld'",NotCod);
|
sprintf (Query,"INSERT INTO current_timeline SET NotCod='%ld'",NotCod);
|
||||||
DB_QueryINSERT (Query,"can not store note code");
|
DB_QueryINSERT (Query,"can not store note code");
|
||||||
}
|
}
|
||||||
else
|
else // Nothing got ==> abort loop
|
||||||
break; // Last publishing
|
break; // Last publishing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -739,34 +754,34 @@ static void Soc_DropTemporaryTablesUsedToQueryTimeline (void)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********************** Show social activity (timeline) *********************/
|
/*********************** Show social activity (timeline) *********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
/* _____
|
||||||
/ +-----+ just_now_timeline_list (Posts retrieved automatically
|
/ |_____| just_now_timeline_list (Posts retrieved automatically
|
||||||
| |-----| via AJAX from time to time.
|
| |_____| via AJAX from time to time.
|
||||||
| +-----+ They are transferred inmediately
|
| |_____| They are transferred inmediately
|
||||||
| | to new_timeline_list.)
|
| | to new_timeline_list.)
|
||||||
Hidden < v
|
Hidden < __v__
|
||||||
| +-----+ new_timeline_list (Posts retrieved but hidden.
|
| |_____| new_timeline_list (Posts retrieved but hidden.
|
||||||
| |-----| When user clicks to view them,
|
| |_____| When user clicks to view them,
|
||||||
| |-----| they are transferred
|
| |_____| they are transferred
|
||||||
\ +-----+ to visible timeline_list.)
|
\ |_____| to visible timeline_list.)
|
||||||
|
|
|
|
||||||
v
|
__v__
|
||||||
/ +-----+ timeline_list (Posts visible on page)
|
/ |_____| timeline_list (Posts visible on page)
|
||||||
| |-----|
|
| |_____|
|
||||||
Visible | |-----|
|
Visible | |_____|
|
||||||
on < |-----|
|
on < |_____|
|
||||||
page | |-----|
|
page | |_____|
|
||||||
| |-----|
|
| |_____|
|
||||||
\ +-----+
|
\ |_____|
|
||||||
^
|
^
|
||||||
|
|
__|__
|
||||||
/ +-----+ old_timeline_list (Posts just retrieved via AJAX
|
/ |_____| old_timeline_list (Posts just retrieved via AJAX
|
||||||
| |-----| when user clicks "see more".
|
| |_____| when user clicks "see more".
|
||||||
| |-----| They are transferred inmediately
|
| |_____| They are transferred inmediately
|
||||||
Hidden < |-----| to timeline_list.)
|
Hidden < |_____| to timeline_list.)
|
||||||
| |-----|
|
| |_____|
|
||||||
| |-----|
|
| |_____|
|
||||||
\ +-----+
|
\ |_____|
|
||||||
*/
|
*/
|
||||||
static void Soc_ShowTimeline (const char *Query,const char *Title,
|
static void Soc_ShowTimeline (const char *Query,const char *Title,
|
||||||
long NotCodToHighlight)
|
long NotCodToHighlight)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user