diff --git a/sql/cambios.sql b/sql/cambios.sql index 83dc4e2c0..95d0107a4 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -11640,6 +11640,6 @@ SELECT SQL_NO_CACHE YEAR(CONVERT_TZ(ClickTime,@@session.time_zone,'Europe/Berlin ----- SWAD 16.15 (2016/10/06) ----- -CREATE TABLE IF NOT EXISTS usr_report (RepCod INT NOT NULL AUTO_INCREMENT,UsrCod INT NOT NULL,ReportTime DATETIME NOT NULL,UniqueDirL CHAR(2) NOT NULL,UniqueDirR CHAR(41) NOT NULL,Filename VARCHAR(255) NOT NULL,Permalink VARCHAR(255) NOT NULL,UNIQUE INDEX(RepCod),INDEX(UsrCod)); +CREATE TABLE IF NOT EXISTS usr_report (RepCod INT NOT NULL AUTO_INCREMENT,UsrCod INT NOT NULL,ReportTimeUTC DATETIME NOT NULL,UniqueDirL CHAR(2) NOT NULL,UniqueDirR CHAR(41) NOT NULL,Filename VARCHAR(255) NOT NULL,Permalink VARCHAR(255) NOT NULL,UNIQUE INDEX(RepCod),INDEX(UsrCod)); diff --git a/swad_changelog.h b/swad_changelog.h index d11af99ef..f76cedcf4 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -146,13 +146,18 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.15.1 (2016-10-06)" +#define Log_PLATFORM_VERSION "SWAD 16.15.3 (2016-10-06)" #define CSS_FILE "swad15.229.css" #define JS_FILE "swad15.238.1.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 16.15.3: Oct 06, 2016 Do not write date when requesting a user's usage report. (205965 lines) + Version 16.15.2: Oct 06, 2016 Code refactoring in user's usage report. (205966 lines) + 1 change necessary in database: +CREATE TABLE IF NOT EXISTS usr_report (RepCod INT NOT NULL AUTO_INCREMENT,UsrCod INT NOT NULL,ReportTimeUTC DATETIME NOT NULL,UniqueDirL CHAR(2) NOT NULL,UniqueDirR CHAR(41) NOT NULL,Filename VARCHAR(255) NOT NULL,Permalink VARCHAR(255) NOT NULL,UNIQUE INDEX(RepCod),INDEX(UsrCod)); + Version 16.15.1: Oct 06, 2016 User's usage reports are stored into database. (205950 lines) Version 16.15: Oct 06, 2016 New database table to store user's usage reports. (205896 lines) Version 16.14: Oct 06, 2016 By default, teachers see (do not edit) documents. Now they must click on small edit icon to edit. (205875 lines) diff --git a/swad_database.c b/swad_database.c index aa75fa99f..0efe4a9cd 100644 --- a/swad_database.c +++ b/swad_database.c @@ -2785,17 +2785,17 @@ mysql> DESCRIBE usr_nicknames; /***** Table usr_report *****/ /* mysql> DESCRIBE usr_report; -+------------+--------------+------+-----+---------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+------------+--------------+------+-----+---------+----------------+ -| RepCod | int(11) | NO | PRI | NULL | auto_increment | -| UsrCod | int(11) | NO | MUL | NULL | | -| ReportTime | datetime | NO | | NULL | | -| UniqueDirL | char(2) | NO | | NULL | | -| UniqueDirR | char(41) | NO | | NULL | | -| Filename | varchar(255) | NO | | NULL | | -| Permalink | varchar(255) | NO | | NULL | | -+------------+--------------+------+-----+---------+----------------+ ++---------------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++---------------+--------------+------+-----+---------+----------------+ +| RepCod | int(11) | NO | PRI | NULL | auto_increment | +| UsrCod | int(11) | NO | MUL | NULL | | +| ReportTimeUTC | datetime | NO | | NULL | | +| UniqueDirL | char(2) | NO | | NULL | | +| UniqueDirR | char(41) | NO | | NULL | | +| Filename | varchar(255) | NO | | NULL | | +| Permalink | varchar(255) | NO | | NULL | | ++---------------+--------------+------+-----+---------+----------------+ 7 rows in set (0,00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS usr_report (" diff --git a/swad_report.c b/swad_report.c index 5431f07f7..cc84b89f6 100644 --- a/swad_report.c +++ b/swad_report.c @@ -91,11 +91,13 @@ static void Rep_PutLinkToMyUsageReport (struct CurrentTimeUTC *CurrentTimeUTC, const char *Permalink); static void Req_TitleReport (struct CurrentTimeUTC *CurrentTimeUTC); -static void Rep_GetCurrentDateTimeUTC (struct CurrentTimeUTC *CurrentTimeUTC); +static void Rep_GetCurrentDateTimeUTC (struct tm *tm_CurrentTime, + struct CurrentTimeUTC *CurrentTimeUTC); static void Rep_CreateNewReportFile (const struct CurrentTimeUTC *CurrentTimeUTC, char *FilenameReport,char *Permalink); -static void Rep_CreateNewReportEntryIntoDB (const char *FilenameReport, +static void Rep_CreateNewReportEntryIntoDB (const struct tm *tm_CurrentTime, + const char *FilenameReport, const char *Permalink); static void Rep_WriteHeader (const struct CurrentTimeUTC *CurrentTimeUTC, const char *Permalink); @@ -143,10 +145,6 @@ void Rep_ReqMyUsageReport (void) { extern const char *Txt_Report_of_use_of_PLATFORM; extern const char *Txt_Generate_report; - struct CurrentTimeUTC CurrentTimeUTC; - - /***** Get current date-time *****/ - Rep_GetCurrentDateTimeUTC (&CurrentTimeUTC); /***** Form to show my usage report *****/ Act_FormStart (ActSeeMyUsgRep); @@ -156,7 +154,7 @@ void Rep_ReqMyUsageReport (void) Lay_StartRoundFrame (NULL,Gbl.Title,NULL); /***** Header *****/ - Req_TitleReport (&CurrentTimeUTC); + Req_TitleReport (NULL); // NULL means do not write date /***** Send button and end frame *****/ Lay_EndRoundFrameWithButton (Lay_CONFIRM_BUTTON,Txt_Generate_report); @@ -191,19 +189,20 @@ static void Rep_CreateMyUsageReport (struct CurrentTimeUTC *CurrentTimeUTC, char *Permalink) { extern const char *Txt_Report_of_use_of_PLATFORM; + struct tm tm_CurrentTime; struct UsrFigures UsrFigures; struct tm tm_FirstClickTime; bool GetUsrFiguresAgain; unsigned long MaxHitsPerYear; /***** Get current date-time *****/ - Rep_GetCurrentDateTimeUTC (CurrentTimeUTC); + Rep_GetCurrentDateTimeUTC (&tm_CurrentTime,CurrentTimeUTC); /***** Create a new report file *****/ Rep_CreateNewReportFile (CurrentTimeUTC,FilenameReport,Permalink); /***** Store report entry into database *****/ - Rep_CreateNewReportEntryIntoDB (FilenameReport,Permalink); + Rep_CreateNewReportEntryIntoDB (&tm_CurrentTime,FilenameReport,Permalink); /***** Start file *****/ Lay_StartHTMLFile (Gbl.F.Rep,FilenameReport); @@ -289,6 +288,7 @@ static void Rep_PutLinkToMyUsageReport (struct CurrentTimeUTC *CurrentTimeUTC, /*****************************************************************************/ /********************* Write title of user's usage report ********************/ /*****************************************************************************/ +// CurrentTimeUTC == NULL ==> do not write date static void Req_TitleReport (struct CurrentTimeUTC *CurrentTimeUTC) { @@ -302,13 +302,13 @@ static void Req_TitleReport (struct CurrentTimeUTC *CurrentTimeUTC) Txt_User[Gbl.Usrs.Me.UsrDat.Sex], Gbl.Usrs.Me.UsrDat.FullName); - fprintf (Gbl.F.Out,"
"); - /***** Report date *****/ - fprintf (Gbl.F.Out,"%s: %s %s UTC", - Txt_Date, - CurrentTimeUTC->StrDate, - CurrentTimeUTC->StrTime); + if (CurrentTimeUTC) + fprintf (Gbl.F.Out,"
" + "%s: %s %s UTC", + Txt_Date, + CurrentTimeUTC->StrDate, + CurrentTimeUTC->StrTime); fprintf (Gbl.F.Out,""); } @@ -317,10 +317,10 @@ static void Req_TitleReport (struct CurrentTimeUTC *CurrentTimeUTC) /********************* Get current date and time in UTC **********************/ /*****************************************************************************/ -static void Rep_GetCurrentDateTimeUTC (struct CurrentTimeUTC *CurrentTimeUTC) +static void Rep_GetCurrentDateTimeUTC (struct tm *tm_CurrentTime, + struct CurrentTimeUTC *CurrentTimeUTC) { time_t CurrentTime; - struct tm tm_CurrentTime; /***** Initialize to empty strings *****/ CurrentTimeUTC->StrDate[0] = '\0'; @@ -328,25 +328,25 @@ static void Rep_GetCurrentDateTimeUTC (struct CurrentTimeUTC *CurrentTimeUTC) /***** Get current time UTC *****/ time (&CurrentTime); - if ((gmtime_r (&CurrentTime,&tm_CurrentTime)) != NULL) + if ((gmtime_r (&CurrentTime,tm_CurrentTime)) != NULL) { /* Date and time as strings */ sprintf (CurrentTimeUTC->StrDate,"%04d-%02d-%02d", - 1900 + tm_CurrentTime.tm_year, // year - 1 + tm_CurrentTime.tm_mon, // month - tm_CurrentTime.tm_mday); // day of the month + 1900 + tm_CurrentTime->tm_year, // year + 1 + tm_CurrentTime->tm_mon, // month + tm_CurrentTime->tm_mday); // day of the month sprintf (CurrentTimeUTC->StrTime,"%02d:%02d:%02d", - tm_CurrentTime.tm_hour, // hours - tm_CurrentTime.tm_min, // minutes - tm_CurrentTime.tm_sec); // seconds + tm_CurrentTime->tm_hour, // hours + tm_CurrentTime->tm_min, // minutes + tm_CurrentTime->tm_sec); // seconds /* Date and time as unsigned */ - CurrentTimeUTC->Date = (1900 + tm_CurrentTime.tm_year) * 10000 + - (1 + tm_CurrentTime.tm_mon) * 100 + - tm_CurrentTime.tm_mday; - CurrentTimeUTC->Time = tm_CurrentTime.tm_hour * 10000 + - tm_CurrentTime.tm_min * 100 + - tm_CurrentTime.tm_sec; + CurrentTimeUTC->Date = (1900 + tm_CurrentTime->tm_year) * 10000 + + (1 + tm_CurrentTime->tm_mon) * 100 + + tm_CurrentTime->tm_mday; + CurrentTimeUTC->Time = tm_CurrentTime->tm_hour * 10000 + + tm_CurrentTime->tm_min * 100 + + tm_CurrentTime->tm_sec; } } @@ -404,17 +404,26 @@ static void Rep_CreateNewReportFile (const struct CurrentTimeUTC *CurrentTimeUTC /************** Insert a new user's usage report into database ***************/ /*****************************************************************************/ -static void Rep_CreateNewReportEntryIntoDB (const char *FilenameReport, +static void Rep_CreateNewReportEntryIntoDB (const struct tm *tm_CurrentTime, + const char *FilenameReport, const char *Permalink) { char Query[1024+PATH_MAX*2]; /***** Insert a new user's usage report into database *****/ sprintf (Query,"INSERT INTO usr_report" - " (UsrCod,ReportTimeUTC,UniqueDirL,UniqueDirR,Filename,Permalink)" + " (UsrCod,ReportTimeUTC," + "UniqueDirL,UniqueDirR,Filename,Permalink)" " VALUES" - " ('%ld',UTC_TIMESTAMP(),'%c%c','%s','%s','%s')", + " ('%ld','%04d-%02d-%02d %02d:%02d:%02d'," + "'%c%c','%s','%s','%s')", Gbl.Usrs.Me.UsrDat.UsrCod, + 1900 + tm_CurrentTime->tm_year, // year + 1 + tm_CurrentTime->tm_mon, // month + tm_CurrentTime->tm_mday, // day of the month + tm_CurrentTime->tm_hour, // hours + tm_CurrentTime->tm_min, // minutes + tm_CurrentTime->tm_sec, // seconds Gbl.UniqueNameEncrypted[0], // 2 leftmost chars from a unique 43 chars base64url codified from a unique SHA-256 string Gbl.UniqueNameEncrypted[1], &Gbl.UniqueNameEncrypted[2], // 41 rightmost chars from a unique 43 chars base64url codified from a unique SHA-256 string