mirror of https://github.com/acanas/swad-core.git
Version 20.82: May 23, 2021 Queries moved to module swad_country_database.
This commit is contained in:
parent
c1a0a2832b
commit
ac0070c318
|
@ -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.
|
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 20.81 (2021-05-22)"
|
#define Log_PLATFORM_VERSION "SWAD 20.82 (2021-05-23)"
|
||||||
#define CSS_FILE "swad20.45.css"
|
#define CSS_FILE "swad20.45.css"
|
||||||
#define JS_FILE "swad20.69.1.js"
|
#define JS_FILE "swad20.69.1.js"
|
||||||
/*
|
/*
|
||||||
TODO: Rename CENTRE to CENTER in help wiki.
|
TODO: Rename CENTRE to CENTER in help wiki.
|
||||||
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
||||||
|
|
||||||
|
Version 20.82: May 22, 2021 Queries moved to module swad_country_database. (311702 lines)
|
||||||
Version 20.81: May 22, 2021 New module swad_country_database for database queries related to countries. (311632 lines)
|
Version 20.81: May 22, 2021 New module swad_country_database for database queries related to countries. (311632 lines)
|
||||||
Version 20.80: May 20, 2021 New module swad_cookie_database for database queries related to cookies. (311497 lines)
|
Version 20.80: May 20, 2021 New module swad_cookie_database for database queries related to cookies. (311497 lines)
|
||||||
Version 20.79: May 20, 2021 New module swad_connected_database for database queries related to connected users. (311415 lines)
|
Version 20.79: May 20, 2021 New module swad_connected_database for database queries related to connected users. (311415 lines)
|
||||||
|
|
427
swad_country.c
427
swad_country.c
|
@ -85,17 +85,13 @@ static void Cty_ListCountriesForEdition (void);
|
||||||
static void Cty_PutParamOtherCtyCod (void *CtyCod);
|
static void Cty_PutParamOtherCtyCod (void *CtyCod);
|
||||||
static long Cty_GetParamOtherCtyCod (void);
|
static long Cty_GetParamOtherCtyCod (void);
|
||||||
|
|
||||||
static bool Cty_DB_CheckIfNumericCountryCodeExists (long CtyCod);
|
static void Cty_UpdateCtyName (long CtyCod,const char *FieldName,const char *NewCtyName);
|
||||||
static bool Cty_DB_CheckIfAlpha2CountryCodeExists (const char Alpha2[2 + 1]);
|
|
||||||
static bool Cty_DB_CheckIfCountryNameExists (Lan_Language_t Language,const char *Name,long CtyCod);
|
|
||||||
static void Cty_UpdateCtyNameDB (long CtyCod,const char *FieldName,const char *NewCtyName);
|
|
||||||
|
|
||||||
static void Cty_ShowAlertAndButtonToGoToCty (void);
|
static void Cty_ShowAlertAndButtonToGoToCty (void);
|
||||||
static void Cty_PutParamGoToCty (void *CtyCod);
|
static void Cty_PutParamGoToCty (void *CtyCod);
|
||||||
|
|
||||||
static void Cty_PutFormToCreateCountry (void);
|
static void Cty_PutFormToCreateCountry (void);
|
||||||
static void Cty_PutHeadCountriesForEdition (void);
|
static void Cty_PutHeadCountriesForEdition (void);
|
||||||
static void Cty_CreateCountry (void);
|
|
||||||
|
|
||||||
static void Cty_EditingCountryConstructor (void);
|
static void Cty_EditingCountryConstructor (void);
|
||||||
static void Cty_EditingCountryDestructor (void);
|
static void Cty_EditingCountryDestructor (void);
|
||||||
|
@ -800,8 +796,6 @@ void Cty_GetBasicListOfCountries (void)
|
||||||
/********** and number of users who claim to belong to them ***********/
|
/********** and number of users who claim to belong to them ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Cty_MAX_BYTES_SUBQUERY_CTYS ((1 + Lan_NUM_LANGUAGES) * 32)
|
|
||||||
|
|
||||||
void Cty_GetFullListOfCountries (void)
|
void Cty_GetFullListOfCountries (void)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
|
@ -939,7 +933,6 @@ void Cty_WriteCountryName (long CtyCod,const char *ClassLink)
|
||||||
bool Cty_GetDataOfCountryByCod (struct Cty_Countr *Cty)
|
bool Cty_GetDataOfCountryByCod (struct Cty_Countr *Cty)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Another_country;
|
extern const char *Txt_Another_country;
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
Lan_Language_t Lan;
|
Lan_Language_t Lan;
|
||||||
|
@ -975,18 +968,9 @@ bool Cty_GetDataOfCountryByCod (struct Cty_Countr *Cty)
|
||||||
// Here Cty->CtyCod > 0
|
// Here Cty->CtyCod > 0
|
||||||
|
|
||||||
/***** Get data of a country from database *****/
|
/***** Get data of a country from database *****/
|
||||||
if(DB_QuerySELECT (&mysql_res,"can not get data of a country",
|
CtyFound = (Cty_DB_GetDataOfCountryByCod (&mysql_res,Cty->CtyCod) != 0);
|
||||||
"SELECT Alpha2," // row[0]
|
if (CtyFound) // Country found...
|
||||||
"Name_%s," // row[1]
|
|
||||||
"WWW_%s" // row[2]
|
|
||||||
" FROM cty_countrs"
|
|
||||||
" WHERE CtyCod='%03ld'",
|
|
||||||
Lan_STR_LANG_ID[Gbl.Prefs.Language],
|
|
||||||
Lan_STR_LANG_ID[Gbl.Prefs.Language],
|
|
||||||
Cty->CtyCod)) // Country found...
|
|
||||||
{
|
{
|
||||||
CtyFound = true;
|
|
||||||
|
|
||||||
/* Get row */
|
/* Get row */
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
|
@ -999,8 +983,6 @@ bool Cty_GetDataOfCountryByCod (struct Cty_Countr *Cty)
|
||||||
Str_Copy (Cty->WWW[Gbl.Prefs.Language],row[2],
|
Str_Copy (Cty->WWW[Gbl.Prefs.Language],row[2],
|
||||||
sizeof (Cty->WWW[Gbl.Prefs.Language]) - 1);
|
sizeof (Cty->WWW[Gbl.Prefs.Language]) - 1);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
CtyFound = false;
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
@ -1022,8 +1004,6 @@ void Cty_FlushCacheCountryName (void)
|
||||||
void Cty_GetCountryName (long CtyCod,Lan_Language_t Language,
|
void Cty_GetCountryName (long CtyCod,Lan_Language_t Language,
|
||||||
char CtyName[Cty_MAX_BYTES_NAME + 1])
|
char CtyName[Cty_MAX_BYTES_NAME + 1])
|
||||||
{
|
{
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
|
||||||
|
|
||||||
/***** 1. Fast check: Trivial case *****/
|
/***** 1. Fast check: Trivial case *****/
|
||||||
if (CtyCod <= 0)
|
if (CtyCod <= 0)
|
||||||
{
|
{
|
||||||
|
@ -1040,17 +1020,10 @@ void Cty_GetCountryName (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);
|
||||||
Gbl.Cache.CountryName.CtyCod = CtyCod;
|
Gbl.Cache.CountryName.CtyCod = CtyCod;
|
||||||
Gbl.Cache.CountryName.Language = Language;
|
Gbl.Cache.CountryName.Language = Language;
|
||||||
DB_QuerySELECTString (Gbl.Cache.CountryName.CtyName,
|
Str_Copy (Gbl.Cache.CountryName.CtyName,CtyName,Cty_MAX_BYTES_NAME);
|
||||||
sizeof (Gbl.Cache.CountryName.CtyName) - 1,
|
|
||||||
"can not get the name of a country",
|
|
||||||
"SELECT Name_%s"
|
|
||||||
" FROM cty_countrs"
|
|
||||||
" WHERE CtyCod='%03ld'",
|
|
||||||
Lan_STR_LANG_ID[Language],
|
|
||||||
CtyCod);
|
|
||||||
Str_Copy (CtyName,Gbl.Cache.CountryName.CtyName,Cty_MAX_BYTES_NAME);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1081,98 +1054,100 @@ static void Cty_ListCountriesForEdition (void)
|
||||||
unsigned NumUsrsCty;
|
unsigned NumUsrsCty;
|
||||||
Lan_Language_t Lan;
|
Lan_Language_t Lan;
|
||||||
|
|
||||||
/***** Write heading *****/
|
/***** Begin table *****/
|
||||||
HTM_TABLE_BeginWidePadding (2);
|
HTM_TABLE_BeginWidePadding (2);
|
||||||
Cty_PutHeadCountriesForEdition ();
|
|
||||||
|
|
||||||
/***** Write all countries *****/
|
/***** Write heading *****/
|
||||||
for (NumCty = 0;
|
Cty_PutHeadCountriesForEdition ();
|
||||||
NumCty < Gbl.Hierarchy.Ctys.Num;
|
|
||||||
NumCty++)
|
|
||||||
{
|
|
||||||
Cty = &Gbl.Hierarchy.Ctys.Lst[NumCty];
|
|
||||||
NumInss = Ins_GetNumInssInCty (Cty->CtyCod);
|
|
||||||
NumUsrsCty = Usr_GetNumUsrsWhoClaimToBelongToCty (Cty);
|
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
/***** Write all countries *****/
|
||||||
|
for (NumCty = 0;
|
||||||
|
NumCty < Gbl.Hierarchy.Ctys.Num;
|
||||||
|
NumCty++)
|
||||||
|
{
|
||||||
|
Cty = &Gbl.Hierarchy.Ctys.Lst[NumCty];
|
||||||
|
NumInss = Ins_GetNumInssInCty (Cty->CtyCod);
|
||||||
|
NumUsrsCty = Usr_GetNumUsrsWhoClaimToBelongToCty (Cty);
|
||||||
|
|
||||||
/* Put icon to remove country */
|
HTM_TR_Begin (NULL);
|
||||||
HTM_TD_Begin ("rowspan=\"%u\" class=\"BT\"",1 + Lan_NUM_LANGUAGES);
|
|
||||||
if (NumInss || // Country has institutions
|
|
||||||
NumUsrsCty) // Country has users
|
|
||||||
// Deletion forbidden
|
|
||||||
Ico_PutIconRemovalNotAllowed ();
|
|
||||||
else if (Usr_GetNumUsrsInCrss (Hie_Lvl_CTY,Cty->CtyCod,
|
|
||||||
1 << Rol_STD |
|
|
||||||
1 << Rol_NET |
|
|
||||||
1 << Rol_TCH)) // Country has users
|
|
||||||
// Deletion forbidden
|
|
||||||
Ico_PutIconRemovalNotAllowed ();
|
|
||||||
else
|
|
||||||
Ico_PutContextualIconToRemove (ActRemCty,NULL,
|
|
||||||
Cty_PutParamOtherCtyCod,&Cty->CtyCod);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
/* Numerical country code (ISO 3166-1) */
|
/* Put icon to remove country */
|
||||||
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
HTM_TD_Begin ("rowspan=\"%u\" class=\"BT\"",1 + Lan_NUM_LANGUAGES);
|
||||||
HTM_TxtF ("%03ld",Cty->CtyCod);
|
if (NumInss || // Country has institutions
|
||||||
HTM_TD_End ();
|
NumUsrsCty) // Country has users
|
||||||
|
// Deletion forbidden
|
||||||
/* Alphabetic country code with 2 letters (ISO 3166-1) */
|
Ico_PutIconRemovalNotAllowed ();
|
||||||
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
else if (Usr_GetNumUsrsInCrss (Hie_Lvl_CTY,Cty->CtyCod,
|
||||||
HTM_Txt (Cty->Alpha2);
|
1 << Rol_STD |
|
||||||
HTM_TD_End ();
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH)) // Country has users
|
||||||
HTM_TD_Empty (3);
|
// Deletion forbidden
|
||||||
|
Ico_PutIconRemovalNotAllowed ();
|
||||||
/* Number of users */
|
else
|
||||||
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
Ico_PutContextualIconToRemove (ActRemCty,NULL,
|
||||||
HTM_Unsigned (NumUsrsCty);
|
Cty_PutParamOtherCtyCod,&Cty->CtyCod);
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
/* Number of institutions */
|
|
||||||
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
|
||||||
HTM_Unsigned (NumInss);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
|
|
||||||
/* Country name in several languages */
|
|
||||||
for (Lan = (Lan_Language_t) 1;
|
|
||||||
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
|
||||||
Lan++)
|
|
||||||
{
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
/* Language */
|
|
||||||
HTM_TD_Begin ("class=\"DAT RM\"");
|
|
||||||
HTM_TxtColon (Txt_STR_LANG_NAME[Lan]);
|
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Name */
|
/* Numerical country code (ISO 3166-1) */
|
||||||
HTM_TD_Begin ("class=\"LT\"");
|
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
||||||
Frm_BeginForm (ActRenCty);
|
HTM_TxtF ("%03ld",Cty->CtyCod);
|
||||||
Cty_PutParamOtherCtyCod (&Cty->CtyCod);
|
|
||||||
Par_PutHiddenParamUnsigned (NULL,"Lan",(unsigned) Lan);
|
|
||||||
HTM_INPUT_TEXT ("Name",Cty_MAX_CHARS_NAME,Cty->Name[Lan],
|
|
||||||
HTM_SUBMIT_ON_CHANGE,
|
|
||||||
"size=\"15\"");
|
|
||||||
Frm_EndForm ();
|
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* WWW */
|
/* Alphabetic country code with 2 letters (ISO 3166-1) */
|
||||||
HTM_TD_Begin ("class=\"LT\"");
|
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
||||||
Frm_BeginForm (ActChgCtyWWW);
|
HTM_Txt (Cty->Alpha2);
|
||||||
Cty_PutParamOtherCtyCod (&Cty->CtyCod);
|
|
||||||
Par_PutHiddenParamUnsigned (NULL,"Lan",(unsigned) Lan);
|
|
||||||
HTM_INPUT_URL ("WWW",Cty->WWW[Lan],HTM_SUBMIT_ON_CHANGE,
|
|
||||||
"class=\"INPUT_WWW_NARROW\" required=\"required\"");
|
|
||||||
Frm_EndForm ();
|
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TD_Empty (3);
|
||||||
}
|
|
||||||
}
|
/* Number of users */
|
||||||
|
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
||||||
|
HTM_Unsigned (NumUsrsCty);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/* Number of institutions */
|
||||||
|
HTM_TD_Begin ("rowspan=\"%u\" class=\"DAT RT\"",1 + Lan_NUM_LANGUAGES);
|
||||||
|
HTM_Unsigned (NumInss);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
|
||||||
|
/* Country name in several languages */
|
||||||
|
for (Lan = (Lan_Language_t) 1;
|
||||||
|
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
||||||
|
Lan++)
|
||||||
|
{
|
||||||
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
/* Language */
|
||||||
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
|
HTM_TxtColon (Txt_STR_LANG_NAME[Lan]);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/* Name */
|
||||||
|
HTM_TD_Begin ("class=\"LT\"");
|
||||||
|
Frm_BeginForm (ActRenCty);
|
||||||
|
Cty_PutParamOtherCtyCod (&Cty->CtyCod);
|
||||||
|
Par_PutHiddenParamUnsigned (NULL,"Lan",(unsigned) Lan);
|
||||||
|
HTM_INPUT_TEXT ("Name",Cty_MAX_CHARS_NAME,Cty->Name[Lan],
|
||||||
|
HTM_SUBMIT_ON_CHANGE,
|
||||||
|
"size=\"15\"");
|
||||||
|
Frm_EndForm ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/* WWW */
|
||||||
|
HTM_TD_Begin ("class=\"LT\"");
|
||||||
|
Frm_BeginForm (ActChgCtyWWW);
|
||||||
|
Cty_PutParamOtherCtyCod (&Cty->CtyCod);
|
||||||
|
Par_PutHiddenParamUnsigned (NULL,"Lan",(unsigned) Lan);
|
||||||
|
HTM_INPUT_URL ("WWW",Cty->WWW[Lan],HTM_SUBMIT_ON_CHANGE,
|
||||||
|
"class=\"INPUT_WWW_NARROW\" required=\"required\"");
|
||||||
|
Frm_EndForm ();
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
HTM_TR_End ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***** End table *****/
|
/***** End table *****/
|
||||||
HTM_TABLE_End ();
|
HTM_TABLE_End ();
|
||||||
|
@ -1255,10 +1230,7 @@ void Cty_RemoveCountry (void)
|
||||||
Svy_RemoveSurveys (Hie_Lvl_CTY,Cty_EditingCty->CtyCod);
|
Svy_RemoveSurveys (Hie_Lvl_CTY,Cty_EditingCty->CtyCod);
|
||||||
|
|
||||||
/***** Remove country *****/
|
/***** Remove country *****/
|
||||||
DB_QueryDELETE ("can not remove a country",
|
Cty_DB_RemoveCty (Cty_EditingCty->CtyCod);
|
||||||
"DELETE FROM cty_countrs"
|
|
||||||
" WHERE CtyCod='%03ld'",
|
|
||||||
Cty_EditingCty->CtyCod);
|
|
||||||
|
|
||||||
/***** Flush cache *****/
|
/***** Flush cache *****/
|
||||||
Cty_FlushCacheCountryName ();
|
Cty_FlushCacheCountryName ();
|
||||||
|
@ -1325,7 +1297,7 @@ void Cty_RenameCountry (void)
|
||||||
/* Update the table changing old name by new name */
|
/* Update the table changing old name by new name */
|
||||||
snprintf (FieldName,sizeof (FieldName),"Name_%s",
|
snprintf (FieldName,sizeof (FieldName),"Name_%s",
|
||||||
Lan_STR_LANG_ID[Language]);
|
Lan_STR_LANG_ID[Language]);
|
||||||
Cty_UpdateCtyNameDB (Cty_EditingCty->CtyCod,FieldName,NewCtyName);
|
Cty_UpdateCtyName (Cty_EditingCty->CtyCod,FieldName,NewCtyName);
|
||||||
|
|
||||||
/* Write message to show the change made */
|
/* Write message to show the change made */
|
||||||
Ale_CreateAlert (Ale_SUCCESS,NULL,
|
Ale_CreateAlert (Ale_SUCCESS,NULL,
|
||||||
|
@ -1346,68 +1318,14 @@ void Cty_RenameCountry (void)
|
||||||
Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
|
Ale_CreateAlertYouCanNotLeaveFieldEmpty ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******************* Check if a numeric country code exists ******************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static bool Cty_DB_CheckIfNumericCountryCodeExists (long CtyCod)
|
|
||||||
{
|
|
||||||
/***** Get number of countries with a name from database *****/
|
|
||||||
return (DB_QueryCOUNT ("can not check if the numeric code"
|
|
||||||
" of a country already existed",
|
|
||||||
"SELECT COUNT(*)"
|
|
||||||
" FROM cty_countrs"
|
|
||||||
" WHERE CtyCod='%03ld'",
|
|
||||||
CtyCod) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*************** Check if an alphabetic country code exists ******************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static bool Cty_DB_CheckIfAlpha2CountryCodeExists (const char Alpha2[2 + 1])
|
|
||||||
{
|
|
||||||
/***** Get number of countries with a name from database *****/
|
|
||||||
return (DB_QueryCOUNT ("can not check if the alphabetic code"
|
|
||||||
" of a country already existed",
|
|
||||||
"SELECT COUNT(*)"
|
|
||||||
" FROM cty_countrs"
|
|
||||||
" WHERE Alpha2='%s'",
|
|
||||||
Alpha2) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/******************** Check if the name of country exists ********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static bool Cty_DB_CheckIfCountryNameExists (Lan_Language_t Language,const char *Name,long CtyCod)
|
|
||||||
{
|
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
|
||||||
|
|
||||||
/***** Get number of countries with a name from database *****/
|
|
||||||
return (DB_QueryCOUNT ("can not check if the name"
|
|
||||||
" of a country already existed",
|
|
||||||
"SELECT COUNT(*)"
|
|
||||||
" FROM cty_countrs"
|
|
||||||
" WHERE Name_%s='%s'"
|
|
||||||
" AND CtyCod<>'%03ld'",
|
|
||||||
Lan_STR_LANG_ID[Language],Name,
|
|
||||||
CtyCod) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************ Update institution name in table of institutions ***************/
|
/************ Update institution name in table of institutions ***************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Cty_UpdateCtyNameDB (long CtyCod,const char *FieldName,const char *NewCtyName)
|
static void Cty_UpdateCtyName (long CtyCod,const char *FieldName,const char *NewCtyName)
|
||||||
{
|
{
|
||||||
/***** Update country changing old name by new name */
|
/***** Update country changing old name by new name */
|
||||||
DB_QueryUPDATE ("can not update the name of a country",
|
Cty_DB_UpdateCtyField (CtyCod,FieldName,NewCtyName);
|
||||||
"UPDATE cty_countrs"
|
|
||||||
" SET %s='%s'"
|
|
||||||
" WHERE CtyCod='%03ld'",
|
|
||||||
FieldName,NewCtyName,
|
|
||||||
CtyCod);
|
|
||||||
|
|
||||||
/***** Flush cache *****/
|
/***** Flush cache *****/
|
||||||
Cty_FlushCacheCountryName ();
|
Cty_FlushCacheCountryName ();
|
||||||
|
@ -1423,6 +1341,7 @@ void Cty_ChangeCtyWWW (void)
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
char NewWWW[Cns_MAX_BYTES_WWW + 1];
|
char NewWWW[Cns_MAX_BYTES_WWW + 1];
|
||||||
Lan_Language_t Language;
|
Lan_Language_t Language;
|
||||||
|
char FieldName[3 + 1 + 2 + 1]; // Example: "WWW_en"
|
||||||
|
|
||||||
/***** Country constructor *****/
|
/***** Country constructor *****/
|
||||||
Cty_EditingCountryConstructor ();
|
Cty_EditingCountryConstructor ();
|
||||||
|
@ -1440,12 +1359,9 @@ void Cty_ChangeCtyWWW (void)
|
||||||
Cty_GetDataOfCountryByCod (Cty_EditingCty);
|
Cty_GetDataOfCountryByCod (Cty_EditingCty);
|
||||||
|
|
||||||
/***** Update the table changing old WWW by new WWW *****/
|
/***** Update the table changing old WWW by new WWW *****/
|
||||||
DB_QueryUPDATE ("can not update the web of a country",
|
snprintf (FieldName,sizeof (FieldName),"Name_%s",
|
||||||
"UPDATE cty_countrs"
|
Lan_STR_LANG_ID[Language]);
|
||||||
" SET WWW_%s='%s'"
|
Cty_DB_UpdateCtyField (Cty_EditingCty->CtyCod,FieldName,NewWWW);
|
||||||
" WHERE CtyCod='%03ld'",
|
|
||||||
Lan_STR_LANG_ID[Language],NewWWW,
|
|
||||||
Cty_EditingCty->CtyCod);
|
|
||||||
Str_Copy (Cty_EditingCty->WWW[Language],NewWWW,
|
Str_Copy (Cty_EditingCty->WWW[Language],NewWWW,
|
||||||
sizeof (Cty_EditingCty->WWW[Language]) - 1);
|
sizeof (Cty_EditingCty->WWW[Language]) - 1);
|
||||||
|
|
||||||
|
@ -1727,65 +1643,12 @@ void Cty_ReceiveFormNewCountry (void)
|
||||||
|
|
||||||
if (CreateCountry)
|
if (CreateCountry)
|
||||||
{
|
{
|
||||||
Cty_CreateCountry (); // Add new country to database
|
Cty_DB_CreateCountry (Cty_EditingCty); // Add new country to database
|
||||||
Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_country_X,
|
Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_country_X,
|
||||||
Cty_EditingCty->Name);
|
Cty_EditingCty->Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**************************** Create a new country ***************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
#define Cty_MAX_BYTES_SUBQUERY_CTYS_NAME ((1 + Lan_NUM_LANGUAGES) * Cty_MAX_BYTES_NAME)
|
|
||||||
#define Cty_MAX_BYTES_SUBQUERY_CTYS_WWW ((1 + Lan_NUM_LANGUAGES) * Cns_MAX_BYTES_WWW)
|
|
||||||
|
|
||||||
static void Cty_CreateCountry (void)
|
|
||||||
{
|
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
|
||||||
Lan_Language_t Lan;
|
|
||||||
char StrField[32];
|
|
||||||
char SubQueryNam1[Cty_MAX_BYTES_SUBQUERY_CTYS + 1];
|
|
||||||
char SubQueryNam2[Cty_MAX_BYTES_SUBQUERY_CTYS_NAME + 1];
|
|
||||||
char SubQueryWWW1[Cty_MAX_BYTES_SUBQUERY_CTYS + 1];
|
|
||||||
char SubQueryWWW2[Cty_MAX_BYTES_SUBQUERY_CTYS_WWW + 1];
|
|
||||||
|
|
||||||
/***** Create a new country *****/
|
|
||||||
SubQueryNam1[0] = '\0';
|
|
||||||
SubQueryNam2[0] = '\0';
|
|
||||||
SubQueryWWW1[0] = '\0';
|
|
||||||
SubQueryWWW2[0] = '\0';
|
|
||||||
for (Lan = (Lan_Language_t) 1;
|
|
||||||
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
|
||||||
Lan++)
|
|
||||||
{
|
|
||||||
snprintf (StrField,sizeof (StrField),",Name_%s",Lan_STR_LANG_ID[Lan]);
|
|
||||||
Str_Concat (SubQueryNam1,StrField,sizeof (SubQueryNam1) - 1);
|
|
||||||
|
|
||||||
Str_Concat (SubQueryNam2,",'",sizeof (SubQueryNam2) - 1);
|
|
||||||
Str_Concat (SubQueryNam2,Cty_EditingCty->Name[Lan],sizeof (SubQueryNam2) - 1);
|
|
||||||
Str_Concat (SubQueryNam2,"'",sizeof (SubQueryNam2) - 1);
|
|
||||||
|
|
||||||
snprintf (StrField,sizeof (StrField),",WWW_%s",Lan_STR_LANG_ID[Lan]);
|
|
||||||
Str_Concat (SubQueryWWW1,StrField,sizeof (SubQueryWWW1) - 1);
|
|
||||||
|
|
||||||
Str_Concat (SubQueryWWW2,",'",sizeof (SubQueryWWW2) - 1);
|
|
||||||
Str_Concat (SubQueryWWW2,Cty_EditingCty->WWW[Lan],sizeof (SubQueryWWW2) - 1);
|
|
||||||
Str_Concat (SubQueryWWW2,"'",sizeof (SubQueryWWW2) - 1);
|
|
||||||
}
|
|
||||||
DB_QueryINSERT ("can not create country",
|
|
||||||
"INSERT INTO cty_countrs"
|
|
||||||
" (CtyCod,Alpha2,MapAttribution%s%s)"
|
|
||||||
" VALUES"
|
|
||||||
" ('%03ld','%s',''%s%s)",
|
|
||||||
SubQueryNam1,
|
|
||||||
SubQueryWWW1,
|
|
||||||
Cty_EditingCty->CtyCod,
|
|
||||||
Cty_EditingCty->Alpha2,
|
|
||||||
SubQueryNam2,
|
|
||||||
SubQueryWWW2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********************** Get total number of countries ***********************/
|
/*********************** Get total number of countries ***********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1820,12 +1683,7 @@ unsigned Cty_GetCachedNumCtysWithInss (void)
|
||||||
FigCch_UNSIGNED,&NumCtysWithInss))
|
FigCch_UNSIGNED,&NumCtysWithInss))
|
||||||
{
|
{
|
||||||
/***** Get current number of countries with institutions from cache *****/
|
/***** Get current number of countries with institutions from cache *****/
|
||||||
NumCtysWithInss = (unsigned)
|
NumCtysWithInss = Cty_DB_GetNumCtysWithInss ();
|
||||||
DB_QueryCOUNT ("can not get number of countries with institutions",
|
|
||||||
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
|
||||||
" FROM cty_countrs,"
|
|
||||||
"ins_instits"
|
|
||||||
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod");
|
|
||||||
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_INSS,Hie_Lvl_SYS,-1L,
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_INSS,Hie_Lvl_SYS,-1L,
|
||||||
FigCch_UNSIGNED,&NumCtysWithInss);
|
FigCch_UNSIGNED,&NumCtysWithInss);
|
||||||
}
|
}
|
||||||
|
@ -1846,14 +1704,7 @@ unsigned Cty_GetCachedNumCtysWithCtrs (void)
|
||||||
FigCch_UNSIGNED,&NumCtysWithCtrs))
|
FigCch_UNSIGNED,&NumCtysWithCtrs))
|
||||||
{
|
{
|
||||||
/***** Get current number of countries with centers from database and update cache *****/
|
/***** Get current number of countries with centers from database and update cache *****/
|
||||||
NumCtysWithCtrs = (unsigned)
|
NumCtysWithCtrs = Cty_DB_GetNumCtysWithCtrs ();
|
||||||
DB_QueryCOUNT ("can not get number of countries with centers",
|
|
||||||
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
|
||||||
" FROM cty_countrs,"
|
|
||||||
"ins_instits,"
|
|
||||||
"ctr_centers"
|
|
||||||
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod"
|
|
||||||
" AND ins_instits.InsCod=ctr_centers.InsCod");
|
|
||||||
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_CTRS,Hie_Lvl_SYS,-1L,
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_CTRS,Hie_Lvl_SYS,-1L,
|
||||||
FigCch_UNSIGNED,&NumCtysWithCtrs);
|
FigCch_UNSIGNED,&NumCtysWithCtrs);
|
||||||
}
|
}
|
||||||
|
@ -1869,19 +1720,12 @@ unsigned Cty_GetCachedNumCtysWithDegs (void)
|
||||||
{
|
{
|
||||||
unsigned NumCtysWithDegs;
|
unsigned NumCtysWithDegs;
|
||||||
|
|
||||||
|
/***** Get number of countries with degrees from cache *****/
|
||||||
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTYS_WITH_DEGS,Hie_Lvl_SYS,-1L,
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_CTYS_WITH_DEGS,Hie_Lvl_SYS,-1L,
|
||||||
FigCch_UNSIGNED,&NumCtysWithDegs))
|
FigCch_UNSIGNED,&NumCtysWithDegs))
|
||||||
{
|
{
|
||||||
NumCtysWithDegs = (unsigned)
|
/***** Get current number of countries with degrees from database and update cache *****/
|
||||||
DB_QueryCOUNT ("can not get number of countries with degrees",
|
NumCtysWithDegs = Cty_DB_GetNumCtysWithDegs ();
|
||||||
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
|
||||||
" FROM cty_countrs,"
|
|
||||||
"ins_instits,"
|
|
||||||
"ctr_centers,"
|
|
||||||
"deg_degrees"
|
|
||||||
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod"
|
|
||||||
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
|
||||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod");
|
|
||||||
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_DEGS,Hie_Lvl_SYS,-1L,
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_DEGS,Hie_Lvl_SYS,-1L,
|
||||||
FigCch_UNSIGNED,&NumCtysWithDegs);
|
FigCch_UNSIGNED,&NumCtysWithDegs);
|
||||||
}
|
}
|
||||||
|
@ -1902,18 +1746,7 @@ unsigned Cty_GetCachedNumCtysWithCrss (void)
|
||||||
FigCch_UNSIGNED,&NumCtysWithCrss))
|
FigCch_UNSIGNED,&NumCtysWithCrss))
|
||||||
{
|
{
|
||||||
/***** Get current number of countries with courses from database and update cache *****/
|
/***** Get current number of countries with courses from database and update cache *****/
|
||||||
NumCtysWithCrss = (unsigned)
|
NumCtysWithCrss = Cty_DB_GetNumCtysWithCrss ();
|
||||||
DB_QueryCOUNT ("can not get number of countries with courses",
|
|
||||||
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
|
||||||
" FROM cty_countrs,"
|
|
||||||
"ins_instits,"
|
|
||||||
"ctr_centers,"
|
|
||||||
"deg_degrees,"
|
|
||||||
"crs_courses"
|
|
||||||
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod"
|
|
||||||
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
|
||||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
|
||||||
" AND deg_degrees.DegCod=crs_courses.DegCod");
|
|
||||||
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_CRSS,Hie_Lvl_SYS,-1L,
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_CTYS_WITH_CRSS,Hie_Lvl_SYS,-1L,
|
||||||
FigCch_UNSIGNED,&NumCtysWithCrss);
|
FigCch_UNSIGNED,&NumCtysWithCrss);
|
||||||
}
|
}
|
||||||
|
@ -1941,23 +1774,7 @@ unsigned Cty_GetCachedNumCtysWithUsrs (Rol_Role_t Role,const char *SubQuery,
|
||||||
FigCch_UNSIGNED,&NumCtysWithUsrs))
|
FigCch_UNSIGNED,&NumCtysWithUsrs))
|
||||||
{
|
{
|
||||||
/***** Get current number of countries with users from database and update cache *****/
|
/***** Get current number of countries with users from database and update cache *****/
|
||||||
NumCtysWithUsrs = (unsigned)
|
NumCtysWithUsrs = Cty_DB_GetNumCtysWithUsrs (Role,SubQuery);
|
||||||
DB_QueryCOUNT ("can not get number of countries with users",
|
|
||||||
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
|
||||||
" FROM cty_countrs,"
|
|
||||||
"ins_instits,"
|
|
||||||
"ctr_centers,"
|
|
||||||
"deg_degrees,"
|
|
||||||
"crs_courses,"
|
|
||||||
"crs_users"
|
|
||||||
" WHERE %s"
|
|
||||||
"cty_countrs.CtyCod=ins_instits.CtyCod"
|
|
||||||
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
|
||||||
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
|
||||||
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
|
||||||
" AND crs_courses.CrsCod=crs_users.CrsCod"
|
|
||||||
" AND crs_users.Role=%u",
|
|
||||||
SubQuery,(unsigned) Role);
|
|
||||||
FigCch_UpdateFigureIntoCache (FigureCtys[Role],Scope,Cod,
|
FigCch_UpdateFigureIntoCache (FigureCtys[Role],Scope,Cod,
|
||||||
FigCch_UNSIGNED,&NumCtysWithUsrs);
|
FigCch_UNSIGNED,&NumCtysWithUsrs);
|
||||||
}
|
}
|
||||||
|
@ -2061,7 +1878,7 @@ static void Cty_FormToGoToMap (struct Cty_Countr *Cty)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Map;
|
extern const char *Txt_Map;
|
||||||
|
|
||||||
if (Cty_GetIfMapIsAvailable (Cty->CtyCod))
|
if (Cty_DB_GetIfMapIsAvailable (Cty->CtyCod))
|
||||||
{
|
{
|
||||||
Cty_EditingCty = Cty; // Used to pass parameter with the code of the country
|
Cty_EditingCty = Cty; // Used to pass parameter with the code of the country
|
||||||
Lay_PutContextualLinkOnlyIcon (ActSeeCtyInf,NULL,
|
Lay_PutContextualLinkOnlyIcon (ActSeeCtyInf,NULL,
|
||||||
|
@ -2070,37 +1887,3 @@ static void Cty_FormToGoToMap (struct Cty_Countr *Cty)
|
||||||
Txt_Map);
|
Txt_Map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************ Check if any of the centers in a country has map ***************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
bool Cty_GetIfMapIsAvailable (long CtyCod)
|
|
||||||
{
|
|
||||||
MYSQL_RES *mysql_res;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
bool MapIsAvailable = false;
|
|
||||||
|
|
||||||
/***** Get if any center in current country 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"
|
|
||||||
"(SELECT *"
|
|
||||||
" FROM ins_instits,"
|
|
||||||
"ctr_centers"
|
|
||||||
" WHERE ins_instits.CtyCod=%ld"
|
|
||||||
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
|
||||||
" AND (ctr_centers.Latitude<>0"
|
|
||||||
" OR ctr_centers.Longitude<>0))",
|
|
||||||
CtyCod))
|
|
||||||
{
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -124,6 +124,4 @@ unsigned Cty_GetCachedNumCtysWithUsrs (Rol_Role_t Role,const char *SubQuery,
|
||||||
|
|
||||||
void Cty_ListCtysFound (MYSQL_RES **mysql_res,unsigned NumCtys);
|
void Cty_ListCtysFound (MYSQL_RES **mysql_res,unsigned NumCtys);
|
||||||
|
|
||||||
bool Cty_GetIfMapIsAvailable (long CtyCod);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,11 +26,7 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define _GNU_SOURCE // For asprintf
|
#define _GNU_SOURCE // For asprintf
|
||||||
// #include <stdbool.h> // For boolean type
|
|
||||||
// #include <stddef.h> // For NULL
|
|
||||||
#include <stdio.h> // For asprintf
|
#include <stdio.h> // For asprintf
|
||||||
// #include <stdlib.h> // For free
|
|
||||||
// #include <string.h> // For string functions
|
|
||||||
|
|
||||||
#include "swad_country_database.h"
|
#include "swad_country_database.h"
|
||||||
#include "swad_database.h"
|
#include "swad_database.h"
|
||||||
|
@ -47,6 +43,10 @@ extern struct Globals Gbl;
|
||||||
/***************************** Private constants *****************************/
|
/***************************** Private constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define Cty_MAX_BYTES_SUBQUERY_CTYS ((1 + Lan_NUM_LANGUAGES) * 32)
|
||||||
|
#define Cty_MAX_BYTES_SUBQUERY_CTYS_NAME ((1 + Lan_NUM_LANGUAGES) * Cty_MAX_BYTES_NAME)
|
||||||
|
#define Cty_MAX_BYTES_SUBQUERY_CTYS_WWW ((1 + Lan_NUM_LANGUAGES) * Cns_MAX_BYTES_WWW)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Private types *******************************/
|
/******************************* Private types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -59,6 +59,56 @@ extern struct Globals Gbl;
|
||||||
/***************************** Private prototypes ****************************/
|
/***************************** Private prototypes ****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**************************** Create a new country ***************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Cty_DB_CreateCountry (const struct Cty_Countr *Cty)
|
||||||
|
{
|
||||||
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
|
Lan_Language_t Lan;
|
||||||
|
char StrField[32];
|
||||||
|
char SubQueryNam1[Cty_MAX_BYTES_SUBQUERY_CTYS + 1];
|
||||||
|
char SubQueryNam2[Cty_MAX_BYTES_SUBQUERY_CTYS_NAME + 1];
|
||||||
|
char SubQueryWWW1[Cty_MAX_BYTES_SUBQUERY_CTYS + 1];
|
||||||
|
char SubQueryWWW2[Cty_MAX_BYTES_SUBQUERY_CTYS_WWW + 1];
|
||||||
|
|
||||||
|
/***** Create a new country *****/
|
||||||
|
SubQueryNam1[0] = '\0';
|
||||||
|
SubQueryNam2[0] = '\0';
|
||||||
|
SubQueryWWW1[0] = '\0';
|
||||||
|
SubQueryWWW2[0] = '\0';
|
||||||
|
for (Lan = (Lan_Language_t) 1;
|
||||||
|
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
|
||||||
|
Lan++)
|
||||||
|
{
|
||||||
|
snprintf (StrField,sizeof (StrField),",Name_%s",Lan_STR_LANG_ID[Lan]);
|
||||||
|
Str_Concat (SubQueryNam1,StrField,sizeof (SubQueryNam1) - 1);
|
||||||
|
|
||||||
|
Str_Concat (SubQueryNam2,",'",sizeof (SubQueryNam2) - 1);
|
||||||
|
Str_Concat (SubQueryNam2,Cty->Name[Lan],sizeof (SubQueryNam2) - 1);
|
||||||
|
Str_Concat (SubQueryNam2,"'",sizeof (SubQueryNam2) - 1);
|
||||||
|
|
||||||
|
snprintf (StrField,sizeof (StrField),",WWW_%s",Lan_STR_LANG_ID[Lan]);
|
||||||
|
Str_Concat (SubQueryWWW1,StrField,sizeof (SubQueryWWW1) - 1);
|
||||||
|
|
||||||
|
Str_Concat (SubQueryWWW2,",'",sizeof (SubQueryWWW2) - 1);
|
||||||
|
Str_Concat (SubQueryWWW2,Cty->WWW[Lan],sizeof (SubQueryWWW2) - 1);
|
||||||
|
Str_Concat (SubQueryWWW2,"'",sizeof (SubQueryWWW2) - 1);
|
||||||
|
}
|
||||||
|
DB_QueryINSERT ("can not create country",
|
||||||
|
"INSERT INTO cty_countrs"
|
||||||
|
" (CtyCod,Alpha2,MapAttribution%s%s)"
|
||||||
|
" VALUES"
|
||||||
|
" ('%03ld','%s',''%s%s)",
|
||||||
|
SubQueryNam1,
|
||||||
|
SubQueryWWW1,
|
||||||
|
Cty->CtyCod,
|
||||||
|
Cty->Alpha2,
|
||||||
|
SubQueryNam2,
|
||||||
|
SubQueryWWW2);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********** Get basic list of countries ordered by name of country ***********/
|
/********** Get basic list of countries ordered by name of country ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -105,8 +155,6 @@ unsigned Cty_DB_GetListOfCountriesWithPendingInss (MYSQL_RES **mysql_res)
|
||||||
/********** and number of users who claim to belong to them ***********/
|
/********** and number of users who claim to belong to them ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Cty_MAX_BYTES_SUBQUERY_CTYS ((1 + Lan_NUM_LANGUAGES) * 32)
|
|
||||||
|
|
||||||
unsigned Cty_DB_GetFullListOfCountries (MYSQL_RES **mysql_res)
|
unsigned Cty_DB_GetFullListOfCountries (MYSQL_RES **mysql_res)
|
||||||
{
|
{
|
||||||
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
|
@ -181,6 +229,186 @@ unsigned Cty_DB_GetFullListOfCountries (MYSQL_RES **mysql_res)
|
||||||
return NumCtys;
|
return NumCtys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************** Get basic data of country given its code ******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetDataOfCountryByCod (MYSQL_RES **mysql_res,long CtyCod)
|
||||||
|
{
|
||||||
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
|
|
||||||
|
return (unsigned)
|
||||||
|
DB_QuerySELECT (mysql_res,"can not get data of a country",
|
||||||
|
"SELECT Alpha2," // row[0]
|
||||||
|
"Name_%s," // row[1]
|
||||||
|
"WWW_%s" // row[2]
|
||||||
|
" FROM cty_countrs"
|
||||||
|
" WHERE CtyCod='%03ld'",
|
||||||
|
Lan_STR_LANG_ID[Gbl.Prefs.Language],
|
||||||
|
Lan_STR_LANG_ID[Gbl.Prefs.Language],
|
||||||
|
CtyCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Get name of a country in a language *********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Cty_DB_GetCountryName (long CtyCod,Lan_Language_t Language,
|
||||||
|
char CtyName[Cty_MAX_BYTES_NAME + 1])
|
||||||
|
{
|
||||||
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
|
|
||||||
|
DB_QuerySELECTString (CtyName,Cty_MAX_BYTES_NAME,
|
||||||
|
"can not get the name of a country",
|
||||||
|
"SELECT Name_%s"
|
||||||
|
" FROM cty_countrs"
|
||||||
|
" WHERE CtyCod='%03ld'",
|
||||||
|
Lan_STR_LANG_ID[Language],
|
||||||
|
CtyCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************** Get number of countries with institutions *****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetNumCtysWithInss (void)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QueryCOUNT ("can not get number of countries with institutions",
|
||||||
|
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
||||||
|
" FROM cty_countrs,"
|
||||||
|
"ins_instits"
|
||||||
|
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Get number of countries with centers ********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetNumCtysWithCtrs (void)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QueryCOUNT ("can not get number of countries with centers",
|
||||||
|
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
||||||
|
" FROM cty_countrs,"
|
||||||
|
"ins_instits,"
|
||||||
|
"ctr_centers"
|
||||||
|
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod"
|
||||||
|
" AND ins_instits.InsCod=ctr_centers.InsCod");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Get number of countries with degrees ********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetNumCtysWithDegs (void)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QueryCOUNT ("can not get number of countries with degrees",
|
||||||
|
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
||||||
|
" FROM cty_countrs,"
|
||||||
|
"ins_instits,"
|
||||||
|
"ctr_centers,"
|
||||||
|
"deg_degrees"
|
||||||
|
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod"
|
||||||
|
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
||||||
|
" AND ctr_centers.CtrCod=deg_degrees.CtrCod");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Get number of countries with courses ********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetNumCtysWithCrss (void)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QueryCOUNT ("can not get number of countries with courses",
|
||||||
|
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
||||||
|
" FROM cty_countrs,"
|
||||||
|
"ins_instits,"
|
||||||
|
"ctr_centers,"
|
||||||
|
"deg_degrees,"
|
||||||
|
"crs_courses"
|
||||||
|
" WHERE cty_countrs.CtyCod=ins_instits.CtyCod"
|
||||||
|
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
||||||
|
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
||||||
|
" AND deg_degrees.DegCod=crs_courses.DegCod");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Get number of countries with users **********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetNumCtysWithUsrs (Rol_Role_t Role,const char *SubQuery)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QueryCOUNT ("can not get number of countries with users",
|
||||||
|
"SELECT COUNT(DISTINCT cty_countrs.CtyCod)"
|
||||||
|
" FROM cty_countrs,"
|
||||||
|
"ins_instits,"
|
||||||
|
"ctr_centers,"
|
||||||
|
"deg_degrees,"
|
||||||
|
"crs_courses,"
|
||||||
|
"crs_users"
|
||||||
|
" WHERE %s"
|
||||||
|
"cty_countrs.CtyCod=ins_instits.CtyCod"
|
||||||
|
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
||||||
|
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
|
||||||
|
" AND deg_degrees.DegCod=crs_courses.DegCod"
|
||||||
|
" AND crs_courses.CrsCod=crs_users.CrsCod"
|
||||||
|
" AND crs_users.Role=%u",
|
||||||
|
SubQuery,(unsigned) Role);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************* Check if a numeric country code exists ******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
bool Cty_DB_CheckIfNumericCountryCodeExists (long CtyCod)
|
||||||
|
{
|
||||||
|
/***** Get number of countries with a name from database *****/
|
||||||
|
return (DB_QueryCOUNT ("can not check if the numeric code"
|
||||||
|
" of a country already existed",
|
||||||
|
"SELECT COUNT(*)"
|
||||||
|
" FROM cty_countrs"
|
||||||
|
" WHERE CtyCod='%03ld'",
|
||||||
|
CtyCod) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*************** Check if an alphabetic country code exists ******************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
bool Cty_DB_CheckIfAlpha2CountryCodeExists (const char Alpha2[2 + 1])
|
||||||
|
{
|
||||||
|
/***** Get number of countries with a name from database *****/
|
||||||
|
return (DB_QueryCOUNT ("can not check if the alphabetic code"
|
||||||
|
" of a country already existed",
|
||||||
|
"SELECT COUNT(*)"
|
||||||
|
" FROM cty_countrs"
|
||||||
|
" WHERE Alpha2='%s'",
|
||||||
|
Alpha2) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************** Check if the name of country exists ********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
bool Cty_DB_CheckIfCountryNameExists (Lan_Language_t Language,const char *Name,long CtyCod)
|
||||||
|
{
|
||||||
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
||||||
|
|
||||||
|
/***** Get number of countries with a name from database *****/
|
||||||
|
return (DB_QueryCOUNT ("can not check if the name"
|
||||||
|
" of a country already existed",
|
||||||
|
"SELECT COUNT(*)"
|
||||||
|
" FROM cty_countrs"
|
||||||
|
" WHERE Name_%s='%s'"
|
||||||
|
" AND CtyCod<>'%03ld'",
|
||||||
|
Lan_STR_LANG_ID[Language],Name,
|
||||||
|
CtyCod) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********** Get average coordinates of centers in current country ***********/
|
/*********** Get average coordinates of centers in current country ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -241,6 +469,54 @@ unsigned Cty_DB_GetMapAttr (MYSQL_RES **mysql_res,long CtyCod)
|
||||||
CtyCod);
|
CtyCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************ Check if any of the centers in a country has map ***************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
bool Cty_DB_GetIfMapIsAvailable (long CtyCod)
|
||||||
|
{
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
bool MapIsAvailable = false;
|
||||||
|
|
||||||
|
/***** Get if any center in current country 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"
|
||||||
|
"(SELECT *"
|
||||||
|
" FROM ins_instits,"
|
||||||
|
"ctr_centers"
|
||||||
|
" WHERE ins_instits.CtyCod=%ld"
|
||||||
|
" AND ins_instits.InsCod=ctr_centers.InsCod"
|
||||||
|
" AND (ctr_centers.Latitude<>0"
|
||||||
|
" OR ctr_centers.Longitude<>0))",
|
||||||
|
CtyCod))
|
||||||
|
{
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******** Update country changing old field value by new field value *********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Cty_DB_UpdateCtyField (long CtyCod,const char *FieldName,const char *FieldValue)
|
||||||
|
{
|
||||||
|
DB_QueryUPDATE ("can not update a field value of a country",
|
||||||
|
"UPDATE cty_countrs"
|
||||||
|
" SET %s='%s'"
|
||||||
|
" WHERE CtyCod='%03ld'",
|
||||||
|
FieldName,FieldValue,
|
||||||
|
CtyCod);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*********** Update the attribution of the map of current country ************/
|
/*********** Update the attribution of the map of current country ************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -255,3 +531,14 @@ void Cty_DB_UpdateCtyMapAttr (const char NewMapAttribution[Med_MAX_BYTES_ATTRIBU
|
||||||
Gbl.Hierarchy.Cty.CtyCod);
|
Gbl.Hierarchy.Cty.CtyCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************************* Remove country ****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Cty_DB_RemoveCty (long CtyCod)
|
||||||
|
{
|
||||||
|
DB_QueryDELETE ("can not remove a country",
|
||||||
|
"DELETE FROM cty_countrs"
|
||||||
|
" WHERE CtyCod='%03ld'",
|
||||||
|
CtyCod);
|
||||||
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include <mysql/mysql.h> // To access MySQL databases
|
#include <mysql/mysql.h> // To access MySQL databases
|
||||||
|
|
||||||
|
#include "swad_country.h"
|
||||||
#include "swad_map.h"
|
#include "swad_map.h"
|
||||||
#include "swad_media.h"
|
#include "swad_media.h"
|
||||||
|
|
||||||
|
@ -40,13 +41,33 @@
|
||||||
/***************************** Public prototypes *****************************/
|
/***************************** Public prototypes *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Cty_DB_CreateCountry (const struct Cty_Countr *Cty);
|
||||||
|
|
||||||
unsigned Cty_DB_GetBasicListOfCountries (MYSQL_RES **mysql_res);
|
unsigned Cty_DB_GetBasicListOfCountries (MYSQL_RES **mysql_res);
|
||||||
unsigned Cty_DB_GetListOfCountriesWithPendingInss (MYSQL_RES **mysql_res);
|
unsigned Cty_DB_GetListOfCountriesWithPendingInss (MYSQL_RES **mysql_res);
|
||||||
unsigned Cty_DB_GetFullListOfCountries (MYSQL_RES **mysql_res);
|
unsigned Cty_DB_GetFullListOfCountries (MYSQL_RES **mysql_res);
|
||||||
|
unsigned Cty_DB_GetDataOfCountryByCod (MYSQL_RES **mysql_res,long CtyCod);
|
||||||
|
void Cty_DB_GetCountryName (long CtyCod,Lan_Language_t Language,
|
||||||
|
char CtyName[Cty_MAX_BYTES_NAME + 1]);
|
||||||
|
|
||||||
|
unsigned Cty_DB_GetNumCtysWithInss (void);
|
||||||
|
unsigned Cty_DB_GetNumCtysWithCtrs (void);
|
||||||
|
unsigned Cty_DB_GetNumCtysWithDegs (void);
|
||||||
|
unsigned Cty_DB_GetNumCtysWithCrss (void);
|
||||||
|
unsigned Cty_DB_GetNumCtysWithUsrs (Rol_Role_t Role,const char *SubQuery);
|
||||||
|
|
||||||
|
bool Cty_DB_CheckIfNumericCountryCodeExists (long CtyCod);
|
||||||
|
bool Cty_DB_CheckIfAlpha2CountryCodeExists (const char Alpha2[2 + 1]);
|
||||||
|
bool Cty_DB_CheckIfCountryNameExists (Lan_Language_t Language,const char *Name,long CtyCod);
|
||||||
|
|
||||||
void Cty_DB_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom);
|
void Cty_DB_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom);
|
||||||
unsigned Cty_DB_GetCtrsWithCoordsInCurrentCty (MYSQL_RES **mysql_res);
|
unsigned Cty_DB_GetCtrsWithCoordsInCurrentCty (MYSQL_RES **mysql_res);
|
||||||
unsigned Cty_DB_GetMapAttr (MYSQL_RES **mysql_res,long CtyCod);
|
unsigned Cty_DB_GetMapAttr (MYSQL_RES **mysql_res,long CtyCod);
|
||||||
|
bool Cty_DB_GetIfMapIsAvailable (long CtyCod);
|
||||||
|
|
||||||
|
void Cty_DB_UpdateCtyField (long CtyCod,const char *FieldName,const char *FieldValue);
|
||||||
void Cty_DB_UpdateCtyMapAttr (const char NewMapAttribution[Med_MAX_BYTES_ATTRIBUTION + 1]);
|
void Cty_DB_UpdateCtyMapAttr (const char NewMapAttribution[Med_MAX_BYTES_ATTRIBUTION + 1]);
|
||||||
|
|
||||||
|
void Cty_DB_RemoveCty (long CtyCod);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue