diff --git a/Makefile b/Makefile index c8188255..d1d6cf97 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,8 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \ swad_indicator_database.o swad_info.o swad_info_database.o \ swad_institution.o swad_institution_config.o \ swad_institution_database.o \ - swad_language.o swad_layout.o swad_link.o swad_log.o swad_logo.o \ + swad_language.o swad_layout.o swad_link.o swad_link_database.o \ + swad_log.o swad_logo.o \ swad_MAC.o swad_mail.o swad_main.o swad_maintenance.o swad_map.o \ swad_mark.o swad_match.o swad_match_print.o swad_match_result.o \ swad_media.o swad_media_database.o swad_menu.o swad_message.o \ diff --git a/swad_changelog.h b/swad_changelog.h index e28d0a2d..d3613070 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.11.1 (2021-09-22)" +#define Log_PLATFORM_VERSION "SWAD 21.12 (2021-09-22)" #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.12: Sep 22, 2021 New module swad_link_database for database queries related to institutional links. (316361 lines) Version 21.11.1: Sep 22, 2021 Queries moved to module swad_info_database. (316237 lines) Version 21.11: Sep 22, 2021 New module swad_info_database for database queries related to course information. (316228 lines) Version 21.10.1: Sep 21, 2021 Fixed bugs in roles. Reported by Javier Fernández Baldomero and Mª Carmen García Miranda. (316111 lines) diff --git a/swad_language.c b/swad_language.c index 71b350b8..876c0a85 100644 --- a/swad_language.c +++ b/swad_language.c @@ -196,18 +196,11 @@ void Lan_ChangeLanguage (void) void Lan_UpdateMyLanguageToCurrentLanguage (void) { - extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES]; - /***** Set my language to the current language *****/ Gbl.Usrs.Me.UsrDat.Prefs.Language = Gbl.Prefs.Language; /***** Update my language in database *****/ - DB_QueryUPDATE ("can not update your language", - "UPDATE usr_data" - " SET Language='%s'" - " WHERE UsrCod=%ld", - Lan_STR_LANG_ID[Gbl.Prefs.Language], - Gbl.Usrs.Me.UsrDat.UsrCod); + Set_DB_UpdateMySettingsAboutLanguage (); } /*****************************************************************************/ diff --git a/swad_layout.c b/swad_layout.c index 9188ca2f..839cfe0f 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -269,12 +269,12 @@ void Lay_WriteStartOfPage (void) switch (BrowserTab) { case Act_BRW_1ST_TAB: - HTM_Txt ("\n"); - HTM_DIV_Begin ("id=\"zoomLyr\" class=\"ZOOM\""); - HTM_IMG (Cfg_URL_ICON_PUBLIC,"usr_bl.jpg",NULL, - "class=\"IMG_USR\" id=\"zoomImg\""); - HTM_DIV_Begin ("id=\"zoomTxt\" class=\"CM\""); - HTM_DIV_End (); + HTM_Txt ("\n"); + HTM_DIV_Begin ("id=\"zoomLyr\" class=\"ZOOM\""); + HTM_IMG (Cfg_URL_ICON_PUBLIC,"usr_bl.jpg",NULL, + "class=\"IMG_USR\" id=\"zoomImg\""); + HTM_DIV_Begin ("id=\"zoomTxt\" class=\"CM\""); + HTM_DIV_End (); HTM_DIV_End (); break; case Act_BRW_NEW_TAB: @@ -311,77 +311,77 @@ void Lay_WriteStartOfPage (void) /***** Begin box that contains the whole page except the foot *****/ HTM_DIV_Begin ("id=\"whole_page\""); - /***** Header of layout *****/ - Lay_WritePageTopHeading (); + /***** Header of layout *****/ + Lay_WritePageTopHeading (); - /***** 3rd. row (tabs) *****/ - Tab_DrawTabs (); + /***** 3rd. row (tabs) *****/ + Tab_DrawTabs (); - /***** 4th row: main zone *****/ - HTM_DIV_Begin ("id=\"main_zone\""); + /***** 4th row: main zone *****/ + HTM_DIV_Begin ("id=\"main_zone\""); - /* Left column */ - if (Gbl.Prefs.SideCols & Lay_SHOW_LEFT_COLUMN) // Left column visible - { - HTM_Txt (""); - } + /* Left column */ + if (Gbl.Prefs.SideCols & Lay_SHOW_LEFT_COLUMN) // Left column visible + { + HTM_Txt (""); + } - /* Right column */ - // Right column is written before central column - // but it must be drawn at right using "position:absolute; right:0". - // The reason to write right column before central column - // is that central column may hold a lot of content drawn slowly. - if (Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) // Right column visible - { - HTM_Txt (""); - } + /* Right column */ + // Right column is written before central column + // but it must be drawn at right using "position:absolute; right:0". + // The reason to write right column before central column + // is that central column may hold a lot of content drawn slowly. + if (Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) // Right column visible + { + HTM_Txt (""); + } - /* Central (main) column */ - switch (Gbl.Prefs.SideCols) - { - case 0: - HTM_DIV_Begin ("id=\"main_zone_central_none\""); - break; - case Lay_SHOW_LEFT_COLUMN: - HTM_DIV_Begin ("id=\"main_zone_central_left\""); - break; - case Lay_SHOW_RIGHT_COLUMN: - HTM_DIV_Begin ("id=\"main_zone_central_right\""); - break; - case (Lay_SHOW_LEFT_COLUMN | Lay_SHOW_RIGHT_COLUMN): - HTM_DIV_Begin ("id=\"main_zone_central_both\""); - break; - } - HTM_DIV_Begin ("id=\"main_zone_central_container\" class=\"%s\"", - The_TabOnBgColors[Gbl.Prefs.Theme]); + /* Central (main) column */ + switch (Gbl.Prefs.SideCols) + { + case 0: + HTM_DIV_Begin ("id=\"main_zone_central_none\""); + break; + case Lay_SHOW_LEFT_COLUMN: + HTM_DIV_Begin ("id=\"main_zone_central_left\""); + break; + case Lay_SHOW_RIGHT_COLUMN: + HTM_DIV_Begin ("id=\"main_zone_central_right\""); + break; + case (Lay_SHOW_LEFT_COLUMN | Lay_SHOW_RIGHT_COLUMN): + HTM_DIV_Begin ("id=\"main_zone_central_both\""); + break; + } + HTM_DIV_Begin ("id=\"main_zone_central_container\" class=\"%s\"", + The_TabOnBgColors[Gbl.Prefs.Theme]); - /* Layout with horizontal or vertical menu */ - HTM_DIV_Begin ("id=\"%s\"",LayoutMainZone[Gbl.Prefs.Menu]); + /* Layout with horizontal or vertical menu */ + HTM_DIV_Begin ("id=\"%s\"",LayoutMainZone[Gbl.Prefs.Menu]); - /* Menu */ - Mnu_WriteMenuThisTab (); + /* Menu */ + Mnu_WriteMenuThisTab (); - /* Begin canvas: main zone for actions output */ - HTM_MAIN_Begin ("MAIN_ZONE_CANVAS"); + /* Begin canvas: main zone for actions output */ + HTM_MAIN_Begin ("MAIN_ZONE_CANVAS"); - /* If it is mandatory to read any information about course */ - if (Gbl.Crs.Info.ShowMsgMustBeRead) - Inf_WriteMsgYouMustReadInfo (); + /* If it is mandatory to read any information about course */ + if (Gbl.Crs.Info.ShowMsgMustBeRead) + Inf_WriteMsgYouMustReadInfo (); - /* Write title of the current action */ - if (Gbl.Prefs.Menu == Mnu_MENU_VERTICAL && - Act_GetIndexInMenu (Gbl.Action.Act) >= 0) - Lay_WriteTitleAction (); + /* Write title of the current action */ + if (Gbl.Prefs.Menu == Mnu_MENU_VERTICAL && + Act_GetIndexInMenu (Gbl.Action.Act) >= 0) + Lay_WriteTitleAction (); - Gbl.Layout.WritingHTMLStart = false; - Gbl.Layout.HTMLStartWritten = true; + Gbl.Layout.WritingHTMLStart = false; + Gbl.Layout.HTMLStartWritten = true; - /* Write message indicating number of clicks allowed before sending my photo */ - Usr_InformAboutNumClicksBeforePhoto (); + /* Write message indicating number of clicks allowed before sending my photo */ + Usr_InformAboutNumClicksBeforePhoto (); } /*****************************************************************************/ @@ -1096,9 +1096,9 @@ static void Lay_WritePageTopHeading (void) static void Lay_WriteBreadcrumb (void) { HTM_Txt (""); } @@ -1117,16 +1117,16 @@ static void Lay_WriteTitleAction (void) Gbl.Prefs.URLIconSet, Act_GetIcon (Act_GetSuperAction (Gbl.Action.Act))); - /***** Title *****/ - HTM_DIV_Begin ("class=\"%s\"",The_ClassTitleAction[Gbl.Prefs.Theme]); - HTM_TxtF ("%s > %s",Txt_TABS_TXT[Act_GetTab (Gbl.Action.Act)], - Act_GetTitleAction (Gbl.Action.Act)); - HTM_DIV_End (); + /***** Title *****/ + HTM_DIV_Begin ("class=\"%s\"",The_ClassTitleAction[Gbl.Prefs.Theme]); + HTM_TxtF ("%s > %s",Txt_TABS_TXT[Act_GetTab (Gbl.Action.Act)], + Act_GetTitleAction (Gbl.Action.Act)); + HTM_DIV_End (); - /***** Subtitle *****/ - HTM_DIV_Begin ("class=\"%s\"",The_ClassSubtitleAction[Gbl.Prefs.Theme]); - HTM_Txt (Act_GetSubtitleAction (Gbl.Action.Act)); - HTM_DIV_End (); + /***** Subtitle *****/ + HTM_DIV_Begin ("class=\"%s\"",The_ClassSubtitleAction[Gbl.Prefs.Theme]); + HTM_Txt (Act_GetSubtitleAction (Gbl.Action.Act)); + HTM_DIV_End (); /***** Container end *****/ HTM_DIV_End (); @@ -1142,33 +1142,33 @@ static void Lay_ShowLeftColumn (void) HTM_DIV_Begin ("style=\"width:160px;\""); - HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); - if (Gbl.Usrs.Me.Logged) - { - /***** Most frequently used actions *****/ - MFU_AllocateMFUActions (&ListMFUActions,6); - MFU_GetMFUActions (&ListMFUActions,6); - MFU_WriteSmallMFUActions (&ListMFUActions); - MFU_FreeMFUActions (&ListMFUActions); - } - else - /***** Institutional links *****/ - Lnk_WriteMenuWithInstitutionalLinks (); - HTM_DIV_End (); - - /***** Month *****/ - HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); - Cal_DrawCurrentMonth (); - HTM_DIV_End (); - - /***** Notices (yellow notes) *****/ - if (Gbl.Hierarchy.Level == HieLvl_CRS) - { HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); - Not_ShowNotices (Not_LIST_BRIEF_NOTICES, - -1L); // No notice highlighted + if (Gbl.Usrs.Me.Logged) + { + /***** Most frequently used actions *****/ + MFU_AllocateMFUActions (&ListMFUActions,6); + MFU_GetMFUActions (&ListMFUActions,6); + MFU_WriteSmallMFUActions (&ListMFUActions); + MFU_FreeMFUActions (&ListMFUActions); + } + else + /***** Institutional links *****/ + Lnk_WriteMenuWithInstitutionalLinks (); HTM_DIV_End (); - } + + /***** Month *****/ + HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); + Cal_DrawCurrentMonth (); + HTM_DIV_End (); + + /***** Notices (yellow notes) *****/ + if (Gbl.Hierarchy.Level == HieLvl_CRS) + { + HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); + Not_ShowNotices (Not_LIST_BRIEF_NOTICES, + -1L); // No notice highlighted + HTM_DIV_End (); + } HTM_DIV_End (); } @@ -1190,7 +1190,7 @@ static void Lay_ShowRightColumn (void) if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) { HTM_DIV_Begin ("id=\"globalconnected\" class=\"LEFT_RIGHT_CELL\""); // Used for AJAX based refresh - Con_ShowGlobalConnectedUsrs (); + Con_ShowGlobalConnectedUsrs (); HTM_DIV_End (); // Used for AJAX based refresh } @@ -1198,15 +1198,15 @@ static void Lay_ShowRightColumn (void) if (Gbl.Hierarchy.Level == HieLvl_CRS) // There is a course selected { HTM_DIV_Begin ("id=\"courseconnected\" class=\"LEFT_RIGHT_CELL\""); // Used for AJAX based refresh - Gbl.Scope.Current = HieLvl_CRS; - Con_ShowConnectedUsrsBelongingToCurrentCrs (); + Gbl.Scope.Current = HieLvl_CRS; + Con_ShowConnectedUsrsBelongingToCurrentCrs (); HTM_DIV_End (); // Used for AJAX based refresh } else if (Gbl.Usrs.Me.Logged) // I am logged { /***** Suggest one user to follow *****/ HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); - Fol_SuggestUsrsToFollowMainZoneOnRightColumn (); + Fol_SuggestUsrsToFollowMainZoneOnRightColumn (); HTM_DIV_End (); } @@ -1214,12 +1214,12 @@ static void Lay_ShowRightColumn (void) { /***** SWADroid advertisement *****/ HTM_DIV_Begin ("class=\"LEFT_RIGHT_CELL\""); - HTM_A_Begin ("href=\"https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid\"" - " target=\"_blank\" title=\"%s\"", - Txt_If_you_have_an_Android_device_try_SWADroid); - HTM_IMG (Cfg_URL_ICON_PUBLIC,"SWADroid120x200.png","SWADroid", - "style=\"width:150px; height:250px;\""); - HTM_A_End (); + HTM_A_Begin ("href=\"https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid\"" + " target=\"_blank\" title=\"%s\"", + Txt_If_you_have_an_Android_device_try_SWADroid); + HTM_IMG (Cfg_URL_ICON_PUBLIC,"SWADroid120x200.png","SWADroid", + "style=\"width:150px; height:250px;\""); + HTM_A_End (); HTM_DIV_End (); } } @@ -1267,7 +1267,7 @@ void Lay_PutContextualLinkIconText (Act_Action_t NextAction,const char *Anchor, /***** Put icon and text with link *****/ HTM_BUTTON_SUBMIT_Begin (Text,The_ClassFormLinkOutBoxBold[Gbl.Prefs.Theme],NULL); - Ico_PutIconTextLink (Icon,Text); + Ico_PutIconTextLink (Icon,Text); HTM_BUTTON_End (); /***** End form *****/ @@ -1301,7 +1301,7 @@ void Lay_PutContextualLinkIconTextOnSubmit (Act_Action_t NextAction,const char * /***** Put icon with link *****/ HTM_BUTTON_SUBMIT_Begin (Text,The_ClassFormLinkOutBoxBold[Gbl.Prefs.Theme],OnSubmit); - Ico_PutIconTextLink (Icon,Text); + Ico_PutIconTextLink (Icon,Text); HTM_BUTTON_End (); /***** End form *****/ @@ -1334,29 +1334,33 @@ void Lay_PutContextualCheckbox (Act_Action_t NextAction, if (FuncParams) FuncParams (); - /***** Begin container and label *****/ + /***** Begin container *****/ HTM_DIV_Begin ("class=\"CONTEXT_OPT %s %s\" title=\"%s\"", Checked ? "CHECKBOX_CHECKED" : "CHECKBOX_UNCHECKED", The_ClassFormOutBoxBold[Gbl.Prefs.Theme], Title); - HTM_LABEL_Begin (NULL); - /****** Checkbox *****/ - HTM_INPUT_CHECKBOX (CheckboxName,HTM_SUBMIT_ON_CHANGE, - "value=\"Y\"%s%s", - Checked ? " checked=\"checked\"" : - "", - Disabled ? " disabled=\"disabled\"" : - ""); + /***** Begin label *****/ + HTM_LABEL_Begin (NULL); - /***** Text *****/ - if (Text) - if (Text[0]) - HTM_TxtF (" %s",Text); + /****** Checkbox *****/ + HTM_INPUT_CHECKBOX (CheckboxName,HTM_SUBMIT_ON_CHANGE, + "value=\"Y\"%s%s", + Checked ? " checked=\"checked\"" : + "", + Disabled ? " disabled=\"disabled\"" : + ""); - /***** End label and container *****/ - HTM_LABEL_End (); + /***** Text *****/ + if (Text) + if (Text[0]) + HTM_TxtF (" %s",Text); + + /***** End label *****/ + HTM_LABEL_End (); + + /***** End container *****/ HTM_DIV_End (); /***** End form *****/ @@ -1513,9 +1517,9 @@ static void Lay_WriteFootFromHTMLFile (void) { HTM_Txt (""); } @@ -1544,69 +1548,71 @@ void Lay_WriteHeaderClassPhoto (bool PrintView,bool DrawingClassPhoto, /***** Begin table *****/ HTM_TABLE_BeginWidePadding (10); - HTM_TR_Begin (NULL); - /***** First column: institution logo *****/ - HTM_TD_Begin ("class=\"LT\" style=\"width:60px;\""); - if (InsCod > 0) - { - if (!PrintView) - HTM_A_Begin ("href=\"%s\" target=\"_blank\"",Hie.Ins.WWW); - Lgo_DrawLogo (HieLvl_INS,Hie.Ins.InsCod,Hie.Ins.ShrtName,40,NULL,true); - if (!PrintView) - HTM_A_End (); - } - HTM_TD_End (); + HTM_TR_Begin (NULL); - /***** Second column: class photo title *****/ - HTM_TD_Begin ("class=\"CLASSPHOTO_TITLE CM\""); - if (InsCod > 0) - { - if (!PrintView) - HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"CLASSPHOTO_TITLE\"", - Hie.Ins.WWW); - HTM_Txt (Hie.Ins.FullName); - if (!PrintView) - HTM_A_End (); - } - if (DegCod > 0) - { - if (Hie.Ins.InsCod > 0) - HTM_Txt (" - "); - if (!PrintView) - HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"CLASSPHOTO_TITLE\"", - Hie.Deg.WWW); - HTM_Txt (Hie.Deg.FullName); - if (!PrintView) - HTM_A_End (); - } - HTM_BR (); - if (CrsCod > 0) - { - HTM_Txt (Hie.Crs.FullName); - if (DrawingClassPhoto && !Gbl.Usrs.ClassPhoto.AllGroups) - { - HTM_BR (); - Grp_WriteNamesOfSelectedGrps (); - } - } - HTM_TD_End (); + /***** First column: institution logo *****/ + HTM_TD_Begin ("class=\"LT\" style=\"width:60px;\""); + if (InsCod > 0) + { + if (!PrintView) + HTM_A_Begin ("href=\"%s\" target=\"_blank\"",Hie.Ins.WWW); + Lgo_DrawLogo (HieLvl_INS,Hie.Ins.InsCod,Hie.Ins.ShrtName,40,NULL,true); + if (!PrintView) + HTM_A_End (); + } + HTM_TD_End (); - /***** Third column: degree logo *****/ - HTM_TD_Begin ("class=\"RT\" style=\"width:60px;\""); - if (DegCod > 0) - { - if (!PrintView) - HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"CLASSPHOTO_TITLE\"", - Hie.Deg.WWW); - Lgo_DrawLogo (HieLvl_DEG,Hie.Deg.DegCod,Hie.Deg.ShrtName,40,NULL,true); - if (!PrintView) - HTM_A_End (); - } - HTM_TD_End (); + /***** Second column: class photo title *****/ + HTM_TD_Begin ("class=\"CLASSPHOTO_TITLE CM\""); + if (InsCod > 0) + { + if (!PrintView) + HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"CLASSPHOTO_TITLE\"", + Hie.Ins.WWW); + HTM_Txt (Hie.Ins.FullName); + if (!PrintView) + HTM_A_End (); + } + if (DegCod > 0) + { + if (Hie.Ins.InsCod > 0) + HTM_Txt (" - "); + if (!PrintView) + HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"CLASSPHOTO_TITLE\"", + Hie.Deg.WWW); + HTM_Txt (Hie.Deg.FullName); + if (!PrintView) + HTM_A_End (); + } + HTM_BR (); + if (CrsCod > 0) + { + HTM_Txt (Hie.Crs.FullName); + if (DrawingClassPhoto && !Gbl.Usrs.ClassPhoto.AllGroups) + { + HTM_BR (); + Grp_WriteNamesOfSelectedGrps (); + } + } + HTM_TD_End (); + + /***** Third column: degree logo *****/ + HTM_TD_Begin ("class=\"RT\" style=\"width:60px;\""); + if (DegCod > 0) + { + if (!PrintView) + HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"CLASSPHOTO_TITLE\"", + Hie.Deg.WWW); + Lgo_DrawLogo (HieLvl_DEG,Hie.Deg.DegCod,Hie.Deg.ShrtName,40,NULL,true); + if (!PrintView) + HTM_A_End (); + } + HTM_TD_End (); + + HTM_TR_End (); /***** End table *****/ - HTM_TR_End (); HTM_TABLE_End (); } @@ -1629,19 +1635,19 @@ void Lay_AdvertisementMobile (void) NULL,NULL, NULL,Box_NOT_CLOSABLE,8); - /***** Show advertisement *****/ - HTM_TR_Begin (NULL); - HTM_TD_Begin ("class=\"DAT CM\""); - HTM_A_Begin ("href=\"https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid\"" - " class=\"DAT\""); - HTM_Txt (Txt_Stay_connected_with_SWADroid); - HTM_BR (); - HTM_BR (); - HTM_IMG (Cfg_URL_ICON_PUBLIC,"SWADroid200x300.png",Txt_Stay_connected_with_SWADroid, - "style=\"width:250px; height:375px;\""); - HTM_A_End (); - HTM_TD_End (); - HTM_TR_End (); + /***** Show advertisement *****/ + HTM_TR_Begin (NULL); + HTM_TD_Begin ("class=\"DAT CM\""); + HTM_A_Begin ("href=\"https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid\"" + " class=\"DAT\""); + HTM_Txt (Txt_Stay_connected_with_SWADroid); + HTM_BR (); + HTM_BR (); + HTM_IMG (Cfg_URL_ICON_PUBLIC,"SWADroid200x300.png",Txt_Stay_connected_with_SWADroid, + "style=\"width:250px; height:375px;\""); + HTM_A_End (); + HTM_TD_End (); + HTM_TR_End (); /***** End table and box *****/ Box_BoxTableEnd (); @@ -1702,14 +1708,14 @@ static void Lay_HelpTextEditor (const char *Text,const char *InlineMath,const ch extern const char *Txt_Equation_centered; HTM_DIV_Begin ("class=\"HELP_EDIT\""); - HTM_TxtF ("%s: %s" - " " - "%s: %s" - " " - "%s: %s", - Txt_Text,Text, - Txt_Inline_math,InlineMath, - Txt_Equation_centered,Equation); + HTM_TxtF ("%s: %s" + " " + "%s: %s" + " " + "%s: %s", + Txt_Text,Text, + Txt_Inline_math,InlineMath, + Txt_Equation_centered,Equation); HTM_DIV_End (); } @@ -1723,11 +1729,13 @@ void Lay_BeginHTMLFile (FILE *File,const char *Title) fprintf (File,"\n" "\n" - "\n" - "\n" - "%s\n" - "\n", + "\n" + "\n" + "" + "%s" + "\n" + "\n", Lan_STR_LANG_ID[Gbl.Prefs.Language], // Language Title); // Page title } diff --git a/swad_link.c b/swad_link.c index fe5e6f53..c1861bea 100644 --- a/swad_link.c +++ b/swad_link.c @@ -39,6 +39,7 @@ #include "swad_HTML.h" #include "swad_language.h" #include "swad_link.h" +#include "swad_link_database.h" #include "swad_parameter.h" /*****************************************************************************/ @@ -72,16 +73,15 @@ static void Lnk_WriteListOfLinks (void); static void Lnk_EditLinksInternal (void); static void Lnk_PutIconsEditingLinks (__attribute__((unused)) void *Args); +static void Lnk_GetDataOfLink (MYSQL_RES *mysql_res,struct Link *Lnk); + static void Lnk_ListLinksForEdition (void); static void Lnk_PutParamLnkCod (void *LnkCod); static void Lnk_RenameLink (Cns_ShrtOrFullName_t ShrtOrFullName); -static bool Lnk_CheckIfLinkNameExists (const char *FieldName,const char *Name,long LnkCod); -static void Lnk_UpdateLnkNameDB (long LnkCod,const char *FieldName,const char *NewLnkName); static void Lnk_PutFormToCreateLink (void); static void Lnk_PutHeadLinks (void); -static void Lnk_CreateLink (struct Link *Lnk); static void Lnk_EditingLinkConstructor (void); static void Lnk_EditingLinkDestructor (void); @@ -105,19 +105,19 @@ void Lnk_SeeLinks (void) Lnk_PutIconsListingLinks,NULL, Hlp_SYSTEM_Links,Box_NOT_CLOSABLE); - /***** Write all links *****/ - if (Gbl.Links.Num) // There are links - Lnk_WriteListOfLinks (); - else // No links created - Ale_ShowAlert (Ale_INFO,Txt_No_links); + /***** Write all links *****/ + if (Gbl.Links.Num) // There are links + Lnk_WriteListOfLinks (); + else // No links created + Ale_ShowAlert (Ale_INFO,Txt_No_links); - /***** Button to create link *****/ - if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - { - Frm_BeginForm (ActEdiLnk); - Btn_PutConfirmButton (Txt_New_link); - Frm_EndForm (); - } + /***** Button to create link *****/ + if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) + { + Frm_BeginForm (ActEdiLnk); + Btn_PutConfirmButton (Txt_New_link); + Frm_EndForm (); + } /***** End box *****/ Box_BoxEnd (); @@ -166,13 +166,14 @@ void Lnk_WriteMenuWithInstitutionalLinks (void) { HTM_DIV_Begin ("id=\"institutional_links\""); - Frm_BeginForm (ActSeeLnk); - HTM_BUTTON_SUBMIT_Begin (Txt_Links,"BT_LINK LINK_TITLE",NULL); - HTM_TxtF ("%s",Txt_Links); - HTM_BUTTON_End (); - Frm_EndForm (); + Frm_BeginForm (ActSeeLnk); + HTM_BUTTON_SUBMIT_Begin (Txt_Links,"BT_LINK LINK_TITLE",NULL); + HTM_TxtF ("%s",Txt_Links); + HTM_BUTTON_End (); + Frm_EndForm (); + + Lnk_WriteListOfLinks (); - Lnk_WriteListOfLinks (); HTM_DIV_End (); } @@ -191,20 +192,20 @@ static void Lnk_WriteListOfLinks (void) /***** List start *****/ HTM_UL_Begin ("class=\"LIST_LEFT\""); - /***** Write all links *****/ - for (NumLnk = 0; - NumLnk < Gbl.Links.Num; - NumLnk++) - { - /* Write data of this link */ - HTM_LI_Begin ("class=\"INS_LNK\""); - HTM_A_Begin ("href=\"%s\" title=\"%s\" class=\"INS_LNK\" target=\"_blank\"", - Gbl.Links.Lst[NumLnk].WWW, - Gbl.Links.Lst[NumLnk].FullName); - HTM_Txt (Gbl.Links.Lst[NumLnk].ShrtName); - HTM_A_End (); - HTM_LI_End (); - } + /***** Write all links *****/ + for (NumLnk = 0; + NumLnk < Gbl.Links.Num; + NumLnk++) + { + /* Write data of this link */ + HTM_LI_Begin ("class=\"INS_LNK\""); + HTM_A_Begin ("href=\"%s\" title=\"%s\" class=\"INS_LNK\" target=\"_blank\"", + Gbl.Links.Lst[NumLnk].WWW, + Gbl.Links.Lst[NumLnk].FullName); + HTM_Txt (Gbl.Links.Lst[NumLnk].ShrtName); + HTM_A_End (); + HTM_LI_End (); + } /***** List end *****/ HTM_UL_End (); @@ -239,12 +240,12 @@ static void Lnk_EditLinksInternal (void) Lnk_PutIconsEditingLinks,NULL, Hlp_SYSTEM_Links_edit,Box_NOT_CLOSABLE); - /***** Put a form to create a new link *****/ - Lnk_PutFormToCreateLink (); + /***** Put a form to create a new link *****/ + Lnk_PutFormToCreateLink (); - /***** Forms to edit current links *****/ - if (Gbl.Links.Num) - Lnk_ListLinksForEdition (); + /***** Forms to edit current links *****/ + if (Gbl.Links.Num) + Lnk_ListLinksForEdition (); /***** End box *****/ Box_BoxEnd (); @@ -287,23 +288,12 @@ void Lnk_PutIconToViewLinks (void) void Lnk_GetListLinks (void) { MYSQL_RES *mysql_res; - MYSQL_ROW row; unsigned NumLnk; - struct Link *Lnk; if (Gbl.DB.DatabaseIsOpen) { /***** Get institutional links from database *****/ - Gbl.Links.Num = (unsigned) - DB_QuerySELECT (&mysql_res,"can not get institutional links", - "SELECT LnkCod," // row[0] - "ShortName," // row[1] - "FullName," // row[2] - "WWW" // row[3] - " FROM lnk_links" - " ORDER BY ShortName"); - - if (Gbl.Links.Num) // Places found... + if ((Gbl.Links.Num = Lnk_DB_GetLinks (&mysql_res))) // Links found... { /***** Create list with places *****/ if ((Gbl.Links.Lst = calloc ((size_t) Gbl.Links.Num, @@ -314,22 +304,8 @@ void Lnk_GetListLinks (void) for (NumLnk = 0; NumLnk < Gbl.Links.Num; NumLnk++) - { - Lnk = &(Gbl.Links.Lst[NumLnk]); - /* Get next link */ - row = mysql_fetch_row (mysql_res); - - /* Get link code (row[0]) */ - if ((Lnk->LnkCod = Str_ConvertStrCodToLongCod (row[0])) <= 0) - Err_WrongLinkExit (); - - /* Get the short name (row[0]), the full name (row[1]) - and de URL (row[2]) of the link */ - Str_Copy (Lnk->ShrtName,row[1],sizeof (Lnk->ShrtName) - 1); - Str_Copy (Lnk->FullName,row[2],sizeof (Lnk->FullName) - 1); - Str_Copy (Lnk->WWW ,row[3],sizeof (Lnk->WWW ) - 1); - } + Lnk_GetDataOfLink (mysql_res,&(Gbl.Links.Lst[NumLnk])); } /***** Free structure that stores the query result *****/ @@ -344,38 +320,43 @@ void Lnk_GetListLinks (void) void Lnk_GetDataOfLinkByCod (struct Link *Lnk) { MYSQL_RES *mysql_res; - MYSQL_ROW row; /***** Clear data *****/ - Lnk->ShrtName[0] = Lnk->FullName[0] = Lnk->WWW[0] = '\0'; + Lnk->ShrtName[0] = + Lnk->FullName[0] = + Lnk->WWW[0] = '\0'; /***** Check if link code is correct *****/ if (Lnk->LnkCod > 0) { /***** Get data of an institutional link from database *****/ - if (DB_QuerySELECT (&mysql_res,"can not get data of an institutional link", - "SELECT ShortName," // row[0] - "FullName," // row[1] - "WWW" // row[2] - " FROM lnk_links" - " WHERE LnkCod=%ld", - Lnk->LnkCod)) // Link found... - { - /* Get row */ - row = mysql_fetch_row (mysql_res); - - /* Get the short name (row[0]), the full name (row[1]) - and de URL (row[2]) of the link */ - Str_Copy (Lnk->ShrtName,row[0],sizeof (Lnk->ShrtName) - 1); - Str_Copy (Lnk->FullName,row[1],sizeof (Lnk->FullName) - 1); - Str_Copy (Lnk->WWW ,row[2],sizeof (Lnk->WWW ) - 1); - } + if (Lnk_DB_GetDataOfLinkByCod (&mysql_res,Lnk->LnkCod)) // Link found... + Lnk_GetDataOfLink (mysql_res,Lnk); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); } } +/*****************************************************************************/ +/**************************** Get data of link *******************************/ +/*****************************************************************************/ + +static void Lnk_GetDataOfLink (MYSQL_RES *mysql_res,struct Link *Lnk) + { + MYSQL_ROW row; + + /***** Get row *****/ + row = mysql_fetch_row (mysql_res); + + /***** Get the short name (row[0]), + the full name (row[1]) + and the URL (row[2]) of the link *****/ + Str_Copy (Lnk->ShrtName,row[0],sizeof (Lnk->ShrtName) - 1); + Str_Copy (Lnk->FullName,row[1],sizeof (Lnk->FullName) - 1); + Str_Copy (Lnk->WWW ,row[2],sizeof (Lnk->WWW ) - 1); + } + /*****************************************************************************/ /**************************** Free list of links *****************************/ /*****************************************************************************/ @@ -403,60 +384,60 @@ static void Lnk_ListLinksForEdition (void) /***** Begin table *****/ HTM_TABLE_BeginWidePadding (2); - /***** Table head *****/ - Lnk_PutHeadLinks (); + /***** Table head *****/ + Lnk_PutHeadLinks (); - /***** Write all the links *****/ - for (NumLnk = 0; - NumLnk < Gbl.Links.Num; - NumLnk++) - { - Lnk = &Gbl.Links.Lst[NumLnk]; + /***** Write all the links *****/ + for (NumLnk = 0; + NumLnk < Gbl.Links.Num; + NumLnk++) + { + Lnk = &Gbl.Links.Lst[NumLnk]; - HTM_TR_Begin (NULL); + HTM_TR_Begin (NULL); - /* Put icon to remove link */ - HTM_TD_Begin ("class=\"BM\""); - Ico_PutContextualIconToRemove (ActRemLnk,NULL, - Lnk_PutParamLnkCod,&Lnk->LnkCod); - HTM_TD_End (); + /* Put icon to remove link */ + HTM_TD_Begin ("class=\"BM\""); + Ico_PutContextualIconToRemove (ActRemLnk,NULL, + Lnk_PutParamLnkCod,&Lnk->LnkCod); + HTM_TD_End (); - /* Link code */ - HTM_TD_Begin ("class=\"DAT RM\""); - HTM_Long (Lnk->LnkCod); - HTM_TD_End (); + /* Link code */ + HTM_TD_Begin ("class=\"DAT RM\""); + HTM_Long (Lnk->LnkCod); + HTM_TD_End (); - /* Link short name */ - HTM_TD_Begin ("class=\"CM\""); - Frm_BeginForm (ActRenLnkSho); - Lnk_PutParamLnkCod (&Lnk->LnkCod); - HTM_INPUT_TEXT ("ShortName",Lnk_MAX_CHARS_LINK_SHRT_NAME,Lnk->ShrtName, - HTM_SUBMIT_ON_CHANGE, - "class=\"INPUT_SHORT_NAME\" required=\"required\""); - Frm_EndForm (); - HTM_TD_End (); + /* Link short name */ + HTM_TD_Begin ("class=\"CM\""); + Frm_BeginForm (ActRenLnkSho); + Lnk_PutParamLnkCod (&Lnk->LnkCod); + HTM_INPUT_TEXT ("ShortName",Lnk_MAX_CHARS_LINK_SHRT_NAME,Lnk->ShrtName, + HTM_SUBMIT_ON_CHANGE, + "class=\"INPUT_SHORT_NAME\" required=\"required\""); + Frm_EndForm (); + HTM_TD_End (); - /* Link full name */ - HTM_TD_Begin ("class=\"CM\""); - Frm_BeginForm (ActRenLnkFul); - Lnk_PutParamLnkCod (&Lnk->LnkCod); - HTM_INPUT_TEXT ("FullName",Lnk_MAX_CHARS_LINK_FULL_NAME,Lnk->FullName, - HTM_SUBMIT_ON_CHANGE, - "class=\"INPUT_FULL_NAME\" required=\"required\""); - Frm_EndForm (); - HTM_TD_End (); + /* Link full name */ + HTM_TD_Begin ("class=\"CM\""); + Frm_BeginForm (ActRenLnkFul); + Lnk_PutParamLnkCod (&Lnk->LnkCod); + HTM_INPUT_TEXT ("FullName",Lnk_MAX_CHARS_LINK_FULL_NAME,Lnk->FullName, + HTM_SUBMIT_ON_CHANGE, + "class=\"INPUT_FULL_NAME\" required=\"required\""); + Frm_EndForm (); + HTM_TD_End (); - /* Link WWW */ - HTM_TD_Begin ("class=\"CM\""); - Frm_BeginForm (ActChgLnkWWW); - Lnk_PutParamLnkCod (&Lnk->LnkCod); - HTM_INPUT_URL ("WWW",Lnk->WWW,HTM_SUBMIT_ON_CHANGE, - "class=\"INPUT_WWW_NARROW\" required=\"required\""); - Frm_EndForm (); - HTM_TD_End (); + /* Link WWW */ + HTM_TD_Begin ("class=\"CM\""); + Frm_BeginForm (ActChgLnkWWW); + Lnk_PutParamLnkCod (&Lnk->LnkCod); + HTM_INPUT_URL ("WWW",Lnk->WWW,HTM_SUBMIT_ON_CHANGE, + "class=\"INPUT_WWW_NARROW\" required=\"required\""); + Frm_EndForm (); + HTM_TD_End (); - HTM_TR_End (); - } + HTM_TR_End (); + } /***** End table *****/ HTM_TABLE_End (); @@ -501,10 +482,7 @@ void Lnk_RemoveLink (void) Lnk_GetDataOfLinkByCod (Lnk_EditingLnk); /***** Remove link *****/ - DB_QueryDELETE ("can not remove an institutional link", - "DELETE FROM lnk_links" - " WHERE LnkCod=%ld", - Lnk_EditingLnk->LnkCod); + Lnk_DB_RemoveLink (Lnk_EditingLnk->LnkCod); /***** Write message to show the change made *****/ Ale_CreateAlert (Ale_SUCCESS,NULL, @@ -588,14 +566,14 @@ static void Lnk_RenameLink (Cns_ShrtOrFullName_t ShrtOrFullName) if (strcmp (CurrentLnkName,NewLnkName)) // Different names { /***** If link was in database... *****/ - if (Lnk_CheckIfLinkNameExists (ParamName,NewLnkName,Lnk_EditingLnk->LnkCod)) + if (Lnk_DB_CheckIfLinkNameExists (ParamName,NewLnkName,Lnk_EditingLnk->LnkCod)) Ale_CreateAlert (Ale_WARNING,NULL, Txt_The_link_X_already_exists, NewLnkName); else { /* Update the table changing old name by new name */ - Lnk_UpdateLnkNameDB (Lnk_EditingLnk->LnkCod,FieldName,NewLnkName); + Lnk_DB_UpdateLnkName (Lnk_EditingLnk->LnkCod,FieldName,NewLnkName); /* Write message to show the change made */ Ale_CreateAlert (Ale_SUCCESS,NULL, @@ -615,37 +593,6 @@ static void Lnk_RenameLink (Cns_ShrtOrFullName_t ShrtOrFullName) Str_Copy (CurrentLnkName,NewLnkName,MaxBytes); } -/*****************************************************************************/ -/********************** Check if the name of link exists *********************/ -/*****************************************************************************/ - -static bool Lnk_CheckIfLinkNameExists (const char *FieldName,const char *Name,long LnkCod) - { - /***** Get number of links with a name from database *****/ - return (DB_QueryCOUNT ("can not check if the name of an institutional link" - " already existed", - "SELECT COUNT(*)" - " FROM lnk_links" - " WHERE %s='%s'" - " AND LnkCod<>%ld", - FieldName,Name,LnkCod) != 0); - } - -/*****************************************************************************/ -/************ Update link name in table of institutional links ***************/ -/*****************************************************************************/ - -static void Lnk_UpdateLnkNameDB (long LnkCod,const char *FieldName,const char *NewLnkName) - { - /***** Update institutional link changing old name by new name */ - DB_QueryUPDATE ("can not update the name of an institutional link", - "UPDATE lnk_links" - " SET %s='%s'" - " WHERE LnkCod=%ld", - FieldName,NewLnkName, - LnkCod); - } - /*****************************************************************************/ /**************** Change the WWW of an institutional link ********************/ /*****************************************************************************/ @@ -673,12 +620,7 @@ void Lnk_ChangeLinkWWW (void) if (NewWWW[0]) { /***** Update the table changing old WWW by new WWW *****/ - DB_QueryUPDATE ("can not update the web of an institutional link", - "UPDATE lnk_links" - " SET WWW='%s'" - " WHERE LnkCod=%ld", - NewWWW, - Lnk_EditingLnk->LnkCod); + Lnk_DB_UpdateLnkWWW (Lnk_EditingLnk->LnkCod,NewWWW); /***** Message to show the change made *****/ Ale_CreateAlert (Ale_SUCCESS,NULL, @@ -721,46 +663,46 @@ static void Lnk_PutFormToCreateLink (void) /***** Begin form *****/ Frm_BeginForm (ActNewLnk); - /***** Begin box and table *****/ - Box_BoxTableBegin (NULL,Txt_New_link, - NULL,NULL, - Hlp_SYSTEM_Links_edit,Box_NOT_CLOSABLE,2); + /***** Begin box and table *****/ + Box_BoxTableBegin (NULL,Txt_New_link, + NULL,NULL, + Hlp_SYSTEM_Links_edit,Box_NOT_CLOSABLE,2); - /***** Write heading *****/ - Lnk_PutHeadLinks (); + /***** Write heading *****/ + Lnk_PutHeadLinks (); - HTM_TR_Begin (NULL); + HTM_TR_Begin (NULL); - /***** Link code *****/ - HTM_TD_Begin ("class=\"BM\""); - HTM_TD_End (); + /***** Link code *****/ + HTM_TD_Begin ("class=\"BM\""); + HTM_TD_End (); - HTM_TD_Empty (1); + HTM_TD_Empty (1); - /***** Link short name *****/ - HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_TEXT ("ShortName",Lnk_MAX_CHARS_LINK_SHRT_NAME,Lnk_EditingLnk->ShrtName, - HTM_DONT_SUBMIT_ON_CHANGE, - "class=\"INPUT_SHORT_NAME\" required=\"required\""); - HTM_TD_End (); + /***** Link short name *****/ + HTM_TD_Begin ("class=\"CM\""); + HTM_INPUT_TEXT ("ShortName",Lnk_MAX_CHARS_LINK_SHRT_NAME,Lnk_EditingLnk->ShrtName, + HTM_DONT_SUBMIT_ON_CHANGE, + "class=\"INPUT_SHORT_NAME\" required=\"required\""); + HTM_TD_End (); - /***** Link full name *****/ - HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_TEXT ("FullName",Lnk_MAX_CHARS_LINK_FULL_NAME,Lnk_EditingLnk->FullName, - HTM_DONT_SUBMIT_ON_CHANGE, - "class=\"INPUT_FULL_NAME\" required=\"required\""); - HTM_TD_End (); + /***** Link full name *****/ + HTM_TD_Begin ("class=\"CM\""); + HTM_INPUT_TEXT ("FullName",Lnk_MAX_CHARS_LINK_FULL_NAME,Lnk_EditingLnk->FullName, + HTM_DONT_SUBMIT_ON_CHANGE, + "class=\"INPUT_FULL_NAME\" required=\"required\""); + HTM_TD_End (); - /***** Link WWW *****/ - HTM_TD_Begin ("class=\"CM\""); - HTM_INPUT_URL ("WWW",Lnk_EditingLnk->WWW,HTM_DONT_SUBMIT_ON_CHANGE, - "class=\"INPUT_WWW_NARROW\" required=\"required\""); - HTM_TD_End (); + /***** Link WWW *****/ + HTM_TD_Begin ("class=\"CM\""); + HTM_INPUT_URL ("WWW",Lnk_EditingLnk->WWW,HTM_DONT_SUBMIT_ON_CHANGE, + "class=\"INPUT_WWW_NARROW\" required=\"required\""); + HTM_TD_End (); - HTM_TR_End (); + HTM_TR_End (); - /***** End table, send button and end box *****/ - Box_BoxTableWithButtonEnd (Btn_CREATE_BUTTON,Txt_Create_link); + /***** End table, send button and end box *****/ + Box_BoxTableWithButtonEnd (Btn_CREATE_BUTTON,Txt_Create_link); /***** End form *****/ Frm_EndForm (); @@ -779,11 +721,11 @@ static void Lnk_PutHeadLinks (void) HTM_TR_Begin (NULL); - HTM_TH (1,1,"BM",NULL); - HTM_TH (1,1,"RM",Txt_Code); - HTM_TH (1,1,"LM",Txt_Short_name); - HTM_TH (1,1,"LM",Txt_Full_name); - HTM_TH (1,1,"LM",Txt_WWW); + HTM_TH (1,1,"BM",NULL); + HTM_TH (1,1,"RM",Txt_Code); + HTM_TH (1,1,"LM",Txt_Short_name); + HTM_TH (1,1,"LM",Txt_Full_name); + HTM_TH (1,1,"LM",Txt_WWW); HTM_TR_End (); } @@ -816,11 +758,11 @@ void Lnk_ReceiveFormNewLink (void) Lnk_EditingLnk->FullName[0]) // If there's a link name { /***** If name of link was in database... *****/ - if (Lnk_CheckIfLinkNameExists ("ShortName",Lnk_EditingLnk->ShrtName,-1L)) + if (Lnk_DB_CheckIfLinkNameExists ("ShortName",Lnk_EditingLnk->ShrtName,-1L)) Ale_CreateAlert (Ale_WARNING,NULL, Txt_The_link_X_already_exists, Lnk_EditingLnk->ShrtName); - else if (Lnk_CheckIfLinkNameExists ("FullName",Lnk_EditingLnk->FullName,-1L)) + else if (Lnk_DB_CheckIfLinkNameExists ("FullName",Lnk_EditingLnk->FullName,-1L)) Ale_CreateAlert (Ale_WARNING,NULL, Txt_The_link_X_already_exists, Lnk_EditingLnk->FullName); @@ -829,7 +771,7 @@ void Lnk_ReceiveFormNewLink (void) Txt_You_must_specify_the_URL_of_the_new_link); else // Add new link to database { - Lnk_CreateLink (Lnk_EditingLnk); + Lnk_DB_CreateLink (Lnk_EditingLnk); Ale_CreateAlert (Ale_SUCCESS,NULL, Txt_Created_new_link_X, Lnk_EditingLnk->ShrtName); @@ -840,23 +782,6 @@ void Lnk_ReceiveFormNewLink (void) Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_link); } -/*****************************************************************************/ -/**************************** Create a new link ******************************/ -/*****************************************************************************/ - -static void Lnk_CreateLink (struct Link *Lnk) - { - /***** Create a new link *****/ - DB_QueryINSERT ("can not create institutional link", - "INSERT INTO lnk_links" - " (ShortName,FullName,WWW)" - " VALUES" - " ('%s','%s','%s')", - Lnk->ShrtName, - Lnk->FullName, - Lnk->WWW); - } - /*****************************************************************************/ /************************* Place constructor/destructor **********************/ /*****************************************************************************/ diff --git a/swad_link_database.c b/swad_link_database.c new file mode 100644 index 00000000..84eb542e --- /dev/null +++ b/swad_link_database.c @@ -0,0 +1,170 @@ +// swad_link_database.c: institutional links, 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 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 // For NULL +// #include // For calloc +// #include // For string functions + +// #include "swad_banner.h" +// #include "swad_box.h" +// #include "swad_constant.h" +#include "swad_database.h" +// #include "swad_error.h" +// #include "swad_form.h" +// #include "swad_global.h" +// #include "swad_HTML.h" +// #include "swad_language.h" +// #include "swad_link.h" +#include "swad_link_database.h" +// #include "swad_parameter.h" + +/*****************************************************************************/ +/************** External global variables from others modules ****************/ +/*****************************************************************************/ + +// extern struct Globals Gbl; + +/*****************************************************************************/ +/***************************** Private constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************************* Private types *******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private variables *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private prototypes ****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/**************************** Create a new link ******************************/ +/*****************************************************************************/ + +void Lnk_DB_CreateLink (const struct Link *Lnk) + { + DB_QueryINSERT ("can not create institutional link", + "INSERT INTO lnk_links" + " (ShortName,FullName,WWW)" + " VALUES" + " ('%s','%s','%s')", + Lnk->ShrtName, + Lnk->FullName, + Lnk->WWW); + } + +/*****************************************************************************/ +/************ Update link name in table of institutional links ***************/ +/*****************************************************************************/ + +void Lnk_DB_UpdateLnkName (long LnkCod,const char *FieldName,const char *NewLnkName) + { + DB_QueryUPDATE ("can not update the name of an institutional link", + "UPDATE lnk_links" + " SET %s='%s'" + " WHERE LnkCod=%ld", + FieldName,NewLnkName, + LnkCod); + } + + +/*****************************************************************************/ +/****************** Update link changing old WWW by new WWW ******************/ +/*****************************************************************************/ + +void Lnk_DB_UpdateLnkWWW (long LnkCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]) + { + DB_QueryUPDATE ("can not update the web of an institutional link", + "UPDATE lnk_links" + " SET WWW='%s'" + " WHERE LnkCod=%ld", + NewWWW, + LnkCod); + } + +/*****************************************************************************/ +/************************** Get institutional links **************************/ +/*****************************************************************************/ + +unsigned Lnk_DB_GetLinks (MYSQL_RES **mysql_res) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get institutional links", + "SELECT LnkCod," // row[0] + "ShortName," // row[1] + "FullName," // row[2] + "WWW" // row[3] + " FROM lnk_links" + " ORDER BY ShortName"); + } + +/*****************************************************************************/ +/**************************** Get link full name *****************************/ +/*****************************************************************************/ + +unsigned Lnk_DB_GetDataOfLinkByCod (MYSQL_RES **mysql_res,long LnkCod) + { + return (unsigned) + DB_QuerySELECT (mysql_res,"can not get data of an institutional link", + "SELECT ShortName," // row[0] + "FullName," // row[1] + "WWW" // row[2] + " FROM lnk_links" + " WHERE LnkCod=%ld", + LnkCod); + } + +/*****************************************************************************/ +/********************** Check if the name of link exists *********************/ +/*****************************************************************************/ + +bool Lnk_DB_CheckIfLinkNameExists (const char *FieldName,const char *Name,long LnkCod) + { + return (DB_QueryCOUNT ("can not check if the name of an institutional link" + " already existed", + "SELECT COUNT(*)" + " FROM lnk_links" + " WHERE %s='%s'" + " AND LnkCod<>%ld", + FieldName,Name, + LnkCod) != 0); + } + +/*****************************************************************************/ +/******************************* Remove a link *******************************/ +/*****************************************************************************/ + +void Lnk_DB_RemoveLink (long LnkCod) + { + DB_QueryDELETE ("can not remove an institutional link", + "DELETE FROM lnk_links" + " WHERE LnkCod=%ld", + LnkCod); + } diff --git a/swad_link_database.h b/swad_link_database.h new file mode 100644 index 00000000..6b80eb21 --- /dev/null +++ b/swad_link_database.h @@ -0,0 +1,52 @@ +// swad_link_database.h: institutional links, operations with database + +#ifndef _SWAD_LNK_DB +#define _SWAD_LNK_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 + +#include "swad_link.h" + +/*****************************************************************************/ +/************************** Public types and constants ***********************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Public prototypes ****************************/ +/*****************************************************************************/ + +void Lnk_DB_CreateLink (const struct Link *Lnk); +void Lnk_DB_UpdateLnkName (long LnkCod,const char *FieldName,const char *NewLnkName); +void Lnk_DB_UpdateLnkWWW (long LnkCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]); + +unsigned Lnk_DB_GetLinks (MYSQL_RES **mysql_res); +unsigned Lnk_DB_GetDataOfLinkByCod (MYSQL_RES **mysql_res,long LnkCod); +bool Lnk_DB_CheckIfLinkNameExists (const char *FieldName,const char *Name,long LnkCod); + +void Lnk_DB_RemoveLink (long LnkCod); + +#endif diff --git a/swad_setting.c b/swad_setting.c index 8c52abf3..9f09afaf 100644 --- a/swad_setting.c +++ b/swad_setting.c @@ -313,6 +313,22 @@ void Set_ChangeSideCols (void) Set_SetSettingsFromIP (); } +/*****************************************************************************/ +/**************** Update my language to the current language *****************/ +/*****************************************************************************/ + +void Set_DB_UpdateMySettingsAboutLanguage (void) + { + extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES]; + + DB_QueryUPDATE ("can not update your language", + "UPDATE usr_data" + " SET Language='%s'" + " WHERE UsrCod=%ld", + Lan_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.Usrs.Me.UsrDat.UsrCod); + } + /*****************************************************************************/ /************** Update layout of side colums on user data table **************/ /*****************************************************************************/ diff --git a/swad_setting.h b/swad_setting.h index 0d46f87c..64fdf97e 100644 --- a/swad_setting.h +++ b/swad_setting.h @@ -50,6 +50,7 @@ void Set_RemoveOldSettingsFromIP (void); void Set_ChangeSideCols (void); unsigned Set_GetParamSideCols (void); +void Set_DB_UpdateMySettingsAboutLanguage (void); void Set_DB_UpdateMySettingsAboutDateFormat (Dat_Format_t DateFormat); void Set_DB_ChangeFirstDayOfWeek (unsigned FirstDayOfWeek); void Set_DB_ChangeIconSet (const char *IconSetId);