Version 23.11: Sep 20, 2023 Code refactoring in hierarchy.

This commit is contained in:
acanas 2023-09-20 20:07:04 +02:00
parent eb837d80a0
commit 9accc808f5
24 changed files with 261 additions and 422 deletions

View File

@ -98,8 +98,6 @@ static void Ctr_PutHeadCentersForSeeing (bool OrderSelectable);
static void Ctr_PutHeadCentersForEdition (void); static void Ctr_PutHeadCentersForEdition (void);
static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status); static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status);
static unsigned Ctr_GetNumCtrsInCty (long CtyCod);
static void Ctr_EditingCenterConstructor (void); static void Ctr_EditingCenterConstructor (void);
static void Ctr_EditingCenterDestructor (void); static void Ctr_EditingCenterDestructor (void);
@ -369,13 +367,15 @@ static void Ctr_ListOneCenterForSeeing (struct Hie_Node *Ctr,unsigned NumCtr)
/***** Number of degrees *****/ /***** Number of degrees *****/
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
TxtClassNormal,The_GetSuffix (),BgColor); TxtClassNormal,The_GetSuffix (),BgColor);
HTM_Unsigned (Deg_GetCachedNumDegsInCtr (Ctr->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_CTR,Ctr->HieCod));
HTM_TD_End (); HTM_TD_End ();
/***** Number of courses *****/ /***** Number of courses *****/
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
TxtClassNormal,The_GetSuffix (),BgColor); TxtClassNormal,The_GetSuffix (),BgColor);
HTM_Unsigned (Crs_GetCachedNumCrssInCtr (Ctr->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_CTR,Ctr->HieCod));
HTM_TD_End (); HTM_TD_End ();
/***** Number of users in courses of this center *****/ /***** Number of users in courses of this center *****/
@ -1554,75 +1554,41 @@ static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status)
Ale_CreateAlertYouMustSpecifyTheShortNameAndTheFullName (); Ale_CreateAlertYouMustSpecifyTheShortNameAndTheFullName ();
} }
/*****************************************************************************/
/************************** Get number of centers ****************************/
/*****************************************************************************/
unsigned Ctr_GetCachedNumCtrsInSys (void)
{
unsigned NumCtrs;
/***** Get number of centers from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumCtrs))
{
/***** Get current number of centers from database and update cache *****/
NumCtrs = (unsigned) DB_GetNumRowsTable ("ctr_centers");
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumCtrs);
}
return NumCtrs;
}
/*****************************************************************************/ /*****************************************************************************/
/******************* Get number of centers in a country **********************/ /******************* Get number of centers in a country **********************/
/*****************************************************************************/ /*****************************************************************************/
void Ctr_FlushCacheNumCtrsInCty (void) void Ctr_FlushCacheNumCtrsInCty (void)
{ {
Gbl.Cache.NumCtrsInCty.CtyCod = -1L; Gbl.Cache.NumCtrsInCty.HieCod = -1L;
Gbl.Cache.NumCtrsInCty.NumCtrs = 0; Gbl.Cache.NumCtrsInCty.NumCtrs = 0;
} }
static unsigned Ctr_GetNumCtrsInCty (long CtyCod) unsigned Ctr_GetNumCtrsInCty (long CtyCod)
{ {
/***** 1. Fast check: Trivial case *****/ /***** 1. Fast check: Trivial case *****/
if (CtyCod <= 0) if (CtyCod <= 0)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (CtyCod == Gbl.Cache.NumCtrsInCty.CtyCod) if (CtyCod == Gbl.Cache.NumCtrsInCty.HieCod)
return Gbl.Cache.NumCtrsInCty.NumCtrs; return Gbl.Cache.NumCtrsInCty.NumCtrs;
/***** 3. Slow: number of centers in a country from database *****/ /***** 3. Slow: number of centers in a country from database *****/
Gbl.Cache.NumCtrsInCty.CtyCod = CtyCod; Gbl.Cache.NumCtrsInCty.HieCod = CtyCod;
Gbl.Cache.NumCtrsInCty.NumCtrs = Ctr_DB_GetNumCtrsInCty (CtyCod); Gbl.Cache.NumCtrsInCty.NumCtrs = Ctr_DB_GetNumCtrsInCty (CtyCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,HieLvl_CTY,Gbl.Cache.NumCtrsInCty.CtyCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,HieLvl_CTY,Gbl.Cache.NumCtrsInCty.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumCtrsInCty.NumCtrs); FigCch_UNSIGNED,&Gbl.Cache.NumCtrsInCty.NumCtrs);
return Gbl.Cache.NumCtrsInCty.NumCtrs; return Gbl.Cache.NumCtrsInCty.NumCtrs;
} }
unsigned Ctr_GetCachedNumCtrsInCty (long CtyCod)
{
unsigned NumCtrs;
/***** Get number of centers from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS,HieLvl_CTY,CtyCod,
FigCch_UNSIGNED,&NumCtrs))
/***** Get current number of centers from database and update cache *****/
NumCtrs = Ctr_GetNumCtrsInCty (CtyCod);
return NumCtrs;
}
/*****************************************************************************/ /*****************************************************************************/
/**************** Get number of centers in an institution ********************/ /**************** Get number of centers in an institution ********************/
/*****************************************************************************/ /*****************************************************************************/
void Ctr_FlushCacheNumCtrsInIns (void) void Ctr_FlushCacheNumCtrsInIns (void)
{ {
Gbl.Cache.NumCtrsInIns.InsCod = -1L; Gbl.Cache.NumCtrsInIns.HieCod = -1L;
Gbl.Cache.NumCtrsInIns.NumCtrs = 0; Gbl.Cache.NumCtrsInIns.NumCtrs = 0;
} }
@ -1633,30 +1599,17 @@ unsigned Ctr_GetNumCtrsInIns (long InsCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (InsCod == Gbl.Cache.NumCtrsInIns.InsCod) if (InsCod == Gbl.Cache.NumCtrsInIns.HieCod)
return Gbl.Cache.NumCtrsInIns.NumCtrs; return Gbl.Cache.NumCtrsInIns.NumCtrs;
/***** 3. Slow: number of centers in an institution from database *****/ /***** 3. Slow: number of centers in an institution from database *****/
Gbl.Cache.NumCtrsInIns.InsCod = InsCod; Gbl.Cache.NumCtrsInIns.HieCod = InsCod;
Gbl.Cache.NumCtrsInIns.NumCtrs = Ctr_DB_GetNumCtrsInIns (InsCod); Gbl.Cache.NumCtrsInIns.NumCtrs = Ctr_DB_GetNumCtrsInIns (InsCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,HieLvl_INS,Gbl.Cache.NumCtrsInIns.InsCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_CTRS,HieLvl_INS,Gbl.Cache.NumCtrsInIns.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumCtrsInIns.NumCtrs); FigCch_UNSIGNED,&Gbl.Cache.NumCtrsInIns.NumCtrs);
return Gbl.Cache.NumCtrsInIns.NumCtrs; return Gbl.Cache.NumCtrsInIns.NumCtrs;
} }
unsigned Ctr_GetCachedNumCtrsInIns (long InsCod)
{
unsigned NumCtrs;
/***** Get number of centers from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTRS,HieLvl_INS,InsCod,
FigCch_UNSIGNED,&NumCtrs))
/***** Get current number of centers from database and update cache *****/
NumCtrs = Ctr_GetNumCtrsInIns (InsCod);
return NumCtrs;
}
/*****************************************************************************/ /*****************************************************************************/
/********************** Get number of centers with map ***********************/ /********************** Get number of centers with map ***********************/
/*****************************************************************************/ /*****************************************************************************/
@ -1988,7 +1941,7 @@ bool Ctr_CheckIfIBelongToCtr (long CtrCod)
void Ctr_FlushCacheNumUsrsWhoClaimToBelongToCtr (void) void Ctr_FlushCacheNumUsrsWhoClaimToBelongToCtr (void)
{ {
Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.CtrCod = -1L; Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.HieCod = -1L;
Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs = 0; Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs = 0;
} }
@ -2003,7 +1956,7 @@ unsigned Ctr_GetNumUsrsWhoClaimToBelongToCtr (struct Hie_Node *Ctr)
return Ctr->NumUsrsWhoClaimToBelong.NumUsrs; return Ctr->NumUsrsWhoClaimToBelong.NumUsrs;
/***** 3. Fast check: If cached... *****/ /***** 3. Fast check: If cached... *****/
if (Ctr->HieCod == Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.CtrCod) if (Ctr->HieCod == Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.HieCod)
{ {
Ctr->NumUsrsWhoClaimToBelong.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs; Ctr->NumUsrsWhoClaimToBelong.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs;
Ctr->NumUsrsWhoClaimToBelong.Valid = true; Ctr->NumUsrsWhoClaimToBelong.Valid = true;
@ -2012,10 +1965,10 @@ unsigned Ctr_GetNumUsrsWhoClaimToBelongToCtr (struct Hie_Node *Ctr)
/***** 4. Slow: number of users who claim to belong to a center /***** 4. Slow: number of users who claim to belong to a center
from database *****/ from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.CtrCod = Ctr->HieCod; Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.HieCod = Ctr->HieCod;
Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs =
Ctr->NumUsrsWhoClaimToBelong.NumUsrs = Ctr_DB_GetNumUsrsWhoClaimToBelongToCtr (Ctr->HieCod); Ctr->NumUsrsWhoClaimToBelong.NumUsrs = Ctr_DB_GetNumUsrsWhoClaimToBelongToCtr (Ctr->HieCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_BELONG_CTR,HieLvl_CTR,Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.CtrCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_BELONG_CTR,HieLvl_CTR,Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs); FigCch_UNSIGNED,&Gbl.Cache.NumUsrsWhoClaimToBelongToCtr.NumUsrs);
return Ctr->NumUsrsWhoClaimToBelong.NumUsrs; return Ctr->NumUsrsWhoClaimToBelong.NumUsrs;
} }

View File

@ -32,6 +32,7 @@
#include "swad_action.h" #include "swad_action.h"
#include "swad_constant.h" #include "swad_constant.h"
#include "swad_degree.h" #include "swad_degree.h"
#include "swad_figure_cache.h"
#include "swad_map.h" #include "swad_map.h"
#include "swad_role_type.h" #include "swad_role_type.h"
@ -70,14 +71,11 @@ void Ctr_ContEditAfterChgCtr (void);
void Ctr_ReceiveFormReqCtr (void); void Ctr_ReceiveFormReqCtr (void);
void Ctr_ReceiveFormNewCtr (void); void Ctr_ReceiveFormNewCtr (void);
unsigned Ctr_GetCachedNumCtrsInSys (void);
void Ctr_FlushCacheNumCtrsInCty (void); void Ctr_FlushCacheNumCtrsInCty (void);
unsigned Ctr_GetCachedNumCtrsInCty (long CtyCod); unsigned Ctr_GetNumCtrsInCty (long CtyCod);
void Ctr_FlushCacheNumCtrsInIns (void); void Ctr_FlushCacheNumCtrsInIns (void);
unsigned Ctr_GetNumCtrsInIns (long InsCod); unsigned Ctr_GetNumCtrsInIns (long InsCod);
unsigned Ctr_GetCachedNumCtrsInIns (long InsCod);
unsigned Ctr_GetCachedNumCtrsWithMapInSys (void); unsigned Ctr_GetCachedNumCtrsWithMapInSys (void);
unsigned Ctr_GetCachedNumCtrsWithMapInCty (long CtyCod); unsigned Ctr_GetCachedNumCtrsWithMapInCty (long CtyCod);

View File

@ -775,7 +775,8 @@ static void CtrCfg_NumDegs (void)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_BUTTON_Submit_Begin (Title,"class=\"LB BT_LINK\""); HTM_BUTTON_Submit_Begin (Title,"class=\"LB BT_LINK\"");
free (Title); free (Title);
HTM_Unsigned (Deg_GetCachedNumDegsInCtr (Gbl.Hierarchy.Node[HieLvl_CTR].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_CTR,Gbl.Hierarchy.Node[HieLvl_CTR].HieCod));
HTM_BUTTON_End (); HTM_BUTTON_End ();
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
@ -799,7 +800,8 @@ static void CtrCfg_NumCrss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Crs_GetCachedNumCrssInCtr (Gbl.Hierarchy.Node[HieLvl_CTR].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_CTR,Gbl.Hierarchy.Node[HieLvl_CTR].HieCod));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();

View File

@ -632,10 +632,11 @@ TODO: Francisco Javier Fern
Me sale este error, no si por no recordar yo la sintaxis apropiada para mandar a varios destinatarios. ¿No era así? Me sale este error, no si por no recordar yo la sintaxis apropiada para mandar a varios destinatarios. ¿No era así?
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
*/ */
#define Log_PLATFORM_VERSION "SWAD 23.10 (2023-09-20)" #define Log_PLATFORM_VERSION "SWAD 23.11 (2023-09-20)"
#define CSS_FILE "swad22.120.4.css" #define CSS_FILE "swad22.120.4.css"
#define JS_FILE "swad22.49.js" #define JS_FILE "swad22.49.js"
/* /*
Version 23.11: Sep 20, 2023 Code refactoring in hierarchy. (337184 lines)
Version 23.10: Sep 20, 2023 Code refactoring in hierarchy. (337298 lines) Version 23.10: Sep 20, 2023 Code refactoring in hierarchy. (337298 lines)
Version 23.9.7: Sep 19, 2023 Code refactoring in hierarchy. (337352 lines) Version 23.9.7: Sep 19, 2023 Code refactoring in hierarchy. (337352 lines)
Version 23.9.6: Sep 19, 2023 Code refactoring in hierarchy. (337410 lines) Version 23.9.6: Sep 19, 2023 Code refactoring in hierarchy. (337410 lines)

View File

@ -255,22 +255,26 @@ void Cty_ListCountries2 (void)
/* Number of institutions in other countries */ /* Number of institutions in other countries */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Ins_GetCachedNumInssInCty (0)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_INSS,
HieLvl_CTY,0));
HTM_TD_End (); HTM_TD_End ();
/* Number of centers in other countries */ /* Number of centers in other countries */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Ctr_GetCachedNumCtrsInCty (0)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,
HieLvl_CTY,0));
HTM_TD_End (); HTM_TD_End ();
/* Number of degrees in other countries */ /* Number of degrees in other countries */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Deg_GetCachedNumDegsInCty (0)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_CTY,0));
HTM_TD_End (); HTM_TD_End ();
/* Number of courses in other countries */ /* Number of courses in other countries */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Crs_GetCachedNumCrssInCty (0)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_CTY,0));
HTM_TD_End (); HTM_TD_End ();
/* Number of users in courses of other countries */ /* Number of users in courses of other countries */
@ -300,22 +304,26 @@ void Cty_ListCountries2 (void)
/* Number of institutions with unknown country */ /* Number of institutions with unknown country */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Ins_GetCachedNumInssInCty (-1L)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_INSS,
HieLvl_CTY,-1L));
HTM_TD_End (); HTM_TD_End ();
/* Number of centers with unknown country */ /* Number of centers with unknown country */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Ctr_GetCachedNumCtrsInCty (-1L)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,
HieLvl_CTY,-1L));
HTM_TD_End (); HTM_TD_End ();
/* Number of degrees with unknown country */ /* Number of degrees with unknown country */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Deg_GetCachedNumDegsInCty (-1L)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_CTY,-1L));
HTM_TD_End (); HTM_TD_End ();
/* Number of courses with unknown country */ /* Number of courses with unknown country */
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Crs_GetCachedNumCrssInCty (-1L)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_CTY,-1L));
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"RM DAT_%s\"",The_GetSuffix ());
@ -434,25 +442,29 @@ static void Cty_ListOneCountryForSeeing (struct Hie_Node *Cty,unsigned NumCty)
/***** Number of institutions *****/ /***** Number of institutions *****/
HTM_TD_Begin ("class=\"RM DAT_%s %s\"", HTM_TD_Begin ("class=\"RM DAT_%s %s\"",
The_GetSuffix (),BgColor); The_GetSuffix (),BgColor);
HTM_Unsigned (Ins_GetCachedNumInssInCty (Cty->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_INSS,
HieLvl_CTY,Cty->HieCod));
HTM_TD_End (); HTM_TD_End ();
/***** Number of centers *****/ /***** Number of centers *****/
HTM_TD_Begin ("class=\"RM DAT_%s %s\"", HTM_TD_Begin ("class=\"RM DAT_%s %s\"",
The_GetSuffix (),BgColor); The_GetSuffix (),BgColor);
HTM_Unsigned (Ctr_GetCachedNumCtrsInCty (Cty->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,
HieLvl_CTY,Cty->HieCod));
HTM_TD_End (); HTM_TD_End ();
/***** Number of degrees *****/ /***** Number of degrees *****/
HTM_TD_Begin ("class=\"RM DAT_%s %s\"", HTM_TD_Begin ("class=\"RM DAT_%s %s\"",
The_GetSuffix (),BgColor); The_GetSuffix (),BgColor);
HTM_Unsigned (Deg_GetCachedNumDegsInCty (Cty->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_CTY,Cty->HieCod));
HTM_TD_End (); HTM_TD_End ();
/***** Number of courses *****/ /***** Number of courses *****/
HTM_TD_Begin ("class=\"RM DAT_%s %s\"", HTM_TD_Begin ("class=\"RM DAT_%s %s\"",
The_GetSuffix (),BgColor); The_GetSuffix (),BgColor);
HTM_Unsigned (Crs_GetCachedNumCrssInCty (Cty->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_CTY,Cty->HieCod));
HTM_TD_End (); HTM_TD_End ();
/***** Number of users in courses *****/ /***** Number of users in courses *****/
@ -623,7 +635,8 @@ void Cty_WriteScriptGoogleGeochart (void)
NumUsrsCty = Cty_GetCachedNumUsrsWhoClaimToBelongToCty (&Gbl.Hierarchy.List[HieLvl_SYS].Lst[NumCty]); NumUsrsCty = Cty_GetCachedNumUsrsWhoClaimToBelongToCty (&Gbl.Hierarchy.List[HieLvl_SYS].Lst[NumCty]);
if (NumUsrsCty) if (NumUsrsCty)
{ {
NumInss = Ins_GetCachedNumInssInCty (Gbl.Hierarchy.List[HieLvl_SYS].Lst[NumCty].HieCod); NumInss = Hie_GetCachedNumNodesIn (FigCch_NUM_INSS,
HieLvl_CTY,Gbl.Hierarchy.List[HieLvl_SYS].Lst[NumCty].HieCod);
/* Write data of this country */ /* Write data of this country */
HTM_TxtF (" ['%s', %u, %u],\n", HTM_TxtF (" ['%s', %u, %u],\n",
@ -998,7 +1011,7 @@ void Cty_GetNamesAndWWWsByCod (struct Hie_Node *Cty,
void Cty_FlushCacheCountryName (void) void Cty_FlushCacheCountryName (void)
{ {
Gbl.Cache.CountryName.CtyCod = -1L; Gbl.Cache.CountryName.HieCod = -1L;
Gbl.Cache.CountryName.Language = Lan_LANGUAGE_UNKNOWN; Gbl.Cache.CountryName.Language = Lan_LANGUAGE_UNKNOWN;
Gbl.Cache.CountryName.CtyName[0] = '\0'; Gbl.Cache.CountryName.CtyName[0] = '\0';
} }
@ -1014,7 +1027,7 @@ void Cty_GetCountryNameInLanguage (long CtyCod,Lan_Language_t Language,
} }
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (CtyCod == Gbl.Cache.CountryName.CtyCod && if (CtyCod == Gbl.Cache.CountryName.HieCod &&
Language == Gbl.Cache.CountryName.Language) Language == Gbl.Cache.CountryName.Language)
{ {
Str_Copy (CtyName,Gbl.Cache.CountryName.CtyName,Cty_MAX_BYTES_NAME); Str_Copy (CtyName,Gbl.Cache.CountryName.CtyName,Cty_MAX_BYTES_NAME);
@ -1023,7 +1036,7 @@ void Cty_GetCountryNameInLanguage (long CtyCod,Lan_Language_t Language,
/***** 3. Slow: get country name from database *****/ /***** 3. Slow: get country name from database *****/
Cty_DB_GetCountryName (CtyCod,Language,CtyName); Cty_DB_GetCountryName (CtyCod,Language,CtyName);
Gbl.Cache.CountryName.CtyCod = CtyCod; Gbl.Cache.CountryName.HieCod = CtyCod;
Gbl.Cache.CountryName.Language = Language; Gbl.Cache.CountryName.Language = Language;
Str_Copy (Gbl.Cache.CountryName.CtyName,CtyName,Cty_MAX_BYTES_NAME); Str_Copy (Gbl.Cache.CountryName.CtyName,CtyName,Cty_MAX_BYTES_NAME);
} }
@ -1624,27 +1637,6 @@ void Cty_ReceiveFormNewCountry (void)
} }
} }
/*****************************************************************************/
/*********************** Get total number of countries ***********************/
/*****************************************************************************/
unsigned Cty_GetCachedNumCtysInSys (void)
{
unsigned NumCtys;
/***** Get number of countries from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTYS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumCtys))
{
/***** Get current number of countries from database and update cache *****/
NumCtys = (unsigned) DB_GetNumRowsTable ("cty_countrs");
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumCtys);
}
return NumCtys;
}
/*****************************************************************************/ /*****************************************************************************/
/***************** Get number of countries with institutions *****************/ /***************** Get number of countries with institutions *****************/
/*****************************************************************************/ /*****************************************************************************/
@ -2017,7 +2009,7 @@ unsigned Cty_GetCachedNumUsrsWhoClaimToBelongToAnotherCty (void)
void Cty_FlushCacheNumUsrsWhoClaimToBelongToCty (void) void Cty_FlushCacheNumUsrsWhoClaimToBelongToCty (void)
{ {
Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod = -1L; Gbl.Cache.NumUsrsWhoClaimToBelongToCty.HieCod = -1L;
Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs = 0; Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs = 0;
} }
@ -2032,7 +2024,7 @@ unsigned Cty_GetNumUsrsWhoClaimToBelongToCty (struct Hie_Node *Cty)
return Cty->NumUsrsWhoClaimToBelong.NumUsrs; return Cty->NumUsrsWhoClaimToBelong.NumUsrs;
/***** 3. Fast check: If cached... *****/ /***** 3. Fast check: If cached... *****/
if (Cty->HieCod == Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod) if (Cty->HieCod == Gbl.Cache.NumUsrsWhoClaimToBelongToCty.HieCod)
{ {
Cty->NumUsrsWhoClaimToBelong.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs; Cty->NumUsrsWhoClaimToBelong.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs;
Cty->NumUsrsWhoClaimToBelong.Valid = true; Cty->NumUsrsWhoClaimToBelong.Valid = true;
@ -2041,11 +2033,11 @@ unsigned Cty_GetNumUsrsWhoClaimToBelongToCty (struct Hie_Node *Cty)
/***** 4. Slow: number of users who claim to belong to an institution /***** 4. Slow: number of users who claim to belong to an institution
from database *****/ from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod = Cty->HieCod; Gbl.Cache.NumUsrsWhoClaimToBelongToCty.HieCod = Cty->HieCod;
Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs =
Cty->NumUsrsWhoClaimToBelong.NumUsrs = Cty_DB_GetNumUsrsWhoClaimToBelongToCty (Cty->HieCod); Cty->NumUsrsWhoClaimToBelong.NumUsrs = Cty_DB_GetNumUsrsWhoClaimToBelongToCty (Cty->HieCod);
Cty->NumUsrsWhoClaimToBelong.Valid = true; Cty->NumUsrsWhoClaimToBelong.Valid = true;
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_BELONG_CTY,HieLvl_CTY,Gbl.Cache.NumUsrsWhoClaimToBelongToCty.CtyCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_BELONG_CTY,HieLvl_CTY,Gbl.Cache.NumUsrsWhoClaimToBelongToCty.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs); FigCch_UNSIGNED,&Gbl.Cache.NumUsrsWhoClaimToBelongToCty.NumUsrs);
return Cty->NumUsrsWhoClaimToBelong.NumUsrs; return Cty->NumUsrsWhoClaimToBelong.NumUsrs;
} }

View File

@ -82,8 +82,6 @@ void Cty_ChangeCtyWWW (void);
void Cty_ContEditAfterChgCty (void); void Cty_ContEditAfterChgCty (void);
void Cty_ReceiveFormNewCountry (void); void Cty_ReceiveFormNewCountry (void);
unsigned Cty_GetCachedNumCtysInSys (void);
unsigned Cty_GetCachedNumCtysWithInss (void); unsigned Cty_GetCachedNumCtysWithInss (void);
unsigned Cty_GetCachedNumCtysWithCtrs (void); unsigned Cty_GetCachedNumCtysWithCtrs (void);
unsigned Cty_GetCachedNumCtysWithDegs (void); unsigned Cty_GetCachedNumCtysWithDegs (void);

View File

@ -149,7 +149,8 @@ static void CtyCfg_Configuration (bool PrintView)
CtyCfg_QR (); CtyCfg_QR ();
else else
{ {
NumCtrs = Ctr_GetCachedNumCtrsInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod); NumCtrs = Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,
HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod);
/* Number of users who claim to belong to this country, /* Number of users who claim to belong to this country,
number of institutions, number of institutions,
@ -489,7 +490,8 @@ static void CtyCfg_NumInss (void)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_BUTTON_Submit_Begin (Title,"class=\"LT BT_LINK\""); HTM_BUTTON_Submit_Begin (Title,"class=\"LT BT_LINK\"");
free (Title); free (Title);
HTM_Unsigned (Ins_GetCachedNumInssInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_INSS,
HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod));
HTM_BUTTON_End (); HTM_BUTTON_End ();
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
@ -513,7 +515,8 @@ static void CtyCfg_NumDegs (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Deg_GetCachedNumDegsInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -535,7 +538,8 @@ static void CtyCfg_NumCrss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Crs_GetCachedNumCrssInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();

View File

@ -407,34 +407,13 @@ static void Crs_WriteListMyCoursesToSelectOne (void)
Box_BoxEnd (); Box_BoxEnd ();
} }
/*****************************************************************************/
/*********************** Get total number of courses *************************/
/*****************************************************************************/
unsigned Crs_GetCachedNumCrssInSys (void)
{
unsigned NumCrss;
/***** Get number of courses from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumCrss))
{
/***** Get current number of courses from database and update cache *****/
NumCrss = (unsigned) DB_GetNumRowsTable ("crs_courses");
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumCrss);
}
return NumCrss;
}
/*****************************************************************************/ /*****************************************************************************/
/****************** Get number of courses in a country ***********************/ /****************** Get number of courses in a country ***********************/
/*****************************************************************************/ /*****************************************************************************/
void Crs_FlushCacheNumCrssInCty (void) void Crs_FlushCacheNumCrssInCty (void)
{ {
Gbl.Cache.NumCrssInCty.CtyCod = -1L; Gbl.Cache.NumCrssInCty.HieCod = -1L;
Gbl.Cache.NumCrssInCty.NumCrss = 0; Gbl.Cache.NumCrssInCty.NumCrss = 0;
} }
@ -445,37 +424,24 @@ unsigned Crs_GetNumCrssInCty (long CtyCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (CtyCod == Gbl.Cache.NumCrssInCty.CtyCod) if (CtyCod == Gbl.Cache.NumCrssInCty.HieCod)
return Gbl.Cache.NumCrssInCty.NumCrss; return Gbl.Cache.NumCrssInCty.NumCrss;
/***** 3. Slow: number of courses in a country from database *****/ /***** 3. Slow: number of courses in a country from database *****/
Gbl.Cache.NumCrssInCty.CtyCod = CtyCod; Gbl.Cache.NumCrssInCty.HieCod = CtyCod;
Gbl.Cache.NumCrssInCty.NumCrss = Crs_DB_GetNumCrssInCty (CtyCod); Gbl.Cache.NumCrssInCty.NumCrss = Crs_DB_GetNumCrssInCty (CtyCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_CTY,Gbl.Cache.NumCrssInCty.CtyCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_CTY,Gbl.Cache.NumCrssInCty.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumCrssInCty.NumCrss); FigCch_UNSIGNED,&Gbl.Cache.NumCrssInCty.NumCrss);
return Gbl.Cache.NumCrssInCty.NumCrss; return Gbl.Cache.NumCrssInCty.NumCrss;
} }
unsigned Crs_GetCachedNumCrssInCty (long CtyCod)
{
unsigned NumCrss;
/***** Get number of courses from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,HieLvl_CTY,CtyCod,
FigCch_UNSIGNED,&NumCrss))
/***** Get current number of courses from database and update cache *****/
NumCrss = Crs_GetNumCrssInCty (CtyCod);
return NumCrss;
}
/*****************************************************************************/ /*****************************************************************************/
/**************** Get number of courses in an institution ********************/ /**************** Get number of courses in an institution ********************/
/*****************************************************************************/ /*****************************************************************************/
void Crs_FlushCacheNumCrssInIns (void) void Crs_FlushCacheNumCrssInIns (void)
{ {
Gbl.Cache.NumCrssInIns.InsCod = -1L; Gbl.Cache.NumCrssInIns.HieCod = -1L;
Gbl.Cache.NumCrssInIns.NumCrss = 0; Gbl.Cache.NumCrssInIns.NumCrss = 0;
} }
@ -486,37 +452,24 @@ unsigned Crs_GetNumCrssInIns (long InsCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (InsCod == Gbl.Cache.NumCrssInIns.InsCod) if (InsCod == Gbl.Cache.NumCrssInIns.HieCod)
return Gbl.Cache.NumCrssInIns.NumCrss; return Gbl.Cache.NumCrssInIns.NumCrss;
/***** 3. Slow: number of courses in an institution from database *****/ /***** 3. Slow: number of courses in an institution from database *****/
Gbl.Cache.NumCrssInIns.InsCod = InsCod; Gbl.Cache.NumCrssInIns.HieCod = InsCod;
Gbl.Cache.NumCrssInIns.NumCrss = Crs_DB_GetNumCrssInIns (InsCod); Gbl.Cache.NumCrssInIns.NumCrss = Crs_DB_GetNumCrssInIns (InsCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_INS,Gbl.Cache.NumCrssInIns.InsCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_INS,Gbl.Cache.NumCrssInIns.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumCrssInIns.NumCrss); FigCch_UNSIGNED,&Gbl.Cache.NumCrssInIns.NumCrss);
return Gbl.Cache.NumCrssInIns.NumCrss; return Gbl.Cache.NumCrssInIns.NumCrss;
} }
unsigned Crs_GetCachedNumCrssInIns (long InsCod)
{
unsigned NumCrss;
/***** Get number of courses from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,HieLvl_INS,InsCod,
FigCch_UNSIGNED,&NumCrss))
/***** Get current number of courses from database and update cache *****/
NumCrss = Crs_GetNumCrssInIns (InsCod);
return NumCrss;
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Get number of courses in a center **********************/ /******************** Get number of courses in a center **********************/
/*****************************************************************************/ /*****************************************************************************/
void Crs_FlushCacheNumCrssInCtr (void) void Crs_FlushCacheNumCrssInCtr (void)
{ {
Gbl.Cache.NumCrssInCtr.CtrCod = -1L; Gbl.Cache.NumCrssInCtr.HieCod = -1L;
Gbl.Cache.NumCrssInCtr.NumCrss = 0; Gbl.Cache.NumCrssInCtr.NumCrss = 0;
} }
@ -527,39 +480,24 @@ unsigned Crs_GetNumCrssInCtr (long CtrCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (CtrCod == Gbl.Cache.NumCrssInCtr.CtrCod) if (CtrCod == Gbl.Cache.NumCrssInCtr.HieCod)
return Gbl.Cache.NumCrssInCtr.NumCrss; return Gbl.Cache.NumCrssInCtr.NumCrss;
/***** 3. Slow: number of courses in a center from database *****/ /***** 3. Slow: number of courses in a center from database *****/
Gbl.Cache.NumCrssInCtr.CtrCod = CtrCod; Gbl.Cache.NumCrssInCtr.HieCod = CtrCod;
Gbl.Cache.NumCrssInCtr.NumCrss = Crs_DB_GetNumCrssInCtr (CtrCod); Gbl.Cache.NumCrssInCtr.NumCrss = Crs_DB_GetNumCrssInCtr (CtrCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_CTR,Gbl.Cache.NumCrssInCtr.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumCrssInCtr.NumCrss);
return Gbl.Cache.NumCrssInCtr.NumCrss; return Gbl.Cache.NumCrssInCtr.NumCrss;
} }
unsigned Crs_GetCachedNumCrssInCtr (long CtrCod)
{
unsigned NumCrss;
/***** Get number of courses from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,HieLvl_CTR,CtrCod,
FigCch_UNSIGNED,&NumCrss))
{
/***** Get current number of courses from database and update cache *****/
NumCrss = Crs_GetNumCrssInCtr (CtrCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_CTR,CtrCod,
FigCch_UNSIGNED,&NumCrss);
}
return NumCrss;
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Get number of courses in a degree **********************/ /******************** Get number of courses in a degree **********************/
/*****************************************************************************/ /*****************************************************************************/
void Crs_FlushCacheNumCrssInDeg (void) void Crs_FlushCacheNumCrssInDeg (void)
{ {
Gbl.Cache.NumCrssInDeg.DegCod = -1L; Gbl.Cache.NumCrssInDeg.HieCod = -1L;
Gbl.Cache.NumCrssInDeg.NumCrss = 0; Gbl.Cache.NumCrssInDeg.NumCrss = 0;
} }
@ -570,30 +508,17 @@ unsigned Crs_GetNumCrssInDeg (long DegCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (DegCod == Gbl.Cache.NumCrssInDeg.DegCod) if (DegCod == Gbl.Cache.NumCrssInDeg.HieCod)
return Gbl.Cache.NumCrssInDeg.NumCrss; return Gbl.Cache.NumCrssInDeg.NumCrss;
/***** 3. Slow: number of courses in a degree from database *****/ /***** 3. Slow: number of courses in a degree from database *****/
Gbl.Cache.NumCrssInDeg.DegCod = DegCod; Gbl.Cache.NumCrssInDeg.HieCod = DegCod;
Gbl.Cache.NumCrssInDeg.NumCrss = Crs_DB_GetNumCrssInDeg (DegCod); Gbl.Cache.NumCrssInDeg.NumCrss = Crs_DB_GetNumCrssInDeg (DegCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_DEG,Gbl.Cache.NumCrssInDeg.DegCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_CRSS,HieLvl_DEG,Gbl.Cache.NumCrssInDeg.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumCrssInDeg.NumCrss); FigCch_UNSIGNED,&Gbl.Cache.NumCrssInDeg.NumCrss);
return Gbl.Cache.NumCrssInDeg.NumCrss; return Gbl.Cache.NumCrssInDeg.NumCrss;
} }
unsigned Crs_GetCachedNumCrssInDeg (long DegCod)
{
unsigned NumCrss;
/***** Get number of courses from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_CRSS,HieLvl_DEG,DegCod,
FigCch_UNSIGNED,&NumCrss))
/***** Get current number of courses from database and update cache *****/
NumCrss = Crs_GetNumCrssInDeg (DegCod);
return NumCrss;
}
/*****************************************************************************/ /*****************************************************************************/
/********************* Get number of courses with users **********************/ /********************* Get number of courses with users **********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -32,6 +32,7 @@
#include "swad_constant.h" #include "swad_constant.h"
#include "swad_degree.h" #include "swad_degree.h"
#include "swad_figure_cache.h"
#include "swad_hierarchy_level.h" #include "swad_hierarchy_level.h"
#include "swad_user.h" #include "swad_user.h"
@ -51,23 +52,17 @@
void Crs_ShowIntroduction (void); void Crs_ShowIntroduction (void);
unsigned Crs_GetCachedNumCrssInSys (void);
void Crs_FlushCacheNumCrssInCty (void); void Crs_FlushCacheNumCrssInCty (void);
unsigned Crs_GetNumCrssInCty (long CtyCod); unsigned Crs_GetNumCrssInCty (long CtyCod);
unsigned Crs_GetCachedNumCrssInCty (long CtyCod);
void Crs_FlushCacheNumCrssInIns (void); void Crs_FlushCacheNumCrssInIns (void);
unsigned Crs_GetNumCrssInIns (long InsCod); unsigned Crs_GetNumCrssInIns (long InsCod);
unsigned Crs_GetCachedNumCrssInIns (long InsCod);
void Crs_FlushCacheNumCrssInCtr (void); void Crs_FlushCacheNumCrssInCtr (void);
unsigned Crs_GetNumCrssInCtr (long CtrCod); unsigned Crs_GetNumCrssInCtr (long CtrCod);
unsigned Crs_GetCachedNumCrssInCtr (long CtrCod);
void Crs_FlushCacheNumCrssInDeg (void); void Crs_FlushCacheNumCrssInDeg (void);
unsigned Crs_GetNumCrssInDeg (long DegCod); unsigned Crs_GetNumCrssInDeg (long DegCod);
unsigned Crs_GetCachedNumCrssInDeg (long DegCod);
unsigned Crs_GetCachedNumCrssWithUsrs (Rol_Role_t Role); unsigned Crs_GetCachedNumCrssWithUsrs (Rol_Role_t Role);

View File

@ -796,7 +796,8 @@ static void Deg_ListOneDegreeForSeeing (struct Hie_Node *Deg,unsigned NumDeg)
const char *TxtClassNormal; const char *TxtClassNormal;
const char *TxtClassStrong; const char *TxtClassStrong;
const char *BgColor; const char *BgColor;
unsigned NumCrss = Crs_GetCachedNumCrssInDeg (Deg->HieCod); unsigned NumCrss = Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_DEG,Deg->HieCod);
/***** Get data of type of degree of this degree *****/ /***** Get data of type of degree of this degree *****/
DegTyp.DegTypCod = Deg->Specific.TypCod; DegTyp.DegTypCod = Deg->Specific.TypCod;
@ -1523,34 +1524,13 @@ static void Deg_ShowAlertAndButtonToGoToDeg (void)
Ale_ShowAlerts (NULL); Ale_ShowAlerts (NULL);
} }
/*****************************************************************************/
/*********************** Get total number of degrees *************************/
/*****************************************************************************/
unsigned Deg_GetCachedNumDegsInSys (void)
{
unsigned NumDegs;
/***** Get number of degrees from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_DEGS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumDegs))
{
/***** Get current number of degrees from database and update cache *****/
NumDegs = (unsigned) DB_GetNumRowsTable ("deg_degrees");
FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumDegs);
}
return NumDegs;
}
/*****************************************************************************/ /*****************************************************************************/
/********************* Get number of degrees in a country ********************/ /********************* Get number of degrees in a country ********************/
/*****************************************************************************/ /*****************************************************************************/
void Deg_FlushCacheNumDegsInCty (void) void Deg_FlushCacheNumDegsInCty (void)
{ {
Gbl.Cache.NumDegsInCty.CtyCod = -1L; Gbl.Cache.NumDegsInCty.HieCod = -1L;
Gbl.Cache.NumDegsInCty.NumDegs = 0; Gbl.Cache.NumDegsInCty.NumDegs = 0;
} }
@ -1561,37 +1541,24 @@ unsigned Deg_GetNumDegsInCty (long CtyCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (CtyCod == Gbl.Cache.NumDegsInCty.CtyCod) if (CtyCod == Gbl.Cache.NumDegsInCty.HieCod)
return Gbl.Cache.NumDegsInCty.NumDegs; return Gbl.Cache.NumDegsInCty.NumDegs;
/***** 3. Slow: number of degrees in a country from database *****/ /***** 3. Slow: number of degrees in a country from database *****/
Gbl.Cache.NumDegsInCty.CtyCod = CtyCod; Gbl.Cache.NumDegsInCty.HieCod = CtyCod;
Gbl.Cache.NumDegsInCty.NumDegs = Deg_DB_GetNumDegsInCty (CtyCod); Gbl.Cache.NumDegsInCty.NumDegs = Deg_DB_GetNumDegsInCty (CtyCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_CTY,Gbl.Cache.NumDegsInCty.CtyCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_CTY,Gbl.Cache.NumDegsInCty.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumDegsInCty.NumDegs); FigCch_UNSIGNED,&Gbl.Cache.NumDegsInCty.NumDegs);
return Gbl.Cache.NumDegsInCty.NumDegs; return Gbl.Cache.NumDegsInCty.NumDegs;
} }
unsigned Deg_GetCachedNumDegsInCty (long CtyCod)
{
unsigned NumDegs;
/***** Get number of degrees from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_DEGS,HieLvl_CTY,CtyCod,
FigCch_UNSIGNED,&NumDegs))
/***** Get current number of degrees from database and update cache *****/
NumDegs = Deg_GetNumDegsInCty (CtyCod);
return NumDegs;
}
/*****************************************************************************/ /*****************************************************************************/
/****************** Get number of degrees in an institution ******************/ /****************** Get number of degrees in an institution ******************/
/*****************************************************************************/ /*****************************************************************************/
void Deg_FlushCacheNumDegsInIns (void) void Deg_FlushCacheNumDegsInIns (void)
{ {
Gbl.Cache.NumDegsInIns.InsCod = -1L; Gbl.Cache.NumDegsInIns.HieCod = -1L;
Gbl.Cache.NumDegsInIns.NumDegs = 0; Gbl.Cache.NumDegsInIns.NumDegs = 0;
} }
@ -1602,37 +1569,24 @@ unsigned Deg_GetNumDegsInIns (long InsCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (InsCod == Gbl.Cache.NumDegsInIns.InsCod) if (InsCod == Gbl.Cache.NumDegsInIns.HieCod)
return Gbl.Cache.NumDegsInIns.NumDegs; return Gbl.Cache.NumDegsInIns.NumDegs;
/***** 3. Slow: number of degrees in an institution from database *****/ /***** 3. Slow: number of degrees in an institution from database *****/
Gbl.Cache.NumDegsInIns.InsCod = InsCod; Gbl.Cache.NumDegsInIns.HieCod = InsCod;
Gbl.Cache.NumDegsInIns.NumDegs = Deg_DB_GetNumDegsInIns (InsCod); Gbl.Cache.NumDegsInIns.NumDegs = Deg_DB_GetNumDegsInIns (InsCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_INS,Gbl.Cache.NumDegsInIns.InsCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_INS,Gbl.Cache.NumDegsInIns.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumDegsInIns.NumDegs); FigCch_UNSIGNED,&Gbl.Cache.NumDegsInIns.NumDegs);
return Gbl.Cache.NumDegsInIns.NumDegs; return Gbl.Cache.NumDegsInIns.NumDegs;
} }
unsigned Deg_GetCachedNumDegsInIns (long InsCod)
{
unsigned NumDegs;
/***** Get number of degrees from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_DEGS,HieLvl_INS,InsCod,
FigCch_UNSIGNED,&NumDegs))
/***** Get current number of degrees from database and update cache *****/
NumDegs = Deg_GetNumDegsInIns (InsCod);
return NumDegs;
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Get number of degrees in a center **********************/ /******************** Get number of degrees in a center **********************/
/*****************************************************************************/ /*****************************************************************************/
void Deg_FlushCacheNumDegsInCtr (void) void Deg_FlushCacheNumDegsInCtr (void)
{ {
Gbl.Cache.NumDegsInCtr.CtrCod = -1L; Gbl.Cache.NumDegsInCtr.HieCod = -1L;
Gbl.Cache.NumDegsInCtr.NumDegs = 0; Gbl.Cache.NumDegsInCtr.NumDegs = 0;
} }
@ -1643,30 +1597,17 @@ unsigned Deg_GetNumDegsInCtr (long CtrCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (CtrCod == Gbl.Cache.NumDegsInCtr.CtrCod) if (CtrCod == Gbl.Cache.NumDegsInCtr.HieCod)
return Gbl.Cache.NumDegsInCtr.NumDegs; return Gbl.Cache.NumDegsInCtr.NumDegs;
/***** 3. Slow: number of degrees in a center from database *****/ /***** 3. Slow: number of degrees in a center from database *****/
Gbl.Cache.NumDegsInCtr.CtrCod = CtrCod; Gbl.Cache.NumDegsInCtr.HieCod = CtrCod;
Gbl.Cache.NumDegsInCtr.NumDegs = Deg_DB_GetNumDegsInCtr (CtrCod); Gbl.Cache.NumDegsInCtr.NumDegs = Deg_DB_GetNumDegsInCtr (CtrCod);
FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_CTR,Gbl.Cache.NumDegsInCtr.CtrCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_DEGS,HieLvl_CTR,Gbl.Cache.NumDegsInCtr.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumDegsInCtr.NumDegs); FigCch_UNSIGNED,&Gbl.Cache.NumDegsInCtr.NumDegs);
return Gbl.Cache.NumDegsInCtr.NumDegs; return Gbl.Cache.NumDegsInCtr.NumDegs;
} }
unsigned Deg_GetCachedNumDegsInCtr (long CtrCod)
{
unsigned NumDegs;
/***** Get number of degrees from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_DEGS,HieLvl_CTR,CtrCod,
FigCch_UNSIGNED,&NumDegs))
/***** Get current number of degrees from database and update cache *****/
NumDegs = Deg_GetNumDegsInCtr (CtrCod);
return NumDegs;
}
/*****************************************************************************/ /*****************************************************************************/
/********************* Get number of centers with courses ********************/ /********************* Get number of centers with courses ********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -31,6 +31,7 @@
#include "swad_action.h" #include "swad_action.h"
#include "swad_constant.h" #include "swad_constant.h"
#include "swad_figure_cache.h"
#include "swad_hierarchy_level.h" #include "swad_hierarchy_level.h"
#include "swad_role_type.h" #include "swad_role_type.h"
#include "swad_string.h" #include "swad_string.h"
@ -80,19 +81,14 @@ void Deg_ChangeDegWWW (void);
void Deg_ChangeDegStatus (void); void Deg_ChangeDegStatus (void);
void Deg_ContEditAfterChgDeg (void); void Deg_ContEditAfterChgDeg (void);
unsigned Deg_GetCachedNumDegsInSys (void);
void Deg_FlushCacheNumDegsInCty (void); void Deg_FlushCacheNumDegsInCty (void);
unsigned Deg_GetNumDegsInCty (long CtyCod); unsigned Deg_GetNumDegsInCty (long CtyCod);
unsigned Deg_GetCachedNumDegsInCty (long CtyCod);
void Deg_FlushCacheNumDegsInIns (void); void Deg_FlushCacheNumDegsInIns (void);
unsigned Deg_GetNumDegsInIns (long InsCod); unsigned Deg_GetNumDegsInIns (long InsCod);
unsigned Deg_GetCachedNumDegsInIns (long InsCod);
void Deg_FlushCacheNumDegsInCtr (void); void Deg_FlushCacheNumDegsInCtr (void);
unsigned Deg_GetNumDegsInCtr (long CtrCod); unsigned Deg_GetNumDegsInCtr (long CtrCod);
unsigned Deg_GetCachedNumDegsInCtr (long CtrCod);
unsigned Deg_GetCachedNumDegsWithCrss (void); unsigned Deg_GetCachedNumDegsWithCrss (void);
unsigned Deg_GetCachedNumDegsWithUsrs (Rol_Role_t Role); unsigned Deg_GetCachedNumDegsWithUsrs (Rol_Role_t Role);

View File

@ -335,7 +335,8 @@ static void DegCfg_NumCrss (void)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_BUTTON_Submit_Begin (Title,"class=\"LB BT_LINK\""); HTM_BUTTON_Submit_Begin (Title,"class=\"LB BT_LINK\"");
free (Title); free (Title);
HTM_Unsigned (Crs_GetCachedNumCrssInDeg (Gbl.Hierarchy.Node[HieLvl_DEG].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_DEG,Gbl.Hierarchy.Node[HieLvl_DEG].HieCod));
HTM_BUTTON_End (); HTM_BUTTON_End ();
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();

View File

@ -990,7 +990,7 @@ unsigned Dpt_GetTotalNumberOfDepartments (void)
void Dpt_FlushCacheNumDptsInIns (void) void Dpt_FlushCacheNumDptsInIns (void)
{ {
Gbl.Cache.NumDptsInIns.InsCod = -1L; Gbl.Cache.NumDptsInIns.HieCod = -1L;
Gbl.Cache.NumDptsInIns.NumDpts = 0; Gbl.Cache.NumDptsInIns.NumDpts = 0;
} }
@ -1001,11 +1001,11 @@ unsigned Dpt_GetNumDptsInIns (long InsCod)
return 0; return 0;
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (InsCod == Gbl.Cache.NumDptsInIns.InsCod) if (InsCod == Gbl.Cache.NumDptsInIns.HieCod)
return Gbl.Cache.NumDptsInIns.NumDpts; return Gbl.Cache.NumDptsInIns.NumDpts;
/***** 3. Slow: number of departments of an institution from database *****/ /***** 3. Slow: number of departments of an institution from database *****/
Gbl.Cache.NumDptsInIns.InsCod = InsCod; Gbl.Cache.NumDptsInIns.HieCod = InsCod;
Gbl.Cache.NumDptsInIns.NumDpts = Dpt_DB_GetNumDepartmentsInInstitution (InsCod); Gbl.Cache.NumDptsInIns.NumDpts = Dpt_DB_GetNumDepartmentsInInstitution (InsCod);
return Gbl.Cache.NumDptsInIns.NumDpts; return Gbl.Cache.NumDptsInIns.NumDpts;
} }

View File

@ -39,7 +39,7 @@
/*****************************************************************************/ /*****************************************************************************/
void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure, void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
FigCch_Type_t Type,const void *ValuePtr) FigCch_Type_t Type,const void *ValuePtr)
{ {
/***** Trivial check *****/ /***** Trivial check *****/
@ -50,11 +50,11 @@ void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
switch (Type) switch (Type)
{ {
case FigCch_UNSIGNED: case FigCch_UNSIGNED:
Fig_DB_UpdateUnsignedFigureIntoCache (Figure,Level,Cod, Fig_DB_UpdateUnsignedFigureIntoCache (Figure,Level,HieCod,
*((unsigned *) ValuePtr)); *((unsigned *) ValuePtr));
break; break;
case FigCch_DOUBLE: case FigCch_DOUBLE:
Fig_DB_UpdateDoubleFigureIntoCache (Figure,Level,Cod, Fig_DB_UpdateDoubleFigureIntoCache (Figure,Level,HieCod,
*((double *) ValuePtr)); *((double *) ValuePtr));
break; break;
} }
@ -66,7 +66,7 @@ void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
// Return true is figure is found (if figure is cached and recently updated) // Return true is figure is found (if figure is cached and recently updated)
bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure, bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
FigCch_Type_t Type,void *ValuePtr) FigCch_Type_t Type,void *ValuePtr)
{ {
/* The higher the level, the longer a value remains cached */ /* The higher the level, the longer a value remains cached */
@ -101,7 +101,7 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
return false; return false;
/***** Get figure's value if cached and recent *****/ /***** Get figure's value if cached and recent *****/
if (Fig_DB_GetFigureFromCache (&mysql_res,Figure,Level,Cod,Type,TimeCached[Level])) if (Fig_DB_GetFigureFromCache (&mysql_res,Figure,Level,HieCod,Type,TimeCached[Level]))
{ {
/* Get row */ /* Get row */
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);

View File

@ -111,10 +111,10 @@ typedef enum
/*****************************************************************************/ /*****************************************************************************/
void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure, void FigCch_UpdateFigureIntoCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
FigCch_Type_t Type,const void *ValuePtr); FigCch_Type_t Type,const void *ValuePtr);
bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure, bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
FigCch_Type_t Type,void *ValuePtr); FigCch_Type_t Type,void *ValuePtr);
#endif #endif

View File

@ -34,7 +34,7 @@
/*****************************************************************************/ /*****************************************************************************/
void Fig_DB_UpdateUnsignedFigureIntoCache (FigCch_FigureCached_t Figure, void Fig_DB_UpdateUnsignedFigureIntoCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
unsigned Value) unsigned Value)
{ {
DB_QueryREPLACE ("can not update cached figure value", DB_QueryREPLACE ("can not update cached figure value",
@ -44,7 +44,7 @@ void Fig_DB_UpdateUnsignedFigureIntoCache (FigCch_FigureCached_t Figure,
" (%u,'%s',%ld,%u,'0.0')", " (%u,'%s',%ld,%u,'0.0')",
(unsigned) Figure, (unsigned) Figure,
Hie_GetDBStrFromLevel (Level), Hie_GetDBStrFromLevel (Level),
Cod, HieCod,
Value); Value);
} }
@ -53,7 +53,7 @@ void Fig_DB_UpdateUnsignedFigureIntoCache (FigCch_FigureCached_t Figure,
/*****************************************************************************/ /*****************************************************************************/
void Fig_DB_UpdateDoubleFigureIntoCache (FigCch_FigureCached_t Figure, void Fig_DB_UpdateDoubleFigureIntoCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
double Value) double Value)
{ {
Str_SetDecimalPointToUS (); // To write the decimal point as a dot Str_SetDecimalPointToUS (); // To write the decimal point as a dot
@ -64,7 +64,7 @@ void Fig_DB_UpdateDoubleFigureIntoCache (FigCch_FigureCached_t Figure,
" (%u,'%s',%ld,0,'%.15lg')", " (%u,'%s',%ld,0,'%.15lg')",
(unsigned) Figure, (unsigned) Figure,
Hie_GetDBStrFromLevel (Level), Hie_GetDBStrFromLevel (Level),
Cod, HieCod,
Value); Value);
Str_SetDecimalPointToLocal (); // Return to local system Str_SetDecimalPointToLocal (); // Return to local system
} }
@ -75,7 +75,7 @@ void Fig_DB_UpdateDoubleFigureIntoCache (FigCch_FigureCached_t Figure,
unsigned Fig_DB_GetFigureFromCache (MYSQL_RES **mysql_res, unsigned Fig_DB_GetFigureFromCache (MYSQL_RES **mysql_res,
FigCch_FigureCached_t Figure, FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
FigCch_Type_t Type,time_t TimeCached) FigCch_Type_t Type,time_t TimeCached)
{ {
static const char *Field[FigCch_NUM_TYPES] = static const char *Field[FigCch_NUM_TYPES] =
@ -93,6 +93,6 @@ unsigned Fig_DB_GetFigureFromCache (MYSQL_RES **mysql_res,
" AND Cod=%ld" " AND Cod=%ld"
" AND LastUpdate>FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)", " AND LastUpdate>FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Field[Type], Field[Type],
(unsigned) Figure,Hie_GetDBStrFromLevel (Level),Cod, (unsigned) Figure,Hie_GetDBStrFromLevel (Level),HieCod,
TimeCached); TimeCached);
} }

View File

@ -37,15 +37,15 @@
/*****************************************************************************/ /*****************************************************************************/
void Fig_DB_UpdateUnsignedFigureIntoCache (FigCch_FigureCached_t Figure, void Fig_DB_UpdateUnsignedFigureIntoCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
unsigned Value); unsigned Value);
void Fig_DB_UpdateDoubleFigureIntoCache (FigCch_FigureCached_t Figure, void Fig_DB_UpdateDoubleFigureIntoCache (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
double Value); double Value);
unsigned Fig_DB_GetFigureFromCache (MYSQL_RES **mysql_res, unsigned Fig_DB_GetFigureFromCache (MYSQL_RES **mysql_res,
FigCch_FigureCached_t Figure, FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long Cod, HieLvl_Level_t Level,long HieCod,
FigCch_Type_t Type,time_t TimeCached); FigCch_Type_t Type,time_t TimeCached);
#endif #endif

View File

@ -291,70 +291,70 @@ struct Globals
{ {
struct struct
{ {
long CtyCod; long HieCod;
Lan_Language_t Language; Lan_Language_t Language;
char CtyName[Cty_MAX_BYTES_NAME + 1]; char CtyName[Cty_MAX_BYTES_NAME + 1];
} CountryName; } CountryName;
struct struct
{ {
long InsCod; long HieCod;
char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1];
char CtyName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1]; char CtyName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1];
} InstitutionShrtNameAndCty; } InstitutionShrtNameAndCty;
struct struct
{ {
long InsCod; long HieCod;
unsigned NumDpts; unsigned NumDpts;
} NumDptsInIns; } NumDptsInIns;
struct struct
{ {
bool Valid; bool Valid;
long CtyCod; long HieCod;
unsigned NumInss; unsigned NumInss;
} NumInssInCty; } NumInssInCty;
struct struct
{ {
long CtyCod; long HieCod;
unsigned NumCtrs; unsigned NumCtrs;
} NumCtrsInCty; } NumCtrsInCty;
struct struct
{ {
long InsCod; long HieCod;
unsigned NumCtrs; unsigned NumCtrs;
} NumCtrsInIns; } NumCtrsInIns;
struct struct
{ {
long CtyCod; long HieCod;
unsigned NumDegs; unsigned NumDegs;
} NumDegsInCty; } NumDegsInCty;
struct struct
{ {
long InsCod; long HieCod;
unsigned NumDegs; unsigned NumDegs;
} NumDegsInIns; } NumDegsInIns;
struct struct
{ {
long CtrCod; long HieCod;
unsigned NumDegs; unsigned NumDegs;
} NumDegsInCtr; } NumDegsInCtr;
struct struct
{ {
long CtyCod; long HieCod;
unsigned NumCrss; unsigned NumCrss;
} NumCrssInCty; } NumCrssInCty;
struct struct
{ {
long InsCod; long HieCod;
unsigned NumCrss; unsigned NumCrss;
} NumCrssInIns; } NumCrssInIns;
struct struct
{ {
long CtrCod; long HieCod;
unsigned NumCrss; unsigned NumCrss;
} NumCrssInCtr; } NumCrssInCtr;
struct struct
{ {
long DegCod; long HieCod;
unsigned NumCrss; unsigned NumCrss;
} NumCrssInDeg; } NumCrssInDeg;
struct struct
@ -369,17 +369,17 @@ struct Globals
} NumUsrsWhoClaimToBelongToAnotherCty; } NumUsrsWhoClaimToBelongToAnotherCty;
struct struct
{ {
long CtyCod; long HieCod;
unsigned NumUsrs; unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToCty; } NumUsrsWhoClaimToBelongToCty;
struct struct
{ {
long InsCod; long HieCod;
unsigned NumUsrs; unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToIns; } NumUsrsWhoClaimToBelongToIns;
struct struct
{ {
long CtrCod; long HieCod;
unsigned NumUsrs; unsigned NumUsrs;
} NumUsrsWhoClaimToBelongToCtr; } NumUsrsWhoClaimToBelongToCtr;
struct struct

View File

@ -405,7 +405,7 @@ void Hie_WriteHierarchyInBreadcrumb (void)
HTM_DIV_Begin ("class=\"BC%s BC_%s\"", HTM_DIV_Begin ("class=\"BC%s BC_%s\"",
(Gbl.Hierarchy.Level == HieLvl_CRS) ? "" : (Gbl.Hierarchy.Level == HieLvl_CRS) ? "" :
((Gbl.Hierarchy.Node[HieLvl_DEG].HieCod > 0) ? " BC_SEMIOFF" : ((Gbl.Hierarchy.Node[HieLvl_DEG].HieCod > 0) ? " BC_SEMIOFF" :
" BC_OFF"), " BC_OFF"),
The_GetSuffix ()); The_GetSuffix ());
/***** Separator *****/ /***** Separator *****/
@ -578,45 +578,45 @@ void Hie_InitHierarchy (void)
depending on course code, degree code, etc. *****/ depending on course code, degree code, etc. *****/
if (Gbl.Hierarchy.Node[HieLvl_CRS].HieCod > 0) // Course selected if (Gbl.Hierarchy.Node[HieLvl_CRS].HieCod > 0) // Course selected
{ {
Gbl.Hierarchy.Level = HieLvl_CRS; Gbl.Hierarchy.Level = HieLvl_CRS;
Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_CRS].HieCod; Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_CRS].HieCod;
} }
else if (Gbl.Hierarchy.Node[HieLvl_DEG].HieCod > 0) // Degree selected else if (Gbl.Hierarchy.Node[HieLvl_DEG].HieCod > 0) // Degree selected
{ {
Gbl.Hierarchy.Level = HieLvl_DEG; Gbl.Hierarchy.Level = HieLvl_DEG;
Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_DEG].HieCod; Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_DEG].HieCod;
} }
else if (Gbl.Hierarchy.Node[HieLvl_CTR].HieCod > 0) // Center selected else if (Gbl.Hierarchy.Node[HieLvl_CTR].HieCod > 0) // Center selected
{ {
Gbl.Hierarchy.Level = HieLvl_CTR; Gbl.Hierarchy.Level = HieLvl_CTR;
Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_CTR].HieCod; Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_CTR].HieCod;
} }
else if (Gbl.Hierarchy.Node[HieLvl_INS].HieCod > 0) // Institution selected else if (Gbl.Hierarchy.Node[HieLvl_INS].HieCod > 0) // Institution selected
{ {
Gbl.Hierarchy.Level = HieLvl_INS; Gbl.Hierarchy.Level = HieLvl_INS;
Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_INS].HieCod; Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_INS].HieCod;
} }
else if (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod > 0) // Country selected else if (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod > 0) // Country selected
{ {
Gbl.Hierarchy.Level = HieLvl_CTY; Gbl.Hierarchy.Level = HieLvl_CTY;
Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_CTY].HieCod; Gbl.Hierarchy.HieCod = Gbl.Hierarchy.Node[HieLvl_CTY].HieCod;
} }
else else
{ {
Gbl.Hierarchy.Level = HieLvl_SYS; Gbl.Hierarchy.Level = HieLvl_SYS;
Gbl.Hierarchy.HieCod = -1L; Gbl.Hierarchy.HieCod = -1L;
} }
/***** Initialize paths *****/ /***** Initialize paths *****/
if (Gbl.Hierarchy.Level == HieLvl_CRS) // Course selected if (Gbl.Hierarchy.Level == HieLvl_CRS) // Course selected
{ {
/***** Paths of course directories *****/ /***** Paths of course directories *****/
snprintf (Gbl.Crs.PathPriv,sizeof (Gbl.Crs.PathPriv),"%s/%ld", snprintf (Gbl.Crs.PathPriv ,sizeof (Gbl.Crs.PathPriv ),"%s/%ld",
Cfg_PATH_CRS_PRIVATE,Gbl.Hierarchy.Node[HieLvl_CRS].HieCod); Cfg_PATH_CRS_PRIVATE,Gbl.Hierarchy.Node[HieLvl_CRS].HieCod);
snprintf (Gbl.Crs.PathRelPubl,sizeof (Gbl.Crs.PathRelPubl),"%s/%ld", snprintf (Gbl.Crs.PathRelPubl,sizeof (Gbl.Crs.PathRelPubl),"%s/%ld",
Cfg_PATH_CRS_PUBLIC,Gbl.Hierarchy.Node[HieLvl_CRS].HieCod); Cfg_PATH_CRS_PUBLIC ,Gbl.Hierarchy.Node[HieLvl_CRS].HieCod);
snprintf (Gbl.Crs.PathURLPubl,sizeof (Gbl.Crs.PathURLPubl),"%s/%ld", snprintf (Gbl.Crs.PathURLPubl,sizeof (Gbl.Crs.PathURLPubl),"%s/%ld",
Cfg_URL_CRS_PUBLIC,Gbl.Hierarchy.Node[HieLvl_CRS].HieCod); Cfg_URL_CRS_PUBLIC ,Gbl.Hierarchy.Node[HieLvl_CRS].HieCod);
/***** If any of the course directories does not exist, create it *****/ /***** If any of the course directories does not exist, create it *****/
if (!Fil_CheckIfPathExists (Gbl.Crs.PathPriv)) if (!Fil_CheckIfPathExists (Gbl.Crs.PathPriv))
@ -639,8 +639,8 @@ void Hie_ResetHierarchy (void)
HieLvl_Level_t Level; HieLvl_Level_t Level;
/***** Hierarchy level and code *****/ /***** Hierarchy level and code *****/
Gbl.Hierarchy.Level = HieLvl_UNK; Gbl.Hierarchy.Level = HieLvl_UNK;
Gbl.Hierarchy.HieCod = -1L; Gbl.Hierarchy.HieCod = -1L;
for (Level = (HieLvl_Level_t) 0; for (Level = (HieLvl_Level_t) 0;
Level <= (HieLvl_Level_t) HieLvl_NUM_LEVELS - 1; Level <= (HieLvl_Level_t) HieLvl_NUM_LEVELS - 1;
@ -649,7 +649,7 @@ void Hie_ResetHierarchy (void)
Gbl.Hierarchy.List[Level].Num = 0; Gbl.Hierarchy.List[Level].Num = 0;
Gbl.Hierarchy.List[Level].Lst = NULL; Gbl.Hierarchy.List[Level].Lst = NULL;
Gbl.Hierarchy.List[Level].SelectedOrder = Hie_ORDER_DEFAULT; Gbl.Hierarchy.List[Level].SelectedOrder = Hie_ORDER_DEFAULT;
Gbl.Hierarchy.Node[Level].HieCod = -1L; Gbl.Hierarchy.Node[Level].HieCod = -1L;
Gbl.Hierarchy.Node[Level].PrtCod = -1L; Gbl.Hierarchy.Node[Level].PrtCod = -1L;
Gbl.Hierarchy.Node[Level].ShrtName[0] = Gbl.Hierarchy.Node[Level].ShrtName[0] =
Gbl.Hierarchy.Node[Level].FullName[0] = '\0'; Gbl.Hierarchy.Node[Level].FullName[0] = '\0';
@ -1296,29 +1296,29 @@ static void Hie_GetAndShowHierarchyTotal (void)
switch (Gbl.Scope.Current) switch (Gbl.Scope.Current)
{ {
case HieLvl_SYS: case HieLvl_SYS:
NumCtysTotal = Cty_GetCachedNumCtysInSys (); NumCtysTotal = Hie_GetCachedNumNodesInSys (FigCch_NUM_CTYS,"cty_countrs");
NumInssTotal = Ins_GetCachedNumInssInSys (); NumInssTotal = Hie_GetCachedNumNodesInSys (FigCch_NUM_INSS,"ins_instits");
NumCtrsTotal = Ctr_GetCachedNumCtrsInSys (); NumCtrsTotal = Hie_GetCachedNumNodesInSys (FigCch_NUM_CTRS,"ctr_centers");
NumDegsTotal = Deg_GetCachedNumDegsInSys (); NumDegsTotal = Hie_GetCachedNumNodesInSys (FigCch_NUM_DEGS,"deg_degrees");
NumCrssTotal = Crs_GetCachedNumCrssInSys (); NumCrssTotal = Hie_GetCachedNumNodesInSys (FigCch_NUM_CRSS,"crs_courses");
break; break;
case HieLvl_CTY: case HieLvl_CTY:
NumInssTotal = Ins_GetCachedNumInssInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod); NumInssTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_INSS,HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod);
NumCtrsTotal = Ctr_GetCachedNumCtrsInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod); NumCtrsTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod);
NumDegsTotal = Deg_GetCachedNumDegsInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod); NumDegsTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod);
NumCrssTotal = Crs_GetCachedNumCrssInCty (Gbl.Hierarchy.Node[HieLvl_CTY].HieCod); NumCrssTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,HieLvl_CTY,Gbl.Hierarchy.Node[HieLvl_CTY].HieCod);
break; break;
case HieLvl_INS: case HieLvl_INS:
NumCtrsTotal = Ctr_GetCachedNumCtrsInIns (Gbl.Hierarchy.Node[HieLvl_INS].HieCod); NumCtrsTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,HieLvl_INS,Gbl.Hierarchy.Node[HieLvl_INS].HieCod);
NumDegsTotal = Deg_GetCachedNumDegsInIns (Gbl.Hierarchy.Node[HieLvl_INS].HieCod); NumDegsTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,HieLvl_INS,Gbl.Hierarchy.Node[HieLvl_INS].HieCod);
NumCrssTotal = Crs_GetCachedNumCrssInIns (Gbl.Hierarchy.Node[HieLvl_INS].HieCod); NumCrssTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,HieLvl_INS,Gbl.Hierarchy.Node[HieLvl_INS].HieCod);
break; break;
case HieLvl_CTR: case HieLvl_CTR:
NumDegsTotal = Deg_GetCachedNumDegsInCtr (Gbl.Hierarchy.Node[HieLvl_CTR].HieCod); NumDegsTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,HieLvl_CTR,Gbl.Hierarchy.Node[HieLvl_CTR].HieCod);
NumCrssTotal = Crs_GetCachedNumCrssInCtr (Gbl.Hierarchy.Node[HieLvl_CTR].HieCod); NumCrssTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,HieLvl_CTR,Gbl.Hierarchy.Node[HieLvl_CTR].HieCod);
break; break;
case HieLvl_DEG: case HieLvl_DEG:
NumCrssTotal = Crs_GetCachedNumCrssInDeg (Gbl.Hierarchy.Node[HieLvl_DEG].HieCod); NumCrssTotal = Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,HieLvl_DEG,Gbl.Hierarchy.Node[HieLvl_DEG].HieCod);
break; break;
case HieLvl_CRS: case HieLvl_CRS:
break; break;
@ -1337,6 +1337,64 @@ static void Hie_GetAndShowHierarchyTotal (void)
(int) NumCrssTotal); (int) NumCrssTotal);
} }
/*****************************************************************************/
/**** Get total number of courses/degrees/centers/institutions/countries *****/
/*****************************************************************************/
unsigned Hie_GetCachedNumNodesInSys (FigCch_FigureCached_t Figure,
const char *Table)
{
unsigned NumNodes;
/***** Get number of courses/degrees/centers/institutions/countries from cache *****/
if (!FigCch_GetFigureFromCache (Figure,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumNodes))
{
/***** Get current number of courses/degrees/centers/institutions/countries
from database and update cache *****/
NumNodes = (unsigned) DB_GetNumRowsTable (Table);
FigCch_UpdateFigureIntoCache (Figure,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumNodes);
}
return NumNodes;
}
/*****************************************************************************/
/**** Get total number of courses/degrees/centers/institutions in country ****/
/*****************************************************************************/
unsigned Hie_GetCachedNumNodesIn (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long HieCod)
{
static unsigned (*FunctionGetNumNodes[][HieLvl_NUM_LEVELS]) (long HieCod) =
{
/* Number of nodes in country */
[FigCch_NUM_INSS][HieLvl_CTY] = Ins_GetNumInssInCty,
[FigCch_NUM_CTRS][HieLvl_CTY] = Ctr_GetNumCtrsInCty,
[FigCch_NUM_DEGS][HieLvl_CTY] = Deg_GetNumDegsInCty,
[FigCch_NUM_CRSS][HieLvl_CTY] = Crs_GetNumCrssInCty,
/* Number of nodes in institution */
[FigCch_NUM_CTRS][HieLvl_INS] = Ctr_GetNumCtrsInIns,
[FigCch_NUM_DEGS][HieLvl_INS] = Deg_GetNumDegsInIns,
[FigCch_NUM_CRSS][HieLvl_INS] = Crs_GetNumCrssInIns,
/* Number of nodes in center */
[FigCch_NUM_DEGS][HieLvl_CTR] = Deg_GetNumDegsInCtr,
[FigCch_NUM_CRSS][HieLvl_CTR] = Crs_GetNumCrssInCtr,
/* Number of nodes in degree */
[FigCch_NUM_CRSS][HieLvl_DEG] = Crs_GetNumCrssInDeg,
};
unsigned NumNodes;
/***** Get number of nodes from cache *****/
if (!FigCch_GetFigureFromCache (Figure,Level,HieCod,
FigCch_UNSIGNED,&NumNodes))
/***** Get current number of nodes from database and update cache *****/
NumNodes = FunctionGetNumNodes[Figure][Level] (HieCod);
return NumNodes;
}
/*****************************************************************************/ /*****************************************************************************/
/************** Show row with number of elements in hierarchy ****************/ /************** Show row with number of elements in hierarchy ****************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -71,4 +71,9 @@ bool Hie_CheckIfUsrBelongsTo (HieLvl_Level_t Level,long UsrCod,long HieCod,
//-------------------------------- Figures ------------------------------------ //-------------------------------- Figures ------------------------------------
void Hie_GetAndShowHierarchyStats (void); void Hie_GetAndShowHierarchyStats (void);
unsigned Hie_GetCachedNumNodesInSys (FigCch_FigureCached_t Figure,
const char *Table);
unsigned Hie_GetCachedNumNodesIn (FigCch_FigureCached_t Figure,
HieLvl_Level_t Level,long HieCod);
#endif #endif

View File

@ -398,19 +398,22 @@ static void Ins_ListOneInstitutionForSeeing (struct Hie_Node *Ins,unsigned NumIn
/* Number of centers in this institution */ /* Number of centers in this institution */
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
TxtClassNormal,The_GetSuffix (),BgColor); TxtClassNormal,The_GetSuffix (),BgColor);
HTM_Unsigned (Ctr_GetCachedNumCtrsInIns (Ins->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,
HieLvl_INS,Ins->HieCod));
HTM_TD_End (); HTM_TD_End ();
/* Number of degrees in this institution */ /* Number of degrees in this institution */
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
TxtClassNormal,The_GetSuffix (),BgColor); TxtClassNormal,The_GetSuffix (),BgColor);
HTM_Unsigned (Deg_GetCachedNumDegsInIns (Ins->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_INS,Ins->HieCod));
HTM_TD_End (); HTM_TD_End ();
/* Number of courses in this institution */ /* Number of courses in this institution */
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
TxtClassNormal,The_GetSuffix (),BgColor); TxtClassNormal,The_GetSuffix (),BgColor);
HTM_Unsigned (Crs_GetCachedNumCrssInIns (Ins->HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_INS,Ins->HieCod));
HTM_TD_End (); HTM_TD_End ();
/* Number of departments in this institution */ /* Number of departments in this institution */
@ -736,7 +739,7 @@ static void Ins_GetInstitDataFromRow (MYSQL_RES *mysql_res,
void Ins_FlushCacheFullNameAndCtyOfInstitution (void) void Ins_FlushCacheFullNameAndCtyOfInstitution (void)
{ {
Gbl.Cache.InstitutionShrtNameAndCty.InsCod = -1L; Gbl.Cache.InstitutionShrtNameAndCty.HieCod = -1L;
Gbl.Cache.InstitutionShrtNameAndCty.ShrtName[0] = '\0'; Gbl.Cache.InstitutionShrtNameAndCty.ShrtName[0] = '\0';
Gbl.Cache.InstitutionShrtNameAndCty.CtyName[0] = '\0'; Gbl.Cache.InstitutionShrtNameAndCty.CtyName[0] = '\0';
} }
@ -756,7 +759,7 @@ void Ins_GetShrtNameAndCtyOfInstitution (struct Hie_Node *Ins,
} }
/***** 2. Fast check: If cached... *****/ /***** 2. Fast check: If cached... *****/
if (Ins->HieCod == Gbl.Cache.InstitutionShrtNameAndCty.InsCod) if (Ins->HieCod == Gbl.Cache.InstitutionShrtNameAndCty.HieCod)
{ {
Str_Copy (Ins->ShrtName,Gbl.Cache.InstitutionShrtNameAndCty.ShrtName, Str_Copy (Ins->ShrtName,Gbl.Cache.InstitutionShrtNameAndCty.ShrtName,
sizeof (Ins->ShrtName) - 1); sizeof (Ins->ShrtName) - 1);
@ -766,7 +769,7 @@ void Ins_GetShrtNameAndCtyOfInstitution (struct Hie_Node *Ins,
} }
/***** 3. Slow: get short name and country of institution from database *****/ /***** 3. Slow: get short name and country of institution from database *****/
Gbl.Cache.InstitutionShrtNameAndCty.InsCod = Ins->HieCod; Gbl.Cache.InstitutionShrtNameAndCty.HieCod = Ins->HieCod;
if (Ins_DB_GetInsShrtNameAndCty (&mysql_res,Ins->HieCod) == 1) if (Ins_DB_GetInsShrtNameAndCty (&mysql_res,Ins->HieCod) == 1)
{ {
@ -1548,27 +1551,6 @@ static void Ins_ReceiveFormRequestOrCreateIns (Hie_Status_t Status)
Ale_CreateAlertYouMustSpecifyTheShortNameAndTheFullName (); Ale_CreateAlertYouMustSpecifyTheShortNameAndTheFullName ();
} }
/*****************************************************************************/
/********************* Get total number of institutions **********************/
/*****************************************************************************/
unsigned Ins_GetCachedNumInssInSys (void)
{
unsigned NumInss;
/***** Get number of institutions from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_INSS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumInss))
{
/***** Get current number of institutions from database and update cache *****/
NumInss = (unsigned) DB_GetNumRowsTable ("ins_instits");
FigCch_UpdateFigureIntoCache (FigCch_NUM_INSS,HieLvl_SYS,-1L,
FigCch_UNSIGNED,&NumInss);
}
return NumInss;
}
/*****************************************************************************/ /*****************************************************************************/
/**************** Get number of institutions in a country ********************/ /**************** Get number of institutions in a country ********************/
/*****************************************************************************/ /*****************************************************************************/
@ -1582,31 +1564,18 @@ unsigned Ins_GetNumInssInCty (long CtyCod)
{ {
/***** 1. Fast check: If cached... *****/ /***** 1. Fast check: If cached... *****/
if (Gbl.Cache.NumInssInCty.Valid && if (Gbl.Cache.NumInssInCty.Valid &&
CtyCod == Gbl.Cache.NumInssInCty.CtyCod) CtyCod == Gbl.Cache.NumInssInCty.HieCod)
return Gbl.Cache.NumInssInCty.NumInss; return Gbl.Cache.NumInssInCty.NumInss;
/***** 2. Slow: number of institutions in a country from database *****/ /***** 2. Slow: number of institutions in a country from database *****/
Gbl.Cache.NumInssInCty.CtyCod = CtyCod; Gbl.Cache.NumInssInCty.HieCod = CtyCod;
Gbl.Cache.NumInssInCty.NumInss = Ins_DB_GetNumInssInCty (CtyCod); Gbl.Cache.NumInssInCty.NumInss = Ins_DB_GetNumInssInCty (CtyCod);
Gbl.Cache.NumInssInCty.Valid = true; Gbl.Cache.NumInssInCty.Valid = true;
FigCch_UpdateFigureIntoCache (FigCch_NUM_INSS,HieLvl_CTY,Gbl.Cache.NumInssInCty.CtyCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_INSS,HieLvl_CTY,Gbl.Cache.NumInssInCty.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumInssInCty.NumInss); FigCch_UNSIGNED,&Gbl.Cache.NumInssInCty.NumInss);
return Gbl.Cache.NumInssInCty.NumInss; return Gbl.Cache.NumInssInCty.NumInss;
} }
unsigned Ins_GetCachedNumInssInCty (long CtyCod)
{
unsigned NumInss;
/***** Get number of institutions from cache *****/
if (!FigCch_GetFigureFromCache (FigCch_NUM_INSS,HieLvl_CTY,CtyCod,
FigCch_UNSIGNED,&NumInss))
/***** Get current number of institutions from database and update cache *****/
NumInss = Ins_GetNumInssInCty (CtyCod);
return NumInss;
}
/*****************************************************************************/ /*****************************************************************************/
/***************** Get number of institutions with centers *******************/ /***************** Get number of institutions with centers *******************/
/*****************************************************************************/ /*****************************************************************************/
@ -1886,7 +1855,7 @@ bool Ins_CheckIfIBelongToIns (long InsCod)
void Ins_FlushCacheNumUsrsWhoClaimToBelongToIns (void) void Ins_FlushCacheNumUsrsWhoClaimToBelongToIns (void)
{ {
Gbl.Cache.NumUsrsWhoClaimToBelongToIns.InsCod = -1L; Gbl.Cache.NumUsrsWhoClaimToBelongToIns.HieCod = -1L;
Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs = 0; Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs = 0;
} }
@ -1901,7 +1870,7 @@ unsigned Ins_GetNumUsrsWhoClaimToBelongToIns (struct Hie_Node *Ins)
return Ins->NumUsrsWhoClaimToBelong.NumUsrs; return Ins->NumUsrsWhoClaimToBelong.NumUsrs;
/***** 3. Fast check: If cached... *****/ /***** 3. Fast check: If cached... *****/
if (Ins->HieCod == Gbl.Cache.NumUsrsWhoClaimToBelongToIns.InsCod) if (Ins->HieCod == Gbl.Cache.NumUsrsWhoClaimToBelongToIns.HieCod)
{ {
Ins->NumUsrsWhoClaimToBelong.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs; Ins->NumUsrsWhoClaimToBelong.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs;
Ins->NumUsrsWhoClaimToBelong.Valid = true; Ins->NumUsrsWhoClaimToBelong.Valid = true;
@ -1910,11 +1879,11 @@ unsigned Ins_GetNumUsrsWhoClaimToBelongToIns (struct Hie_Node *Ins)
/***** 4. Slow: number of users who claim to belong to an institution /***** 4. Slow: number of users who claim to belong to an institution
from database *****/ from database *****/
Gbl.Cache.NumUsrsWhoClaimToBelongToIns.InsCod = Ins->HieCod; Gbl.Cache.NumUsrsWhoClaimToBelongToIns.HieCod = Ins->HieCod;
Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs = Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs =
Ins->NumUsrsWhoClaimToBelong.NumUsrs = Ins_DB_GetNumUsrsWhoClaimToBelongToIns (Ins->HieCod); Ins->NumUsrsWhoClaimToBelong.NumUsrs = Ins_DB_GetNumUsrsWhoClaimToBelongToIns (Ins->HieCod);
Ins->NumUsrsWhoClaimToBelong.Valid = true; Ins->NumUsrsWhoClaimToBelong.Valid = true;
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_BELONG_INS,HieLvl_INS,Gbl.Cache.NumUsrsWhoClaimToBelongToIns.InsCod, FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_BELONG_INS,HieLvl_INS,Gbl.Cache.NumUsrsWhoClaimToBelongToIns.HieCod,
FigCch_UNSIGNED,&Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs); FigCch_UNSIGNED,&Gbl.Cache.NumUsrsWhoClaimToBelongToIns.NumUsrs);
return Ins->NumUsrsWhoClaimToBelong.NumUsrs; return Ins->NumUsrsWhoClaimToBelong.NumUsrs;
} }

View File

@ -29,6 +29,7 @@
#include "swad_center.h" #include "swad_center.h"
#include "swad_constant.h" #include "swad_constant.h"
#include "swad_figure_cache.h"
#include "swad_role_type.h" #include "swad_role_type.h"
/*****************************************************************************/ /*****************************************************************************/
@ -71,11 +72,8 @@ void Ins_ContEditAfterChgIns (void);
void Ins_ReceiveFormReqIns (void); void Ins_ReceiveFormReqIns (void);
void Ins_ReceiveFormNewIns (void); void Ins_ReceiveFormNewIns (void);
unsigned Ins_GetCachedNumInssInSys (void);
void Ins_FlushCacheNumInssInCty (void); void Ins_FlushCacheNumInssInCty (void);
unsigned Ins_GetNumInssInCty (long CtyCod); unsigned Ins_GetNumInssInCty (long CtyCod);
unsigned Ins_GetCachedNumInssInCty (long CtyCod);
unsigned Ins_GetCachedNumInssWithCtrs (void); unsigned Ins_GetCachedNumInssWithCtrs (void);
unsigned Ins_GetCachedNumInssWithDegs (void); unsigned Ins_GetCachedNumInssWithDegs (void);

View File

@ -160,7 +160,8 @@ static void InsCfg_Configuration (bool PrintView)
InsCfg_QR (); InsCfg_QR ();
else else
{ {
NumCtrs = Ctr_GetCachedNumCtrsInIns (Gbl.Hierarchy.Node[HieLvl_INS].HieCod); NumCtrs = Hie_GetCachedNumNodesIn (FigCch_NUM_CTRS,
HieLvl_INS,Gbl.Hierarchy.Node[HieLvl_INS].HieCod);
/***** Number of users who claim to belong to this institution, /***** Number of users who claim to belong to this institution,
number of centers, number of centers,
@ -448,7 +449,8 @@ static void InsCfg_NumDegs (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Deg_GetCachedNumDegsInIns (Gbl.Hierarchy.Node[HieLvl_INS].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_DEGS,
HieLvl_INS,Gbl.Hierarchy.Node[HieLvl_INS].HieCod));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -470,7 +472,8 @@ static void InsCfg_NumCrss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Crs_GetCachedNumCrssInIns (Gbl.Hierarchy.Node[HieLvl_INS].HieCod)); HTM_Unsigned (Hie_GetCachedNumNodesIn (FigCch_NUM_CRSS,
HieLvl_INS,Gbl.Hierarchy.Node[HieLvl_INS].HieCod));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();

View File

@ -126,7 +126,7 @@ static void SysCfg_Configuration (bool PrintView)
else else
{ {
/***** Get number of centers *****/ /***** Get number of centers *****/
NumCtrs = Ctr_GetCachedNumCtrsInSys (); NumCtrs = Hie_GetCachedNumNodesInSys (FigCch_NUM_CTRS,"ctr_centers");
/***** Number of countries, /***** Number of countries,
number of institutions, number of institutions,
@ -309,7 +309,7 @@ static void SysCfg_NumCtys (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
Frm_BeginFormGoTo (ActSeeCty); Frm_BeginFormGoTo (ActSeeCty);
HTM_BUTTON_Submit_Begin (Txt_Countries,"class=\"LB BT_LINK\""); HTM_BUTTON_Submit_Begin (Txt_Countries,"class=\"LB BT_LINK\"");
HTM_Unsigned (Cty_GetCachedNumCtysInSys ()); HTM_Unsigned (Hie_GetCachedNumNodesInSys (FigCch_NUM_CTYS,"cty_countrs"));
HTM_BUTTON_End (); HTM_BUTTON_End ();
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
@ -333,7 +333,7 @@ static void SysCfg_NumInss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Ins_GetCachedNumInssInSys ()); HTM_Unsigned (Hie_GetCachedNumNodesInSys (FigCch_NUM_INSS,"ins_instits"));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -355,7 +355,7 @@ static void SysCfg_NumDegs (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Deg_GetCachedNumDegsInSys ()); HTM_Unsigned (Hie_GetCachedNumNodesInSys (FigCch_NUM_DEGS,"deg_degrees"));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -377,7 +377,7 @@ static void SysCfg_NumCrss (void)
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
HTM_Unsigned (Crs_GetCachedNumCrssInSys ()); HTM_Unsigned (Hie_GetCachedNumNodesInSys (FigCch_NUM_CRSS,"crs_courses"));
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();