From 28969d7ac0ba09eb29de47ce3f98f0a944e9ccea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Thu, 18 Oct 2018 20:27:22 +0200 Subject: [PATCH] Version 18.7.5 --- swad_account.c | 52 +++++++++++----------------------- swad_action.c | 14 +++++---- swad_changelog.h | 3 +- swad_database.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ swad_database.h | 12 ++++++++ 5 files changed, 113 insertions(+), 42 deletions(-) diff --git a/swad_account.c b/swad_account.c index c13e8039e..c03fd419c 100644 --- a/swad_account.c +++ b/swad_account.c @@ -210,8 +210,7 @@ void Acc_CheckIfEmptyAccountExists (void) " AND usr_data.Password=''", ID) < 0) Lay_NotEnoughMemoryExit (); - NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get user's codes"); - free ((void *) Query); + NumUsrs = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get user's codes"); if (NumUsrs) { @@ -639,7 +638,7 @@ static bool Acc_GetParamsNewAccount (char NewNicknameWithoutArroba[Nck_MAX_BYTES " WHERE Nickname='%s' AND UsrCod<>%ld", NewNicknameWithoutArroba,Gbl.Usrs.Me.UsrDat.UsrCod) < 0) Lay_NotEnoughMemoryExit (); - if (DB_QueryCOUNT (Query,"can not check if nickname already existed")) // A nickname of another user is the same that this nickname + if (DB_QueryCOUNT_free (Query,"can not check if nickname already existed")) // A nickname of another user is the same that this nickname { Error = true; snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt), @@ -647,7 +646,6 @@ static bool Acc_GetParamsNewAccount (char NewNicknameWithoutArroba[Nck_MAX_BYTES NewNicknameWithoutArroba); Ale_ShowAlert (Ale_WARNING,Gbl.Alert.Txt); } - free ((void *) Query); } else // New nickname is not valid { @@ -671,7 +669,7 @@ static bool Acc_GetParamsNewAccount (char NewNicknameWithoutArroba[Nck_MAX_BYTES " WHERE E_mail='%s' AND Confirmed='Y'", NewEmail) < 0) Lay_NotEnoughMemoryExit (); - if (DB_QueryCOUNT (Query,"can not check if email already existed")) // An email of another user is the same that my email + if (DB_QueryCOUNT_free (Query,"can not check if email already existed")) // An email of another user is the same that my email { Error = true; snprintf (Gbl.Alert.Txt,sizeof (Gbl.Alert.Txt), @@ -679,7 +677,6 @@ static bool Acc_GetParamsNewAccount (char NewNicknameWithoutArroba[Nck_MAX_BYTES NewEmail); Ale_ShowAlert (Ale_WARNING,Gbl.Alert.Txt); } - free ((void *) Query); } else // New email is not valid { @@ -779,9 +776,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat,bool CreatingMyOwnAccount) (unsigned) Mnu_MENU_DEFAULT, (unsigned) Cfg_DEFAULT_COLUMNS) < 0) Lay_NotEnoughMemoryExit (); - UsrDat->UsrCod = DB_QueryINSERTandReturnCode (QueryUsrData, - "can not create user"); - free ((void *) QueryUsrData); + UsrDat->UsrCod = DB_QueryINSERTandReturnCode_free (QueryUsrData,"can not create user"); /* Insert user's IDs as confirmed */ for (NumID = 0; @@ -798,8 +793,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat,bool CreatingMyOwnAccount) UsrDat->IDs.List[NumID].Confirmed ? 'Y' : 'N') < 0) Lay_NotEnoughMemoryExit (); - DB_QueryINSERT (QueryUsrIDs,"can not store user's ID when creating user"); - free ((void *) QueryUsrIDs); + DB_QueryINSERT_free (QueryUsrIDs,"can not store user's ID when creating user"); } /***** Create directory for the user, if not exists *****/ @@ -1038,8 +1032,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, if (asprintf (&Query,"DELETE FROM crs_usr_requests WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's requests for inscription"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's requests for inscription"); /***** Remove user from possible duplicate users *****/ Dup_RemoveUsrFromDuplicated (UsrDat->UsrCod); @@ -1048,8 +1041,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, if (asprintf (&Query,"DELETE FROM crs_usr WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove a user from all courses"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove a user from all courses"); if (QuietOrVerbose == Cns_VERBOSE) { @@ -1063,8 +1055,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, if (asprintf (&Query,"DELETE FROM admin WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove a user as administrator"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove a user as administrator"); if (QuietOrVerbose == Cns_VERBOSE) { @@ -1121,15 +1112,13 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, if (asprintf (&Query,"DELETE FROM connected WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove a user from table of connected users"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove a user from table of connected users"); /***** Remove all sessions of this user *****/ if (asprintf (&Query,"DELETE FROM sessions WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove sessions of a user"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove sessions of a user"); /***** Remove social content associated to the user *****/ Soc_RemoveUsrSocialContent (UsrDat->UsrCod); @@ -1195,49 +1184,42 @@ static void Acc_RemoveUsr (struct UsrData *UsrDat) if (asprintf (&Query,"DELETE FROM usr_webs WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's webs / social networks"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's webs / social networks"); /***** Remove user's nicknames *****/ if (asprintf (&Query,"DELETE FROM usr_nicknames WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's nicknames"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's nicknames"); /***** Remove user's emails *****/ if (asprintf (&Query,"DELETE FROM pending_emails WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove pending user's emails"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove pending user's emails"); if (asprintf (&Query,"DELETE FROM usr_emails WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's emails"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's emails"); /***** Remove user's IDs *****/ if (asprintf (&Query,"DELETE FROM usr_IDs WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's IDs"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's IDs"); /***** Remove user's last data *****/ if (asprintf (&Query,"DELETE FROM usr_last WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's last data"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's last data"); /***** Remove user's data *****/ if (asprintf (&Query,"DELETE FROM usr_data WHERE UsrCod=%ld", UsrDat->UsrCod) < 0) Lay_NotEnoughMemoryExit (); - DB_QueryDELETE (Query,"can not remove user's data"); - free ((void *) Query); + DB_QueryDELETE_free (Query,"can not remove user's data"); } /*****************************************************************************/ diff --git a/swad_action.c b/swad_action.c index c81dca89b..e1a04e35d 100644 --- a/swad_action.c +++ b/swad_action.c @@ -25,8 +25,9 @@ /*********************************** Headers *********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For NULL -#include // For fprintf +#include // For fprintf, asprintf #include // For malloc and free #include // For string functions @@ -5119,15 +5120,16 @@ char *Act_GetActionTextFromDB (long ActCod, char ActTxt[Act_MAX_BYTES_ACTION_TXT + 1]) { extern const char *Txt_STR_LANG_ID[1 + Txt_NUM_LANGUAGES]; - char Query[1024]; + char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; /***** Get test for an action from database *****/ - sprintf (Query,"SELECT Txt FROM actions" - " WHERE ActCod=%ld AND Language='%s'", - ActCod,Txt_STR_LANG_ID[Txt_LANGUAGE_ES]); // !!! TODO: Replace Txt_LANGUAGE_ES by Gbl.Prefs.Language !!! - if (DB_QuerySELECT (Query,&mysql_res,"can not get text for an action")) + if (asprintf (&Query,"SELECT Txt FROM actions" + " WHERE ActCod=%ld AND Language='%s'", + ActCod,Txt_STR_LANG_ID[Txt_LANGUAGE_ES]) < 0) // !!! TODO: Replace Txt_LANGUAGE_ES by Gbl.Prefs.Language !!! + Lay_NotEnoughMemoryExit (); + if (DB_QuerySELECT_free (Query,&mysql_res,"can not get text for an action")) { /***** Get text *****/ row = mysql_fetch_row (mysql_res); diff --git a/swad_changelog.h b/swad_changelog.h index b532b8df4..25f27265a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -355,10 +355,11 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.7.4 (2018-10-18)" +#define Log_PLATFORM_VERSION "SWAD 18.7.5 (2018-10-18)" #define CSS_FILE "swad18.4.css" #define JS_FILE "swad17.17.1.js" /* + Version 18.7.5: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236688 lines) Version 18.7.4: Oct 18, 2018 Some sprintf for database queries changed by asprintf. (236640 lines) Version 18.7.3: Oct 18, 2018 Changes in layout of list of attendance. (236608 lines) Version 18.7.2: Oct 18, 2018 Changes in layout of list of attendance. (236602 lines) diff --git a/swad_database.c b/swad_database.c index 5bbf6e67f..8f603f921 100644 --- a/swad_database.c +++ b/swad_database.c @@ -3066,6 +3066,24 @@ void DB_CloseDBConnection (void) /******************** Make a SELECT query from database **********************/ /*****************************************************************************/ +unsigned long DB_QuerySELECT_free (const char *Query,MYSQL_RES **mysql_res,const char *MsgError) + { + int Result; + + /***** Query database *****/ + Result = mysql_query (&Gbl.mysql,Query); // Returns 0 on success + free ((void *) Query); + if (Result) + DB_ExitOnMySQLError (MsgError); + + /***** Store query result *****/ + if ((*mysql_res = mysql_store_result (&Gbl.mysql)) == NULL) + DB_ExitOnMySQLError (MsgError); + + /***** Return number of rows of result *****/ + return (unsigned long) mysql_num_rows (*mysql_res); + } + unsigned long DB_QuerySELECT (const char *Query,MYSQL_RES **mysql_res,const char *MsgError) { /***** Query database *****/ @@ -3084,6 +3102,26 @@ unsigned long DB_QuerySELECT (const char *Query,MYSQL_RES **mysql_res,const char /**************** Make a SELECT COUNT query from database ********************/ /*****************************************************************************/ +unsigned long DB_QueryCOUNT_free (const char *Query,const char *MsgError) + { + MYSQL_RES *mysql_res; + MYSQL_ROW row; + unsigned long NumRows; + + /***** Make query "SELECT COUNT(*) FROM..." *****/ + DB_QuerySELECT_free (Query,&mysql_res,MsgError); + + /***** Get number of rows *****/ + row = mysql_fetch_row (mysql_res); + if (sscanf (row[0],"%lu",&NumRows) != 1) + Lay_ShowErrorAndExit ("Error when counting number of rows."); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + return NumRows; + } + unsigned long DB_QueryCOUNT (const char *Query,const char *MsgError) { MYSQL_RES *mysql_res; @@ -3108,6 +3146,17 @@ unsigned long DB_QueryCOUNT (const char *Query,const char *MsgError) /******************** Make an INSERT query in database ***********************/ /*****************************************************************************/ +void DB_QueryINSERT_free (const char *Query,const char *MsgError) + { + int Result; + + /***** Query database *****/ + Result = mysql_query (&Gbl.mysql,Query); // Returns 0 on success + free ((void *) Query); + if (Result) + DB_ExitOnMySQLError (MsgError); + } + void DB_QueryINSERT (const char *Query,const char *MsgError) { /***** Query database *****/ @@ -3119,6 +3168,20 @@ void DB_QueryINSERT (const char *Query,const char *MsgError) /** Make an INSERT query in database and return code of last inserted item ***/ /*****************************************************************************/ +long DB_QueryINSERTandReturnCode_free (const char *Query,const char *MsgError) + { + int Result; + + /***** Query database *****/ + Result = mysql_query (&Gbl.mysql,Query); // Returns 0 on success + free ((void *) Query); + if (Result) + DB_ExitOnMySQLError (MsgError); + + /***** Return the code of the inserted item *****/ + return (long) mysql_insert_id (&Gbl.mysql); + } + long DB_QueryINSERTandReturnCode (const char *Query,const char *MsgError) { /***** Query database *****/ @@ -3158,6 +3221,17 @@ void DB_QueryUPDATE (const char *Query,const char *MsgError) /******************** Make a DELETE query from database **********************/ /*****************************************************************************/ +void DB_QueryDELETE_free (const char *Query,const char *MsgError) + { + int Result; + + /***** Query database *****/ + Result = mysql_query (&Gbl.mysql,Query); // Returns 0 on success + free ((void *) Query); + if (Result) + DB_ExitOnMySQLError (MsgError); + } + void DB_QueryDELETE (const char *Query,const char *MsgError) { /***** Query database *****/ diff --git a/swad_database.h b/swad_database.h index 7d64cce05..041802103 100644 --- a/swad_database.h +++ b/swad_database.h @@ -36,13 +36,25 @@ void DB_CreateTablesIfNotExist (void); void DB_OpenDBConnection (void); void DB_CloseDBConnection (void); + +unsigned long DB_QuerySELECT_free (const char *Query,MYSQL_RES **mysql_res,const char *MsgError); unsigned long DB_QuerySELECT (const char *Query,MYSQL_RES **mysql_res,const char *MsgError); + +unsigned long DB_QueryCOUNT_free (const char *Query,const char *MsgError); unsigned long DB_QueryCOUNT (const char *Query,const char *MsgError); + +void DB_QueryINSERT_free (const char *Query,const char *MsgError); void DB_QueryINSERT (const char *Query,const char *MsgError); + +long DB_QueryINSERTandReturnCode_free (const char *Query,const char *MsgError); long DB_QueryINSERTandReturnCode (const char *Query,const char *MsgError); + void DB_QueryREPLACE (const char *Query,const char *MsgError); void DB_QueryUPDATE (const char *Query,const char *MsgError); + +void DB_QueryDELETE_free (const char *Query,const char *MsgError); void DB_QueryDELETE (const char *Query,const char *MsgError); + void DB_Query (const char *Query,const char *MsgError); void DB_FreeMySQLResult (MYSQL_RES **mysql_res); void DB_ExitOnMySQLError (const char *Message);