mirror of https://github.com/acanas/swad-core.git
Version 21.17: Sep 27, 2021 New module swad_message_database for database queries related to messages.
This commit is contained in:
parent
deea5d1cb6
commit
71117ce06f
2
Makefile
2
Makefile
|
@ -65,7 +65,7 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
|
||||||
swad_maintenance.o swad_map.o swad_mark.o swad_mark_database.o \
|
swad_maintenance.o swad_map.o swad_mark.o swad_mark_database.o \
|
||||||
swad_match.o swad_match_database.o swad_match_print.o \
|
swad_match.o swad_match_database.o swad_match_print.o \
|
||||||
swad_match_result.o swad_media.o swad_media_database.o swad_menu.o \
|
swad_match_result.o swad_media.o swad_media_database.o swad_menu.o \
|
||||||
swad_message.o swad_MFU.o \
|
swad_message.o swad_message_database.o swad_MFU.o \
|
||||||
swad_network.o swad_nickname.o swad_notice.o swad_notification.o \
|
swad_network.o swad_nickname.o swad_notice.o swad_notification.o \
|
||||||
swad_notification_database.o swad_pagination.o swad_parameter.o \
|
swad_notification_database.o swad_pagination.o swad_parameter.o \
|
||||||
swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_privacy.o \
|
swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_privacy.o \
|
||||||
|
|
|
@ -848,7 +848,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
|
||||||
Acc_CompletelyEliminateAccount (&Gbl.Usrs.Other.UsrDat,Cns_VERBOSE);
|
Acc_CompletelyEliminateAccount (&Gbl.Usrs.Other.UsrDat,Cns_VERBOSE);
|
||||||
|
|
||||||
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
||||||
Msg_MoveUnusedMsgsContentToDeleted ();
|
Msg_DB_MoveUnusedMsgsContentToDeleted ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Acc_AskIfRemoveUsrAccount (ItsMe);
|
Acc_AskIfRemoveUsrAccount (ItsMe);
|
||||||
|
@ -953,7 +953,7 @@ void Acc_RemoveMyAccount (void)
|
||||||
Acc_CompletelyEliminateAccount (&Gbl.Usrs.Me.UsrDat,Cns_VERBOSE);
|
Acc_CompletelyEliminateAccount (&Gbl.Usrs.Me.UsrDat,Cns_VERBOSE);
|
||||||
|
|
||||||
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
||||||
Msg_MoveUnusedMsgsContentToDeleted ();
|
Msg_DB_MoveUnusedMsgsContentToDeleted ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Acc_AskIfRemoveUsrAccount (true);
|
Acc_AskIfRemoveUsrAccount (true);
|
||||||
|
|
|
@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
|
||||||
|
|
||||||
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 21.16.6 (2021-09-27)"
|
#define Log_PLATFORM_VERSION "SWAD 21.17 (2021-09-27)"
|
||||||
#define CSS_FILE "swad20.45.css"
|
#define CSS_FILE "swad20.45.css"
|
||||||
#define JS_FILE "swad20.69.1.js"
|
#define JS_FILE "swad20.69.1.js"
|
||||||
/*
|
/*
|
||||||
TODO: Rename CENTRE to CENTER in help wiki.
|
TODO: Rename CENTRE to CENTER in help wiki.
|
||||||
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
||||||
|
|
||||||
|
Version 21.17: Sep 27, 2021 New module swad_message_database for database queries related to messages. (317295 lines)
|
||||||
Version 21.16.6: Sep 27, 2021 Queries moved to module swad_match_database. (317186 lines)
|
Version 21.16.6: Sep 27, 2021 Queries moved to module swad_match_database. (317186 lines)
|
||||||
Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database. (317134 lines)
|
Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database. (317134 lines)
|
||||||
Version 21.16.4: Sep 25, 2021 Queries moved to module swad_match_database. (317091 lines)
|
Version 21.16.4: Sep 25, 2021 Queries moved to module swad_match_database. (317091 lines)
|
||||||
|
|
|
@ -807,7 +807,7 @@ void Enr_RemoveOldUsrs (void)
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
|
||||||
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
||||||
Msg_MoveUnusedMsgsContentToDeleted ();
|
Msg_DB_MoveUnusedMsgsContentToDeleted ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Write end message *****/
|
/***** Write end message *****/
|
||||||
|
@ -1293,7 +1293,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
|
||||||
|
|
||||||
if (NumUsrsEliminated)
|
if (NumUsrsEliminated)
|
||||||
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
/***** Move unused contents of messages to table of deleted contents of messages *****/
|
||||||
Msg_MoveUnusedMsgsContentToDeleted ();
|
Msg_DB_MoveUnusedMsgsContentToDeleted ();
|
||||||
|
|
||||||
/***** Write messages with the number of users enroled/removed *****/
|
/***** Write messages with the number of users enroled/removed *****/
|
||||||
if (WhatToDo.RemoveUsrs)
|
if (WhatToDo.RemoveUsrs)
|
||||||
|
|
|
@ -3055,12 +3055,12 @@ static void Fig_GetAndShowMsgsStats (void)
|
||||||
unsigned NumMsgsReceivedAndNotified;
|
unsigned NumMsgsReceivedAndNotified;
|
||||||
|
|
||||||
/***** Get the number of unique messages sent from this location *****/
|
/***** Get the number of unique messages sent from this location *****/
|
||||||
NumMsgsSentNotDeleted = Msg_GetNumMsgsSent (Gbl.Scope.Current,Msg_STATUS_ALL );
|
NumMsgsSentNotDeleted = Msg_DB_GetNumSntMsgs (Gbl.Scope.Current,Msg_STATUS_ALL );
|
||||||
NumMsgsSentDeleted = Msg_GetNumMsgsSent (Gbl.Scope.Current,Msg_STATUS_DELETED );
|
NumMsgsSentDeleted = Msg_DB_GetNumSntMsgs (Gbl.Scope.Current,Msg_STATUS_DELETED );
|
||||||
|
|
||||||
NumMsgsReceivedNotDeleted = Msg_GetNumMsgsReceived (Gbl.Scope.Current,Msg_STATUS_ALL );
|
NumMsgsReceivedNotDeleted = Msg_DB_GetNumRcvMsgs (Gbl.Scope.Current,Msg_STATUS_ALL );
|
||||||
NumMsgsReceivedAndDeleted = Msg_GetNumMsgsReceived (Gbl.Scope.Current,Msg_STATUS_DELETED );
|
NumMsgsReceivedAndDeleted = Msg_DB_GetNumRcvMsgs (Gbl.Scope.Current,Msg_STATUS_DELETED );
|
||||||
NumMsgsReceivedAndNotified = Msg_GetNumMsgsReceived (Gbl.Scope.Current,Msg_STATUS_NOTIFIED);
|
NumMsgsReceivedAndNotified = Msg_DB_GetNumRcvMsgs (Gbl.Scope.Current,Msg_STATUS_NOTIFIED);
|
||||||
|
|
||||||
/***** Begin box and table *****/
|
/***** Begin box and table *****/
|
||||||
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_MESSAGES],
|
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_MESSAGES],
|
||||||
|
|
|
@ -1040,6 +1040,7 @@ unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
|
||||||
char *MchSubQuery;
|
char *MchSubQuery;
|
||||||
char *GamSubQuery;
|
char *GamSubQuery;
|
||||||
char *HidGamSubQuery;
|
char *HidGamSubQuery;
|
||||||
|
unsigned NumResults;
|
||||||
|
|
||||||
/***** Build matches subquery *****/
|
/***** Build matches subquery *****/
|
||||||
if (MchCod > 0)
|
if (MchCod > 0)
|
||||||
|
@ -1096,7 +1097,7 @@ unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Make database query *****/
|
/***** Make database query *****/
|
||||||
return (unsigned)
|
NumResults = (unsigned)
|
||||||
DB_QuerySELECT (mysql_res,"can not get matches results",
|
DB_QuerySELECT (mysql_res,"can not get matches results",
|
||||||
"SELECT mch_results.MchCod"
|
"SELECT mch_results.MchCod"
|
||||||
" FROM mch_results,"
|
" FROM mch_results,"
|
||||||
|
@ -1121,6 +1122,8 @@ unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
|
||||||
free (HidGamSubQuery);
|
free (HidGamSubQuery);
|
||||||
free (GamSubQuery);
|
free (GamSubQuery);
|
||||||
free (MchSubQuery);
|
free (MchSubQuery);
|
||||||
|
|
||||||
|
return NumResults;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
574
swad_message.c
574
swad_message.c
|
@ -49,6 +49,7 @@
|
||||||
#include "swad_HTML.h"
|
#include "swad_HTML.h"
|
||||||
#include "swad_ID.h"
|
#include "swad_ID.h"
|
||||||
#include "swad_message.h"
|
#include "swad_message.h"
|
||||||
|
#include "swad_message_database.h"
|
||||||
#include "swad_notification.h"
|
#include "swad_notification.h"
|
||||||
#include "swad_pagination.h"
|
#include "swad_pagination.h"
|
||||||
#include "swad_parameter.h"
|
#include "swad_parameter.h"
|
||||||
|
@ -66,8 +67,6 @@ extern struct Globals Gbl;
|
||||||
/***************************** Private constants *****************************/
|
/***************************** Private constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Msg_MAX_BYTES_MESSAGES_QUERY (4 * 1024 - 1)
|
|
||||||
|
|
||||||
// Forum images will be saved with:
|
// Forum images will be saved with:
|
||||||
// - maximum width of Msg_IMAGE_SAVED_MAX_HEIGHT
|
// - maximum width of Msg_IMAGE_SAVED_MAX_HEIGHT
|
||||||
// - maximum height of Msg_IMAGE_SAVED_MAX_HEIGHT
|
// - maximum height of Msg_IMAGE_SAVED_MAX_HEIGHT
|
||||||
|
@ -96,13 +95,8 @@ static void Msg_ResetMessages (struct Msg_Messages *Messages);
|
||||||
static void Msg_PutFormMsgUsrs (struct Msg_Messages *Messages,
|
static void Msg_PutFormMsgUsrs (struct Msg_Messages *Messages,
|
||||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1]);
|
char Content[Cns_MAX_BYTES_LONG_TEXT + 1]);
|
||||||
|
|
||||||
static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages);
|
static void Msg_ShowSntOrRcvMessages (struct Msg_Messages *Messages);
|
||||||
static unsigned Msg_DB_GetNumUsrsBannedByMe (void);
|
|
||||||
static void Msg_PutLinkToViewBannedUsers(void);
|
static void Msg_PutLinkToViewBannedUsers(void);
|
||||||
static unsigned Msg_GetSentOrReceivedMsgs (const struct Msg_Messages *Messages,
|
|
||||||
long UsrCod,
|
|
||||||
const char *FilterFromToSubquery,
|
|
||||||
MYSQL_RES **mysql_res);
|
|
||||||
|
|
||||||
static void Msg_SetNumMsgsStr (const struct Msg_Messages *Messages,
|
static void Msg_SetNumMsgsStr (const struct Msg_Messages *Messages,
|
||||||
char **NumMsgsStr,unsigned NumUnreadMsgs);
|
char **NumMsgsStr,unsigned NumUnreadMsgs);
|
||||||
|
@ -118,8 +112,6 @@ static void Msg_ShowFormToShowOnlyUnreadMessages (const struct Msg_Messages *Mes
|
||||||
static bool Msg_GetParamOnlyUnreadMsgs (void);
|
static bool Msg_GetParamOnlyUnreadMsgs (void);
|
||||||
static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
||||||
long MsgNum,long MsgCod);
|
long MsgNum,long MsgCod);
|
||||||
static bool Msg_DB_GetStatusOfSentMsg (long MsgCod);
|
|
||||||
static void Msg_GetStatusOfReceivedMsg (long MsgCod,bool *Open,bool *Replied,bool *Expanded);
|
|
||||||
static long Msg_GetParamMsgCod (void);
|
static long Msg_GetParamMsgCod (void);
|
||||||
static void Msg_PutLinkToShowMorePotentialRecipients (const struct Msg_Messages *Messages);
|
static void Msg_PutLinkToShowMorePotentialRecipients (const struct Msg_Messages *Messages);
|
||||||
static void Msg_PutParamsShowMorePotentialRecipients (const void *Messages);
|
static void Msg_PutParamsShowMorePotentialRecipients (const void *Messages);
|
||||||
|
@ -139,27 +131,19 @@ static void Msg_GetParamMsgsCrsCod (struct Msg_Messages *Messages);
|
||||||
static void Msg_GetParamFilterFromTo (struct Msg_Messages *Messages);
|
static void Msg_GetParamFilterFromTo (struct Msg_Messages *Messages);
|
||||||
static void Msg_GetParamFilterContent (struct Msg_Messages *Messages);
|
static void Msg_GetParamFilterContent (struct Msg_Messages *Messages);
|
||||||
|
|
||||||
static void Msg_MakeFilterFromToSubquery (const struct Msg_Messages *Messages,
|
|
||||||
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1]);
|
|
||||||
|
|
||||||
static void Msg_ExpandSentMsg (long MsgCod);
|
|
||||||
static void Msg_ExpandReceivedMsg (long MsgCod);
|
|
||||||
static void Msg_DB_ContractSentMsg (long MsgCod);
|
|
||||||
static void Msg_DB_ContractReceivedMsg (long MsgCod);
|
|
||||||
|
|
||||||
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
||||||
struct Med_Media *Media);
|
struct Med_Media *Media);
|
||||||
|
|
||||||
static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
|
static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
|
||||||
long UsrCod,
|
long UsrCod,
|
||||||
const char *FilterFromToSubquery);
|
const char *FilterFromToSubquery);
|
||||||
static void Msg_DB_InsertReceivedMsg (long MsgCod,long UsrCod,bool NotifyByEmail);
|
static void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail);
|
||||||
static void Msg_DB_SetReceivedMsgAsReplied (long MsgCod);
|
static void Msg_DB_SetRcvMsgAsReplied (long MsgCod);
|
||||||
static void Msg_MoveReceivedMsgToDeleted (long MsgCod,long UsrCod);
|
static void Msg_MoveRcvMsgToDeleted (long MsgCod,long UsrCod);
|
||||||
static void Msg_MoveSentMsgToDeleted (long MsgCod);
|
static void Msg_MoveSntMsgToDeleted (long MsgCod);
|
||||||
static void Msg_MoveMsgContentToDeleted (long MsgCod);
|
static void Msg_MoveMsgContentToDeleted (long MsgCod);
|
||||||
static bool Msg_DB_CheckIfSentMsgIsDeleted (long MsgCod);
|
static bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod);
|
||||||
static bool Msg_DB_CheckIfReceivedMsgIsDeletedForAllItsRecipients (long MsgCod);
|
static bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod);
|
||||||
static unsigned Msg_GetNumUnreadMsgs (const struct Msg_Messages *Messages,
|
static unsigned Msg_GetNumUnreadMsgs (const struct Msg_Messages *Messages,
|
||||||
const char *FilterFromToSubquery);
|
const char *FilterFromToSubquery);
|
||||||
|
|
||||||
|
@ -167,7 +151,6 @@ static void Msg_GetMsgSntData (long MsgCod,long *CrsCod,long *UsrCod,
|
||||||
time_t *CreatTimeUTC,
|
time_t *CreatTimeUTC,
|
||||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||||
bool *Deleted);
|
bool *Deleted);
|
||||||
static void Msg_DB_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1]);
|
|
||||||
static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
||||||
struct Med_Media *Media);
|
struct Med_Media *Media);
|
||||||
|
|
||||||
|
@ -611,12 +594,7 @@ static void Msg_WriteFormSubjectAndContentMsgToUsrs (struct Msg_Messages *Messag
|
||||||
if (!SubjectAndContentComeFromForm)
|
if (!SubjectAndContentComeFromForm)
|
||||||
{
|
{
|
||||||
/* Get subject and content of message from database */
|
/* Get subject and content of message from database */
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get message content",
|
if (Msg_DB_GetSubjectAndContent (&mysql_res,MsgCod) != 1)
|
||||||
"SELECT Subject," // row[0]
|
|
||||||
"Content" // row[1]
|
|
||||||
" FROM msg_content"
|
|
||||||
" WHERE MsgCod=%ld",
|
|
||||||
MsgCod) != 1)
|
|
||||||
Err_WrongMessageExit ();
|
Err_WrongMessageExit ();
|
||||||
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
@ -863,7 +841,7 @@ void Msg_RecMsgFromUsr (void)
|
||||||
|
|
||||||
/***** Create the received message for this recipient
|
/***** Create the received message for this recipient
|
||||||
and increment number of new messages received by this recipient *****/
|
and increment number of new messages received by this recipient *****/
|
||||||
Msg_DB_InsertReceivedMsg (NewMsgCod,UsrDstData.UsrCod,NotifyByEmail);
|
Msg_DB_CreateRcvMsg (NewMsgCod,UsrDstData.UsrCod,NotifyByEmail);
|
||||||
|
|
||||||
/***** Create notification for this recipient.
|
/***** Create notification for this recipient.
|
||||||
If this recipient wants to receive notifications by -mail,
|
If this recipient wants to receive notifications by -mail,
|
||||||
|
@ -908,7 +886,7 @@ void Msg_RecMsgFromUsr (void)
|
||||||
|
|
||||||
/***** Update received message setting Replied field to true *****/
|
/***** Update received message setting Replied field to true *****/
|
||||||
if (Replied)
|
if (Replied)
|
||||||
Msg_DB_SetReceivedMsgAsReplied (OriginalMsgCod);
|
Msg_DB_SetRcvMsgAsReplied (OriginalMsgCod);
|
||||||
|
|
||||||
/***** Write final message *****/
|
/***** Write final message *****/
|
||||||
if (NumRecipients)
|
if (NumRecipients)
|
||||||
|
@ -982,7 +960,7 @@ void Msg_ReqDelAllRecMsgs (void)
|
||||||
|
|
||||||
/* Show received messages again */
|
/* Show received messages again */
|
||||||
Messages.TypeOfMessages = Msg_RECEIVED;
|
Messages.TypeOfMessages = Msg_RECEIVED;
|
||||||
Msg_ShowSentOrReceivedMessages (&Messages);
|
Msg_ShowSntOrRcvMessages (&Messages);
|
||||||
|
|
||||||
/* End alert */
|
/* End alert */
|
||||||
Ale_ShowAlertAndButton2 (ActDelAllRcvMsg,NULL,NULL,
|
Ale_ShowAlertAndButton2 (ActDelAllRcvMsg,NULL,NULL,
|
||||||
|
@ -1025,7 +1003,7 @@ void Msg_ReqDelAllSntMsgs (void)
|
||||||
|
|
||||||
/* Show sent messages again */
|
/* Show sent messages again */
|
||||||
Messages.TypeOfMessages = Msg_SENT;
|
Messages.TypeOfMessages = Msg_SENT;
|
||||||
Msg_ShowSentOrReceivedMessages (&Messages);
|
Msg_ShowSntOrRcvMessages (&Messages);
|
||||||
|
|
||||||
/* End alert */
|
/* End alert */
|
||||||
Ale_ShowAlertAndButton2 (ActDelAllSntMsg,NULL,NULL,
|
Ale_ShowAlertAndButton2 (ActDelAllSntMsg,NULL,NULL,
|
||||||
|
@ -1051,11 +1029,11 @@ void Msg_DelAllRecMsgs (void)
|
||||||
Msg_GetParamFilterFromTo (&Messages);
|
Msg_GetParamFilterFromTo (&Messages);
|
||||||
Msg_GetParamFilterContent (&Messages);
|
Msg_GetParamFilterContent (&Messages);
|
||||||
Messages.ShowOnlyUnreadMsgs = Msg_GetParamOnlyUnreadMsgs ();
|
Messages.ShowOnlyUnreadMsgs = Msg_GetParamOnlyUnreadMsgs ();
|
||||||
Msg_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
|
Msg_DB_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
|
||||||
|
|
||||||
/***** Delete messages *****/
|
/***** Delete messages *****/
|
||||||
Messages.TypeOfMessages = Msg_RECEIVED;
|
Messages.TypeOfMessages = Msg_RECEIVED;
|
||||||
NumMsgs = Msg_DelSomeRecOrSntMsgsUsr (&Messages,
|
NumMsgs = Msg_RemoveSomeRecOrSntMsgsUsr (&Messages,
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
FilterFromToSubquery);
|
FilterFromToSubquery);
|
||||||
Msg_ShowNumMsgsDeleted (NumMsgs);
|
Msg_ShowNumMsgsDeleted (NumMsgs);
|
||||||
|
@ -1079,11 +1057,11 @@ void Msg_DelAllSntMsgs (void)
|
||||||
Msg_GetParamMsgsCrsCod (&Messages);
|
Msg_GetParamMsgsCrsCod (&Messages);
|
||||||
Msg_GetParamFilterFromTo (&Messages);
|
Msg_GetParamFilterFromTo (&Messages);
|
||||||
Msg_GetParamFilterContent (&Messages);
|
Msg_GetParamFilterContent (&Messages);
|
||||||
Msg_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
|
Msg_DB_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
|
||||||
|
|
||||||
/***** Delete messages *****/
|
/***** Delete messages *****/
|
||||||
Messages.TypeOfMessages = Msg_SENT;
|
Messages.TypeOfMessages = Msg_SENT;
|
||||||
NumMsgs = Msg_DelSomeRecOrSntMsgsUsr (&Messages,
|
NumMsgs = Msg_RemoveSomeRecOrSntMsgsUsr (&Messages,
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
FilterFromToSubquery);
|
FilterFromToSubquery);
|
||||||
Msg_ShowNumMsgsDeleted (NumMsgs);
|
Msg_ShowNumMsgsDeleted (NumMsgs);
|
||||||
|
@ -1151,38 +1129,6 @@ static void Msg_GetParamFilterContent (struct Msg_Messages *Messages)
|
||||||
Msg_MAX_BYTES_FILTER_CONTENT);
|
Msg_MAX_BYTES_FILTER_CONTENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************* Make "from"/"to" subquery *************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_MakeFilterFromToSubquery (const struct Msg_Messages *Messages,
|
|
||||||
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1])
|
|
||||||
{
|
|
||||||
const char *Ptr;
|
|
||||||
char SearchWord[Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 1];
|
|
||||||
|
|
||||||
/***** Split "from"/"to" string into words *****/
|
|
||||||
if (Messages->FilterFromTo[0])
|
|
||||||
{
|
|
||||||
Ptr = Messages->FilterFromTo;
|
|
||||||
Str_Copy (FilterFromToSubquery,
|
|
||||||
" AND CONCAT(usr_data.FirstName,' ',usr_data.Surname1,' ',usr_data.Surname2) LIKE '",
|
|
||||||
Msg_MAX_BYTES_MESSAGES_QUERY);
|
|
||||||
while (*Ptr)
|
|
||||||
{
|
|
||||||
Str_GetNextStringUntilSpace (&Ptr,SearchWord,Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME);
|
|
||||||
if (strlen (FilterFromToSubquery) + strlen (SearchWord) + 512 >
|
|
||||||
Msg_MAX_BYTES_MESSAGES_QUERY) // Prevent string overflow
|
|
||||||
break;
|
|
||||||
Str_Concat (FilterFromToSubquery,"%",Msg_MAX_BYTES_MESSAGES_QUERY);
|
|
||||||
Str_Concat (FilterFromToSubquery,SearchWord,Msg_MAX_BYTES_MESSAGES_QUERY);
|
|
||||||
}
|
|
||||||
Str_Concat (FilterFromToSubquery,"%'",Msg_MAX_BYTES_MESSAGES_QUERY);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
FilterFromToSubquery[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Delete a sent message ************************/
|
/****************************** Delete a sent message ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1198,7 +1144,7 @@ void Msg_DelSntMsg (void)
|
||||||
|
|
||||||
/***** Delete the message *****/
|
/***** Delete the message *****/
|
||||||
/* Delete the sent message */
|
/* Delete the sent message */
|
||||||
Msg_MoveSentMsgToDeleted (MsgCod);
|
Msg_MoveSntMsgToDeleted (MsgCod);
|
||||||
Ale_ShowAlert (Ale_SUCCESS,Txt_Message_deleted);
|
Ale_ShowAlert (Ale_SUCCESS,Txt_Message_deleted);
|
||||||
|
|
||||||
/* Show the remaining messages */
|
/* Show the remaining messages */
|
||||||
|
@ -1220,7 +1166,7 @@ void Msg_DelRecMsg (void)
|
||||||
|
|
||||||
/***** Delete the message *****/
|
/***** Delete the message *****/
|
||||||
/* Delete the received message */
|
/* Delete the received message */
|
||||||
Msg_MoveReceivedMsgToDeleted (MsgCod,Gbl.Usrs.Me.UsrDat.UsrCod);
|
Msg_MoveRcvMsgToDeleted (MsgCod,Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
Ale_ShowAlert (Ale_SUCCESS,Txt_Message_deleted);
|
Ale_ShowAlert (Ale_SUCCESS,Txt_Message_deleted);
|
||||||
|
|
||||||
/* Show the remaining messages */
|
/* Show the remaining messages */
|
||||||
|
@ -1243,7 +1189,7 @@ void Msg_ExpSntMsg (void)
|
||||||
Err_WrongMessageExit ();
|
Err_WrongMessageExit ();
|
||||||
|
|
||||||
/***** Expand the message *****/
|
/***** Expand the message *****/
|
||||||
Msg_ExpandSentMsg (Messages.ExpandedMsgCod);
|
Msg_DB_ExpandSntMsg (Messages.ExpandedMsgCod);
|
||||||
|
|
||||||
/***** Show again the messages *****/
|
/***** Show again the messages *****/
|
||||||
Msg_ShowSntMsgs ();
|
Msg_ShowSntMsgs ();
|
||||||
|
@ -1265,7 +1211,7 @@ void Msg_ExpRecMsg (void)
|
||||||
Err_WrongMessageExit ();
|
Err_WrongMessageExit ();
|
||||||
|
|
||||||
/***** Expand the message *****/
|
/***** Expand the message *****/
|
||||||
Msg_ExpandReceivedMsg (Messages.ExpandedMsgCod);
|
Msg_DB_ExpandRcvMsg (Messages.ExpandedMsgCod);
|
||||||
|
|
||||||
/***** Mark possible notification as seen *****/
|
/***** Mark possible notification as seen *****/
|
||||||
Ntf_MarkNotifAsSeen (Ntf_EVENT_MESSAGE,
|
Ntf_MarkNotifAsSeen (Ntf_EVENT_MESSAGE,
|
||||||
|
@ -1289,7 +1235,7 @@ void Msg_ConSntMsg (void)
|
||||||
Err_WrongMessageExit ();
|
Err_WrongMessageExit ();
|
||||||
|
|
||||||
/***** Contract the message *****/
|
/***** Contract the message *****/
|
||||||
Msg_DB_ContractSentMsg (MsgCod);
|
Msg_DB_ContractSntMsg (MsgCod);
|
||||||
|
|
||||||
/***** Show again the messages *****/
|
/***** Show again the messages *****/
|
||||||
Msg_ShowSntMsgs ();
|
Msg_ShowSntMsgs ();
|
||||||
|
@ -1308,95 +1254,12 @@ void Msg_ConRecMsg (void)
|
||||||
Err_WrongMessageExit ();
|
Err_WrongMessageExit ();
|
||||||
|
|
||||||
/***** Contract the message *****/
|
/***** Contract the message *****/
|
||||||
Msg_DB_ContractReceivedMsg (MsgCod);
|
Msg_DB_ContractRcvMsg (MsgCod);
|
||||||
|
|
||||||
/***** Show again the messages *****/
|
/***** Show again the messages *****/
|
||||||
Msg_ShowRecMsgs ();
|
Msg_ShowRecMsgs ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**************************** Expand a sent message **************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_ExpandSentMsg (long MsgCod)
|
|
||||||
{
|
|
||||||
/***** Expand message in sent message table *****/
|
|
||||||
DB_QueryUPDATE ("can not expand a sent message",
|
|
||||||
"UPDATE msg_snt"
|
|
||||||
" SET Expanded='Y'"
|
|
||||||
" WHERE MsgCod=%ld"
|
|
||||||
" AND UsrCod=%ld",
|
|
||||||
MsgCod,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
||||||
|
|
||||||
/***** Contract all my other messages in sent message table *****/
|
|
||||||
DB_QueryUPDATE ("can not contract a sent message",
|
|
||||||
"UPDATE msg_snt"
|
|
||||||
" SET Expanded='N'"
|
|
||||||
" WHERE UsrCod=%ld"
|
|
||||||
" AND MsgCod<>%ld",
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
||||||
MsgCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************* Expand a received message *************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_ExpandReceivedMsg (long MsgCod)
|
|
||||||
{
|
|
||||||
/***** Expand message in received message table and mark it as read by me *****/
|
|
||||||
DB_QueryUPDATE ("can not expand a received message",
|
|
||||||
"UPDATE msg_rcv"
|
|
||||||
" SET Open='Y',"
|
|
||||||
"Expanded='Y'"
|
|
||||||
" WHERE MsgCod=%ld"
|
|
||||||
" AND UsrCod=%ld",
|
|
||||||
MsgCod,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
||||||
|
|
||||||
/***** Contract all my other messages in received message table *****/
|
|
||||||
DB_QueryUPDATE ("can not contract a received message",
|
|
||||||
"UPDATE msg_rcv"
|
|
||||||
" SET Expanded='N'"
|
|
||||||
" WHERE UsrCod=%ld"
|
|
||||||
" AND MsgCod<>%ld",
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
||||||
MsgCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************** Contract a sent message **************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_DB_ContractSentMsg (long MsgCod)
|
|
||||||
{
|
|
||||||
/***** Contract message in sent message table *****/
|
|
||||||
DB_QueryUPDATE ("can not contract a sent message",
|
|
||||||
"UPDATE msg_snt"
|
|
||||||
" SET Expanded='N'"
|
|
||||||
" WHERE MsgCod=%ld"
|
|
||||||
" AND UsrCod=%ld",
|
|
||||||
MsgCod,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************ Contract a received message ************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_DB_ContractReceivedMsg (long MsgCod)
|
|
||||||
{
|
|
||||||
/***** Contract message in received message table *****/
|
|
||||||
DB_QueryUPDATE ("can not contract a received message",
|
|
||||||
"UPDATE msg_rcv"
|
|
||||||
" SET Expanded='N'"
|
|
||||||
" WHERE MsgCod=%ld"
|
|
||||||
" AND UsrCod=%ld",
|
|
||||||
MsgCod,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************** Mark a received message as open **********************/
|
/********************** Mark a received message as open **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1457,9 +1320,9 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
|
||||||
/************** Delete some received or sent messages of a user **************/
|
/************** Delete some received or sent messages of a user **************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
|
static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
|
||||||
long UsrCod,
|
long UsrCod,
|
||||||
const char *FilterFromToSubquery)
|
const char *FilterFromToSubquery)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
unsigned NumMsgs;
|
unsigned NumMsgs;
|
||||||
|
@ -1467,10 +1330,8 @@ static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Mess
|
||||||
long MsgCod;
|
long MsgCod;
|
||||||
|
|
||||||
/***** Get some of the messages received or sent by this user from database *****/
|
/***** Get some of the messages received or sent by this user from database *****/
|
||||||
NumMsgs = Msg_GetSentOrReceivedMsgs (Messages,
|
NumMsgs = Msg_DB_GetSntOrRcvMsgs (&mysql_res,
|
||||||
UsrCod,
|
Messages,UsrCod,FilterFromToSubquery);
|
||||||
FilterFromToSubquery,
|
|
||||||
&mysql_res);
|
|
||||||
|
|
||||||
/***** Delete each message *****/
|
/***** Delete each message *****/
|
||||||
for (NumMsg = 0;
|
for (NumMsg = 0;
|
||||||
|
@ -1483,10 +1344,10 @@ static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Mess
|
||||||
switch (Messages->TypeOfMessages)
|
switch (Messages->TypeOfMessages)
|
||||||
{
|
{
|
||||||
case Msg_RECEIVED:
|
case Msg_RECEIVED:
|
||||||
Msg_MoveReceivedMsgToDeleted (MsgCod,UsrCod);
|
Msg_MoveRcvMsgToDeleted (MsgCod,UsrCod);
|
||||||
break;
|
break;
|
||||||
case Msg_SENT:
|
case Msg_SENT:
|
||||||
Msg_MoveSentMsgToDeleted (MsgCod);
|
Msg_MoveSntMsgToDeleted (MsgCod);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1549,7 +1410,7 @@ void Msg_DelAllRecAndSntMsgsUsr (long UsrCod)
|
||||||
/**** Insert a message y su destinatario in the table of messages received ***/
|
/**** Insert a message y su destinatario in the table of messages received ***/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Msg_DB_InsertReceivedMsg (long MsgCod,long UsrCod,bool NotifyByEmail)
|
static void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail)
|
||||||
{
|
{
|
||||||
/***** Insert message received in the database *****/
|
/***** Insert message received in the database *****/
|
||||||
DB_QueryINSERT ("can not create received message",
|
DB_QueryINSERT ("can not create received message",
|
||||||
|
@ -1567,7 +1428,7 @@ static void Msg_DB_InsertReceivedMsg (long MsgCod,long UsrCod,bool NotifyByEmail
|
||||||
/******** Update received message by setting Replied field to true ***********/
|
/******** Update received message by setting Replied field to true ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Msg_DB_SetReceivedMsgAsReplied (long MsgCod)
|
static void Msg_DB_SetRcvMsgAsReplied (long MsgCod)
|
||||||
{
|
{
|
||||||
/***** Update received message by setting Replied field to true *****/
|
/***** Update received message by setting Replied field to true *****/
|
||||||
DB_QueryUPDATE ("can not update a received message",
|
DB_QueryUPDATE ("can not update a received message",
|
||||||
|
@ -1583,7 +1444,7 @@ static void Msg_DB_SetReceivedMsgAsReplied (long MsgCod)
|
||||||
/************ Delete a message from the received message table ***************/
|
/************ Delete a message from the received message table ***************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Msg_MoveReceivedMsgToDeleted (long MsgCod,long UsrCod)
|
static void Msg_MoveRcvMsgToDeleted (long MsgCod,long UsrCod)
|
||||||
{
|
{
|
||||||
/***** Move message from msg_rcv to msg_rcv_deleted *****/
|
/***** Move message from msg_rcv to msg_rcv_deleted *****/
|
||||||
/* Insert message into msg_rcv_deleted */
|
/* Insert message into msg_rcv_deleted */
|
||||||
|
@ -1610,8 +1471,8 @@ static void Msg_MoveReceivedMsgToDeleted (long MsgCod,long UsrCod)
|
||||||
UsrCod);
|
UsrCod);
|
||||||
|
|
||||||
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
|
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
|
||||||
if (Msg_DB_CheckIfSentMsgIsDeleted (MsgCod))
|
if (Msg_DB_CheckIfSntMsgIsDeleted (MsgCod))
|
||||||
if (Msg_DB_CheckIfReceivedMsgIsDeletedForAllItsRecipients (MsgCod))
|
if (Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (MsgCod))
|
||||||
Msg_MoveMsgContentToDeleted (MsgCod);
|
Msg_MoveMsgContentToDeleted (MsgCod);
|
||||||
|
|
||||||
/***** Mark possible notifications as removed *****/
|
/***** Mark possible notifications as removed *****/
|
||||||
|
@ -1622,7 +1483,7 @@ static void Msg_MoveReceivedMsgToDeleted (long MsgCod,long UsrCod)
|
||||||
/************** Delete a message from the sent message table *****************/
|
/************** Delete a message from the sent message table *****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Msg_MoveSentMsgToDeleted (long MsgCod)
|
static void Msg_MoveSntMsgToDeleted (long MsgCod)
|
||||||
{
|
{
|
||||||
/***** Move message from msg_snt to msg_snt_deleted *****/
|
/***** Move message from msg_snt to msg_snt_deleted *****/
|
||||||
/* Insert message into msg_snt_deleted */
|
/* Insert message into msg_snt_deleted */
|
||||||
|
@ -1644,7 +1505,7 @@ static void Msg_MoveSentMsgToDeleted (long MsgCod)
|
||||||
MsgCod);
|
MsgCod);
|
||||||
|
|
||||||
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
|
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
|
||||||
if (Msg_DB_CheckIfReceivedMsgIsDeletedForAllItsRecipients (MsgCod))
|
if (Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (MsgCod))
|
||||||
Msg_MoveMsgContentToDeleted (MsgCod);
|
Msg_MoveMsgContentToDeleted (MsgCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1681,7 +1542,7 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
|
||||||
/***** Delete the subject and content of all completely deleted messages *****/
|
/***** Delete the subject and content of all completely deleted messages *****/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Msg_MoveUnusedMsgsContentToDeleted (void)
|
void Msg_DB_MoveUnusedMsgsContentToDeleted (void)
|
||||||
{
|
{
|
||||||
/***** Move messages from msg_content to msg_content_deleted *****/
|
/***** Move messages from msg_content to msg_content_deleted *****/
|
||||||
/* Insert message content into msg_content_deleted */
|
/* Insert message content into msg_content_deleted */
|
||||||
|
@ -1717,7 +1578,7 @@ void Msg_MoveUnusedMsgsContentToDeleted (void)
|
||||||
/******************** Check if a sent message is deleted *********************/
|
/******************** Check if a sent message is deleted *********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static bool Msg_DB_CheckIfSentMsgIsDeleted (long MsgCod)
|
static bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod)
|
||||||
{
|
{
|
||||||
/***** Get if the message code is in table of sent messages not deleted *****/
|
/***** Get if the message code is in table of sent messages not deleted *****/
|
||||||
return (DB_QueryCOUNT ("can not check if a sent message is deleted",
|
return (DB_QueryCOUNT ("can not check if a sent message is deleted",
|
||||||
|
@ -1733,7 +1594,7 @@ static bool Msg_DB_CheckIfSentMsgIsDeleted (long MsgCod)
|
||||||
/***** Check if a received message has been deleted by all its recipients ****/
|
/***** Check if a received message has been deleted by all its recipients ****/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static bool Msg_DB_CheckIfReceivedMsgIsDeletedForAllItsRecipients (long MsgCod)
|
static bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod)
|
||||||
{
|
{
|
||||||
/***** Get if the message code is in table of received messages not deleted *****/
|
/***** Get if the message code is in table of received messages not deleted *****/
|
||||||
return (DB_QueryCOUNT ("can not check if a received message"
|
return (DB_QueryCOUNT ("can not check if a received message"
|
||||||
|
@ -1848,7 +1709,7 @@ void Msg_ShowSntMsgs (void)
|
||||||
|
|
||||||
/***** Show the sent messages *****/
|
/***** Show the sent messages *****/
|
||||||
Messages.TypeOfMessages = Msg_SENT;
|
Messages.TypeOfMessages = Msg_SENT;
|
||||||
Msg_ShowSentOrReceivedMessages (&Messages);
|
Msg_ShowSntOrRcvMessages (&Messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1872,14 +1733,14 @@ void Msg_ShowRecMsgs (void)
|
||||||
|
|
||||||
/***** Show the received messages *****/
|
/***** Show the received messages *****/
|
||||||
Messages.TypeOfMessages = Msg_RECEIVED;
|
Messages.TypeOfMessages = Msg_RECEIVED;
|
||||||
Msg_ShowSentOrReceivedMessages (&Messages);
|
Msg_ShowSntOrRcvMessages (&Messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************************ Show sent or received messages *********************/
|
/************************ Show sent or received messages *********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
static void Msg_ShowSntOrRcvMessages (struct Msg_Messages *Messages)
|
||||||
{
|
{
|
||||||
extern const char *Hlp_COMMUNICATION_Messages_received;
|
extern const char *Hlp_COMMUNICATION_Messages_received;
|
||||||
extern const char *Hlp_COMMUNICATION_Messages_received_filter;
|
extern const char *Hlp_COMMUNICATION_Messages_received_filter;
|
||||||
|
@ -1891,10 +1752,8 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1];
|
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1];
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
unsigned long NumRow;
|
unsigned NumMsg;
|
||||||
unsigned long NumRows;
|
|
||||||
char *NumMsgsStr;
|
char *NumMsgsStr;
|
||||||
unsigned long NumMsg;
|
|
||||||
unsigned NumUnreadMsgs;
|
unsigned NumUnreadMsgs;
|
||||||
struct Pagination Pagination;
|
struct Pagination Pagination;
|
||||||
long MsgCod;
|
long MsgCod;
|
||||||
|
@ -1930,7 +1789,7 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
Msg_GetParamMsgsCrsCod (Messages);
|
Msg_GetParamMsgsCrsCod (Messages);
|
||||||
Msg_GetParamFilterFromTo (Messages);
|
Msg_GetParamFilterFromTo (Messages);
|
||||||
Msg_GetParamFilterContent (Messages);
|
Msg_GetParamFilterContent (Messages);
|
||||||
Msg_MakeFilterFromToSubquery (Messages,FilterFromToSubquery);
|
Msg_DB_MakeFilterFromToSubquery (Messages,FilterFromToSubquery);
|
||||||
Msg_GetDistinctCoursesInMyMessages (Messages);
|
Msg_GetDistinctCoursesInMyMessages (Messages);
|
||||||
|
|
||||||
/***** Get number of unread messages *****/
|
/***** Get number of unread messages *****/
|
||||||
|
@ -1950,11 +1809,9 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Get messages from database *****/
|
/***** Get messages from database *****/
|
||||||
NumRows = Msg_GetSentOrReceivedMsgs (Messages,
|
Messages->NumMsgs = Msg_DB_GetSntOrRcvMsgs (&mysql_res,
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
Messages,Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
FilterFromToSubquery,
|
FilterFromToSubquery);
|
||||||
&mysql_res);
|
|
||||||
Messages->NumMsgs = (unsigned) NumRows;
|
|
||||||
|
|
||||||
/***** Begin box with messages *****/
|
/***** Begin box with messages *****/
|
||||||
Msg_SetNumMsgsStr (Messages,&NumMsgsStr,NumUnreadMsgs);
|
Msg_SetNumMsgsStr (Messages,&NumMsgsStr,NumUnreadMsgs);
|
||||||
|
@ -2000,9 +1857,9 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
// from a notification of received message, so show the page where the message is inside
|
// from a notification of received message, so show the page where the message is inside
|
||||||
{
|
{
|
||||||
/***** Get the page where the expanded message is inside *****/
|
/***** Get the page where the expanded message is inside *****/
|
||||||
for (NumRow = 0;
|
for (NumMsg = 0;
|
||||||
NumRow < NumRows;
|
NumMsg < Messages->NumMsgs;
|
||||||
NumRow++)
|
NumMsg++)
|
||||||
{
|
{
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
if (sscanf (row[0],"%ld",&MsgCod) != 1)
|
if (sscanf (row[0],"%ld",&MsgCod) != 1)
|
||||||
|
@ -2010,7 +1867,7 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
|
|
||||||
if (MsgCod == Messages->ExpandedMsgCod) // Expanded message found
|
if (MsgCod == Messages->ExpandedMsgCod) // Expanded message found
|
||||||
{
|
{
|
||||||
Messages->CurrentPage = (unsigned) (NumRow / Pag_ITEMS_PER_PAGE) + 1;
|
Messages->CurrentPage = NumMsg / Pag_ITEMS_PER_PAGE + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2034,16 +1891,17 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
HTM_TABLE_BeginWidePadding (2);
|
HTM_TABLE_BeginWidePadding (2);
|
||||||
|
|
||||||
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible - 1));
|
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible - 1));
|
||||||
for (NumRow = Pagination.FirstItemVisible;
|
for (NumMsg = Pagination.FirstItemVisible;
|
||||||
NumRow <= Pagination.LastItemVisible;
|
NumMsg <= Pagination.LastItemVisible;
|
||||||
NumRow++)
|
NumMsg++)
|
||||||
{
|
{
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
if (sscanf (row[0],"%ld",&MsgCod) != 1)
|
if (sscanf (row[0],"%ld",&MsgCod) != 1)
|
||||||
Err_WrongMessageExit ();
|
Err_WrongMessageExit ();
|
||||||
NumMsg = NumRows - NumRow + 1;
|
Msg_ShowASentOrReceivedMessage (Messages,
|
||||||
Msg_ShowASentOrReceivedMessage (Messages,NumMsg,MsgCod);
|
Messages->NumMsgs - NumMsg + 1,
|
||||||
|
MsgCod);
|
||||||
}
|
}
|
||||||
|
|
||||||
HTM_TABLE_End ();
|
HTM_TABLE_End ();
|
||||||
|
@ -2060,21 +1918,6 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********************* Get number of user I have banned **********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static unsigned Msg_DB_GetNumUsrsBannedByMe (void)
|
|
||||||
{
|
|
||||||
/***** Get number of users I have banned *****/
|
|
||||||
return (unsigned)
|
|
||||||
DB_QueryCOUNT ("can not get number of users you have banned",
|
|
||||||
"SELECT COUNT(*)"
|
|
||||||
" FROM msg_banned"
|
|
||||||
" WHERE ToUsrCod=%ld",
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************** Put a link (form) to view banned users *******************/
|
/****************** Put a link (form) to view banned users *******************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2089,220 +1932,12 @@ static void Msg_PutLinkToViewBannedUsers(void)
|
||||||
Txt_Banned_users);
|
Txt_Banned_users);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********* Generate a query to select messages received or sent **************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static unsigned Msg_GetSentOrReceivedMsgs (const struct Msg_Messages *Messages,
|
|
||||||
long UsrCod,
|
|
||||||
const char *FilterFromToSubquery,
|
|
||||||
MYSQL_RES **mysql_res)
|
|
||||||
{
|
|
||||||
char *SubQuery;
|
|
||||||
const char *StrUnreadMsg;
|
|
||||||
unsigned NumMsgs;
|
|
||||||
|
|
||||||
if (Messages->FilterCrsCod > 0) // If origin course selected
|
|
||||||
switch (Messages->TypeOfMessages)
|
|
||||||
{
|
|
||||||
case Msg_RECEIVED:
|
|
||||||
StrUnreadMsg = (Messages->ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" :
|
|
||||||
"");
|
|
||||||
if (FilterFromToSubquery[0])
|
|
||||||
{
|
|
||||||
if (asprintf (&SubQuery,"(SELECT msg_rcv.MsgCod"
|
|
||||||
" FROM msg_rcv,"
|
|
||||||
"msg_snt,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_rcv.UsrCod=%ld%s"
|
|
||||||
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
|
|
||||||
" AND msg_snt.CrsCod=%ld"
|
|
||||||
" AND msg_snt.UsrCod=usr_data.UsrCod%s)"
|
|
||||||
" UNION "
|
|
||||||
"(SELECT msg_rcv.MsgCod"
|
|
||||||
" FROM msg_rcv,"
|
|
||||||
"msg_snt_deleted,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_rcv.UsrCod=%ld%s"
|
|
||||||
" AND msg_rcv.MsgCod=msg_snt_deleted.MsgCod"
|
|
||||||
" AND msg_snt_deleted.CrsCod=%ld"
|
|
||||||
" AND msg_snt_deleted.UsrCod=usr_data.UsrCod%s)",
|
|
||||||
UsrCod,StrUnreadMsg,Messages->FilterCrsCod,FilterFromToSubquery,
|
|
||||||
UsrCod,StrUnreadMsg,Messages->FilterCrsCod,FilterFromToSubquery) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (asprintf (&SubQuery,"(SELECT msg_rcv.MsgCod"
|
|
||||||
" FROM msg_rcv,"
|
|
||||||
"msg_snt"
|
|
||||||
" WHERE msg_rcv.UsrCod=%ld"
|
|
||||||
"%s"
|
|
||||||
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
|
|
||||||
" AND msg_snt.CrsCod=%ld)"
|
|
||||||
" UNION "
|
|
||||||
"(SELECT msg_rcv.MsgCod"
|
|
||||||
" FROM msg_rcv,"
|
|
||||||
"msg_snt_deleted"
|
|
||||||
" WHERE msg_rcv.UsrCod=%ld"
|
|
||||||
"%s"
|
|
||||||
" AND msg_rcv.MsgCod=msg_snt_deleted.MsgCod"
|
|
||||||
" AND msg_snt_deleted.CrsCod=%ld)",
|
|
||||||
UsrCod,StrUnreadMsg,Messages->FilterCrsCod,
|
|
||||||
UsrCod,StrUnreadMsg,Messages->FilterCrsCod) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Msg_SENT:
|
|
||||||
if (FilterFromToSubquery[0])
|
|
||||||
{
|
|
||||||
if (asprintf (&SubQuery,"(SELECT DISTINCT msg_snt.MsgCod"
|
|
||||||
" FROM msg_snt,"
|
|
||||||
"msg_rcv,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_snt.UsrCod=%ld"
|
|
||||||
" AND msg_snt.CrsCod=%ld"
|
|
||||||
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
|
|
||||||
" AND msg_rcv.UsrCod=usr_data.UsrCod"
|
|
||||||
"%s)"
|
|
||||||
" UNION "
|
|
||||||
"(SELECT DISTINCT msg_snt.MsgCod"
|
|
||||||
" FROM msg_snt,"
|
|
||||||
"msg_rcv_deleted,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_snt.UsrCod=%ld"
|
|
||||||
" AND msg_snt.CrsCod=%ld"
|
|
||||||
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
|
|
||||||
" AND msg_rcv_deleted.UsrCod=usr_data.UsrCod"
|
|
||||||
"%s)",
|
|
||||||
UsrCod,Messages->FilterCrsCod,FilterFromToSubquery,
|
|
||||||
UsrCod,Messages->FilterCrsCod,FilterFromToSubquery) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (asprintf (&SubQuery,"SELECT MsgCod"
|
|
||||||
" FROM msg_snt"
|
|
||||||
" WHERE UsrCod=%ld"
|
|
||||||
" AND CrsCod=%ld",
|
|
||||||
UsrCod,Messages->FilterCrsCod) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: // Not aplicable here
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else // If no origin course selected
|
|
||||||
switch (Messages->TypeOfMessages)
|
|
||||||
{
|
|
||||||
case Msg_RECEIVED:
|
|
||||||
if (FilterFromToSubquery[0])
|
|
||||||
{
|
|
||||||
StrUnreadMsg = (Messages->ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" :
|
|
||||||
"");
|
|
||||||
if (asprintf (&SubQuery,"(SELECT msg_rcv.MsgCod"
|
|
||||||
" FROM msg_rcv,"
|
|
||||||
"msg_snt,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_rcv.UsrCod=%ld"
|
|
||||||
"%s"
|
|
||||||
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
|
|
||||||
" AND msg_snt.UsrCod=usr_data.UsrCod"
|
|
||||||
"%s)"
|
|
||||||
" UNION "
|
|
||||||
"(SELECT msg_rcv.MsgCod"
|
|
||||||
" FROM msg_rcv,"
|
|
||||||
"msg_snt_deleted,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_rcv.UsrCod=%ld"
|
|
||||||
"%s"
|
|
||||||
" AND msg_rcv.MsgCod=msg_snt_deleted.MsgCod"
|
|
||||||
" AND msg_snt_deleted.UsrCod=usr_data.UsrCod"
|
|
||||||
"%s)",
|
|
||||||
UsrCod,StrUnreadMsg,FilterFromToSubquery,
|
|
||||||
UsrCod,StrUnreadMsg,FilterFromToSubquery) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StrUnreadMsg = (Messages->ShowOnlyUnreadMsgs ? " AND Open='N'" :
|
|
||||||
"");
|
|
||||||
if (asprintf (&SubQuery,"SELECT MsgCod"
|
|
||||||
" FROM msg_rcv"
|
|
||||||
" WHERE UsrCod=%ld"
|
|
||||||
"%s",
|
|
||||||
UsrCod,StrUnreadMsg) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Msg_SENT:
|
|
||||||
if (FilterFromToSubquery[0])
|
|
||||||
{
|
|
||||||
if (asprintf (&SubQuery,"(SELECT msg_snt.MsgCod"
|
|
||||||
" FROM msg_snt,"
|
|
||||||
"msg_rcv,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_snt.UsrCod=%ld"
|
|
||||||
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
|
|
||||||
" AND msg_rcv.UsrCod=usr_data.UsrCod%s)"
|
|
||||||
" UNION "
|
|
||||||
"(SELECT msg_snt.MsgCod"
|
|
||||||
" FROM msg_snt,"
|
|
||||||
"msg_rcv_deleted,"
|
|
||||||
"usr_data"
|
|
||||||
" WHERE msg_snt.UsrCod=%ld"
|
|
||||||
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
|
|
||||||
" AND msg_rcv_deleted.UsrCod=usr_data.UsrCod%s)",
|
|
||||||
UsrCod,FilterFromToSubquery,
|
|
||||||
UsrCod,FilterFromToSubquery) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (asprintf (&SubQuery,"SELECT MsgCod"
|
|
||||||
" FROM msg_snt"
|
|
||||||
" WHERE UsrCod=%ld",
|
|
||||||
UsrCod) < 0)
|
|
||||||
Err_NotEnoughMemoryExit ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: // Not aplicable here
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Messages->FilterContent[0])
|
|
||||||
/* Match against the content written in filter form */
|
|
||||||
NumMsgs = (unsigned)
|
|
||||||
DB_QuerySELECT (mysql_res,"can not get messages",
|
|
||||||
"SELECT MsgCod"
|
|
||||||
" FROM msg_content"
|
|
||||||
" WHERE MsgCod IN"
|
|
||||||
" (SELECT MsgCod"
|
|
||||||
" FROM (%s) AS M)"
|
|
||||||
" AND MATCH (Subject,Content) AGAINST ('%s')"
|
|
||||||
" ORDER BY MsgCod DESC", // End the query ordering the result from most recent message to oldest
|
|
||||||
SubQuery,
|
|
||||||
Messages->FilterContent);
|
|
||||||
else
|
|
||||||
NumMsgs = (unsigned)
|
|
||||||
DB_QuerySELECT (mysql_res,"can not get messages",
|
|
||||||
"%s"
|
|
||||||
" ORDER BY MsgCod DESC", // End the query ordering the result from most recent message to oldest
|
|
||||||
SubQuery);
|
|
||||||
|
|
||||||
/***** Free memory used for subquery *****/
|
|
||||||
free (SubQuery);
|
|
||||||
|
|
||||||
return NumMsgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**** Get the number of unique messages sent by any teacher from a course ****/
|
/**** Get the number of unique messages sent by any teacher from a course ****/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
|
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
|
||||||
{
|
{
|
||||||
/***** Get the number of unique messages sent by any teacher from this course *****/
|
|
||||||
return (unsigned)
|
return (unsigned)
|
||||||
DB_QueryCOUNT ("can not get the number of messages sent by teachers",
|
DB_QueryCOUNT ("can not get the number of messages sent by teachers",
|
||||||
"SELECT COUNT(*)"
|
"SELECT COUNT(*)"
|
||||||
|
@ -2310,11 +1945,12 @@ unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
|
||||||
"crs_users"
|
"crs_users"
|
||||||
" WHERE msg_snt.CrsCod=%ld"
|
" WHERE msg_snt.CrsCod=%ld"
|
||||||
" AND crs_users.CrsCod=%ld"
|
" AND crs_users.CrsCod=%ld"
|
||||||
" AND crs_users.Role=%u"
|
" AND crs_users.Role IN (%u,%u)"
|
||||||
" AND msg_snt.UsrCod=crs_users.UsrCod",
|
" AND msg_snt.UsrCod=crs_users.UsrCod",
|
||||||
CrsCod,
|
CrsCod,
|
||||||
CrsCod,
|
CrsCod,
|
||||||
(unsigned) Rol_TCH);
|
(unsigned) Rol_NET, // Non-editing teacher
|
||||||
|
(unsigned) Rol_TCH); // Teacher
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2323,7 +1959,6 @@ unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
|
||||||
|
|
||||||
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod)
|
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod)
|
||||||
{
|
{
|
||||||
/***** Get the number of unique messages sent by any teacher from this course *****/
|
|
||||||
return (unsigned)
|
return (unsigned)
|
||||||
DB_QueryCOUNT ("can not get the number of messages sent by a user",
|
DB_QueryCOUNT ("can not get the number of messages sent by a user",
|
||||||
"SELECT"
|
"SELECT"
|
||||||
|
@ -2343,7 +1978,7 @@ unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod)
|
||||||
/******** (all the platform, current degree or current course) **********/
|
/******** (all the platform, current degree or current course) **********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
unsigned Msg_GetNumMsgsSent (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
|
unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
|
||||||
{
|
{
|
||||||
const char *Table = "msg_snt";
|
const char *Table = "msg_snt";
|
||||||
|
|
||||||
|
@ -2437,7 +2072,7 @@ unsigned Msg_GetNumMsgsSent (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
|
||||||
/****** (all the platform, current degree or current course) ********/
|
/****** (all the platform, current degree or current course) ********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
unsigned Msg_GetNumMsgsReceived (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
|
unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
|
||||||
{
|
{
|
||||||
char *Table;
|
char *Table;
|
||||||
|
|
||||||
|
@ -3122,21 +2757,6 @@ static void Msg_GetMsgSntData (long MsgCod,long *CrsCod,long *UsrCod,
|
||||||
Msg_DB_GetMsgSubject (MsgCod,Subject);
|
Msg_DB_GetMsgSubject (MsgCod,Subject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************************ Get the subject of a message ***********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_DB_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1])
|
|
||||||
{
|
|
||||||
/***** Get subject of message from database *****/
|
|
||||||
DB_QuerySELECTString (Subject,Cns_MAX_BYTES_SUBJECT,
|
|
||||||
"can not get the subject of a message",
|
|
||||||
"SELECT Subject" // row[0]
|
|
||||||
" FROM msg_content"
|
|
||||||
" WHERE MsgCod=%ld",
|
|
||||||
MsgCod);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*************** Get content and optional image of a message *****************/
|
/*************** Get content and optional image of a message *****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -3170,64 +2790,6 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********************** Get if a sent message is expanded ********************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static bool Msg_DB_GetStatusOfSentMsg (long MsgCod)
|
|
||||||
{
|
|
||||||
char StrExpanded[1 + 1];
|
|
||||||
|
|
||||||
/***** Get if sent message has been expanded from database *****/
|
|
||||||
DB_QuerySELECTString (StrExpanded,1,
|
|
||||||
"can not get if a sent message has been expanded",
|
|
||||||
"SELECT Expanded" // row[0]
|
|
||||||
" FROM msg_snt"
|
|
||||||
" WHERE MsgCod=%ld"
|
|
||||||
" AND UsrCod=%ld",
|
|
||||||
MsgCod,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
||||||
|
|
||||||
/***** Get if message is expanded *****/
|
|
||||||
return (StrExpanded[0] == 'Y');
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********* Get if a received message has been open/replied/expanded **********/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Msg_GetStatusOfReceivedMsg (long MsgCod,bool *Open,bool *Replied,bool *Expanded)
|
|
||||||
{
|
|
||||||
MYSQL_RES *mysql_res;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
|
|
||||||
/***** Get if received message has been open/replied/expanded from database *****/
|
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get if a received message"
|
|
||||||
" has been replied/expanded",
|
|
||||||
"SELECT Open," // row[0]
|
|
||||||
"Replied," // row[1]
|
|
||||||
"Expanded" // row[2]
|
|
||||||
" FROM msg_rcv"
|
|
||||||
" WHERE MsgCod=%ld"
|
|
||||||
" AND UsrCod=%ld",
|
|
||||||
MsgCod,
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod) != 1)
|
|
||||||
Err_ShowErrorAndExit ("Error when getting if a received message has been replied/expanded.");
|
|
||||||
|
|
||||||
/***** Get number of rows *****/
|
|
||||||
row = mysql_fetch_row (mysql_res);
|
|
||||||
|
|
||||||
/***** Get if message has been read by me (row[0]),
|
|
||||||
if message has been replied (row[1]), and
|
|
||||||
if message is expanded (row[2]) *****/
|
|
||||||
*Open = (row[0][0] == 'Y');
|
|
||||||
*Replied = (row[1][0] == 'Y');
|
|
||||||
*Expanded = (row[2][0] == 'Y');
|
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******** Show a sent or a received message (from a user to another) *********/
|
/******** Show a sent or a received message (from a user to another) *********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -3269,10 +2831,10 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
||||||
switch (Messages->TypeOfMessages)
|
switch (Messages->TypeOfMessages)
|
||||||
{
|
{
|
||||||
case Msg_RECEIVED:
|
case Msg_RECEIVED:
|
||||||
Msg_GetStatusOfReceivedMsg (MsgCod,&Open,&Replied,&Expanded);
|
Msg_DB_GetStatusOfRcvMsg (MsgCod,&Open,&Replied,&Expanded);
|
||||||
break;
|
break;
|
||||||
case Msg_SENT:
|
case Msg_SENT:
|
||||||
Expanded = Msg_DB_GetStatusOfSentMsg (MsgCod);
|
Expanded = Msg_DB_GetStatusOfSntMsg (MsgCod);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -104,15 +104,15 @@ void Msg_ConRecMsg (void);
|
||||||
void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod);
|
void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod);
|
||||||
|
|
||||||
void Msg_DelAllRecAndSntMsgsUsr (long UsrCod);
|
void Msg_DelAllRecAndSntMsgsUsr (long UsrCod);
|
||||||
void Msg_MoveUnusedMsgsContentToDeleted (void);
|
void Msg_DB_MoveUnusedMsgsContentToDeleted (void);
|
||||||
|
|
||||||
void Msg_ShowSntMsgs (void);
|
void Msg_ShowSntMsgs (void);
|
||||||
void Msg_ShowRecMsgs (void);
|
void Msg_ShowRecMsgs (void);
|
||||||
|
|
||||||
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod);
|
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod);
|
||||||
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod);
|
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod);
|
||||||
unsigned Msg_GetNumMsgsSent (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
|
unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
|
||||||
unsigned Msg_GetNumMsgsReceived (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
|
unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
|
||||||
|
|
||||||
void Msg_PutHiddenParamsMsgsFilters (void *Messages);
|
void Msg_PutHiddenParamsMsgsFilters (void *Messages);
|
||||||
void Msg_GetNotifMessage (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
|
void Msg_GetNotifMessage (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
|
||||||
|
|
|
@ -0,0 +1,501 @@
|
||||||
|
// swad_message_database.c: messages between users, operations with database
|
||||||
|
|
||||||
|
/*
|
||||||
|
SWAD (Shared Workspace At a Distance),
|
||||||
|
is a web platform developed at the University of Granada (Spain),
|
||||||
|
and used to support university teaching.
|
||||||
|
|
||||||
|
This file is part of SWAD core.
|
||||||
|
Copyright (C) 1999-2021 Antonio Cañas Vargas
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************************* Headers ***********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE // For asprintf
|
||||||
|
// #include <linux/limits.h> // For PATH_MAX
|
||||||
|
// #include <stddef.h> // For NULL
|
||||||
|
#include <stdio.h> // For asprintf
|
||||||
|
// #include <stdlib.h> // For free
|
||||||
|
#include <string.h> // For string functions
|
||||||
|
// #include <time.h> // For time
|
||||||
|
|
||||||
|
// #include "swad_action.h"
|
||||||
|
// #include "swad_box.h"
|
||||||
|
// #include "swad_config.h"
|
||||||
|
// #include "swad_course.h"
|
||||||
|
#include "swad_database.h"
|
||||||
|
#include "swad_error.h"
|
||||||
|
// #include "swad_figure.h"
|
||||||
|
// #include "swad_form.h"
|
||||||
|
// #include "swad_forum.h"
|
||||||
|
#include "swad_global.h"
|
||||||
|
// #include "swad_group.h"
|
||||||
|
// #include "swad_hierarchy.h"
|
||||||
|
// #include "swad_hierarchy_level.h"
|
||||||
|
// #include "swad_HTML.h"
|
||||||
|
// #include "swad_ID.h"
|
||||||
|
#include "swad_message.h"
|
||||||
|
#include "swad_message_database.h"
|
||||||
|
// #include "swad_notification.h"
|
||||||
|
// #include "swad_pagination.h"
|
||||||
|
// #include "swad_parameter.h"
|
||||||
|
// #include "swad_photo.h"
|
||||||
|
// #include "swad_profile.h"
|
||||||
|
// #include "swad_user.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** External global variables from others modules ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
extern struct Globals Gbl;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Private constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************************** Private types ******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Private prototypes ****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**************************** Expand a sent message **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_ExpandSntMsg (long MsgCod)
|
||||||
|
{
|
||||||
|
/***** Expand message in sent message table *****/
|
||||||
|
DB_QueryUPDATE ("can not expand a sent message",
|
||||||
|
"UPDATE msg_snt"
|
||||||
|
" SET Expanded='Y'"
|
||||||
|
" WHERE MsgCod=%ld"
|
||||||
|
" AND UsrCod=%ld",
|
||||||
|
MsgCod,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
|
||||||
|
/***** Contract all my other messages in sent message table *****/
|
||||||
|
DB_QueryUPDATE ("can not contract a sent message",
|
||||||
|
"UPDATE msg_snt"
|
||||||
|
" SET Expanded='N'"
|
||||||
|
" WHERE UsrCod=%ld"
|
||||||
|
" AND MsgCod<>%ld",
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
MsgCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Expand a received message *************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_ExpandRcvMsg (long MsgCod)
|
||||||
|
{
|
||||||
|
/***** Expand message in received message table and mark it as read by me *****/
|
||||||
|
DB_QueryUPDATE ("can not expand a received message",
|
||||||
|
"UPDATE msg_rcv"
|
||||||
|
" SET Open='Y',"
|
||||||
|
"Expanded='Y'"
|
||||||
|
" WHERE MsgCod=%ld"
|
||||||
|
" AND UsrCod=%ld",
|
||||||
|
MsgCod,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
|
||||||
|
/***** Contract all my other messages in received message table *****/
|
||||||
|
DB_QueryUPDATE ("can not contract a received message",
|
||||||
|
"UPDATE msg_rcv"
|
||||||
|
" SET Expanded='N'"
|
||||||
|
" WHERE UsrCod=%ld"
|
||||||
|
" AND MsgCod<>%ld",
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
MsgCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************** Contract a sent message **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_ContractSntMsg (long MsgCod)
|
||||||
|
{
|
||||||
|
/***** Contract message in sent message table *****/
|
||||||
|
DB_QueryUPDATE ("can not contract a sent message",
|
||||||
|
"UPDATE msg_snt"
|
||||||
|
" SET Expanded='N'"
|
||||||
|
" WHERE MsgCod=%ld"
|
||||||
|
" AND UsrCod=%ld",
|
||||||
|
MsgCod,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Contract a received message ************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_ContractRcvMsg (long MsgCod)
|
||||||
|
{
|
||||||
|
/***** Contract message in received message table *****/
|
||||||
|
DB_QueryUPDATE ("can not contract a received message",
|
||||||
|
"UPDATE msg_rcv"
|
||||||
|
" SET Expanded='N'"
|
||||||
|
" WHERE MsgCod=%ld"
|
||||||
|
" AND UsrCod=%ld",
|
||||||
|
MsgCod,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Make "from"/"to" subquery *************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_MakeFilterFromToSubquery (const struct Msg_Messages *Messages,
|
||||||
|
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1])
|
||||||
|
{
|
||||||
|
const char *Ptr;
|
||||||
|
char SearchWord[Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 1];
|
||||||
|
|
||||||
|
/***** Split "from"/"to" string into words *****/
|
||||||
|
if (Messages->FilterFromTo[0])
|
||||||
|
{
|
||||||
|
Ptr = Messages->FilterFromTo;
|
||||||
|
Str_Copy (FilterFromToSubquery,
|
||||||
|
" AND CONCAT(usr_data.FirstName,' ',usr_data.Surname1,' ',usr_data.Surname2) LIKE '",
|
||||||
|
Msg_MAX_BYTES_MESSAGES_QUERY);
|
||||||
|
while (*Ptr)
|
||||||
|
{
|
||||||
|
Str_GetNextStringUntilSpace (&Ptr,SearchWord,Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME);
|
||||||
|
if (strlen (FilterFromToSubquery) + strlen (SearchWord) + 512 >
|
||||||
|
Msg_MAX_BYTES_MESSAGES_QUERY) // Prevent string overflow
|
||||||
|
break;
|
||||||
|
Str_Concat (FilterFromToSubquery,"%",Msg_MAX_BYTES_MESSAGES_QUERY);
|
||||||
|
Str_Concat (FilterFromToSubquery,SearchWord,Msg_MAX_BYTES_MESSAGES_QUERY);
|
||||||
|
}
|
||||||
|
Str_Concat (FilterFromToSubquery,"%'",Msg_MAX_BYTES_MESSAGES_QUERY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
FilterFromToSubquery[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********* Generate a query to select messages received or sent **************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Msg_DB_GetSntOrRcvMsgs (MYSQL_RES **mysql_res,
|
||||||
|
const struct Msg_Messages *Messages,
|
||||||
|
long UsrCod,
|
||||||
|
const char *FilterFromToSubquery)
|
||||||
|
{
|
||||||
|
char *SubQuery;
|
||||||
|
const char *StrUnreadMsg;
|
||||||
|
unsigned NumMsgs;
|
||||||
|
|
||||||
|
if (Messages->FilterCrsCod > 0) // If origin course selected
|
||||||
|
switch (Messages->TypeOfMessages)
|
||||||
|
{
|
||||||
|
case Msg_RECEIVED:
|
||||||
|
StrUnreadMsg = (Messages->ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" :
|
||||||
|
"");
|
||||||
|
if (FilterFromToSubquery[0])
|
||||||
|
{
|
||||||
|
if (asprintf (&SubQuery,"(SELECT msg_rcv.MsgCod"
|
||||||
|
" FROM msg_rcv,"
|
||||||
|
"msg_snt,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_rcv.UsrCod=%ld%s"
|
||||||
|
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
|
||||||
|
" AND msg_snt.CrsCod=%ld"
|
||||||
|
" AND msg_snt.UsrCod=usr_data.UsrCod%s)"
|
||||||
|
" UNION "
|
||||||
|
"(SELECT msg_rcv.MsgCod"
|
||||||
|
" FROM msg_rcv,"
|
||||||
|
"msg_snt_deleted,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_rcv.UsrCod=%ld%s"
|
||||||
|
" AND msg_rcv.MsgCod=msg_snt_deleted.MsgCod"
|
||||||
|
" AND msg_snt_deleted.CrsCod=%ld"
|
||||||
|
" AND msg_snt_deleted.UsrCod=usr_data.UsrCod%s)",
|
||||||
|
UsrCod,StrUnreadMsg,Messages->FilterCrsCod,FilterFromToSubquery,
|
||||||
|
UsrCod,StrUnreadMsg,Messages->FilterCrsCod,FilterFromToSubquery) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (asprintf (&SubQuery,"(SELECT msg_rcv.MsgCod"
|
||||||
|
" FROM msg_rcv,"
|
||||||
|
"msg_snt"
|
||||||
|
" WHERE msg_rcv.UsrCod=%ld"
|
||||||
|
"%s"
|
||||||
|
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
|
||||||
|
" AND msg_snt.CrsCod=%ld)"
|
||||||
|
" UNION "
|
||||||
|
"(SELECT msg_rcv.MsgCod"
|
||||||
|
" FROM msg_rcv,"
|
||||||
|
"msg_snt_deleted"
|
||||||
|
" WHERE msg_rcv.UsrCod=%ld"
|
||||||
|
"%s"
|
||||||
|
" AND msg_rcv.MsgCod=msg_snt_deleted.MsgCod"
|
||||||
|
" AND msg_snt_deleted.CrsCod=%ld)",
|
||||||
|
UsrCod,StrUnreadMsg,Messages->FilterCrsCod,
|
||||||
|
UsrCod,StrUnreadMsg,Messages->FilterCrsCod) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Msg_SENT:
|
||||||
|
if (FilterFromToSubquery[0])
|
||||||
|
{
|
||||||
|
if (asprintf (&SubQuery,"(SELECT DISTINCT msg_snt.MsgCod"
|
||||||
|
" FROM msg_snt,"
|
||||||
|
"msg_rcv,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_snt.UsrCod=%ld"
|
||||||
|
" AND msg_snt.CrsCod=%ld"
|
||||||
|
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
|
||||||
|
" AND msg_rcv.UsrCod=usr_data.UsrCod"
|
||||||
|
"%s)"
|
||||||
|
" UNION "
|
||||||
|
"(SELECT DISTINCT msg_snt.MsgCod"
|
||||||
|
" FROM msg_snt,"
|
||||||
|
"msg_rcv_deleted,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_snt.UsrCod=%ld"
|
||||||
|
" AND msg_snt.CrsCod=%ld"
|
||||||
|
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
|
||||||
|
" AND msg_rcv_deleted.UsrCod=usr_data.UsrCod"
|
||||||
|
"%s)",
|
||||||
|
UsrCod,Messages->FilterCrsCod,FilterFromToSubquery,
|
||||||
|
UsrCod,Messages->FilterCrsCod,FilterFromToSubquery) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (asprintf (&SubQuery,"SELECT MsgCod"
|
||||||
|
" FROM msg_snt"
|
||||||
|
" WHERE UsrCod=%ld"
|
||||||
|
" AND CrsCod=%ld",
|
||||||
|
UsrCod,Messages->FilterCrsCod) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: // Not aplicable here
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else // If no origin course selected
|
||||||
|
switch (Messages->TypeOfMessages)
|
||||||
|
{
|
||||||
|
case Msg_RECEIVED:
|
||||||
|
if (FilterFromToSubquery[0])
|
||||||
|
{
|
||||||
|
StrUnreadMsg = (Messages->ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" :
|
||||||
|
"");
|
||||||
|
if (asprintf (&SubQuery,"(SELECT msg_rcv.MsgCod"
|
||||||
|
" FROM msg_rcv,"
|
||||||
|
"msg_snt,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_rcv.UsrCod=%ld"
|
||||||
|
"%s"
|
||||||
|
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
|
||||||
|
" AND msg_snt.UsrCod=usr_data.UsrCod"
|
||||||
|
"%s)"
|
||||||
|
" UNION "
|
||||||
|
"(SELECT msg_rcv.MsgCod"
|
||||||
|
" FROM msg_rcv,"
|
||||||
|
"msg_snt_deleted,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_rcv.UsrCod=%ld"
|
||||||
|
"%s"
|
||||||
|
" AND msg_rcv.MsgCod=msg_snt_deleted.MsgCod"
|
||||||
|
" AND msg_snt_deleted.UsrCod=usr_data.UsrCod"
|
||||||
|
"%s)",
|
||||||
|
UsrCod,StrUnreadMsg,FilterFromToSubquery,
|
||||||
|
UsrCod,StrUnreadMsg,FilterFromToSubquery) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StrUnreadMsg = (Messages->ShowOnlyUnreadMsgs ? " AND Open='N'" :
|
||||||
|
"");
|
||||||
|
if (asprintf (&SubQuery,"SELECT MsgCod"
|
||||||
|
" FROM msg_rcv"
|
||||||
|
" WHERE UsrCod=%ld"
|
||||||
|
"%s",
|
||||||
|
UsrCod,StrUnreadMsg) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Msg_SENT:
|
||||||
|
if (FilterFromToSubquery[0])
|
||||||
|
{
|
||||||
|
if (asprintf (&SubQuery,"(SELECT msg_snt.MsgCod"
|
||||||
|
" FROM msg_snt,"
|
||||||
|
"msg_rcv,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_snt.UsrCod=%ld"
|
||||||
|
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
|
||||||
|
" AND msg_rcv.UsrCod=usr_data.UsrCod%s)"
|
||||||
|
" UNION "
|
||||||
|
"(SELECT msg_snt.MsgCod"
|
||||||
|
" FROM msg_snt,"
|
||||||
|
"msg_rcv_deleted,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE msg_snt.UsrCod=%ld"
|
||||||
|
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
|
||||||
|
" AND msg_rcv_deleted.UsrCod=usr_data.UsrCod%s)",
|
||||||
|
UsrCod,FilterFromToSubquery,
|
||||||
|
UsrCod,FilterFromToSubquery) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (asprintf (&SubQuery,"SELECT MsgCod"
|
||||||
|
" FROM msg_snt"
|
||||||
|
" WHERE UsrCod=%ld",
|
||||||
|
UsrCod) < 0)
|
||||||
|
Err_NotEnoughMemoryExit ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: // Not aplicable here
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Messages->FilterContent[0])
|
||||||
|
/* Match against the content written in filter form */
|
||||||
|
NumMsgs = (unsigned)
|
||||||
|
DB_QuerySELECT (mysql_res,"can not get messages",
|
||||||
|
"SELECT MsgCod"
|
||||||
|
" FROM msg_content"
|
||||||
|
" WHERE MsgCod IN"
|
||||||
|
" (SELECT MsgCod"
|
||||||
|
" FROM (%s) AS M)"
|
||||||
|
" AND MATCH (Subject,Content) AGAINST ('%s')"
|
||||||
|
" ORDER BY MsgCod DESC", // End the query ordering the result from most recent message to oldest
|
||||||
|
SubQuery,
|
||||||
|
Messages->FilterContent);
|
||||||
|
else
|
||||||
|
NumMsgs = (unsigned)
|
||||||
|
DB_QuerySELECT (mysql_res,"can not get messages",
|
||||||
|
"%s"
|
||||||
|
" ORDER BY MsgCod DESC", // End the query ordering the result from most recent message to oldest
|
||||||
|
SubQuery);
|
||||||
|
|
||||||
|
/***** Free memory used for subquery *****/
|
||||||
|
free (SubQuery);
|
||||||
|
|
||||||
|
return NumMsgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************** Get subject and content of a message *********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Msg_DB_GetSubjectAndContent (MYSQL_RES **mysql_res,long MsgCod)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QuerySELECT (mysql_res,"can not get message content",
|
||||||
|
"SELECT Subject," // row[0]
|
||||||
|
"Content" // row[1]
|
||||||
|
" FROM msg_content"
|
||||||
|
" WHERE MsgCod=%ld",
|
||||||
|
MsgCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Get the subject of a message ***********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1])
|
||||||
|
{
|
||||||
|
/***** Get subject of message from database *****/
|
||||||
|
DB_QuerySELECTString (Subject,Cns_MAX_BYTES_SUBJECT,
|
||||||
|
"can not get the subject of a message",
|
||||||
|
"SELECT Subject" // row[0]
|
||||||
|
" FROM msg_content"
|
||||||
|
" WHERE MsgCod=%ld",
|
||||||
|
MsgCod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************** Get if a sent message is expanded ********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
bool Msg_DB_GetStatusOfSntMsg (long MsgCod)
|
||||||
|
{
|
||||||
|
char StrExpanded[1 + 1];
|
||||||
|
|
||||||
|
/***** Get if sent message has been expanded from database *****/
|
||||||
|
DB_QuerySELECTString (StrExpanded,1,
|
||||||
|
"can not get if a sent message has been expanded",
|
||||||
|
"SELECT Expanded" // row[0]
|
||||||
|
" FROM msg_snt"
|
||||||
|
" WHERE MsgCod=%ld"
|
||||||
|
" AND UsrCod=%ld",
|
||||||
|
MsgCod,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
|
||||||
|
/***** Get if message is expanded *****/
|
||||||
|
return (StrExpanded[0] == 'Y');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********* Get if a received message has been open/replied/expanded **********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
|
||||||
|
bool *Open,bool *Replied,bool *Expanded)
|
||||||
|
{
|
||||||
|
MYSQL_RES *mysql_res;
|
||||||
|
MYSQL_ROW row;
|
||||||
|
|
||||||
|
/***** Get if received message has been open/replied/expanded from database *****/
|
||||||
|
if (DB_QuerySELECT (&mysql_res,"can not get if a received message"
|
||||||
|
" has been replied/expanded",
|
||||||
|
"SELECT Open," // row[0]
|
||||||
|
"Replied," // row[1]
|
||||||
|
"Expanded" // row[2]
|
||||||
|
" FROM msg_rcv"
|
||||||
|
" WHERE MsgCod=%ld"
|
||||||
|
" AND UsrCod=%ld",
|
||||||
|
MsgCod,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod) != 1)
|
||||||
|
Err_ShowErrorAndExit ("Error when getting if a received message has been replied/expanded.");
|
||||||
|
|
||||||
|
/***** Get number of rows *****/
|
||||||
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
||||||
|
/***** Get if message has been read by me (row[0]),
|
||||||
|
if message has been replied (row[1]), and
|
||||||
|
if message is expanded (row[2]) *****/
|
||||||
|
*Open = (row[0][0] == 'Y');
|
||||||
|
*Replied = (row[1][0] == 'Y');
|
||||||
|
*Expanded = (row[2][0] == 'Y');
|
||||||
|
|
||||||
|
/***** Free structure that stores the query result *****/
|
||||||
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************* Get number of user I have banned **********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
unsigned Msg_DB_GetNumUsrsBannedByMe (void)
|
||||||
|
{
|
||||||
|
return (unsigned)
|
||||||
|
DB_QueryCOUNT ("can not get number of users you have banned",
|
||||||
|
"SELECT COUNT(*)"
|
||||||
|
" FROM msg_banned"
|
||||||
|
" WHERE ToUsrCod=%ld",
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
// swad_message_database.h: messages between users, operations with database
|
||||||
|
|
||||||
|
#ifndef _SWAD_MSG_DB
|
||||||
|
#define _SWAD_MSG_DB
|
||||||
|
/*
|
||||||
|
SWAD (Shared Workspace At a Distance in Spanish),
|
||||||
|
is a web platform developed at the University of Granada (Spain),
|
||||||
|
and used to support university teaching.
|
||||||
|
|
||||||
|
This file is part of SWAD core.
|
||||||
|
Copyright (C) 1999-2021 Antonio Cañas Vargas
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************************** Headers **********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include <mysql/mysql.h> // To access MySQL databases
|
||||||
|
|
||||||
|
// #include "swad_course.h"
|
||||||
|
// #include "swad_notification.h"
|
||||||
|
// #include "swad_statistic.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define Msg_MAX_BYTES_MESSAGES_QUERY (4 * 1024 - 1)
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************************** Public types *******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public prototypes ****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Msg_DB_ExpandSntMsg (long MsgCod);
|
||||||
|
void Msg_DB_ExpandRcvMsg (long MsgCod);
|
||||||
|
void Msg_DB_ContractSntMsg (long MsgCod);
|
||||||
|
void Msg_DB_ContractRcvMsg (long MsgCod);
|
||||||
|
|
||||||
|
void Msg_DB_MakeFilterFromToSubquery (const struct Msg_Messages *Messages,
|
||||||
|
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1]);
|
||||||
|
unsigned Msg_DB_GetSntOrRcvMsgs (MYSQL_RES **mysql_res,
|
||||||
|
const struct Msg_Messages *Messages,
|
||||||
|
long UsrCod,
|
||||||
|
const char *FilterFromToSubquery);
|
||||||
|
unsigned Msg_DB_GetSubjectAndContent (MYSQL_RES **mysql_res,long MsgCod);
|
||||||
|
void Msg_DB_GetMsgSubject (long MsgCod,char Subject[Cns_MAX_BYTES_SUBJECT + 1]);
|
||||||
|
bool Msg_DB_GetStatusOfSntMsg (long MsgCod);
|
||||||
|
void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
|
||||||
|
bool *Open,bool *Replied,bool *Expanded);
|
||||||
|
unsigned Msg_DB_GetNumUsrsBannedByMe (void);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue