Version 20.99: Sep 10, 2021 Queries moved to module swad_institution_database.

This commit is contained in:
acanas 2021-09-10 14:51:36 +02:00
parent 986005e2ca
commit 87d72a9d6f
7 changed files with 424 additions and 303 deletions

View File

@ -406,7 +406,8 @@ unsigned Ctr_DB_GetNumCtrsWithMapInIns (long InsCod)
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND (Latitude<>0"
" OR Longitude<>0)",
" OR"
" Longitude<>0)",
InsCod);
}

View File

@ -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 20.98 (2021-09-10)"
#define Log_PLATFORM_VERSION "SWAD 20.99 (2021-09-10)"
#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 20.99: Sep 10, 2021 Queries moved to module swad_institution_database. (314758 lines)
Version 20.98: Sep 10, 2021 New module swad_institution_database for database queries related to institutions. (314663 lines)
Version 20.97: Sep 10, 2021 Code refactoring related to scope. (314566 lines)
Version 20.96.7: Sep 09, 2021 Queries moved to module swad_exam_database. (314527 lines)

View File

@ -126,7 +126,7 @@ void Ins_SeeInsWithPendingCtrs (void)
extern const char *Txt_There_are_no_institutions_with_requests_for_centers_to_be_confirmed;
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumInss;
unsigned NumInss = 0;
unsigned NumIns;
struct Ins_Instit Ins;
const char *BgColor;
@ -135,37 +135,14 @@ void Ins_SeeInsWithPendingCtrs (void)
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_INS_ADM:
NumInss = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get institutions with pending centers",
"SELECT ctr_centers.InsCod," // row[0]
"COUNT(*)" // row[1]
" FROM ctr_centers,"
"ins_admin,"
"ins_instits"
" WHERE (ctr_centers.Status & %u)<>0"
" AND ctr_centers.InsCod=ins_admin.InsCod"
" AND ins_admin.UsrCod=%ld"
" AND ctr_centers.InsCod=ins_instits.InsCod"
" GROUP BY ctr_centers.InsCod"
" ORDER BY ins_instits.ShortName",
(unsigned) Ctr_STATUS_BIT_PENDING,
Gbl.Usrs.Me.UsrDat.UsrCod);
NumInss = Ins_DB_GetInsWithPendingCtrsAdminByMe (&mysql_res);
break;
case Rol_SYS_ADM:
NumInss = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get institutions with pending centers",
"SELECT ctr_centers.InsCod," // row[0]
"COUNT(*)" // row[1]
" FROM ctr_centers,"
"ins_instits"
" WHERE (ctr_centers.Status & %u)<>0"
" AND ctr_centers.InsCod=ins_instits.InsCod"
" GROUP BY ctr_centers.InsCod"
" ORDER BY ins_instits.ShortName",
(unsigned) Ctr_STATUS_BIT_PENDING);
NumInss = Ins_DB_GetAllInsWithPendingCtr (&mysql_res);
break;
default: // Forbidden for other users
return;
Err_WrongRoleExit ();
break; // Not reached
}
/***** Get institutions *****/
@ -636,21 +613,7 @@ void Ins_GetBasicListOfInstitutions (long CtyCod)
struct Ins_Instit *Ins;
/***** Get institutions from database *****/
Gbl.Hierarchy.Inss.Num = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get institutions",
"SELECT InsCod," // row[0]
"CtyCod," // row[1]
"Status," // row[2]
"RequesterUsrCod," // row[3]
"ShortName," // row[4]
"FullName," // row[5]
"WWW" // row[6]
" FROM ins_instits"
" WHERE CtyCod=%ld"
" ORDER BY FullName",
CtyCod);
if (Gbl.Hierarchy.Inss.Num) // Institutions found...
if ((Gbl.Hierarchy.Inss.Num = Ins_DB_GetInssInCtyOrderedByFullName (&mysql_res,CtyCod))) // Institutions found...
{
/***** Create list with institutions *****/
if ((Gbl.Hierarchy.Inss.Lst = calloc ((size_t) Gbl.Hierarchy.Inss.Num,
@ -686,53 +649,13 @@ void Ins_GetBasicListOfInstitutions (long CtyCod)
void Ins_GetFullListOfInstitutions (long CtyCod)
{
static const char *OrderBySubQuery[Ins_NUM_ORDERS] =
{
[Ins_ORDER_BY_INSTITUTION] = "FullName",
[Ins_ORDER_BY_NUM_USRS ] = "NumUsrs DESC,FullName",
};
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumIns;
struct Ins_Instit *Ins;
/***** Get institutions from database *****/
/* Query database */
Gbl.Hierarchy.Inss.Num = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get institutions",
"(SELECT ins_instits.InsCod," // row[0]
"ins_instits.CtyCod," // row[1]
"ins_instits.Status," // row[2]
"ins_instits.RequesterUsrCod," // row[3]
"ins_instits.ShortName," // row[4]
"ins_instits.FullName," // row[5]
"ins_instits.WWW," // row[6]
"COUNT(*) AS NumUsrs" // row[7]
" FROM ins_instits,"
"usr_data"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=usr_data.InsCod"
" GROUP BY ins_instits.InsCod)"
" UNION "
"(SELECT InsCod," // row[0]
"CtyCod," // row[1]
"Status," // row[2]
"RequesterUsrCod," // row[3]
"ShortName," // row[4]
"FullName," // row[5]
"WWW," // row[6]
"0 AS NumUsrs" // row[7]
" FROM ins_instits"
" WHERE CtyCod=%ld"
" AND InsCod NOT IN"
" (SELECT DISTINCT InsCod"
" FROM usr_data))"
" ORDER BY %s",
CtyCod,
CtyCod,
OrderBySubQuery[Gbl.Hierarchy.Inss.SelectedOrder]);
if (Gbl.Hierarchy.Inss.Num) // Institutions found...
if ((Gbl.Hierarchy.Inss.Num = Ins_DB_GetFullListOfInssInCty (&mysql_res,CtyCod))) // Institutions found...
{
/***** Create list with institutions *****/
if ((Gbl.Hierarchy.Inss.Lst = calloc ((size_t) Gbl.Hierarchy.Inss.Num,
@ -804,17 +727,7 @@ bool Ins_GetDataOfInstitutionByCod (struct Ins_Instit *Ins)
if (Ins->InsCod > 0)
{
/***** Get data of an institution from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get data of an institution",
"SELECT InsCod," // row[0]
"CtyCod," // row[1]
"Status," // row[2]
"RequesterUsrCod," // row[3]
"ShortName," // row[4]
"FullName," // row[5]
"WWW" // row[6]
" FROM ins_instits"
" WHERE InsCod=%ld",
Ins->InsCod)) // Institution found...
if (Ins_DB_GetDataOfInstitutionByCod (&mysql_res,Ins->InsCod)) // Institution found...
{
/* Get institution data */
row = mysql_fetch_row (mysql_res);
@ -837,6 +750,15 @@ bool Ins_GetDataOfInstitutionByCod (struct Ins_Instit *Ins)
static void Ins_GetDataOfInstitFromRow (struct Ins_Instit *Ins,MYSQL_ROW row)
{
/*
row[0]: InsCod
row[1]: CtyCod
row[2]: Status
row[3]: RequesterUsrCod
row[4]: ShortName
row[5]: FullName
row[6]: WWW
*/
/***** Get institution code (row[0]) *****/
if ((Ins->InsCod = Str_ConvertStrCodToLongCod (row[0])) <= 0)
Err_WrongInstitExit ();
@ -859,20 +781,19 @@ static void Ins_GetDataOfInstitFromRow (struct Ins_Instit *Ins,MYSQL_ROW row)
}
/*****************************************************************************/
/************ Get the full name of an institution from its code **************/
/******** Get short name and country of an institution from its code *********/
/*****************************************************************************/
void Ins_FlushCacheFullNameAndCtyOfInstitution (void)
{
Gbl.Cache.InstitutionShrtNameAndCty.InsCod = -1L;
Gbl.Cache.InstitutionShrtNameAndCty.InsCod = -1L;
Gbl.Cache.InstitutionShrtNameAndCty.ShrtName[0] = '\0';
Gbl.Cache.InstitutionShrtNameAndCty.CtyName[0] = '\0';
Gbl.Cache.InstitutionShrtNameAndCty.CtyName[0] = '\0';
}
static void Ins_GetShrtNameAndCtyOfInstitution (struct Ins_Instit *Ins,
char CtyName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1])
{
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -897,15 +818,7 @@ static void Ins_GetShrtNameAndCtyOfInstitution (struct Ins_Instit *Ins,
/***** 3. Slow: get short name and country of institution from database *****/
Gbl.Cache.InstitutionShrtNameAndCty.InsCod = Ins->InsCod;
if (DB_QuerySELECT (&mysql_res,"can not get short name and country"
" of an institution",
"SELECT ins_instits.ShortName," // row[0]
"cty_countrs.Name_%s" // row[1]
" FROM ins_instits,"
"cty_countrs"
" WHERE ins_instits.InsCod=%ld"
" AND ins_instits.CtyCod=cty_countrs.CtyCod",
Lan_STR_LANG_ID[Gbl.Prefs.Language],Ins->InsCod) == 1)
if (Ins_DB_GetShrtNameAndCtyOfIns (&mysql_res,Ins->InsCod) == 1)
{
/* Get row */
row = mysql_fetch_row (mysql_res);
@ -977,15 +890,8 @@ void Ins_WriteSelectorOfInstitution (void)
if (Gbl.Hierarchy.Cty.CtyCod > 0)
{
/***** Get institutions of selected country from database *****/
NumInss = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get institutions",
"SELECT DISTINCT InsCod," // row[0]
"ShortName" // row[1]
" FROM ins_instits"
" WHERE CtyCod=%ld"
" ORDER BY ShortName",
Gbl.Hierarchy.Cty.CtyCod);
/***** Get institutions of current country *****/
NumInss = Ins_DB_GetInssInCtyOrderedByShrtName (&mysql_res,Gbl.Hierarchy.Cty.CtyCod);
/***** List institutions *****/
for (NumIns = 0;
@ -1355,10 +1261,7 @@ void Ins_RemoveInstitution (void)
Adm_DB_RemAdmins (HieLvl_INS,Ins_EditingIns->InsCod);
/***** Remove institution *****/
DB_QueryDELETE ("can not remove an institution",
"DELETE FROM ins_instits"
" WHERE InsCod=%ld",
Ins_EditingIns->InsCod);
Ins_DB_RemoveInstitution (Ins_EditingIns->InsCod);
/***** Flush caches *****/
Ins_FlushCacheFullNameAndCtyOfInstitution ();
@ -1481,12 +1384,7 @@ void Ins_RenameInstitution (struct Ins_Instit *Ins,Cns_ShrtOrFullName_t ShrtOrFu
static void Ins_UpdateInsNameDB (long InsCod,const char *FieldName,const char *NewInsName)
{
/***** Update institution changing old name by new name */
DB_QueryUPDATE ("can not update the name of an institution",
"UPDATE ins_instits"
" SET %s='%s'"
" WHERE InsCod=%ld",
FieldName,NewInsName,
InsCod);
Ins_DB_UpdateInsName (InsCod,FieldName,NewInsName);
/***** Flush caches *****/
Ins_FlushCacheFullNameAndCtyOfInstitution ();
@ -1563,12 +1461,7 @@ void Ins_ChangeInsStatus (void)
Ins_GetDataOfInstitutionByCod (Ins_EditingIns);
/***** Update status in table of institutions *****/
DB_QueryUPDATE ("can not update the status of an institution",
"UPDATE ins_instits"
" SET Status=%u"
" WHERE InsCod=%ld",
(unsigned) Status,
Ins_EditingIns->InsCod);
Ins_DB_UpdateInsStatus (Status,Ins_EditingIns->InsCod);
Ins_EditingIns->Status = Status;
/***** Create message to show the change made
@ -1875,13 +1768,8 @@ unsigned Ins_GetNumInssInCty (long CtyCod)
/***** 2. Slow: number of institutions in a country from database *****/
Gbl.Cache.NumInssInCty.CtyCod = CtyCod;
Gbl.Cache.NumInssInCty.NumInss = (unsigned)
DB_QueryCOUNT ("can not get the number of institutions in a country",
"SELECT COUNT(*)"
" FROM ins_instits"
" WHERE CtyCod=%ld",
CtyCod);
Gbl.Cache.NumInssInCty.Valid = true;
Gbl.Cache.NumInssInCty.NumInss = Ins_DB_GetNumInssInCty (CtyCod);
Gbl.Cache.NumInssInCty.Valid = true;
FigCch_UpdateFigureIntoCache (FigCch_NUM_INSS,HieLvl_CTY,Gbl.Cache.NumInssInCty.CtyCod,
FigCch_UNSIGNED,&Gbl.Cache.NumInssInCty.NumInss);
return Gbl.Cache.NumInssInCty.NumInss;
@ -2083,7 +1971,7 @@ static void Ins_FormToGoToMap (struct Ins_Instit *Ins)
{
extern const char *Txt_Map;
if (Ins_GetIfMapIsAvailable (Ins->InsCod))
if (Ins_DB_GetIfMapIsAvailable (Ins->InsCod))
{
Ins_EditingIns = Ins; // Used to pass parameter with the code of the institution
Lay_PutContextualLinkOnlyIcon (ActSeeInsInf,NULL,
@ -2092,36 +1980,3 @@ static void Ins_FormToGoToMap (struct Ins_Instit *Ins)
Txt_Map);
}
}
/*****************************************************************************/
/********** Check if any of the centers in an institution has map ************/
/*****************************************************************************/
bool Ins_GetIfMapIsAvailable (long InsCod)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
bool MapIsAvailable = false;
/***** Get if any center in current institution has a coordinate set
(coordinates 0, 0 means not set ==> don't show map) *****/
if (DB_QuerySELECT (&mysql_res,"can not get if map is available",
"SELECT EXISTS" // row[0]
"(SELECT *"
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND (Latitude<>0"
" OR"
" Longitude<>0))",
InsCod))
{
/* Get if map is available */
row = mysql_fetch_row (mysql_res);
MapIsAvailable = (row[0][0] == '1');
}
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
return MapIsAvailable;
}

View File

@ -135,6 +135,4 @@ unsigned Ins_GetCachedNumInssWithUsrs (Rol_Role_t Role);
void Ins_ListInssFound (MYSQL_RES **mysql_res,unsigned NumInss);
bool Ins_GetIfMapIsAvailable (long InsCod);
#endif

View File

@ -72,7 +72,6 @@ extern struct Globals Gbl;
static void InsCfg_Configuration (bool PrintView);
static void InsCfg_PutIconsToPrintAndUpload (__attribute__((unused)) void *Args);
static void InsCfg_Title (bool PutLink);
static void InsCfg_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom);
static void InsCfg_Map (void);
static void InsCfg_Country (bool PrintView,bool PutForm);
static void InsCfg_FullName (bool PutForm);
@ -147,52 +146,52 @@ static void InsCfg_Configuration (bool PrintView)
/**************************** Left part ***********************************/
HTM_DIV_Begin ("class=\"HIE_CFG_LEFT HIE_CFG_WIDTH\"");
/***** Begin table *****/
HTM_TABLE_BeginWidePadding (2);
/***** Begin table *****/
HTM_TABLE_BeginWidePadding (2);
/***** Country *****/
InsCfg_Country (PrintView,PutFormCty);
/***** Country *****/
InsCfg_Country (PrintView,PutFormCty);
/***** Institution name *****/
InsCfg_FullName (PutFormName);
InsCfg_ShrtName (PutFormName);
/***** Institution name *****/
InsCfg_FullName (PutFormName);
InsCfg_ShrtName (PutFormName);
/***** Institution WWW *****/
InsCfg_WWW (PrintView,PutFormWWW);
/***** Institution WWW *****/
InsCfg_WWW (PrintView,PutFormWWW);
/***** Shortcut to the institution *****/
InsCfg_Shortcut (PrintView);
/***** Shortcut to the institution *****/
InsCfg_Shortcut (PrintView);
NumCtrsWithMap = Ctr_GetCachedNumCtrsWithMapInIns (Gbl.Hierarchy.Ins.InsCod);
if (PrintView)
/***** QR code with link to the institution *****/
InsCfg_QR ();
else
{
NumCtrs = Ctr_GetCachedNumCtrsInIns (Gbl.Hierarchy.Ins.InsCod);
NumCtrsWithMap = Ctr_GetCachedNumCtrsWithMapInIns (Gbl.Hierarchy.Ins.InsCod);
if (PrintView)
/***** QR code with link to the institution *****/
InsCfg_QR ();
else
{
NumCtrs = Ctr_GetCachedNumCtrsInIns (Gbl.Hierarchy.Ins.InsCod);
/***** Number of users who claim to belong to this institution,
number of centers,
number of degrees,
number of courses,
number of departments *****/
InsCfg_NumUsrs ();
HieCfg_NumCtrs (NumCtrs,
true); // Put form
HieCfg_NumCtrsWithMap (NumCtrs,NumCtrsWithMap);
InsCfg_NumDegs ();
InsCfg_NumCrss ();
InsCfg_NumDpts ();
/***** Number of users who claim to belong to this institution,
number of centers,
number of degrees,
number of courses,
number of departments *****/
InsCfg_NumUsrs ();
HieCfg_NumCtrs (NumCtrs,
true); // Put form
HieCfg_NumCtrsWithMap (NumCtrs,NumCtrsWithMap);
InsCfg_NumDegs ();
InsCfg_NumCrss ();
InsCfg_NumDpts ();
/***** Number of users in courses of this institution *****/
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_TCH);
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_NET);
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_STD);
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_UNK);
}
/***** Number of users in courses of this institution *****/
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_TCH);
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_NET);
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_STD);
HieCfg_NumUsrsInCrss (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Rol_UNK);
}
/***** End table *****/
HTM_TABLE_End ();
/***** End table *****/
HTM_TABLE_End ();
/***** End of left part *****/
HTM_DIV_End ();
@ -202,8 +201,8 @@ static void InsCfg_Configuration (bool PrintView)
{
HTM_DIV_Begin ("class=\"HIE_CFG_RIGHT HIE_CFG_WIDTH\"");
/***** Institution map *****/
InsCfg_Map ();
/***** Institution map *****/
InsCfg_Map ();
HTM_DIV_End ();
}
@ -245,32 +244,6 @@ static void InsCfg_Title (bool PutLink)
Gbl.Hierarchy.Ins.FullName); // Text full name
}
/*****************************************************************************/
/********* Get average coordinates of centers in current institution *********/
/*****************************************************************************/
static void InsCfg_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom)
{
char *Query;
/***** Get average coordinates of centers of current institution
with both coordinates set
(coordinates 0, 0 means not set ==> don't show map) *****/
if (asprintf (&Query,
"SELECT AVG(Latitude)," // row[0]
"AVG(Longitude)," // row[1]
"GREATEST(MAX(Latitude)-MIN(Latitude),"
"MAX(Longitude)-MIN(Longitude))" // row[2]
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND Latitude<>0"
" AND Longitude<>0",
Gbl.Hierarchy.Ins.InsCod) < 0)
Err_NotEnoughMemoryExit ();
Map_GetCoordAndZoom (Coord,Zoom,Query);
free (Query);
}
/*****************************************************************************/
/****************************** Draw center map ******************************/
/*****************************************************************************/
@ -300,21 +273,14 @@ static void InsCfg_Map (void)
HTM_SCRIPT_Begin (NULL,NULL);
/* Let's create a map with pretty Mapbox Streets tiles */
InsCfg_GetCoordAndZoom (&InsAvgCoord,&Zoom);
Ins_DB_GetCoordAndZoom (&InsAvgCoord,&Zoom);
Map_CreateMap (InsCfg_MAP_CONTAINER_ID,&InsAvgCoord,Zoom);
/* Add Mapbox Streets tile layer to our map */
Map_AddTileLayer ();
/* Get centers with coordinates */
NumCtrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get centers with coordinates",
"SELECT CtrCod" // row[0]
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND Latitude<>0"
" AND Longitude<>0",
Gbl.Hierarchy.Ins.InsCod);
NumCtrs = Ins_DB_GetCtrsWithCoordsInCurrentIns (&mysql_res);
/* Add a marker and a popup for each center */
for (NumCtr = 0;
@ -385,16 +351,16 @@ static void InsCfg_Country (bool PrintView,bool PutForm)
{
Frm_BeginFormGoTo (ActSeeCtyInf);
Cty_PutParamCtyCod (Gbl.Hierarchy.Cty.CtyCod);
HTM_BUTTON_SUBMIT_Begin (Hie_BuildGoToMsg (Gbl.Hierarchy.Cty.Name[Gbl.Prefs.Language]),
"BT_LINK LT DAT",NULL);
Hie_FreeGoToMsg ();
HTM_BUTTON_SUBMIT_Begin (Hie_BuildGoToMsg (Gbl.Hierarchy.Cty.Name[Gbl.Prefs.Language]),
"BT_LINK LT DAT",NULL);
Hie_FreeGoToMsg ();
}
Cty_DrawCountryMap (&Gbl.Hierarchy.Cty,"COUNTRY_MAP_TINY");
HTM_NBSP ();
HTM_Txt (Gbl.Hierarchy.Cty.Name[Gbl.Prefs.Language]);
if (!PrintView)
{
HTM_BUTTON_End ();
HTM_BUTTON_End ();
Frm_EndForm ();
}
}
@ -464,13 +430,13 @@ static void InsCfg_NumUsrs (void)
/***** Number of users *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Users_of_the_institution);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Users_of_the_institution);
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Usr_GetCachedNumUsrsWhoClaimToBelongToIns (&Gbl.Hierarchy.Ins));
HTM_TD_End ();
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Usr_GetCachedNumUsrsWhoClaimToBelongToIns (&Gbl.Hierarchy.Ins));
HTM_TD_End ();
HTM_TR_End ();
}
@ -486,13 +452,13 @@ static void InsCfg_NumDegs (void)
/***** Number of degrees *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Degrees);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Degrees);
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Deg_GetCachedNumDegsInIns (Gbl.Hierarchy.Ins.InsCod));
HTM_TD_End ();
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Deg_GetCachedNumDegsInIns (Gbl.Hierarchy.Ins.InsCod));
HTM_TD_End ();
HTM_TR_End ();
}
@ -508,13 +474,13 @@ static void InsCfg_NumCrss (void)
/***** Number of courses *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Courses);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Courses);
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Crs_GetCachedNumCrssInIns (Gbl.Hierarchy.Ins.InsCod));
HTM_TD_End ();
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Crs_GetCachedNumCrssInIns (Gbl.Hierarchy.Ins.InsCod));
HTM_TD_End ();
HTM_TR_End ();
}
@ -530,13 +496,13 @@ static void InsCfg_NumDpts (void)
/***** Number of departments *****/
HTM_TR_Begin (NULL);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Departments);
/* Label */
Frm_LabelColumn ("RT",NULL,Txt_Departments);
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Dpt_DB_GetNumDepartmentsInInstitution (Gbl.Hierarchy.Ins.InsCod));
HTM_TD_End ();
/* Data */
HTM_TD_Begin ("class=\"DAT LB\"");
HTM_Unsigned (Dpt_DB_GetNumDepartmentsInInstitution (Gbl.Hierarchy.Ins.InsCod));
HTM_TD_End ();
HTM_TR_End ();
}
@ -673,4 +639,3 @@ void InsCfg_ContEditAfterChgIns (void)
/***** Show the form again *****/
InsCfg_ShowConfiguration ();
}

View File

@ -25,30 +25,15 @@
/********************************* Headers ***********************************/
/*****************************************************************************/
// #include <stdbool.h> // For boolean type
// #include <stddef.h> // For NULL
// #include <stdlib.h> // For free
// #include <string.h> // For string functions
#define _GNU_SOURCE // For asprintf
#include <stdio.h> // For asprintf
// #include "swad_admin_database.h"
#include "swad_database.h"
// #include "swad_department.h"
// #include "swad_enrolment_database.h"
// #include "swad_error.h"
// #include "swad_figure.h"
// #include "swad_figure_cache.h"
// #include "swad_form.h"
// #include "swad_forum.h"
#include "swad_error.h"
#include "swad_global.h"
#include "swad_hierarchy.h"
// #include "swad_hierarchy_level.h"
// #include "swad_HTML.h"
#include "swad_institution.h"
#include "swad_institution_database.h"
// #include "swad_logo.h"
// #include "swad_message.h"
// #include "swad_place.h"
// #include "swad_survey.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
@ -100,7 +85,6 @@ long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,unsigned Status)
void Ins_DB_UpdateInsCty (long InsCod,long CtyCod)
{
/***** Update country in table of institutions *****/
DB_QueryUPDATE ("can not update the country of an institution",
"UPDATE ins_instits"
" SET CtyCod=%ld"
@ -109,6 +93,35 @@ void Ins_DB_UpdateInsCty (long InsCod,long CtyCod)
InsCod);
}
/*****************************************************************************/
/****************** Update status in table of institutions *******************/
/*****************************************************************************/
void Ins_DB_UpdateInsStatus (long InsCod,Ins_Status_t Status)
{
DB_QueryUPDATE ("can not update the status of an institution",
"UPDATE ins_instits"
" SET Status=%u"
" WHERE InsCod=%ld",
(unsigned) Status,
InsCod);
}
/*****************************************************************************/
/*************************** Update institution name *************************/
/*****************************************************************************/
void Ins_DB_UpdateInsName (long InsCod,const char *FieldName,const char *NewInsName)
{
/***** Update institution changing old name by new name */
DB_QueryUPDATE ("can not update the name of an institution",
"UPDATE ins_instits"
" SET %s='%s'"
" WHERE InsCod=%ld",
FieldName,NewInsName,
InsCod);
}
/*****************************************************************************/
/**************** Update database changing old WWW by new WWW ****************/
/*****************************************************************************/
@ -124,6 +137,26 @@ void Ins_DB_UpdateInsWWW (long InsCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1])
InsCod);
}
/*****************************************************************************/
/************************* Get data of an institution ************************/
/*****************************************************************************/
unsigned Ins_DB_GetDataOfInstitutionByCod (MYSQL_RES **mysql_res,long InsCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get data of an institution",
"SELECT InsCod," // row[0]
"CtyCod," // row[1]
"Status," // row[2]
"RequesterUsrCod," // row[3]
"ShortName," // row[4]
"FullName," // row[5]
"WWW" // row[6]
" FROM ins_instits"
" WHERE InsCod=%ld",
InsCod);
}
/*****************************************************************************/
/*********** Get the short name of an institution from its code **************/
/*****************************************************************************/
@ -146,6 +179,27 @@ void Ins_DB_GetShortNameOfInstitution (long InsCod,char ShrtName[Cns_HIERARCHY_M
InsCod);
}
/*****************************************************************************/
/******** Get short name and country of an institution from its code *********/
/*****************************************************************************/
unsigned Ins_DB_GetShrtNameAndCtyOfIns (MYSQL_RES **mysql_res,long InsCod)
{
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get short name and country"
" of an institution",
"SELECT ins_instits.ShortName," // row[0]
"cty_countrs.Name_%s" // row[1]
" FROM ins_instits,"
"cty_countrs"
" WHERE ins_instits.InsCod=%ld"
" AND ins_instits.CtyCod=cty_countrs.CtyCod",
Lan_STR_LANG_ID[Gbl.Prefs.Language],
InsCod);
}
/*****************************************************************************/
/****** Check if the name of institution exists in the current country *******/
/*****************************************************************************/
@ -155,7 +209,6 @@ bool Ins_DB_CheckIfInsNameExistsInCty (const char *FieldName,
long InsCod,
long CtyCod)
{
/***** Get number of institutions in current country with a name from database *****/
return (DB_QueryCOUNT ("can not check if the name of an institution"
" already existed",
"SELECT COUNT(*)"
@ -166,6 +219,147 @@ bool Ins_DB_CheckIfInsNameExistsInCty (const char *FieldName,
CtyCod,FieldName,Name,InsCod) != 0);
}
/*****************************************************************************/
/***************** Get all institutions with pending centers *****************/
/*****************************************************************************/
unsigned Ins_DB_GetAllInsWithPendingCtr (MYSQL_RES **mysql_res)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get institutions with pending centers",
"SELECT ctr_centers.InsCod," // row[0]
"COUNT(*)" // row[1]
" FROM ctr_centers,"
"ins_instits"
" WHERE (ctr_centers.Status & %u)<>0"
" AND ctr_centers.InsCod=ins_instits.InsCod"
" GROUP BY ctr_centers.InsCod"
" ORDER BY ins_instits.ShortName",
(unsigned) Ctr_STATUS_BIT_PENDING);
}
/*****************************************************************************/
/************* Get institutions with pending centers admin by me *************/
/*****************************************************************************/
unsigned Ins_DB_GetInsWithPendingCtrsAdminByMe (MYSQL_RES **mysql_res)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get institutions with pending centers",
"SELECT ctr_centers.InsCod," // row[0]
"COUNT(*)" // row[1]
" FROM ctr_centers,"
"ins_admin,"
"ins_instits"
" WHERE (ctr_centers.Status & %u)<>0"
" AND ctr_centers.InsCod=ins_admin.InsCod"
" AND ins_admin.UsrCod=%ld"
" AND ctr_centers.InsCod=ins_instits.InsCod"
" GROUP BY ctr_centers.InsCod"
" ORDER BY ins_instits.ShortName",
(unsigned) Ctr_STATUS_BIT_PENDING,
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/************* Get institutions in country ordered by short name *************/
/*****************************************************************************/
unsigned Ins_DB_GetInssInCtyOrderedByShrtName (MYSQL_RES **mysql_res,long CtyCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get institutions",
"SELECT DISTINCT InsCod," // row[0]
"ShortName" // row[1]
" FROM ins_instits"
" WHERE CtyCod=%ld"
" ORDER BY ShortName",
CtyCod);
}
/*****************************************************************************/
/******* Get basic list of institutions ordered by name of institution *******/
/*****************************************************************************/
unsigned Ins_DB_GetInssInCtyOrderedByFullName (MYSQL_RES **mysql_res,long CtyCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get institutions",
"SELECT InsCod," // row[0]
"CtyCod," // row[1]
"Status," // row[2]
"RequesterUsrCod," // row[3]
"ShortName," // row[4]
"FullName," // row[5]
"WWW" // row[6]
" FROM ins_instits"
" WHERE CtyCod=%ld"
" ORDER BY FullName",
CtyCod);
}
/*****************************************************************************/
/************* Get full list of institutions **************/
/************* with number of users who claim to belong to them **************/
/*****************************************************************************/
unsigned Ins_DB_GetFullListOfInssInCty (MYSQL_RES **mysql_res,long CtyCod)
{
static const char *OrderBySubQuery[Ins_NUM_ORDERS] =
{
[Ins_ORDER_BY_INSTITUTION] = "FullName",
[Ins_ORDER_BY_NUM_USRS ] = "NumUsrs DESC,FullName",
};
/***** Get institutions from database *****/
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get institutions",
"(SELECT ins_instits.InsCod," // row[0]
"ins_instits.CtyCod," // row[1]
"ins_instits.Status," // row[2]
"ins_instits.RequesterUsrCod," // row[3]
"ins_instits.ShortName," // row[4]
"ins_instits.FullName," // row[5]
"ins_instits.WWW," // row[6]
"COUNT(*) AS NumUsrs" // row[7]
" FROM ins_instits,"
"usr_data"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=usr_data.InsCod"
" GROUP BY ins_instits.InsCod)"
" UNION "
"(SELECT InsCod," // row[0]
"CtyCod," // row[1]
"Status," // row[2]
"RequesterUsrCod," // row[3]
"ShortName," // row[4]
"FullName," // row[5]
"WWW," // row[6]
"0 AS NumUsrs" // row[7]
" FROM ins_instits"
" WHERE CtyCod=%ld"
" AND InsCod NOT IN"
" (SELECT DISTINCT InsCod"
" FROM usr_data))"
" ORDER BY %s",
CtyCod,
CtyCod,
OrderBySubQuery[Gbl.Hierarchy.Inss.SelectedOrder]);
}
/*****************************************************************************/
/**************** Get number of institutions in a country ********************/
/*****************************************************************************/
unsigned Ins_DB_GetNumInssInCty (long CtyCod)
{
return (unsigned)
DB_QueryCOUNT ("can not get the number of institutions in a country",
"SELECT COUNT(*)"
" FROM ins_instits"
" WHERE CtyCod=%ld",
CtyCod);
}
/*****************************************************************************/
/****************** Get number of institutions with centres ******************/
/*****************************************************************************/
@ -256,3 +450,90 @@ unsigned Ins_DB_GetNumInnsWithUsrs (Rol_Role_t Role,
" AND crs_users.Role=%u",
SubQuery,(unsigned) Role);
}
/*****************************************************************************/
/********** Check if any of the centers in an institution has map ************/
/*****************************************************************************/
bool Ins_DB_GetIfMapIsAvailable (long InsCod)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
bool MapIsAvailable = false;
/***** Get if any center in current institution has a coordinate set
(coordinates 0, 0 means not set ==> don't show map) *****/
if (DB_QuerySELECT (&mysql_res,"can not get if map is available",
"SELECT EXISTS" // row[0]
"(SELECT *"
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND (Latitude<>0"
" OR"
" Longitude<>0))",
InsCod))
{
/* Get if map is available */
row = mysql_fetch_row (mysql_res);
MapIsAvailable = (row[0][0] == '1');
}
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
return MapIsAvailable;
}
/*****************************************************************************/
/********* Get average coordinates of centers in current institution *********/
/*****************************************************************************/
void Ins_DB_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom)
{
char *Query;
/***** Get average coordinates of centers of current institution
with both coordinates set
(coordinates 0, 0 means not set ==> don't show map) *****/
if (asprintf (&Query,
"SELECT AVG(Latitude)," // row[0]
"AVG(Longitude)," // row[1]
"GREATEST(MAX(Latitude)-MIN(Latitude),"
"MAX(Longitude)-MIN(Longitude))" // row[2]
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND Latitude<>0"
" AND Longitude<>0",
Gbl.Hierarchy.Ins.InsCod) < 0)
Err_NotEnoughMemoryExit ();
Map_GetCoordAndZoom (Coord,Zoom,Query);
free (Query);
}
/*****************************************************************************/
/******** Get centres which have coordinates in current institution **********/
/*****************************************************************************/
unsigned Ins_DB_GetCtrsWithCoordsInCurrentIns (MYSQL_RES **mysql_res)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get centers with coordinates",
"SELECT CtrCod" // row[0]
" FROM ctr_centers"
" WHERE InsCod=%ld"
" AND Latitude<>0"
" AND Longitude<>0",
Gbl.Hierarchy.Ins.InsCod);
}
/*****************************************************************************/
/***************************** Remove institution ****************************/
/*****************************************************************************/
void Ins_DB_RemoveInstitution (long InsCod)
{
DB_QueryDELETE ("can not remove an institution",
"DELETE FROM ins_instits"
" WHERE InsCod=%ld",
InsCod);
}

View File

@ -29,6 +29,7 @@
#include "swad_constant.h"
#include "swad_hierarchy_level.h"
#include "swad_map.h"
#include "swad_role_type.h"
/*****************************************************************************/
@ -41,18 +42,37 @@
long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,unsigned Status);
void Ins_DB_UpdateInsCty (long InsCod,long CtyCod);
void Ins_DB_UpdateInsStatus (long InsCod,Ins_Status_t Status);
void Ins_DB_UpdateInsName (long InsCod,const char *FieldName,const char *NewInsName);
void Ins_DB_UpdateInsWWW (long InsCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]);
unsigned Ins_DB_GetDataOfInstitutionByCod (MYSQL_RES **mysql_res,long InsCod);
void Ins_DB_GetShortNameOfInstitution (long InsCod,char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]);
unsigned Ins_DB_GetShrtNameAndCtyOfIns (MYSQL_RES **mysql_res,long InsCod);
bool Ins_DB_CheckIfInsNameExistsInCty (const char *FieldName,
const char *Name,
long InsCod,
long CtyCod);
unsigned Ins_DB_GetAllInsWithPendingCtr (MYSQL_RES **mysql_res);
unsigned Ins_DB_GetInsWithPendingCtrsAdminByMe (MYSQL_RES **mysql_res);
unsigned Ins_DB_GetInssInCtyOrderedByShrtName (MYSQL_RES **mysql_res,long CtyCod);
unsigned Ins_DB_GetInssInCtyOrderedByFullName (MYSQL_RES **mysql_res,long CtyCod);
unsigned Ins_DB_GetFullListOfInssInCty (MYSQL_RES **mysql_res,long CtyCod);
unsigned Ins_DB_GetNumInssInCty (long CtyCod);
unsigned Ins_DB_GetNumInssWithCtrs (HieLvl_Level_t Scope,long Cod);
unsigned Ins_DB_GetNumInssWithDegs (HieLvl_Level_t Scope,long Cod);
unsigned Ins_DB_GetNumInssWithCrss (HieLvl_Level_t Scope,long Cod);
unsigned Ins_DB_GetNumInnsWithUsrs (Rol_Role_t Role,
HieLvl_Level_t Scope,long Cod);
bool Ins_DB_GetIfMapIsAvailable (long InsCod);
void Ins_DB_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom);
unsigned Ins_DB_GetCtrsWithCoordsInCurrentIns (MYSQL_RES **mysql_res);
void Ins_DB_RemoveInstitution (long InsCod);
#endif