From c54ed0e6eb8d977088d31c4885296f865ad794ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Thu, 25 Oct 2018 11:26:44 +0200 Subject: [PATCH] Version 18.8 --- swad_account.c | 18 +- swad_action.c | 10 +- swad_agenda.c | 230 +++++++++++------------ swad_announcement.c | 54 +++--- swad_assignment.c | 282 ++++++++++++---------------- swad_attendance.c | 251 +++++++++++-------------- swad_banner.c | 52 +++--- swad_centre.c | 163 ++++++++-------- swad_centre.h | 2 +- swad_changelog.h | 3 +- swad_chat.c | 16 +- swad_connected.c | 446 +++++++++++++++++++++----------------------- swad_country.c | 136 ++++++-------- swad_country.h | 2 +- swad_database.c | 66 ++++++- swad_database.h | 3 + swad_global.c | 1 + swad_global.h | 1 + swad_notification.c | 10 +- swad_search.c | 36 ++-- 20 files changed, 845 insertions(+), 937 deletions(-) diff --git a/swad_account.c b/swad_account.c index c03fd419c..84c718414 100644 --- a/swad_account.c +++ b/swad_account.c @@ -25,8 +25,6 @@ /*********************************** Headers *********************************/ /*****************************************************************************/ -#define _GNU_SOURCE // For asprintf -#include // For asprintf #include // For string functions #include "swad_account.h" @@ -183,7 +181,6 @@ void Acc_CheckIfEmptyAccountExists (void) unsigned NumUsrs; unsigned NumUsr; struct UsrData UsrDat; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -203,14 +200,13 @@ void Acc_CheckIfEmptyAccountExists (void) /***** Check if there are users with this user's ID *****/ if (ID_CheckIfUsrIDIsValid (ID)) { - if (asprintf (&Query,"SELECT usr_IDs.UsrCod" - " FROM usr_IDs,usr_data" - " WHERE usr_IDs.UsrID='%s'" - " AND usr_IDs.UsrCod=usr_data.UsrCod" - " AND usr_data.Password=''", - ID) < 0) - Lay_NotEnoughMemoryExit (); - NumUsrs = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get user's codes"); + DB_BuildQuery ("SELECT usr_IDs.UsrCod" + " FROM usr_IDs,usr_data" + " WHERE usr_IDs.UsrID='%s'" + " AND usr_IDs.UsrCod=usr_data.UsrCod" + " AND usr_data.Password=''", + ID); + NumUsrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get user's codes"); if (NumUsrs) { diff --git a/swad_action.c b/swad_action.c index e1a04e35d..f67c2939b 100644 --- a/swad_action.c +++ b/swad_action.c @@ -5120,16 +5120,14 @@ 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; MYSQL_RES *mysql_res; MYSQL_ROW row; /***** Get test for an action from database *****/ - 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")) + DB_BuildQuery ("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_new (&mysql_res,"can not get text for an action")) { /***** Get text *****/ row = mysql_fetch_row (mysql_res); diff --git a/swad_agenda.c b/swad_agenda.c index ad45dd198..8284f46c8 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -987,7 +987,6 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType) char PrivatPublicEventsSubQuery[Agd_MAX_BYTES_SUBQUERY]; char HiddenVisiblEventsSubQuery[Agd_MAX_BYTES_SUBQUERY]; char OrderBySubQuery[Agd_MAX_BYTES_SUBQUERY]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -1102,16 +1101,15 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType) } /* Build full query */ - if (asprintf (&Query,"SELECT AgdCod FROM agendas" - " WHERE %s%s%s%s" - " ORDER BY %s", - UsrSubQuery, - Past__FutureEventsSubQuery, - PrivatPublicEventsSubQuery, - HiddenVisiblEventsSubQuery, - OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get agenda events"); + DB_BuildQuery ("SELECT AgdCod FROM agendas" + " WHERE %s%s%s%s" + " ORDER BY %s", + UsrSubQuery, + Past__FutureEventsSubQuery, + PrivatPublicEventsSubQuery, + HiddenVisiblEventsSubQuery, + OrderBySubQuery); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get agenda events"); if (NumRows) // Events found... { @@ -1148,24 +1146,22 @@ static void Agd_GetListEvents (Agd_AgendaType_t AgendaType) static void Agd_GetDataOfEventByCod (struct AgendaEvent *AgdEvent) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; /***** Build query *****/ - if (asprintf (&Query,"SELECT AgdCod,Public,Hidden," - "UNIX_TIMESTAMP(StartTime)," - "UNIX_TIMESTAMP(EndTime)," - "NOW()>EndTime," // Past event? - "NOW()AgdCod,AgdEvent->UsrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AgdCod,Public,Hidden," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW()>EndTime," // Past event? + "NOW()AgdCod,AgdEvent->UsrCod); /***** Get data of event from database *****/ - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get agenda event data")) // Event found... + if (DB_QuerySELECT_new (&mysql_res,"can not get agenda event data")) // Event found... { /* Get row: row[0] AgdCod @@ -1248,17 +1244,15 @@ void Agd_FreeListEvents (void) static void Agd_GetEventTxtFromDB (struct AgendaEvent *AgdEvent, char Txt[Cns_MAX_BYTES_TEXT + 1]) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; /***** Get text of event from database *****/ - if (asprintf (&Query,"SELECT Txt FROM agendas" - " WHERE AgdCod=%ld AND UsrCod=%ld", - AgdEvent->AgdCod,AgdEvent->UsrCod) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get event text"); + DB_BuildQuery ("SELECT Txt FROM agendas" + " WHERE AgdCod=%ld AND UsrCod=%ld", + AgdEvent->AgdCod,AgdEvent->UsrCod); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get event text"); /***** The result of the query must have one row or none *****/ if (NumRows == 1) @@ -1797,7 +1791,6 @@ unsigned Agd_GetNumEventsFromUsr (long UsrCod) unsigned Agd_GetNumUsrsWithEvents (Sco_Scope_t Scope) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumUsrs; @@ -1806,70 +1799,64 @@ unsigned Agd_GetNumUsrsWithEvents (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT UsrCod)" - " FROM agendas" - " WHERE UsrCod>0") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT UsrCod)" + " FROM agendas" + " WHERE UsrCod>0"); break; case Sco_SCOPE_CTY: - if (asprintf (&Query,"SELECT COUNT(DISTINCT agendas.UsrCod)" - " FROM institutions,centres,degrees,courses,crs_usr,agendas" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentCty.Cty.CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT agendas.UsrCod)" + " FROM institutions,centres,degrees,courses,crs_usr,agendas" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT agendas.UsrCod)" - " FROM centres,degrees,courses,crs_usr,agendas" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT agendas.UsrCod)" + " FROM centres,degrees,courses,crs_usr,agendas" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - if (asprintf (&Query,"SELECT COUNT(DISTINCT agendas.UsrCod)" - " FROM degrees,courses,crs_usr,agendas" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT agendas.UsrCod)" + " FROM degrees,courses,crs_usr,agendas" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: - if (asprintf (&Query,"SELECT COUNT(DISTINCT agendas.UsrCod)" - " FROM courses,crs_usr,agendas" - " WHERE courses.DegCod=%ld" - " AND courses.Status=0" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT agendas.UsrCod)" + " FROM courses,crs_usr,agendas" + " WHERE courses.DegCod=%ld" + " AND courses.Status=0" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT agendas.UsrCod)" - " FROM crs_usr,agendas" - " WHERE crs_usr.CrsCod=%ld" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT agendas.UsrCod)" + " FROM crs_usr,agendas" + " WHERE crs_usr.CrsCod=%ld" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of users with events"); + DB_QuerySELECT_new (&mysql_res,"can not get number of users with events"); /***** Get number of users *****/ row = mysql_fetch_row (mysql_res); @@ -1889,7 +1876,6 @@ unsigned Agd_GetNumUsrsWithEvents (Sco_Scope_t Scope) unsigned Agd_GetNumEvents (Sco_Scope_t Scope) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumEvents; @@ -1898,66 +1884,60 @@ unsigned Agd_GetNumEvents (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - if (asprintf (&Query,"SELECT COUNT(*)" - " FROM agendas" - " WHERE UsrCod>0") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*)" + " FROM agendas" + " WHERE UsrCod>0"); break; case Sco_SCOPE_CTY: - if (asprintf (&Query,"SELECT COUNT(*)" - " FROM institutions,centres,degrees,courses,crs_usr,agendas" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentCty.Cty.CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*)" + " FROM institutions,centres,degrees,courses,crs_usr,agendas" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: - if (asprintf (&Query,"SELECT COUNT(*)" - " FROM centres,degrees,courses,crs_usr,agendas" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*)" + " FROM centres,degrees,courses,crs_usr,agendas" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - if (asprintf (&Query,"SELECT COUNT(*)" - " FROM degrees,courses,crs_usr,agendas" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*)" + " FROM degrees,courses,crs_usr,agendas" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: - if (asprintf (&Query,"SELECT COUNT(*)" - " FROM courses,crs_usr,agendas" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*)" + " FROM courses,crs_usr,agendas" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: - if (asprintf (&Query,"SELECT COUNT(*)" - " FROM crs_usr,agendas" - " WHERE crs_usr.CrsCod=%ld" - " AND crs_usr.UsrCod=agendas.UsrCod", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*)" + " FROM crs_usr,agendas" + " WHERE crs_usr.CrsCod=%ld" + " AND crs_usr.UsrCod=agendas.UsrCod", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of events"); + DB_QuerySELECT_new (&mysql_res,"can not get number of events"); /***** Get number of events *****/ row = mysql_fetch_row (mysql_res); diff --git a/swad_announcement.c b/swad_announcement.c index 98281f80e..c363054c1 100644 --- a/swad_announcement.c +++ b/swad_announcement.c @@ -83,7 +83,6 @@ void Ann_ShowAllAnnouncements (void) extern const char *Hlp_MESSAGES_Announcements; extern const char *Txt_Announcements; extern const char *Txt_No_announcements; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumAnnouncements; @@ -100,34 +99,31 @@ void Ann_ShowAllAnnouncements (void) if (ICanEdit) { /* Select all announcements */ - if (asprintf (&Query,"SELECT AnnCod,Status,Roles,Subject,Content" - " FROM announcements" - " ORDER BY AnnCod DESC") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AnnCod,Status,Roles,Subject,Content" + " FROM announcements" + " ORDER BY AnnCod DESC"); } else if (Gbl.Usrs.Me.Logged) { /* Select only announcements I can see */ Rol_GetRolesInAllCrssIfNotYetGot (&Gbl.Usrs.Me.UsrDat); - if (asprintf (&Query,"SELECT AnnCod,Status,Roles,Subject,Content" - " FROM announcements" - " WHERE (Roles&%u)<>0 " - " ORDER BY AnnCod DESC", - (unsigned) Gbl.Usrs.Me.UsrDat.Roles.InCrss) < 0) // All my roles in different courses - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AnnCod,Status,Roles,Subject,Content" + " FROM announcements" + " WHERE (Roles&%u)<>0 " + " ORDER BY AnnCod DESC", + (unsigned) Gbl.Usrs.Me.UsrDat.Roles.InCrss); // All my roles in different courses } else // No user logged { /* Select only active announcements for unknown users */ - if (asprintf (&Query,"SELECT AnnCod,Status,Roles,Subject,Content" - " FROM announcements" - " WHERE Status=%u AND (Roles&%u)<>0 " - " ORDER BY AnnCod DESC", - (unsigned) Ann_ACTIVE_ANNOUNCEMENT, - (unsigned) (1 << Rol_UNK)) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AnnCod,Status,Roles,Subject,Content" + " FROM announcements" + " WHERE Status=%u AND (Roles&%u)<>0 " + " ORDER BY AnnCod DESC", + (unsigned) Ann_ACTIVE_ANNOUNCEMENT, + (unsigned) (1 << Rol_UNK)); } - NumAnnouncements = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get announcements"); + NumAnnouncements = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get announcements"); /***** Start box *****/ Box_StartBox ("550px",Txt_Announcements, @@ -216,7 +212,6 @@ static void Ann_PutButtonToAddNewAnnouncement (void) void Ann_ShowMyAnnouncementsNotMarkedAsSeen (void) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumAnnouncements; @@ -227,16 +222,15 @@ void Ann_ShowMyAnnouncementsNotMarkedAsSeen (void) /***** Select announcements not seen *****/ Rol_GetRolesInAllCrssIfNotYetGot (&Gbl.Usrs.Me.UsrDat); - if (asprintf (&Query,"SELECT AnnCod,Subject,Content FROM announcements" - " WHERE Status=%u AND (Roles&%u)<>0 " - " AND AnnCod NOT IN" - " (SELECT AnnCod FROM ann_seen WHERE UsrCod=%ld)" - " ORDER BY AnnCod DESC", // Newest first - (unsigned) Ann_ACTIVE_ANNOUNCEMENT, - (unsigned) Gbl.Usrs.Me.UsrDat.Roles.InCrss, // All my roles in different courses - Gbl.Usrs.Me.UsrDat.UsrCod) < 0) - Lay_NotEnoughMemoryExit (); - NumAnnouncements = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get announcements"); + DB_BuildQuery ("SELECT AnnCod,Subject,Content FROM announcements" + " WHERE Status=%u AND (Roles&%u)<>0 " + " AND AnnCod NOT IN" + " (SELECT AnnCod FROM ann_seen WHERE UsrCod=%ld)" + " ORDER BY AnnCod DESC", // Newest first + (unsigned) Ann_ACTIVE_ANNOUNCEMENT, + (unsigned) Gbl.Usrs.Me.UsrDat.Roles.InCrss, // All my roles in different courses + Gbl.Usrs.Me.UsrDat.UsrCod); + NumAnnouncements = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get announcements"); /***** Show the announcements *****/ if (NumAnnouncements) diff --git a/swad_assignment.c b/swad_assignment.c index 8a829ee46..11746ab8d 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -81,7 +81,7 @@ static void Asg_GetParamAsgOrder (void); static void Asg_PutFormsToRemEditOneAsg (long AsgCod,bool Hidden); static void Asg_PutParams (void); -static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query); +static void Asg_GetDataOfAssignment (struct Assignment *Asg); static void Asg_ResetAssignment (struct Assignment *Asg); static void Asg_GetAssignmentTxtFromDB (long AsgCod,char Txt[Cns_MAX_BYTES_TEXT + 1]); static void Asg_PutParamAsgCod (long AsgCod); @@ -623,7 +623,6 @@ void Asg_GetListAssignments (void) { char HiddenSubQuery[256]; char OrderBySubQuery[256]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -653,30 +652,24 @@ void Asg_GetListAssignments (void) break; } if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) - { - if (asprintf (&Query,"SELECT AsgCod" - " FROM assignments" - " WHERE CrsCod=%ld%s" - " AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR" - " AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" - " WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))" - " ORDER BY %s", - Gbl.CurrentCrs.Crs.CrsCod, - HiddenSubQuery, - Gbl.Usrs.Me.UsrDat.UsrCod, - OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); - } + DB_BuildQuery ("SELECT AsgCod" + " FROM assignments" + " WHERE CrsCod=%ld%s" + " AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR" + " AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" + " WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))" + " ORDER BY %s", + Gbl.CurrentCrs.Crs.CrsCod, + HiddenSubQuery, + Gbl.Usrs.Me.UsrDat.UsrCod, + OrderBySubQuery); else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS - { - if (asprintf (&Query,"SELECT AsgCod" - " FROM assignments" - " WHERE CrsCod=%ld%s" - " ORDER BY %s", - Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); - } - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get assignments"); + DB_BuildQuery ("SELECT AsgCod" + " FROM assignments" + " WHERE CrsCod=%ld%s" + " ORDER BY %s", + Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get assignments"); if (NumRows) // Assignments found... { @@ -712,23 +705,20 @@ void Asg_GetListAssignments (void) void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg) { - char *Query; - if (Asg->AsgCod > 0) { /***** Build query *****/ - if (asprintf (&Query,"SELECT AsgCod,Hidden,UsrCod," - "UNIX_TIMESTAMP(StartTime)," - "UNIX_TIMESTAMP(EndTime)," - "NOW() BETWEEN StartTime AND EndTime," - "Title,Folder" - " FROM assignments" - " WHERE AsgCod=%ld AND CrsCod=%ld", - Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AsgCod,Hidden,UsrCod," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW() BETWEEN StartTime AND EndTime," + "Title,Folder" + " FROM assignments" + " WHERE AsgCod=%ld AND CrsCod=%ld", + Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); /***** Get data of assignment *****/ - Asg_GetDataOfAssignment (Asg,Query); + Asg_GetDataOfAssignment (Asg); } else { @@ -744,23 +734,20 @@ void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg) void Asg_GetDataOfAssignmentByFolder (struct Assignment *Asg) { - char *Query; - if (Asg->Folder[0]) { /***** Query database *****/ - if (asprintf (&Query,"SELECT AsgCod,Hidden,UsrCod," - "UNIX_TIMESTAMP(StartTime)," - "UNIX_TIMESTAMP(EndTime)," - "NOW() BETWEEN StartTime AND EndTime," - "Title,Folder" - " FROM assignments" - " WHERE CrsCod=%ld AND Folder='%s'", - Gbl.CurrentCrs.Crs.CrsCod,Asg->Folder) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AsgCod,Hidden,UsrCod," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW() BETWEEN StartTime AND EndTime," + "Title,Folder" + " FROM assignments" + " WHERE CrsCod=%ld AND Folder='%s'", + Gbl.CurrentCrs.Crs.CrsCod,Asg->Folder); /***** Get data of assignment *****/ - Asg_GetDataOfAssignment (Asg,Query); + Asg_GetDataOfAssignment (Asg); } else { @@ -774,7 +761,7 @@ void Asg_GetDataOfAssignmentByFolder (struct Assignment *Asg) /************************* Get assignment data *******************************/ /*****************************************************************************/ -static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) +static void Asg_GetDataOfAssignment (struct Assignment *Asg) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -783,7 +770,7 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) Asg_ResetAssignment (Asg); /***** Get data of assignment from database *****/ - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get assignment data")) // Assignment found... + if (DB_QuerySELECT_new (&mysql_res,"can not get assignment data")) // Assignment found... { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -865,17 +852,15 @@ void Asg_FreeListAssignments (void) static void Asg_GetAssignmentTxtFromDB (long AsgCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; /***** Get text of assignment from database *****/ - if (asprintf (&Query,"SELECT Txt FROM assignments" - " WHERE AsgCod=%ld AND CrsCod=%ld", - AsgCod,Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get assignment text"); + DB_BuildQuery ("SELECT Txt FROM assignments" + " WHERE AsgCod=%ld AND CrsCod=%ld", + AsgCod,Gbl.CurrentCrs.Crs.CrsCod); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get assignment text"); /***** The result of the query must have one row or none *****/ if (NumRows == 1) @@ -904,7 +889,6 @@ void Asg_GetNotifAssignment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], char **ContentStr, long AsgCod,bool GetContent) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -913,10 +897,8 @@ void Asg_GetNotifAssignment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], SummaryStr[0] = '\0'; // Return nothing on error /***** Build query *****/ - if (asprintf (&Query,"SELECT Title,Txt FROM assignments WHERE AsgCod=%ld", - AsgCod) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get assignment title and text"); + DB_BuildQuery ("SELECT Title,Txt FROM assignments WHERE AsgCod=%ld",AsgCod); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get assignment title and text"); /***** Result should have a unique row *****/ if (NumRows == 1) @@ -1668,22 +1650,20 @@ static void Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (struct Assignment *Asg) extern const char *Txt_Groups; extern const char *Txt_and; extern const char *Txt_The_whole_course; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRow; unsigned long NumRows; /***** Get groups associated to an assignment from database *****/ - if (asprintf (&Query,"SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" - " FROM asg_grp,crs_grp,crs_grp_types" - " WHERE asg_grp.AsgCod=%ld" - " AND asg_grp.GrpCod=crs_grp.GrpCod" - " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" - " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", - Asg->AsgCod) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get groups of an assignment"); + DB_BuildQuery ("SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" + " FROM asg_grp,crs_grp,crs_grp_types" + " WHERE asg_grp.AsgCod=%ld" + " AND asg_grp.GrpCod=crs_grp.GrpCod" + " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" + " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", + Asg->AsgCod); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get groups of an assignment"); /***** Write heading *****/ fprintf (Gbl.F.Out,"
%s: ", @@ -1811,7 +1791,6 @@ unsigned Asg_GetNumAssignmentsInCrs (long CrsCod) unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumCourses; @@ -1820,65 +1799,59 @@ unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT CrsCod)" - " FROM assignments" - " WHERE CrsCod>0") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT CrsCod)" + " FROM assignments" + " WHERE CrsCod>0"); break; case Sco_SCOPE_CTY: - if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" - " FROM institutions,centres,degrees,courses,assignments" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentCty.Cty.CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT assignments.CrsCod)" + " FROM institutions,centres,degrees,courses,assignments" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" - " FROM centres,degrees,courses,assignments" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT assignments.CrsCod)" + " FROM centres,degrees,courses,assignments" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" - " FROM degrees,courses,assignments" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT assignments.CrsCod)" + " FROM degrees,courses,assignments" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: - if (asprintf (&Query,"SELECT COUNT(DISTINCT assignments.CrsCod)" - " FROM courses,assignments" - " WHERE courses.DegCod=%ld" - " AND courses.Status=0" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT assignments.CrsCod)" + " FROM courses,assignments" + " WHERE courses.DegCod=%ld" + " AND courses.Status=0" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT CrsCod)" - " FROM assignments" - " WHERE CrsCod=%ld", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT CrsCod)" + " FROM assignments" + " WHERE CrsCod=%ld", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of courses with assignments"); + DB_QuerySELECT_new (&mysql_res,"can not get number of courses with assignments"); /***** Get number of courses *****/ row = mysql_fetch_row (mysql_res); @@ -1899,7 +1872,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Sco_Scope_t Scope) unsigned Asg_GetNumAssignments (Sco_Scope_t Scope,unsigned *NumNotif) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumAssignments; @@ -1908,61 +1880,55 @@ unsigned Asg_GetNumAssignments (Sco_Scope_t Scope,unsigned *NumNotif) switch (Scope) { case Sco_SCOPE_SYS: - if (asprintf (&Query,"SELECT COUNT(*),SUM(NumNotif)" - " FROM assignments" - " WHERE CrsCod>0") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(NumNotif)" + " FROM assignments" + " WHERE CrsCod>0"); break; case Sco_SCOPE_CTY: - if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" - " FROM institutions,centres,degrees,courses,assignments" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentCty.Cty.CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(assignments.NumNotif)" + " FROM institutions,centres,degrees,courses,assignments" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: - if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" - " FROM centres,degrees,courses,assignments" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(assignments.NumNotif)" + " FROM centres,degrees,courses,assignments" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" - " FROM degrees,courses,assignments" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(assignments.NumNotif)" + " FROM degrees,courses,assignments" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: - if (asprintf (&Query,"SELECT COUNT(*),SUM(assignments.NumNotif)" - " FROM courses,assignments" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=assignments.CrsCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(assignments.NumNotif)" + " FROM courses,assignments" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=assignments.CrsCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: - if (asprintf (&Query,"SELECT COUNT(*),SUM(NumNotif)" - " FROM assignments" - " WHERE CrsCod=%ld", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(NumNotif)" + " FROM assignments" + " WHERE CrsCod=%ld", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of assignments"); + DB_QuerySELECT_new (&mysql_res,"can not get number of assignments"); /***** Get number of assignments *****/ row = mysql_fetch_row (mysql_res); diff --git a/swad_attendance.c b/swad_attendance.c index e4b46b53b..8d596e4ef 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -606,7 +606,6 @@ static void Att_GetListAttEvents (Att_OrderTime_t Order) { char HiddenSubQuery[256]; char OrderBySubQuery[256]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -642,30 +641,24 @@ static void Att_GetListAttEvents (Att_OrderTime_t Order) break; } if (Gbl.CurrentCrs.Grps.WhichGrps == Grp_ONLY_MY_GROUPS) - { - if (asprintf (&Query,"SELECT AttCod" - " FROM att_events" - " WHERE CrsCod=%ld%s" - " AND (AttCod NOT IN (SELECT AttCod FROM att_grp) OR" - " AttCod IN (SELECT att_grp.AttCod FROM att_grp,crs_grp_usr" - " WHERE crs_grp_usr.UsrCod=%ld" - " AND att_grp.GrpCod=crs_grp_usr.GrpCod))" - " ORDER BY %s", - Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery, - Gbl.Usrs.Me.UsrDat.UsrCod,OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); - } + DB_BuildQuery ("SELECT AttCod" + " FROM att_events" + " WHERE CrsCod=%ld%s" + " AND (AttCod NOT IN (SELECT AttCod FROM att_grp) OR" + " AttCod IN (SELECT att_grp.AttCod FROM att_grp,crs_grp_usr" + " WHERE crs_grp_usr.UsrCod=%ld" + " AND att_grp.GrpCod=crs_grp_usr.GrpCod))" + " ORDER BY %s", + Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery, + Gbl.Usrs.Me.UsrDat.UsrCod,OrderBySubQuery); else // Gbl.CurrentCrs.Grps.WhichGrps == Grp_ALL_GROUPS - { - if (asprintf (&Query,"SELECT AttCod" - " FROM att_events" - " WHERE CrsCod=%ld%s" - " ORDER BY %s", - Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); - } + DB_BuildQuery ("SELECT AttCod" + " FROM att_events" + " WHERE CrsCod=%ld%s" + " ORDER BY %s", + Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery); - if ((NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get attendance events"))) // Attendance events found... + if ((NumRows = DB_QuerySELECT_new (&mysql_res,"can not get attendance events"))) // Attendance events found... { Gbl.AttEvents.Num = (unsigned) NumRows; @@ -716,7 +709,6 @@ static void Att_GetDataOfAttEventByCodAndCheckCrs (struct AttendanceEvent *Att) bool Att_GetDataOfAttEventByCod (struct AttendanceEvent *Att) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; bool Found = false; @@ -727,19 +719,18 @@ bool Att_GetDataOfAttEventByCod (struct AttendanceEvent *Att) if (Att->AttCod > 0) { /***** Build query *****/ - if (asprintf (&Query,"SELECT AttCod,CrsCod,Hidden,UsrCod," - "UNIX_TIMESTAMP(StartTime)," - "UNIX_TIMESTAMP(EndTime)," - "NOW() BETWEEN StartTime AND EndTime," - "CommentTchVisible," - "Title" - " FROM att_events" - " WHERE AttCod=%ld", - Att->AttCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT AttCod,CrsCod,Hidden,UsrCod," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW() BETWEEN StartTime AND EndTime," + "CommentTchVisible," + "Title" + " FROM att_events" + " WHERE AttCod=%ld", + Att->AttCod); /***** Get data of attendance event from database *****/ - if ((Found = (DB_QuerySELECT_free (Query,&mysql_res,"can not get attendance event data") != 0))) // Attendance event found... + if ((Found = (DB_QuerySELECT_new (&mysql_res,"can not get attendance event data") != 0))) // Attendance event found... { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -825,17 +816,15 @@ void Att_FreeListAttEvents (void) static void Att_GetAttEventTxtFromDB (long AttCod,char Txt[Cns_MAX_BYTES_TEXT + 1]) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; /***** Get text of attendance event from database *****/ - if (asprintf (&Query,"SELECT Txt FROM att_events" - " WHERE AttCod=%ld AND CrsCod=%ld", - AttCod,Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get attendance event text"); + DB_BuildQuery ("SELECT Txt FROM att_events" + " WHERE AttCod=%ld AND CrsCod=%ld", + AttCod,Gbl.CurrentCrs.Crs.CrsCod); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get attendance event text"); /***** The result of the query must have one row or none *****/ if (NumRows == 1) @@ -1536,22 +1525,20 @@ static void Att_GetAndWriteNamesOfGrpsAssociatedToAttEvent (struct AttendanceEve extern const char *Txt_Groups; extern const char *Txt_and; extern const char *Txt_The_whole_course; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumGrp; unsigned NumGrps; /***** Get groups associated to an attendance event from database *****/ - if (asprintf (&Query,"SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" - " FROM att_grp,crs_grp,crs_grp_types" - " WHERE att_grp.AttCod=%ld" - " AND att_grp.GrpCod=crs_grp.GrpCod" - " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" - " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", - Att->AttCod) < 0) - Lay_NotEnoughMemoryExit (); - NumGrps = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get groups of an attendance event"); + DB_BuildQuery ("SELECT crs_grp_types.GrpTypName,crs_grp.GrpName" + " FROM att_grp,crs_grp,crs_grp_types" + " WHERE att_grp.AttCod=%ld" + " AND att_grp.GrpCod=crs_grp.GrpCod" + " AND crs_grp.GrpTypCod=crs_grp_types.GrpTypCod" + " ORDER BY crs_grp_types.GrpTypName,crs_grp.GrpName", + Att->AttCod); + NumGrps = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get groups of an attendance event"); /***** Write heading *****/ fprintf (Gbl.F.Out,"
%s: ", @@ -1708,7 +1695,6 @@ unsigned Att_GetNumAttEventsInCrs (long CrsCod) unsigned Att_GetNumCoursesWithAttEvents (Sco_Scope_t Scope) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumCourses; @@ -1717,53 +1703,48 @@ unsigned Att_GetNumCoursesWithAttEvents (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_SYS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT CrsCod)" - " FROM att_events" - " WHERE CrsCod>0") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT CrsCod)" + " FROM att_events" + " WHERE CrsCod>0"); break; case Sco_SCOPE_INS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT att_events.CrsCod)" - " FROM centres,degrees,courses,att_events" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=att_events.CrsCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT att_events.CrsCod)" + " FROM centres,degrees,courses,att_events" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=att_events.CrsCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - if (asprintf (&Query,"SELECT COUNT(DISTINCT att_events.CrsCod)" - " FROM degrees,courses,att_events" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.Status=0" - " AND courses.CrsCod=att_events.CrsCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT att_events.CrsCod)" + " FROM degrees,courses,att_events" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.Status=0" + " AND courses.CrsCod=att_events.CrsCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: - if (asprintf (&Query,"SELECT COUNT(DISTINCT att_events.CrsCod)" - " FROM courses,att_events" - " WHERE courses.DegCod=%ld" - " AND courses.Status=0" - " AND courses.CrsCod=att_events.CrsCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT att_events.CrsCod)" + " FROM courses,att_events" + " WHERE courses.DegCod=%ld" + " AND courses.Status=0" + " AND courses.CrsCod=att_events.CrsCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: - if (asprintf (&Query,"SELECT COUNT(DISTINCT CrsCod)" - " FROM att_events" - " WHERE CrsCod=%ld", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT CrsCod)" + " FROM att_events" + " WHERE CrsCod=%ld", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of courses with attendance events"); + DB_QuerySELECT_new (&mysql_res,"can not get number of courses with attendance events"); /***** Get number of courses *****/ row = mysql_fetch_row (mysql_res); @@ -1784,7 +1765,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Sco_Scope_t Scope) unsigned Att_GetNumAttEvents (Sco_Scope_t Scope,unsigned *NumNotif) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumAttEvents; @@ -1793,50 +1773,45 @@ unsigned Att_GetNumAttEvents (Sco_Scope_t Scope,unsigned *NumNotif) switch (Scope) { case Sco_SCOPE_SYS: - if (asprintf (&Query,"SELECT COUNT(*),SUM(NumNotif)" - " FROM att_events" - " WHERE CrsCod>0") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(NumNotif)" + " FROM att_events" + " WHERE CrsCod>0"); break; case Sco_SCOPE_INS: - if (asprintf (&Query,"SELECT COUNT(*),SUM(att_events.NumNotif)" - " FROM centres,degrees,courses,att_events" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=att_events.CrsCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(att_events.NumNotif)" + " FROM centres,degrees,courses,att_events" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=att_events.CrsCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: - if (asprintf (&Query,"SELECT COUNT(*),SUM(att_events.NumNotif)" - " FROM degrees,courses,att_events" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=att_events.CrsCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(att_events.NumNotif)" + " FROM degrees,courses,att_events" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=att_events.CrsCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: - if (asprintf (&Query,"SELECT COUNT(*),SUM(att_events.NumNotif)" - " FROM courses,att_events" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=att_events.CrsCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(att_events.NumNotif)" + " FROM courses,att_events" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=att_events.CrsCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: - if (asprintf (&Query,"SELECT COUNT(*),SUM(NumNotif)" - " FROM att_events" - " WHERE CrsCod=%ld", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(*),SUM(NumNotif)" + " FROM att_events" + " WHERE CrsCod=%ld", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of attendance events"); + DB_QuerySELECT_new (&mysql_res,"can not get number of attendance events"); /***** Get number of attendance events *****/ row = mysql_fetch_row (mysql_res); @@ -2241,7 +2216,6 @@ static void Att_WriteRowStdToCallTheRoll (unsigned NumStd, static void Att_PutParamsCodGrps (long AttCod) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumGrp; @@ -2250,11 +2224,10 @@ static void Att_PutParamsCodGrps (long AttCod) /***** Get groups associated to an attendance event from database *****/ if (Gbl.CurrentCrs.Grps.NumGrps) { - if (asprintf (&Query,"SELECT GrpCod FROM att_grp" - " WHERE att_grp.AttCod=%ld", - AttCod) < 0) - Lay_NotEnoughMemoryExit (); - NumGrps = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get groups of an attendance event"); + DB_BuildQuery ("SELECT GrpCod FROM att_grp" + " WHERE att_grp.AttCod=%ld", + AttCod); + NumGrps = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get groups of an attendance event"); } else NumGrps = 0; @@ -2537,18 +2510,16 @@ static unsigned Att_GetNumStdsFromAListWhoAreInAttEvent (long AttCod,long LstSel static bool Att_CheckIfUsrIsInTableAttUsr (long AttCod,long UsrCod,bool *Present) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumRows; bool InDBTable; /***** Check if a student is registered in an event in database *****/ - if (asprintf (&Query,"SELECT Present FROM att_usr" - " WHERE AttCod=%ld AND UsrCod=%ld", - AttCod,UsrCod) < 0) - Lay_NotEnoughMemoryExit (); - if ((NumRows = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get if a student is already registered in an event"))) + DB_BuildQuery ("SELECT Present FROM att_usr" + " WHERE AttCod=%ld AND UsrCod=%ld", + AttCod,UsrCod); + if ((NumRows = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get if a student is already registered in an event"))) { InDBTable = true; @@ -2591,18 +2562,16 @@ static bool Att_CheckIfUsrIsPresentInAttEventAndGetComments (long AttCod,long Us char CommentStd[Cns_MAX_BYTES_TEXT + 1], char CommentTch[Cns_MAX_BYTES_TEXT + 1]) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumRows; bool Present; /***** Check if a students is registered in an event in database *****/ - if (asprintf (&Query,"SELECT Present,CommentStd,CommentTch FROM att_usr" - " WHERE AttCod=%ld AND UsrCod=%ld", - AttCod,UsrCod) < 0) - Lay_NotEnoughMemoryExit (); - if ((NumRows = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get if a student is already registered in an event"))) + DB_BuildQuery ("SELECT Present,CommentStd,CommentTch FROM att_usr" + " WHERE AttCod=%ld AND UsrCod=%ld", + AttCod,UsrCod); + if ((NumRows = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get if a student is already registered in an event"))) { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -3022,7 +2991,6 @@ static void Att_GetListSelectedAttCods (char **StrAttCodsSelected) const char *Ptr; long AttCod; char LongStr[1 + 10 + 1]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumGrpsInThisEvent; @@ -3088,11 +3056,10 @@ static void Att_GetListSelectedAttCods (char **StrAttCodsSelected) else // No students attended to this event { /***** Get groups associated to an attendance event from database *****/ - if (asprintf (&Query,"SELECT GrpCod FROM att_grp" - " WHERE att_grp.AttCod=%ld", - Gbl.AttEvents.Lst[NumAttEvent].AttCod) < 0) - Lay_NotEnoughMemoryExit (); - NumGrpsInThisEvent = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get groups of an attendance event"); + DB_BuildQuery ("SELECT GrpCod FROM att_grp" + " WHERE att_grp.AttCod=%ld", + Gbl.AttEvents.Lst[NumAttEvent].AttCod); + NumGrpsInThisEvent = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get groups of an attendance event"); if (NumGrpsInThisEvent) // This event is associated to groups /* Get groups associated to this event */ diff --git a/swad_banner.c b/swad_banner.c index 4299d2adc..79f6ed349 100644 --- a/swad_banner.c +++ b/swad_banner.c @@ -65,7 +65,7 @@ extern struct Globals Gbl; static void Ban_WriteListOfBanners (void); static void Ban_PutFormToEditBanners (void); -static void Ban_GetListBanners (const char *Query); +static void Ban_GetListBanners (void); static void Ban_PutIconToViewBanners (void); static void Ban_ListBannersForEdition (void); static void Ban_PutParamBanCod (long BanCod); @@ -103,7 +103,6 @@ void Ban_SeeBanners (void) extern const char *Txt_Banners; extern const char *Txt_No_banners; extern const char *Txt_New_banner; - char *Query; /***** Put contextual links *****/ fprintf (Gbl.F.Out,"
"); @@ -114,12 +113,11 @@ void Ban_SeeBanners (void) fprintf (Gbl.F.Out,"
"); /***** Get list of banners *****/ - if (asprintf (&Query,"SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" - " FROM banners" - " WHERE Hidden='N'" - " ORDER BY ShortName") < 0) - Lay_NotEnoughMemoryExit (); - Ban_GetListBanners (Query); + DB_BuildQuery ("SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" + " FROM banners" + " WHERE Hidden='N'" + " ORDER BY ShortName"); + Ban_GetListBanners (); /***** Start box *****/ Box_StartBox (NULL,Txt_Banners,Ban_PutFormToEditBanners, @@ -198,7 +196,6 @@ void Ban_EditBanners (void) { extern const char *Hlp_SYSTEM_Banners_edit; extern const char *Txt_Banners; - char *Query; /***** Put contextual links *****/ fprintf (Gbl.F.Out,"
"); @@ -209,10 +206,9 @@ void Ban_EditBanners (void) fprintf (Gbl.F.Out,"
"); /***** Get list of banners *****/ - if (asprintf (&Query,"SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" - " FROM banners ORDER BY ShortName") < 0) - Lay_NotEnoughMemoryExit (); - Ban_GetListBanners (Query); + DB_BuildQuery ("SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" + " FROM banners ORDER BY ShortName"); + Ban_GetListBanners (); /***** Start box *****/ Box_StartBox (NULL,Txt_Banners,Ban_PutIconToViewBanners, @@ -236,7 +232,7 @@ void Ban_EditBanners (void) /**************************** List all the banners ***************************/ /*****************************************************************************/ -static void Ban_GetListBanners (const char *Query) +static void Ban_GetListBanners (void) { MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -247,7 +243,7 @@ static void Ban_GetListBanners (const char *Query) if (Gbl.DB.DatabaseIsOpen) { /***** Get banners from database *****/ - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get banners"); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get banners"); if (NumRows) // Banners found... { @@ -305,7 +301,6 @@ static void Ban_GetListBanners (const char *Query) void Ban_GetDataOfBannerByCod (struct Banner *Ban) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -318,11 +313,10 @@ void Ban_GetDataOfBannerByCod (struct Banner *Ban) if (Ban->BanCod > 0) { /***** Get data of a banner from database *****/ - if (asprintf (&Query,"SELECT Hidden,ShortName,FullName,Img,WWW" - " FROM banners WHERE BanCod=%ld", - Ban->BanCod) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get data of a banner"); + DB_BuildQuery ("SELECT Hidden,ShortName,FullName,Img,WWW" + " FROM banners WHERE BanCod=%ld", + Ban->BanCod); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get data of a banner"); if (NumRows) // Banner found... { @@ -1027,19 +1021,17 @@ static void Ban_CreateBanner (struct Banner *Ban) void Ban_WriteMenuWithBanners (void) { - char *Query; unsigned NumBan; /***** Get random banner *****/ // The banner(s) will change once in a while - if (asprintf (&Query,"SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" - " FROM banners" - " WHERE Hidden='N'" - " ORDER BY RAND(%lu) LIMIT %u", - (unsigned long) (Gbl.StartExecutionTimeUTC / Cfg_TIME_TO_CHANGE_BANNER), - Cfg_NUMBER_OF_BANNERS) < 0) - Lay_NotEnoughMemoryExit (); - Ban_GetListBanners (Query); + DB_BuildQuery ("SELECT BanCod,Hidden,ShortName,FullName,Img,WWW" + " FROM banners" + " WHERE Hidden='N'" + " ORDER BY RAND(%lu) LIMIT %u", + (unsigned long) (Gbl.StartExecutionTimeUTC / Cfg_TIME_TO_CHANGE_BANNER), + Cfg_NUMBER_OF_BANNERS); + Ban_GetListBanners (); /***** Write all the banners *****/ for (NumBan = 0; diff --git a/swad_centre.c b/swad_centre.c index e2569b996..c741e17f3 100644 --- a/swad_centre.c +++ b/swad_centre.c @@ -133,7 +133,6 @@ void Ctr_SeeCtrWithPendingDegs (void) extern const char *Txt_Centre; extern const char *Txt_Degrees_ABBREVIATION; extern const char *Txt_There_are_no_centres_with_requests_for_degrees_to_be_confirmed; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumCtrs; @@ -145,31 +144,29 @@ void Ctr_SeeCtrWithPendingDegs (void) switch (Gbl.Usrs.Me.Role.Logged) { case Rol_CTR_ADM: - if (asprintf (&Query,"SELECT degrees.CtrCod,COUNT(*)" - " FROM degrees,ctr_admin,centres" - " WHERE (degrees.Status & %u)<>0" - " AND degrees.CtrCod=ctr_admin.CtrCod" - " AND ctr_admin.UsrCod=%ld" - " AND degrees.CtrCod=centres.CtrCod" - " GROUP BY degrees.CtrCod ORDER BY centres.ShortName", - (unsigned) Deg_STATUS_BIT_PENDING,Gbl.Usrs.Me.UsrDat.UsrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT degrees.CtrCod,COUNT(*)" + " FROM degrees,ctr_admin,centres" + " WHERE (degrees.Status & %u)<>0" + " AND degrees.CtrCod=ctr_admin.CtrCod" + " AND ctr_admin.UsrCod=%ld" + " AND degrees.CtrCod=centres.CtrCod" + " GROUP BY degrees.CtrCod ORDER BY centres.ShortName", + (unsigned) Deg_STATUS_BIT_PENDING,Gbl.Usrs.Me.UsrDat.UsrCod); break; case Rol_SYS_ADM: - if (asprintf (&Query,"SELECT degrees.CtrCod,COUNT(*)" - " FROM degrees,centres" - " WHERE (degrees.Status & %u)<>0" - " AND degrees.CtrCod=centres.CtrCod" - " GROUP BY degrees.CtrCod ORDER BY centres.ShortName", - (unsigned) Deg_STATUS_BIT_PENDING) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT degrees.CtrCod,COUNT(*)" + " FROM degrees,centres" + " WHERE (degrees.Status & %u)<>0" + " AND degrees.CtrCod=centres.CtrCod" + " GROUP BY degrees.CtrCod ORDER BY centres.ShortName", + (unsigned) Deg_STATUS_BIT_PENDING); break; default: // Forbidden for other users return; } /***** Get centres *****/ - if ((NumCtrs = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get centres with pending degrees"))) + if ((NumCtrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get centres with pending degrees"))) { /***** Start box and table *****/ Box_StartBoxTable (NULL,Txt_Centres_with_pending_degrees,NULL, @@ -1037,7 +1034,6 @@ static void Ctr_PutIconToViewCentres (void) void Ctr_GetListCentres (long InsCod) { char OrderBySubQuery[256]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -1054,27 +1050,26 @@ void Ctr_GetListCentres (long InsCod) sprintf (OrderBySubQuery,"NumUsrs DESC,FullName"); break; } - if (asprintf (&Query,"(SELECT centres.CtrCod,centres.InsCod,centres.PlcCod," - "centres.Status,centres.RequesterUsrCod," - "centres.ShortName,centres.FullName,centres.WWW," - "COUNT(DISTINCT usr_data.UsrCod) AS NumUsrs" - " FROM centres,usr_data" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=usr_data.CtrCod" - " GROUP BY centres.CtrCod)" - " UNION " - "(SELECT CtrCod,InsCod,PlcCod,Status,RequesterUsrCod," - "ShortName,FullName,WWW,0 AS NumUsrs" - " FROM centres" - " WHERE centres.InsCod=%ld" - " AND CtrCod NOT IN" - " (SELECT DISTINCT CtrCod FROM usr_data))" - " ORDER BY %s", - InsCod, - InsCod, - OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get centres"); + DB_BuildQuery ("(SELECT centres.CtrCod,centres.InsCod,centres.PlcCod," + "centres.Status,centres.RequesterUsrCod," + "centres.ShortName,centres.FullName,centres.WWW," + "COUNT(DISTINCT usr_data.UsrCod) AS NumUsrs" + " FROM centres,usr_data" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=usr_data.CtrCod" + " GROUP BY centres.CtrCod)" + " UNION " + "(SELECT CtrCod,InsCod,PlcCod,Status,RequesterUsrCod," + "ShortName,FullName,WWW,0 AS NumUsrs" + " FROM centres" + " WHERE centres.InsCod=%ld" + " AND CtrCod NOT IN" + " (SELECT DISTINCT CtrCod FROM usr_data))" + " ORDER BY %s", + InsCod, + InsCod, + OrderBySubQuery); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get centres"); if (NumRows) // Centres found... { @@ -1151,7 +1146,6 @@ void Ctr_GetListCentres (long InsCod) bool Ctr_GetDataOfCentreByCod (struct Centre *Ctr) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; bool CtrFound = false; @@ -1173,27 +1167,26 @@ bool Ctr_GetDataOfCentreByCod (struct Centre *Ctr) if (Ctr->CtrCod > 0) { /***** Get data of a centre from database *****/ - if (asprintf (&Query,"(SELECT centres.InsCod,centres.PlcCod," - "centres.Status,centres.RequesterUsrCod," - "centres.ShortName,centres.FullName,centres.WWW," - "COUNT(DISTINCT usr_data.UsrCod) AS NumUsrs" - " FROM centres,usr_data" - " WHERE centres.CtrCod=%ld" - " AND centres.CtrCod=usr_data.CtrCod" - " GROUP BY centres.CtrCod)" - " UNION " - "(SELECT InsCod,PlcCod," - "Status,RequesterUsrCod," - "ShortName,FullName,WWW," - "0 AS NumUsrs" - " FROM centres" - " WHERE CtrCod=%ld" - " AND CtrCod NOT IN" - " (SELECT DISTINCT CtrCod FROM usr_data))", - Ctr->CtrCod, - Ctr->CtrCod) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get data of a centre")) // Centre found... + DB_BuildQuery ("(SELECT centres.InsCod,centres.PlcCod," + "centres.Status,centres.RequesterUsrCod," + "centres.ShortName,centres.FullName,centres.WWW," + "COUNT(DISTINCT usr_data.UsrCod) AS NumUsrs" + " FROM centres,usr_data" + " WHERE centres.CtrCod=%ld" + " AND centres.CtrCod=usr_data.CtrCod" + " GROUP BY centres.CtrCod)" + " UNION " + "(SELECT InsCod,PlcCod," + "Status,RequesterUsrCod," + "ShortName,FullName,WWW," + "0 AS NumUsrs" + " FROM centres" + " WHERE CtrCod=%ld" + " AND CtrCod NOT IN" + " (SELECT DISTINCT CtrCod FROM usr_data))", + Ctr->CtrCod, + Ctr->CtrCod); + if (DB_QuerySELECT_new (&mysql_res,"can not get data of a centre")) // Centre found... { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -1253,7 +1246,6 @@ bool Ctr_GetDataOfCentreByCod (struct Centre *Ctr) long Ctr_GetInsCodOfCentreByCod (long CtrCod) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; long InsCod = -1L; @@ -1261,10 +1253,9 @@ long Ctr_GetInsCodOfCentreByCod (long CtrCod) if (CtrCod > 0) { /***** Get the institution code of a centre from database *****/ - if (asprintf (&Query,"SELECT InsCod FROM centres WHERE CtrCod=%ld", - CtrCod) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get the institution of a centre") == 1) + DB_BuildQuery ("SELECT InsCod FROM centres WHERE CtrCod=%ld", + CtrCod); + if (DB_QuerySELECT_new (&mysql_res,"can not get the institution of a centre") == 1) { /***** Get the institution code of this centre *****/ row = mysql_fetch_row (mysql_res); @@ -1284,7 +1275,6 @@ long Ctr_GetInsCodOfCentreByCod (long CtrCod) void Ctr_GetShortNameOfCentreByCod (struct Centre *Ctr) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -1292,11 +1282,10 @@ void Ctr_GetShortNameOfCentreByCod (struct Centre *Ctr) if (Ctr->CtrCod > 0) { /***** Get the short name of a centre from database *****/ - if (asprintf (&Query,"SELECT ShortName FROM centres" - " WHERE CtrCod=%ld", - Ctr->CtrCod) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get the short name of a centre") == 1) + DB_BuildQuery ("SELECT ShortName FROM centres" + " WHERE CtrCod=%ld", + Ctr->CtrCod); + if (DB_QuerySELECT_new (&mysql_res,"can not get the short name of a centre") == 1) { /***** Get the short name of this centre *****/ row = mysql_fetch_row (mysql_res); @@ -1316,7 +1305,6 @@ void Ctr_GetShortNameOfCentreByCod (struct Centre *Ctr) static void Ctr_GetPhotoAttribution (long CtrCod,char **PhotoAttribution) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; size_t Length; @@ -1325,11 +1313,10 @@ static void Ctr_GetPhotoAttribution (long CtrCod,char **PhotoAttribution) Ctr_FreePhotoAttribution (PhotoAttribution); /***** Get photo attribution from database *****/ - if (asprintf (&Query,"SELECT PhotoAttribution" - " FROM centres WHERE CtrCod=%ld", - CtrCod) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get photo attribution")) + DB_BuildQuery ("SELECT PhotoAttribution" + " FROM centres WHERE CtrCod=%ld", + CtrCod); + if (DB_QuerySELECT_new (&mysql_res,"can not get photo attribution")) { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -1385,7 +1372,6 @@ void Ctr_FreeListCentres (void) void Ctr_WriteSelectorOfCentre (void) { extern const char *Txt_Centre; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumCtrs; @@ -1409,13 +1395,12 @@ void Ctr_WriteSelectorOfCentre (void) if (Gbl.CurrentIns.Ins.InsCod > 0) { /***** Get centres from database *****/ - if (asprintf (&Query,"SELECT DISTINCT CtrCod,ShortName" - " FROM centres" - " WHERE InsCod=%ld" - " ORDER BY ShortName", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); - NumCtrs = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get centres"); + DB_BuildQuery ("SELECT DISTINCT CtrCod,ShortName" + " FROM centres" + " WHERE InsCod=%ld" + " ORDER BY ShortName", + Gbl.CurrentIns.Ins.InsCod); + NumCtrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get centres"); /***** Get centres *****/ for (NumCtr = 0; @@ -2996,7 +2981,7 @@ unsigned Ctr_GetNumCtrsWithUsrs (Rol_Role_t Role,const char *SubQuery) /*****************************************************************************/ // Returns number of centres found -unsigned Ctr_ListCtrsFound (const char *Query) +unsigned Ctr_ListCtrsFound (void) { extern const char *Txt_centre; extern const char *Txt_centres; @@ -3007,7 +2992,7 @@ unsigned Ctr_ListCtrsFound (const char *Query) struct Centre Ctr; /***** Query database *****/ - if ((NumCtrs = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get centres"))) + if ((NumCtrs = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get centres"))) { /***** Start box and table *****/ /* Number of centres found */ diff --git a/swad_centre.h b/swad_centre.h index 7f08a7395..e7a6a6245 100644 --- a/swad_centre.h +++ b/swad_centre.h @@ -134,6 +134,6 @@ unsigned Ctr_GetNumCtrsWithDegs (const char *SubQuery); unsigned Ctr_GetNumCtrsWithCrss (const char *SubQuery); unsigned Ctr_GetNumCtrsWithUsrs (Rol_Role_t Role,const char *SubQuery); -unsigned Ctr_ListCtrsFound (const char *Query); +unsigned Ctr_ListCtrsFound (void); #endif diff --git a/swad_changelog.h b/swad_changelog.h index d73fa769e..45aa24a5d 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.42 (2018-10-25)" +#define Log_PLATFORM_VERSION "SWAD 18.8 (2018-10-25)" #define CSS_FILE "swad18.4.css" #define JS_FILE "swad17.17.1.js" /* + Version 18.8: Oct 25, 2018 New internal functions to build database queries. (238043 lines) Version 18.7.42: Oct 25, 2018 Some sprintf for database queries changed by asprintf. (238146 lines) Version 18.7.41: Oct 24, 2018 Some sprintf for database queries changed by asprintf. (238125 lines) Version 18.7.40: Oct 24, 2018 Some sprintf for database queries changed by asprintf. (238060 lines) diff --git a/swad_chat.c b/swad_chat.c index 4c4306705..3532ab5b0 100644 --- a/swad_chat.c +++ b/swad_chat.c @@ -268,16 +268,14 @@ void Cht_ShowListOfChatRoomsWithUsrs (void) extern const char *Txt_Rooms_with_users; extern const char *Txt_CHAT_Room_code; extern const char *Txt_No_of_users; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRow,NumRows; /***** Get chat rooms with connected users from database *****/ - if (asprintf (&Query,"SELECT RoomCode,NumUsrs FROM chat" - " WHERE NumUsrs>0 ORDER BY NumUsrs DESC,RoomCode") < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get chat rooms with connected users"); + DB_BuildQuery ("SELECT RoomCode,NumUsrs FROM chat" + " WHERE NumUsrs>0 ORDER BY NumUsrs DESC,RoomCode"); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get chat rooms with connected users"); if (NumRows > 0) // If not empty chat rooms found { @@ -378,16 +376,14 @@ void Cht_WriteParamsRoomCodeAndNames (const char *RoomCode,const char *RoomShrtN static unsigned Cht_GetNumUsrsInChatRoom (const char *RoomCode) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumUsrs = 0; /***** Get number of users connected to chat rooms from database *****/ - if (asprintf (&Query,"SELECT NumUsrs FROM chat WHERE RoomCode='%s'", - RoomCode) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get number of users connected to a chat room")) + DB_BuildQuery ("SELECT NumUsrs FROM chat WHERE RoomCode='%s'", + RoomCode); + if (DB_QuerySELECT_new (&mysql_res,"can not get number of users connected to a chat room")) { /* Get number of users connected to the chat room */ row = mysql_fetch_row (mysql_res); diff --git a/swad_connected.c b/swad_connected.c index d19c1e5e1..5953f0a06 100644 --- a/swad_connected.c +++ b/swad_connected.c @@ -192,7 +192,6 @@ void Con_GetAndShowLastClicks (void) extern const char *Txt_Degree; extern const char *Txt_Action; extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumRow; @@ -208,21 +207,20 @@ void Con_GetAndShowLastClicks (void) /***** Get last clicks from database *****/ /* Important for maximum performance: do the LIMIT in the big log table before the JOIN */ - if (asprintf (&Query,"SELECT last_logs.LogCod,last_logs.ActCod," - "last_logs.Dif,last_logs.Role," - "last_logs.CtyCod,last_logs.InsCod," - "last_logs.CtrCod,last_logs.DegCod," - "actions.Txt" - " FROM" - " (SELECT LogCod,ActCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(ClickTime) AS Dif," - "Role,CtyCod,InsCod,CtrCod,DegCod" - " FROM log_recent ORDER BY LogCod DESC LIMIT 20)" - " AS last_logs,actions" - " WHERE last_logs.ActCod=actions.ActCod" - " AND actions.Language='es'") < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get last clicks"); + DB_BuildQuery ("SELECT last_logs.LogCod,last_logs.ActCod," + "last_logs.Dif,last_logs.Role," + "last_logs.CtyCod,last_logs.InsCod," + "last_logs.CtrCod,last_logs.DegCod," + "actions.Txt" + " FROM" + " (SELECT LogCod,ActCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(ClickTime) AS Dif," + "Role,CtyCod,InsCod,CtrCod,DegCod" + " FROM log_recent ORDER BY LogCod DESC LIMIT 20)" + " AS last_logs,actions" + " WHERE last_logs.ActCod=actions.ActCod" + " AND actions.Language='es'"); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get last clicks"); /***** Write list of connected users *****/ Tbl_StartTableCenter (1); @@ -698,7 +696,6 @@ static unsigned Con_GetConnectedUsrsTotal (Rol_Role_t Role) static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Role,struct ConnectedUsrs *Usrs) { extern const char *Usr_StringsSexDB[Usr_NUM_SEXS]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumSexs; @@ -711,71 +708,65 @@ static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t switch (Gbl.Scope.Current) { case Sco_SCOPE_SYS: // Show connected users in the whole platform - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM connected,usr_data" - " WHERE connected.UsrCod=usr_data.UsrCod") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM connected,usr_data" + " WHERE connected.UsrCod=usr_data.UsrCod"); break; case Sco_SCOPE_CTY: // Show connected users in the current country - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentCty.Cty.CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentCty.Cty.CtyCod); break; case Sco_SCOPE_INS: // Show connected users in the current institution - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM centres,degrees,courses,crs_usr,connected,usr_data" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentIns.Ins.InsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM centres,degrees,courses,crs_usr,connected,usr_data" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CTR: // Show connected users in the current centre - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM degrees,courses,crs_usr,connected,usr_data" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentCtr.Ctr.CtrCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM degrees,courses,crs_usr,connected,usr_data" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEG: // Show connected users in the current degree - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM courses,crs_usr,connected,usr_data" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentDeg.Deg.DegCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM courses,crs_usr,connected,usr_data" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentDeg.Deg.DegCod); break; case Sco_SCOPE_CRS: // Show connected users in the current course - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM crs_usr,connected,usr_data" - " WHERE crs_usr.CrsCod=%ld" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentCrs.Crs.CrsCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM crs_usr,connected,usr_data" + " WHERE crs_usr.CrsCod=%ld" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentCrs.Crs.CrsCod); break; default: Lay_WrongScopeExit (); @@ -783,12 +774,11 @@ static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t } break; case Rol_GST: - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM connected,usr_data" - " WHERE connected.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " AND connected.UsrCod=usr_data.UsrCod") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM connected,usr_data" + " WHERE connected.UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" + " AND connected.UsrCod=usr_data.UsrCod"); break; case Rol_STD: case Rol_NET: @@ -796,84 +786,78 @@ static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t switch (Gbl.Scope.Current) { case Sco_SCOPE_SYS: // Show connected users in the whole platform - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM connected,crs_usr,usr_data" - " WHERE connected.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " AND connected.UsrCod=usr_data.UsrCod", - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM connected,crs_usr,usr_data" + " WHERE connected.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role=%u" + " AND connected.UsrCod=usr_data.UsrCod", + (unsigned) Role); break; case Sco_SCOPE_CTY: // Show connected users in the current country - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentCty.Cty.CtyCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM institutions,centres,degrees,courses,crs_usr,connected,usr_data" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentCty.Cty.CtyCod, + (unsigned) Role); break; case Sco_SCOPE_INS: // Show connected users in the current institution - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM centres,degrees,courses,crs_usr,connected,usr_data" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM centres,degrees,courses,crs_usr,connected,usr_data" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" " AND connected.UsrCod=usr_data.UsrCod", Gbl.CurrentIns.Ins.InsCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + (unsigned) Role); break; case Sco_SCOPE_CTR: // Show connected users in the current centre - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM degrees,courses,crs_usr,connected,usr_data" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentCtr.Ctr.CtrCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM degrees,courses,crs_usr,connected,usr_data" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentCtr.Ctr.CtrCod, + (unsigned) Role); break; case Sco_SCOPE_DEG: // Show connected users in the current degree - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM courses,crs_usr,connected,usr_data" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentDeg.Deg.DegCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM courses,crs_usr,connected,usr_data" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentDeg.Deg.DegCod, + (unsigned) Role); break; case Sco_SCOPE_CRS: // Show connected users in the current course - if (asprintf (&Query,"SELECT COUNT(DISTINCT connected.UsrCod)," - "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" - " FROM crs_usr,connected,usr_data" - " WHERE crs_usr.CrsCod=%ld" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " AND connected.UsrCod=usr_data.UsrCod", - Gbl.CurrentCrs.Crs.CrsCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT COUNT(DISTINCT connected.UsrCod)," + "COUNT(DISTINCT usr_data.Sex),MIN(usr_data.Sex)" + " FROM crs_usr,connected,usr_data" + " WHERE crs_usr.CrsCod=%ld" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " AND connected.UsrCod=usr_data.UsrCod", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Role); break; default: Lay_WrongScopeExit (); @@ -884,7 +868,7 @@ static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t Lay_ShowErrorAndExit ("Wrong role."); break; } - DB_QuerySELECT_free (Query,&mysql_res,"can not get number of connected users who belong to this location"); + DB_QuerySELECT_new (&mysql_res,"can not get number of connected users who belong to this location"); row = mysql_fetch_row (mysql_res); @@ -918,25 +902,23 @@ static void Con_GetNumConnectedUsrsWithARoleBelongingCurrentLocation (Rol_Role_t static void Con_ComputeConnectedUsrsWithARoleCurrentCrsOneByOne (Rol_Role_t Role) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; unsigned NumUsr = Gbl.Usrs.Connected.NumUsrs; // Save current number of users /***** Get connected users who belong to current course from database *****/ - if (asprintf (&Query,"SELECT connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM connected,crs_usr" - " WHERE crs_usr.CrsCod=%ld AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " ORDER BY Dif", - Gbl.CurrentCrs.Crs.CrsCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); - NumRows = DB_QuerySELECT_free (Query,&mysql_res, - "can not get list of connected users" - " who belong to this course"); + DB_BuildQuery ("SELECT connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM connected,crs_usr" + " WHERE crs_usr.CrsCod=%ld AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Role); + NumRows = DB_QuerySELECT_new (&mysql_res, + "can not get list of connected users" + " who belong to this course"); Gbl.Usrs.Connected.NumUsrs += (unsigned) NumRows; Gbl.Usrs.Connected.NumUsrsToList += (unsigned) NumRows; if (Gbl.Usrs.Connected.NumUsrsToList > Cfg_MAX_CONNECTED_SHOWN) @@ -1077,7 +1059,6 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role) static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t Role) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumUsrs; @@ -1098,12 +1079,11 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R switch (Role) { case Rol_GST: - if (asprintf (&Query,"SELECT UsrCod,LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(LastTime) AS Dif" - " FROM connected" - " WHERE UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" - " ORDER BY Dif") < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT UsrCod,LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(LastTime) AS Dif" + " FROM connected" + " WHERE UsrCod NOT IN (SELECT UsrCod FROM crs_usr)" + " ORDER BY Dif"); break; case Rol_STD: case Rol_NET: @@ -1111,84 +1091,78 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R switch (Gbl.Scope.Current) { case Sco_SCOPE_SYS: // Show connected users in the whole platform - if (asprintf (&Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM connected,crs_usr" - " WHERE connected.UsrCod=crs_usr.UsrCod" - " AND crs_usr.Role=%u" - " ORDER BY Dif", - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM connected,crs_usr" + " WHERE connected.UsrCod=crs_usr.UsrCod" + " AND crs_usr.Role=%u" + " ORDER BY Dif", + (unsigned) Role); break; case Sco_SCOPE_CTY: // Show connected users in the current country - if (asprintf (&Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM institutions,centres,degrees,courses,crs_usr,connected" - " WHERE institutions.CtyCod=%ld" - " AND institutions.InsCod=centres.InsCod" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " ORDER BY Dif", - Gbl.CurrentCty.Cty.CtyCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM institutions,centres,degrees,courses,crs_usr,connected" + " WHERE institutions.CtyCod=%ld" + " AND institutions.InsCod=centres.InsCod" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCty.Cty.CtyCod, + (unsigned) Role); break; case Sco_SCOPE_INS: // Show connected users in the current institution - if (asprintf (&Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM centres,degrees,courses,crs_usr,connected" - " WHERE centres.InsCod=%ld" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " ORDER BY Dif", - Gbl.CurrentIns.Ins.InsCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM centres,degrees,courses,crs_usr,connected" + " WHERE centres.InsCod=%ld" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentIns.Ins.InsCod, + (unsigned) Role); break; case Sco_SCOPE_CTR: // Show connected users in the current centre - if (asprintf (&Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM degrees,courses,crs_usr,connected" - " WHERE degrees.CtrCod=%ld" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " ORDER BY Dif", - Gbl.CurrentCtr.Ctr.CtrCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM degrees,courses,crs_usr,connected" + " WHERE degrees.CtrCod=%ld" + " AND degrees.DegCod=courses.DegCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCtr.Ctr.CtrCod, + (unsigned) Role); break; case Sco_SCOPE_DEG: // Show connected users in the current degree - if (asprintf (&Query,"SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM courses,crs_usr,connected" - " WHERE courses.DegCod=%ld" - " AND courses.CrsCod=crs_usr.CrsCod" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " ORDER BY Dif", - Gbl.CurrentDeg.Deg.DegCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT DISTINCTROW connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM courses,crs_usr,connected" + " WHERE courses.DegCod=%ld" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentDeg.Deg.DegCod, + (unsigned) Role); break; case Sco_SCOPE_CRS: // Show connected users in the current course - if (asprintf (&Query,"SELECT connected.UsrCod,connected.LastCrsCod," - "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" - " FROM crs_usr,connected" - " WHERE crs_usr.CrsCod=%ld" - " AND crs_usr.Role=%u" - " AND crs_usr.UsrCod=connected.UsrCod" - " ORDER BY Dif", - Gbl.CurrentCrs.Crs.CrsCod, - (unsigned) Role) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT connected.UsrCod,connected.LastCrsCod," + "UNIX_TIMESTAMP()-UNIX_TIMESTAMP(connected.LastTime) AS Dif" + " FROM crs_usr,connected" + " WHERE crs_usr.CrsCod=%ld" + " AND crs_usr.Role=%u" + " AND crs_usr.UsrCod=connected.UsrCod" + " ORDER BY Dif", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Role); break; default: Lay_WrongScopeExit (); @@ -1200,9 +1174,9 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R break; } - NumUsrs = (unsigned) DB_QuerySELECT_free (Query,&mysql_res, - "can not get list of connected users" - " who belong to this location"); + NumUsrs = (unsigned) DB_QuerySELECT_new (&mysql_res, + "can not get list of connected users" + " who belong to this location"); if (NumUsrs) { diff --git a/swad_country.c b/swad_country.c index 8993f4b7b..b0a4793d7 100644 --- a/swad_country.c +++ b/swad_country.c @@ -111,7 +111,6 @@ void Cty_SeeCtyWithPendingInss (void) extern const char *Txt_Country; extern const char *Txt_Institutions_ABBREVIATION; extern const char *Txt_There_are_no_countries_with_requests_for_institutions_to_be_confirmed; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumCtys; @@ -123,24 +122,23 @@ void Cty_SeeCtyWithPendingInss (void) switch (Gbl.Usrs.Me.Role.Logged) { case Rol_SYS_ADM: - if (asprintf (&Query,"SELECT institutions.CtyCod,COUNT(*)" - " FROM institutions,countries" - " WHERE (institutions.Status & %u)<>0" - " AND institutions.CtyCod=countries.CtyCod" - " GROUP BY institutions.CtyCod" - " ORDER BY countries.Name_%s", - (unsigned) Ins_STATUS_BIT_PENDING, - Txt_STR_LANG_ID[Gbl.Prefs.Language]) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT institutions.CtyCod,COUNT(*)" + " FROM institutions,countries" + " WHERE (institutions.Status & %u)<>0" + " AND institutions.CtyCod=countries.CtyCod" + " GROUP BY institutions.CtyCod" + " ORDER BY countries.Name_%s", + (unsigned) Ins_STATUS_BIT_PENDING, + Txt_STR_LANG_ID[Gbl.Prefs.Language]); break; default: // Forbidden for other users return; } /***** Get countries *****/ - if ((NumCtys = (unsigned) DB_QuerySELECT_free (Query,&mysql_res, - "can not get countries" - "with pending institutions"))) + if ((NumCtys = (unsigned) DB_QuerySELECT_new (&mysql_res, + "can not get countries" + "with pending institutions"))) { /***** Start box and table *****/ Box_StartBoxTable (NULL,Txt_Countries_with_pending_institutions,NULL, @@ -1001,7 +999,6 @@ void Cty_GetListCountries (Cty_GetExtraData_t GetExtraData) char SubQueryWWW1[Cty_MAX_BYTES_SUBQUERY_CTYS + 1]; char SubQueryWWW2[Cty_MAX_BYTES_SUBQUERY_CTYS + 1]; char OrderBySubQuery[256]; - char *Query = NULL; // Initialized to avoid warning MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -1013,11 +1010,10 @@ void Cty_GetListCountries (Cty_GetExtraData_t GetExtraData) switch (GetExtraData) { case Cty_GET_BASIC_DATA: - if (asprintf (&Query,"SELECT CtyCod,Alpha2,Name_%s" - " FROM countries ORDER BY Name_%s", - Txt_STR_LANG_ID[Gbl.Prefs.Language], - Txt_STR_LANG_ID[Gbl.Prefs.Language]) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT CtyCod,Alpha2,Name_%s" + " FROM countries ORDER BY Name_%s", + Txt_STR_LANG_ID[Gbl.Prefs.Language], + Txt_STR_LANG_ID[Gbl.Prefs.Language]); break; case Cty_GET_EXTRA_DATA: SubQueryNam1[0] = '\0'; @@ -1062,24 +1058,23 @@ void Cty_GetListCountries (Cty_GetExtraData_t GetExtraData) Txt_STR_LANG_ID[Gbl.Prefs.Language]); break; } - if (asprintf (&Query,"(SELECT countries.CtyCod,countries.Alpha2,%s%sCOUNT(*) AS NumUsrs" - " FROM countries,usr_data" - " WHERE countries.CtyCod=usr_data.CtyCod" - " GROUP BY countries.CtyCod)" - " UNION " - "(SELECT CtyCod,Alpha2,%s%s0 AS NumUsrs" - " FROM countries" - " WHERE CtyCod NOT IN" - " (SELECT DISTINCT CtyCod FROM usr_data))" - " ORDER BY %s", - SubQueryNam1,SubQueryWWW1, - SubQueryNam2,SubQueryWWW2,OrderBySubQuery) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("(SELECT countries.CtyCod,countries.Alpha2,%s%sCOUNT(*) AS NumUsrs" + " FROM countries,usr_data" + " WHERE countries.CtyCod=usr_data.CtyCod" + " GROUP BY countries.CtyCod)" + " UNION " + "(SELECT CtyCod,Alpha2,%s%s0 AS NumUsrs" + " FROM countries" + " WHERE CtyCod NOT IN" + " (SELECT DISTINCT CtyCod FROM usr_data))" + " ORDER BY %s", + SubQueryNam1,SubQueryWWW1, + SubQueryNam2,SubQueryWWW2,OrderBySubQuery); break; } /***** Count number of rows in result *****/ - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get countries"); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get countries"); if (NumRows) // Countries found... { Gbl.Ctys.Num = (unsigned) NumRows; @@ -1174,7 +1169,6 @@ void Cty_WriteSelectorOfCountry (void) { extern const char *Txt_Country; extern const char *Txt_STR_LANG_ID[1 + Txt_NUM_LANGUAGES]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned NumCtys; @@ -1193,13 +1187,12 @@ void Cty_WriteSelectorOfCountry (void) Txt_Country); /***** Get countries from database *****/ - if (asprintf (&Query,"SELECT DISTINCT CtyCod,Name_%s" - " FROM countries" - " ORDER BY countries.Name_%s", - Txt_STR_LANG_ID[Gbl.Prefs.Language], - Txt_STR_LANG_ID[Gbl.Prefs.Language]) < 0) - Lay_NotEnoughMemoryExit (); - NumCtys = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get countries"); + DB_BuildQuery ("SELECT DISTINCT CtyCod,Name_%s" + " FROM countries" + " ORDER BY countries.Name_%s", + Txt_STR_LANG_ID[Gbl.Prefs.Language], + Txt_STR_LANG_ID[Gbl.Prefs.Language]); + NumCtys = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get countries"); /***** List countries *****/ for (NumCty = 0; @@ -1272,7 +1265,6 @@ bool Cty_GetDataOfCountryByCod (struct Country *Cty,Cty_GetExtraData_t GetExtraD char SubQueryNam2[Cty_MAX_BYTES_SUBQUERY_CTYS + 1]; char SubQueryWWW1[Cty_MAX_BYTES_SUBQUERY_CTYS + 1]; char SubQueryWWW2[Cty_MAX_BYTES_SUBQUERY_CTYS + 1]; - char *Query = NULL; // Initialized to avoid warning MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -1314,13 +1306,12 @@ bool Cty_GetDataOfCountryByCod (struct Country *Cty,Cty_GetExtraData_t GetExtraD switch (GetExtraData) { case Cty_GET_BASIC_DATA: - if (asprintf (&Query,"SELECT Alpha2,Name_%s,WWW_%s" - " FROM countries" - " WHERE CtyCod='%03ld'", - Txt_STR_LANG_ID[Gbl.Prefs.Language], - Txt_STR_LANG_ID[Gbl.Prefs.Language], - Cty->CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("SELECT Alpha2,Name_%s,WWW_%s" + " FROM countries" + " WHERE CtyCod='%03ld'", + Txt_STR_LANG_ID[Gbl.Prefs.Language], + Txt_STR_LANG_ID[Gbl.Prefs.Language], + Cty->CtyCod); break; case Cty_GET_EXTRA_DATA: SubQueryNam1[0] = '\0'; @@ -1353,23 +1344,22 @@ bool Cty_GetDataOfCountryByCod (struct Country *Cty,Cty_GetExtraData_t GetExtraD Str_Concat (SubQueryWWW2,StrField, Cty_MAX_BYTES_SUBQUERY_CTYS); } - if (asprintf (&Query,"(SELECT countries.Alpha2,%s%sCOUNT(*) AS NumUsrs" - " FROM countries,usr_data" - " WHERE countries.CtyCod='%03ld'" - " AND countries.CtyCod=usr_data.CtyCod)" - " UNION " - "(SELECT Alpha2,%s%s0 AS NumUsrs" - " FROM countries" - " WHERE CtyCod='%03ld'" - " AND CtyCod NOT IN" - " (SELECT DISTINCT CtyCod FROM usr_data))", - SubQueryNam1,SubQueryWWW1,Cty->CtyCod, - SubQueryNam2,SubQueryWWW2,Cty->CtyCod) < 0) - Lay_NotEnoughMemoryExit (); + DB_BuildQuery ("(SELECT countries.Alpha2,%s%sCOUNT(*) AS NumUsrs" + " FROM countries,usr_data" + " WHERE countries.CtyCod='%03ld'" + " AND countries.CtyCod=usr_data.CtyCod)" + " UNION " + "(SELECT Alpha2,%s%s0 AS NumUsrs" + " FROM countries" + " WHERE CtyCod='%03ld'" + " AND CtyCod NOT IN" + " (SELECT DISTINCT CtyCod FROM usr_data))", + SubQueryNam1,SubQueryWWW1,Cty->CtyCod, + SubQueryNam2,SubQueryWWW2,Cty->CtyCod); break; } - NumRows = DB_QuerySELECT_free (Query,&mysql_res,"can not get data of a country"); + NumRows = DB_QuerySELECT_new (&mysql_res,"can not get data of a country"); /***** Count number of rows in result *****/ if (NumRows) // Country found... @@ -1440,7 +1430,6 @@ void Cty_FlushCacheCountryName (void) void Cty_GetCountryName (long CtyCod,char CtyName[Cty_MAX_BYTES_NAME + 1]) { extern const char *Txt_STR_LANG_ID[1 + Txt_NUM_LANGUAGES]; - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -1462,10 +1451,9 @@ void Cty_GetCountryName (long CtyCod,char CtyName[Cty_MAX_BYTES_NAME + 1]) /***** 3. Slow: get country name from database *****/ Gbl.Cache.CountryName.CtyCod = CtyCod; - if (asprintf (&Query,"SELECT Name_%s FROM countries WHERE CtyCod='%03ld'", - Txt_STR_LANG_ID[Gbl.Prefs.Language],CtyCod) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get the name of a country")) // Country found... + DB_BuildQuery ("SELECT Name_%s FROM countries WHERE CtyCod='%03ld'", + Txt_STR_LANG_ID[Gbl.Prefs.Language],CtyCod); + if (DB_QuerySELECT_new (&mysql_res,"can not get the name of a country")) // Country found... { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -1490,7 +1478,6 @@ void Cty_GetCountryName (long CtyCod,char CtyName[Cty_MAX_BYTES_NAME + 1]) static void Cty_GetMapAttribution (long CtyCod,char **MapAttribution) { - char *Query; MYSQL_RES *mysql_res; MYSQL_ROW row; size_t Length; @@ -1499,10 +1486,9 @@ static void Cty_GetMapAttribution (long CtyCod,char **MapAttribution) Cty_FreeMapAttribution (MapAttribution); /***** Get photo attribution from database *****/ - if (asprintf (&Query,"SELECT MapAttribution FROM countries WHERE CtyCod=%ld", - CtyCod) < 0) - Lay_NotEnoughMemoryExit (); - if (DB_QuerySELECT_free (Query,&mysql_res,"can not get photo attribution")) + DB_BuildQuery ("SELECT MapAttribution FROM countries WHERE CtyCod=%ld", + CtyCod); + if (DB_QuerySELECT_new (&mysql_res,"can not get photo attribution")) { /* Get row */ row = mysql_fetch_row (mysql_res); @@ -2418,7 +2404,7 @@ unsigned Cty_GetNumCtysWithUsrs (Rol_Role_t Role,const char *SubQuery) /*****************************************************************************/ // Returns number of countries found -unsigned Cty_ListCtysFound (const char *Query) +unsigned Cty_ListCtysFound (void) { extern const char *Txt_country; extern const char *Txt_countries; @@ -2429,7 +2415,7 @@ unsigned Cty_ListCtysFound (const char *Query) struct Country Cty; /***** Query database *****/ - if ((NumCtys = (unsigned) DB_QuerySELECT_free (Query,&mysql_res,"can not get countries"))) + if ((NumCtys = (unsigned) DB_QuerySELECT_new (&mysql_res,"can not get countries"))) { /***** Start box and table *****/ /* Number of countries found */ diff --git a/swad_country.h b/swad_country.h index 4b62d1504..a1b41c05e 100644 --- a/swad_country.h +++ b/swad_country.h @@ -116,6 +116,6 @@ unsigned Cty_GetNumCtysWithDegs (const char *SubQuery); unsigned Cty_GetNumCtysWithCrss (const char *SubQuery); unsigned Cty_GetNumCtysWithUsrs (Rol_Role_t Role,const char *SubQuery); -unsigned Cty_ListCtysFound (const char *Query); +unsigned Cty_ListCtysFound (void); #endif diff --git a/swad_database.c b/swad_database.c index e24a32929..ce3a3465f 100644 --- a/swad_database.c +++ b/swad_database.c @@ -26,9 +26,10 @@ /*********************************** Headers *********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For vasprintf #include // For NULL #include // To access MySQL databases -#include // For FILE,fprintf +#include // For FILE, fprintf, vasprintf #include "swad_config.h" #include "swad_database.h" @@ -51,6 +52,8 @@ extern struct Globals Gbl; static void DB_CreateTable (const char *Query); +// static void DB_QueryPrintf (char **strp,const char *fmt,...); + /*****************************************************************************/ /***************************** Database tables *******************************/ /*****************************************************************************/ @@ -3062,6 +3065,67 @@ void DB_CloseDBConnection (void) } } +void DB_BuildQuery (const char *fmt,...) + { + int NumBytesPrinted; + va_list ap; + + if (Gbl.DB.QueryPtr != NULL) + Lay_ShowErrorAndExit ("Error building query."); + + va_start (ap,fmt); + NumBytesPrinted = vasprintf (&Gbl.DB.QueryPtr,fmt,ap); + va_end (ap); + + if (NumBytesPrinted < 0) // If memory allocation wasn't possible, + // or some other error occurs, + // vasprintf will return -1 + Lay_NotEnoughMemoryExit (); + } +/* +static void DB_QueryPrintf (char **strp,const char *fmt,...) + { + int NumBytesPrinted; + va_list ap; + + va_start (ap, fmt); + NumBytesPrinted = vasprintf (strp, fmt, ap); + va_end (ap); + + if (NumBytesPrinted < 0) // If memory allocation wasn't possible, + // or some other error occurs, + // vasprintf will return -1 + Lay_NotEnoughMemoryExit (); + } +*/ +/*****************************************************************************/ +/******************** Make a SELECT query from database **********************/ +/*****************************************************************************/ + +unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError) + { + int Result; + + /***** Check that query string pointer + does not point to an allocated string *****/ + if (Gbl.DB.QueryPtr == NULL) + Lay_ShowErrorAndExit ("Wrong query string."); + + /***** Query database and free query string pointer *****/ + Result = mysql_query (&Gbl.mysql,Gbl.DB.QueryPtr); // Returns 0 on success + free ((void *) Gbl.DB.QueryPtr); + Gbl.DB.QueryPtr = NULL; + 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); + } + /*****************************************************************************/ /******************** Make a SELECT query from database **********************/ /*****************************************************************************/ diff --git a/swad_database.h b/swad_database.h index 42b7b1ac9..364c4057d 100644 --- a/swad_database.h +++ b/swad_database.h @@ -37,6 +37,9 @@ void DB_CreateTablesIfNotExist (void); void DB_OpenDBConnection (void); void DB_CloseDBConnection (void); +void DB_BuildQuery (const char *fmt,...); + +unsigned long DB_QuerySELECT_new (MYSQL_RES **mysql_res,const char *MsgError); 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); diff --git a/swad_global.c b/swad_global.c index 763067df7..3d1b854c9 100644 --- a/swad_global.c +++ b/swad_global.c @@ -126,6 +126,7 @@ void Gbl_InitializeGlobals (void) Gbl.DB.DatabaseIsOpen = false; Gbl.DB.LockedTables = false; + Gbl.DB.QueryPtr = NULL; Gbl.HiddenParamsInsertedIntoDB = false; diff --git a/swad_global.h b/swad_global.h index 5b5c5fc8b..48058991f 100644 --- a/swad_global.h +++ b/swad_global.h @@ -142,6 +142,7 @@ struct Globals { bool DatabaseIsOpen; bool LockedTables; + char *QueryPtr; // Pointer to query string, allocated dinamically } DB; bool HiddenParamsInsertedIntoDB; // If parameters are inserted in the database in this execution diff --git a/swad_notification.c b/swad_notification.c index b76787a80..95de6752f 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -355,6 +355,7 @@ void Ntf_ShowMyNotifications (void) sprintf (SubQuery," AND (Status&%u)=0", Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED); + /* if (asprintf (&Query,"SELECT NotifyEvent,FromUsrCod,InsCod,CtrCod,DegCod,CrsCod," "Cod,UNIX_TIMESTAMP(TimeNotif),Status" " FROM notif" @@ -362,7 +363,14 @@ void Ntf_ShowMyNotifications (void) " ORDER BY TimeNotif DESC", Gbl.Usrs.Me.UsrDat.UsrCod,SubQuery) < 0) Lay_NotEnoughMemoryExit (); - NumNotifications = DB_QuerySELECT_free (Query,&mysql_res,"can not get your notifications"); + */ + DB_BuildQuery ("SELECT NotifyEvent,FromUsrCod,InsCod,CtrCod,DegCod,CrsCod," + "Cod,UNIX_TIMESTAMP(TimeNotif),Status" + " FROM notif" + " WHERE ToUsrCod=%ld%s" + " ORDER BY TimeNotif DESC", + Gbl.Usrs.Me.UsrDat.UsrCod,SubQuery); + NumNotifications = DB_QuerySELECT_new (&mysql_res,"can not get your notifications"); /***** Contextual links *****/ fprintf (Gbl.F.Out,"
"); diff --git a/swad_search.c b/swad_search.c index bb4067b5d..7e0889cb9 100644 --- a/swad_search.c +++ b/swad_search.c @@ -616,7 +616,6 @@ static unsigned Sch_SearchCountriesInDB (const char *RangeQuery) { extern const char *Txt_STR_LANG_ID[1 + Txt_NUM_LANGUAGES]; char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1]; - char *Query; char FieldName[4+1+2+1]; // Example: Name_en /***** Check scope *****/ @@ -634,14 +633,13 @@ static unsigned Sch_SearchCountriesInDB (const char *RangeQuery) if (Sch_BuildSearchQuery (SearchQuery,FieldName,NULL,NULL)) { /***** Query database and list institutions found *****/ - if (asprintf (&Query,"SELECT CtyCod" - " FROM countries" - " WHERE %s%s" - " ORDER BY Name_%s", - SearchQuery,RangeQuery, - Txt_STR_LANG_ID[Gbl.Prefs.Language]) < 0) - Lay_NotEnoughMemoryExit (); - return Cty_ListCtysFound (Query); + DB_BuildQuery ("SELECT CtyCod" + " FROM countries" + " WHERE %s%s" + " ORDER BY Name_%s", + SearchQuery,RangeQuery, + Txt_STR_LANG_ID[Gbl.Prefs.Language]); + return Cty_ListCtysFound (); } } @@ -691,7 +689,6 @@ static unsigned Sch_SearchInstitutionsInDB (const char *RangeQuery) static unsigned Sch_SearchCentresInDB (const char *RangeQuery) { char SearchQuery[Sch_MAX_BYTES_SEARCH_QUERY + 1]; - char *Query; /***** Check scope *****/ if (Gbl.Scope.Current != Sco_SCOPE_DEG && @@ -702,16 +699,15 @@ static unsigned Sch_SearchCentresInDB (const char *RangeQuery) if (Sch_BuildSearchQuery (SearchQuery,"centres.FullName",NULL,NULL)) { /***** Query database and list centres found *****/ - if (asprintf (&Query,"SELECT centres.CtrCod" - " FROM centres,institutions,countries" - " WHERE %s" - " AND centres.InsCod=institutions.InsCod" - " AND institutions.CtyCod=countries.CtyCod" - "%s" - " ORDER BY centres.FullName,institutions.FullName", - SearchQuery,RangeQuery) < 0) - Lay_NotEnoughMemoryExit (); - return Ctr_ListCtrsFound (Query); + DB_BuildQuery ("SELECT centres.CtrCod" + " FROM centres,institutions,countries" + " WHERE %s" + " AND centres.InsCod=institutions.InsCod" + " AND institutions.CtyCod=countries.CtyCod" + "%s" + " ORDER BY centres.FullName,institutions.FullName", + SearchQuery,RangeQuery); + return Ctr_ListCtrsFound (); } return 0;