diff --git a/Makefile b/Makefile index 7b962637..75abddbd 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \ swad_maintenance.o swad_map.o swad_mark.o swad_mark_database.o \ swad_match.o swad_match_database.o swad_match_print.o \ swad_match_result.o swad_media.o swad_media_database.o swad_menu.o \ - swad_message.o swad_message_database.o swad_MFU.o \ + swad_message.o swad_message_database.o swad_MFU.o swad_MFU_database.o \ swad_network.o swad_nickname.o swad_notice.o swad_notification.o \ swad_notification_database.o swad_pagination.o swad_parameter.o \ swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_privacy.o \ diff --git a/swad_MFU.c b/swad_MFU.c index a0a0643c..30d8fcce 100644 --- a/swad_MFU.c +++ b/swad_MFU.c @@ -1,4 +1,4 @@ -// swad_role.c: user's roles +// swad_MFU.c: Most Frequently Used actions /* SWAD (Shared Workspace At a Distance), @@ -38,6 +38,7 @@ #include "swad_global.h" #include "swad_HTML.h" #include "swad_MFU.h" +#include "swad_MFU_database.h" #include "swad_tab.h" #include "swad_theme.h" @@ -109,14 +110,7 @@ void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxAc Act_Action_t Action; /***** Get most frequently used actions *****/ - NumActions = (unsigned) - DB_QuerySELECT (&mysql_res,"can not get most frequently used actions", - "SELECT ActCod" - " FROM act_frequent" - " WHERE UsrCod=%ld" - " ORDER BY Score DESC," - "LastClick DESC", - Gbl.Usrs.Me.UsrDat.UsrCod); + NumActions = MFU_DB_GetMFUActionsOrderByScore (&mysql_res); /***** Write list of frequently used actions *****/ for (NumAction = 0, ListMFUActions->NumActions = 0; @@ -153,14 +147,7 @@ Act_Action_t MFU_GetMyLastActionInCurrentTab (void) if (Gbl.Usrs.Me.UsrDat.UsrCod > 0) { /***** Get my most frequently used actions *****/ - NumActions = (unsigned) - DB_QuerySELECT (&mysql_res,"can not get the most frequently used actions", - "SELECT ActCod" - " FROM act_frequent" - " WHERE UsrCod=%ld" - " ORDER BY LastClick DESC," - "Score DESC", - Gbl.Usrs.Me.UsrDat.UsrCod); + NumActions = MFU_DB_GetMFUActionsOrderByLastClick (&mysql_res); /***** Loop over list of frequently used actions *****/ for (NumAct = 0; @@ -333,11 +320,6 @@ void MFU_WriteSmallMFUActions (struct MFU_ListMFUActions *ListMFUActions) /******************** Update most frequently used actions ********************/ /*****************************************************************************/ -#define MFU_MIN_SCORE 0.5 -#define MFU_MAX_SCORE 100.0 -#define MFU_INCREASE_FACTOR 1.2 -#define MFU_DECREASE_FACTOR 0.99 - void MFU_UpdateMFUActions (void) { MYSQL_RES *mysql_res; @@ -360,13 +342,7 @@ void MFU_UpdateMFUActions (void) Str_SetDecimalPointToUS (); // To get the decimal point as a dot /***** Get current score *****/ - if (DB_QuerySELECT (&mysql_res,"can not get score for current action", - "SELECT Score" // row[0] - " FROM act_frequent" - " WHERE UsrCod=%ld" - " AND ActCod=%ld", - Gbl.Usrs.Me.UsrDat.UsrCod, - ActCod)) + if (MFU_DB_GetScoreForCurrentAction (&mysql_res,ActCod)) { row = mysql_fetch_row (mysql_res); if (sscanf (row[0],"%lf",&Score) != 1) @@ -382,25 +358,10 @@ void MFU_UpdateMFUActions (void) DB_FreeMySQLResult (&mysql_res); /***** Update score for the current action *****/ - DB_QueryREPLACE ("can not update most frequently used actions", - "REPLACE INTO act_frequent" - " (UsrCod,ActCod,Score,LastClick)" - " VALUES" - " (%ld,%ld,'%15lg',NOW())", - Gbl.Usrs.Me.UsrDat.UsrCod, - ActCod, - Score); + MFU_DB_UpdateScoreForCurrentAction (ActCod,Score); /***** Update score for other actions *****/ - DB_QueryUPDATE ("can not update most frequently used actions", - "UPDATE act_frequent" - " SET Score=GREATEST(Score*'%.15lg','%.15lg')" - " WHERE UsrCod=%ld" - " AND ActCod<>%ld", - MFU_DECREASE_FACTOR, - MFU_MIN_SCORE, - Gbl.Usrs.Me.UsrDat.UsrCod, - ActCod); + MFU_DB_UpdateScoreForOtherActions (ActCod); Str_SetDecimalPointToLocal (); // Return to local system } diff --git a/swad_MFU.h b/swad_MFU.h index f66b683f..d830a371 100644 --- a/swad_MFU.h +++ b/swad_MFU.h @@ -31,6 +31,11 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ +#define MFU_MIN_SCORE 0.5 +#define MFU_MAX_SCORE 100.0 +#define MFU_INCREASE_FACTOR 1.2 +#define MFU_DECREASE_FACTOR 0.99 + /*****************************************************************************/ /******************************** Public types *******************************/ /*****************************************************************************/ diff --git a/swad_MFU_database.c b/swad_MFU_database.c new file mode 100644 index 00000000..d3ff29ee --- /dev/null +++ b/swad_MFU_database.c @@ -0,0 +1,139 @@ +// swad_MFU_database.c: Most Frequently Used actions, operations with database + +/* + SWAD (Shared Workspace At a Distance), + is a web platform developed at the University of Granada (Spain), + and used to support university teaching. + + This file is part of SWAD core. + Copyright (C) 1999-2021 Antonio Caņas Vargas + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General 3 License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/*****************************************************************************/ +/*********************************** Headers *********************************/ +/*****************************************************************************/ + +#include "swad_database.h" +#include "swad_global.h" +#include "swad_MFU.h" +#include "swad_MFU_database.h" + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************************* Private types *******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/************** External global variables from others modules ****************/ +/*****************************************************************************/ + +extern struct Globals Gbl; + +/*****************************************************************************/ +/************************** Private global variables *************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private prototypes ****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************** Update score for the current action ********************/ +/*****************************************************************************/ + +void MFU_DB_UpdateScoreForCurrentAction (long ActCod,double Score) + { + DB_QueryREPLACE ("can not update most frequently used actions", + "REPLACE INTO act_frequent" + " (UsrCod,ActCod,Score,LastClick)" + " VALUES" + " (%ld,%ld,'%15lg',NOW())", + Gbl.Usrs.Me.UsrDat.UsrCod, + ActCod, + Score); + } + +/*****************************************************************************/ +/********************** Update score for other actions ***********************/ +/*****************************************************************************/ + +void MFU_DB_UpdateScoreForOtherActions (long ActCod) + { + DB_QueryUPDATE ("can not update most frequently used actions", + "UPDATE act_frequent" + " SET Score=GREATEST(Score*'%.15lg','%.15lg')" + " WHERE UsrCod=%ld" + " AND ActCod<>%ld", + MFU_DECREASE_FACTOR, + MFU_MIN_SCORE, + Gbl.Usrs.Me.UsrDat.UsrCod, + ActCod); + } + +/*****************************************************************************/ +/******************** Get most frequently used actions ***********************/ +/*****************************************************************************/ + +unsigned MFU_DB_GetMFUActionsOrderByScore (MYSQL_RES **mysql_res) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get most frequently used actions", + "SELECT ActCod" + " FROM act_frequent" + " WHERE UsrCod=%ld" + " ORDER BY Score DESC," + "LastClick DESC", + Gbl.Usrs.Me.UsrDat.UsrCod); + } + +/*****************************************************************************/ +/******************** Get most frequently used actions ***********************/ +/*****************************************************************************/ + +unsigned MFU_DB_GetMFUActionsOrderByLastClick (MYSQL_RES **mysql_res) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get the most frequently used actions", + "SELECT ActCod" + " FROM act_frequent" + " WHERE UsrCod=%ld" + " ORDER BY LastClick DESC," + "Score DESC", + Gbl.Usrs.Me.UsrDat.UsrCod); + } + +/*****************************************************************************/ +/************************ Get score of current action ************************/ +/*****************************************************************************/ + +unsigned MFU_DB_GetScoreForCurrentAction (MYSQL_RES **mysql_res,long ActCod) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get score for current action", + "SELECT Score" // row[0] + " FROM act_frequent" + " WHERE UsrCod=%ld" + " AND ActCod=%ld", + Gbl.Usrs.Me.UsrDat.UsrCod, + ActCod); + } + diff --git a/swad_MFU_database.h b/swad_MFU_database.h new file mode 100644 index 00000000..d3677b01 --- /dev/null +++ b/swad_MFU_database.h @@ -0,0 +1,51 @@ +// swad_MFU_database.h: Most Frequently Used actions, operations with database + +#ifndef _SWAD_MFU_DB +#define _SWAD_MFU_DB +/* + SWAD (Shared Workspace At a Distance in Spanish), + is a web platform developed at the University of Granada (Spain), + and used to support university teaching. + + This file is part of SWAD core. + Copyright (C) 1999-2021 Antonio Caņas Vargas + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/*****************************************************************************/ +/********************************** Headers **********************************/ +/*****************************************************************************/ + +#include // To access MySQL databases + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************************** Public types *******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Public prototypes ****************************/ +/*****************************************************************************/ + +void MFU_DB_UpdateScoreForCurrentAction (long ActCod,double Score); +void MFU_DB_UpdateScoreForOtherActions (long ActCod); + +unsigned MFU_DB_GetMFUActionsOrderByScore (MYSQL_RES **mysql_res); +unsigned MFU_DB_GetMFUActionsOrderByLastClick (MYSQL_RES **mysql_res); +unsigned MFU_DB_GetScoreForCurrentAction (MYSQL_RES **mysql_res,long ActCod); + +#endif diff --git a/swad_changelog.h b/swad_changelog.h index d2e306df..c926f4a4 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.17.4 (2021-09-29)" +#define Log_PLATFORM_VERSION "SWAD 21.18 (2021-09-29)" #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.18: Sep 29, 2021 New module swad_MFU_database for database queries related to most frequently used actions. (317529 lines) Version 21.17.4: Sep 29, 2021 Queries moved to module swad_message_database. (317408 lines) Version 21.17.3: Sep 29, 2021 Queries moved to module swad_message_database. (317431 lines) Version 21.17.2: Sep 27, 2021 Queries moved to module swad_message_database. (317358 lines)