mirror of https://github.com/acanas/swad-core.git
Version 20.99: Sep 10, 2021 Queries moved to module swad_institution_database.
This commit is contained in:
parent
986005e2ca
commit
87d72a9d6f
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,7 +781,7 @@ 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)
|
||||
|
@ -872,7 +794,6 @@ void Ins_FlushCacheFullNameAndCtyOfInstitution (void)
|
|||
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,12 +1768,7 @@ 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.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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -673,4 +639,3 @@ void InsCfg_ContEditAfterChgIns (void)
|
|||
/***** Show the form again *****/
|
||||
InsCfg_ShowConfiguration ();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue