diff --git a/Makefile b/Makefile
index 9caa948e..7b962637 100644
--- a/Makefile
+++ b/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_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_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_notification_database.o swad_pagination.o swad_parameter.o \
swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_privacy.o \
diff --git a/swad_account.c b/swad_account.c
index 6afe7694..9625e4e2 100644
--- a/swad_account.c
+++ b/swad_account.c
@@ -848,7 +848,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
Acc_CompletelyEliminateAccount (&Gbl.Usrs.Other.UsrDat,Cns_VERBOSE);
/***** Move unused contents of messages to table of deleted contents of messages *****/
- Msg_MoveUnusedMsgsContentToDeleted ();
+ Msg_DB_MoveUnusedMsgsContentToDeleted ();
}
else
Acc_AskIfRemoveUsrAccount (ItsMe);
@@ -953,7 +953,7 @@ void Acc_RemoveMyAccount (void)
Acc_CompletelyEliminateAccount (&Gbl.Usrs.Me.UsrDat,Cns_VERBOSE);
/***** Move unused contents of messages to table of deleted contents of messages *****/
- Msg_MoveUnusedMsgsContentToDeleted ();
+ Msg_DB_MoveUnusedMsgsContentToDeleted ();
}
else
Acc_AskIfRemoveUsrAccount (true);
diff --git a/swad_changelog.h b/swad_changelog.h
index b3885f4f..f7f740ee 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
-#define Log_PLATFORM_VERSION "SWAD 21.16.6 (2021-09-27)"
+#define Log_PLATFORM_VERSION "SWAD 21.17 (2021-09-27)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
+ Version 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.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)
diff --git a/swad_enrolment.c b/swad_enrolment.c
index b5c67e86..6933a3d5 100644
--- a/swad_enrolment.c
+++ b/swad_enrolment.c
@@ -807,7 +807,7 @@ void Enr_RemoveOldUsrs (void)
DB_FreeMySQLResult (&mysql_res);
/***** Move unused contents of messages to table of deleted contents of messages *****/
- Msg_MoveUnusedMsgsContentToDeleted ();
+ Msg_DB_MoveUnusedMsgsContentToDeleted ();
}
/***** Write end message *****/
@@ -1293,7 +1293,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
if (NumUsrsEliminated)
/***** 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 *****/
if (WhatToDo.RemoveUsrs)
diff --git a/swad_figure.c b/swad_figure.c
index 93ef17b0..e4772ab5 100644
--- a/swad_figure.c
+++ b/swad_figure.c
@@ -3055,12 +3055,12 @@ static void Fig_GetAndShowMsgsStats (void)
unsigned NumMsgsReceivedAndNotified;
/***** Get the number of unique messages sent from this location *****/
- NumMsgsSentNotDeleted = Msg_GetNumMsgsSent (Gbl.Scope.Current,Msg_STATUS_ALL );
- NumMsgsSentDeleted = Msg_GetNumMsgsSent (Gbl.Scope.Current,Msg_STATUS_DELETED );
+ NumMsgsSentNotDeleted = Msg_DB_GetNumSntMsgs (Gbl.Scope.Current,Msg_STATUS_ALL );
+ NumMsgsSentDeleted = Msg_DB_GetNumSntMsgs (Gbl.Scope.Current,Msg_STATUS_DELETED );
- NumMsgsReceivedNotDeleted = Msg_GetNumMsgsReceived (Gbl.Scope.Current,Msg_STATUS_ALL );
- NumMsgsReceivedAndDeleted = Msg_GetNumMsgsReceived (Gbl.Scope.Current,Msg_STATUS_DELETED );
- NumMsgsReceivedAndNotified = Msg_GetNumMsgsReceived (Gbl.Scope.Current,Msg_STATUS_NOTIFIED);
+ NumMsgsReceivedNotDeleted = Msg_DB_GetNumRcvMsgs (Gbl.Scope.Current,Msg_STATUS_ALL );
+ NumMsgsReceivedAndDeleted = Msg_DB_GetNumRcvMsgs (Gbl.Scope.Current,Msg_STATUS_DELETED );
+ NumMsgsReceivedAndNotified = Msg_DB_GetNumRcvMsgs (Gbl.Scope.Current,Msg_STATUS_NOTIFIED);
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_MESSAGES],
diff --git a/swad_match_database.c b/swad_match_database.c
index 253e06c7..5b3ab3ba 100644
--- a/swad_match_database.c
+++ b/swad_match_database.c
@@ -1040,6 +1040,7 @@ unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
char *MchSubQuery;
char *GamSubQuery;
char *HidGamSubQuery;
+ unsigned NumResults;
/***** Build matches subquery *****/
if (MchCod > 0)
@@ -1096,7 +1097,7 @@ unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
}
/***** Make database query *****/
- return (unsigned)
+ NumResults = (unsigned)
DB_QuerySELECT (mysql_res,"can not get matches results",
"SELECT mch_results.MchCod"
" FROM mch_results,"
@@ -1121,6 +1122,8 @@ unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
free (HidGamSubQuery);
free (GamSubQuery);
free (MchSubQuery);
+
+ return NumResults;
}
/*****************************************************************************/
diff --git a/swad_message.c b/swad_message.c
index 522f569a..2448e7ee 100644
--- a/swad_message.c
+++ b/swad_message.c
@@ -49,6 +49,7 @@
#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"
@@ -66,8 +67,6 @@ extern struct Globals Gbl;
/***************************** Private constants *****************************/
/*****************************************************************************/
-#define Msg_MAX_BYTES_MESSAGES_QUERY (4 * 1024 - 1)
-
// Forum images will be saved with:
// - maximum width 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,
char Content[Cns_MAX_BYTES_LONG_TEXT + 1]);
-static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages);
-static unsigned Msg_DB_GetNumUsrsBannedByMe (void);
+static void Msg_ShowSntOrRcvMessages (struct Msg_Messages *Messages);
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,
char **NumMsgsStr,unsigned NumUnreadMsgs);
@@ -118,8 +112,6 @@ static void Msg_ShowFormToShowOnlyUnreadMessages (const struct Msg_Messages *Mes
static bool Msg_GetParamOnlyUnreadMsgs (void);
static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
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 void Msg_PutLinkToShowMorePotentialRecipients (const struct Msg_Messages *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_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,
struct Med_Media *Media);
-static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
- long UsrCod,
- const char *FilterFromToSubquery);
-static void Msg_DB_InsertReceivedMsg (long MsgCod,long UsrCod,bool NotifyByEmail);
-static void Msg_DB_SetReceivedMsgAsReplied (long MsgCod);
-static void Msg_MoveReceivedMsgToDeleted (long MsgCod,long UsrCod);
-static void Msg_MoveSentMsgToDeleted (long MsgCod);
+static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
+ long UsrCod,
+ const char *FilterFromToSubquery);
+static void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail);
+static void Msg_DB_SetRcvMsgAsReplied (long MsgCod);
+static void Msg_MoveRcvMsgToDeleted (long MsgCod,long UsrCod);
+static void Msg_MoveSntMsgToDeleted (long MsgCod);
static void Msg_MoveMsgContentToDeleted (long MsgCod);
-static bool Msg_DB_CheckIfSentMsgIsDeleted (long MsgCod);
-static bool Msg_DB_CheckIfReceivedMsgIsDeletedForAllItsRecipients (long MsgCod);
+static bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod);
+static bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod);
static unsigned Msg_GetNumUnreadMsgs (const struct Msg_Messages *Messages,
const char *FilterFromToSubquery);
@@ -167,7 +151,6 @@ static void Msg_GetMsgSntData (long MsgCod,long *CrsCod,long *UsrCod,
time_t *CreatTimeUTC,
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
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],
struct Med_Media *Media);
@@ -611,12 +594,7 @@ static void Msg_WriteFormSubjectAndContentMsgToUsrs (struct Msg_Messages *Messag
if (!SubjectAndContentComeFromForm)
{
/* Get subject and content of message from database */
- if (DB_QuerySELECT (&mysql_res,"can not get message content",
- "SELECT Subject," // row[0]
- "Content" // row[1]
- " FROM msg_content"
- " WHERE MsgCod=%ld",
- MsgCod) != 1)
+ if (Msg_DB_GetSubjectAndContent (&mysql_res,MsgCod) != 1)
Err_WrongMessageExit ();
row = mysql_fetch_row (mysql_res);
@@ -863,7 +841,7 @@ void Msg_RecMsgFromUsr (void)
/***** Create the received message for 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.
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 *****/
if (Replied)
- Msg_DB_SetReceivedMsgAsReplied (OriginalMsgCod);
+ Msg_DB_SetRcvMsgAsReplied (OriginalMsgCod);
/***** Write final message *****/
if (NumRecipients)
@@ -982,7 +960,7 @@ void Msg_ReqDelAllRecMsgs (void)
/* Show received messages again */
Messages.TypeOfMessages = Msg_RECEIVED;
- Msg_ShowSentOrReceivedMessages (&Messages);
+ Msg_ShowSntOrRcvMessages (&Messages);
/* End alert */
Ale_ShowAlertAndButton2 (ActDelAllRcvMsg,NULL,NULL,
@@ -1025,7 +1003,7 @@ void Msg_ReqDelAllSntMsgs (void)
/* Show sent messages again */
Messages.TypeOfMessages = Msg_SENT;
- Msg_ShowSentOrReceivedMessages (&Messages);
+ Msg_ShowSntOrRcvMessages (&Messages);
/* End alert */
Ale_ShowAlertAndButton2 (ActDelAllSntMsg,NULL,NULL,
@@ -1051,11 +1029,11 @@ void Msg_DelAllRecMsgs (void)
Msg_GetParamFilterFromTo (&Messages);
Msg_GetParamFilterContent (&Messages);
Messages.ShowOnlyUnreadMsgs = Msg_GetParamOnlyUnreadMsgs ();
- Msg_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
+ Msg_DB_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
/***** Delete messages *****/
Messages.TypeOfMessages = Msg_RECEIVED;
- NumMsgs = Msg_DelSomeRecOrSntMsgsUsr (&Messages,
+ NumMsgs = Msg_RemoveSomeRecOrSntMsgsUsr (&Messages,
Gbl.Usrs.Me.UsrDat.UsrCod,
FilterFromToSubquery);
Msg_ShowNumMsgsDeleted (NumMsgs);
@@ -1079,11 +1057,11 @@ void Msg_DelAllSntMsgs (void)
Msg_GetParamMsgsCrsCod (&Messages);
Msg_GetParamFilterFromTo (&Messages);
Msg_GetParamFilterContent (&Messages);
- Msg_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
+ Msg_DB_MakeFilterFromToSubquery (&Messages,FilterFromToSubquery);
/***** Delete messages *****/
Messages.TypeOfMessages = Msg_SENT;
- NumMsgs = Msg_DelSomeRecOrSntMsgsUsr (&Messages,
+ NumMsgs = Msg_RemoveSomeRecOrSntMsgsUsr (&Messages,
Gbl.Usrs.Me.UsrDat.UsrCod,
FilterFromToSubquery);
Msg_ShowNumMsgsDeleted (NumMsgs);
@@ -1151,38 +1129,6 @@ static void Msg_GetParamFilterContent (struct Msg_Messages *Messages)
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 ************************/
/*****************************************************************************/
@@ -1198,7 +1144,7 @@ void Msg_DelSntMsg (void)
/***** Delete the message *****/
/* Delete the sent message */
- Msg_MoveSentMsgToDeleted (MsgCod);
+ Msg_MoveSntMsgToDeleted (MsgCod);
Ale_ShowAlert (Ale_SUCCESS,Txt_Message_deleted);
/* Show the remaining messages */
@@ -1220,7 +1166,7 @@ void Msg_DelRecMsg (void)
/***** Delete the 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);
/* Show the remaining messages */
@@ -1243,7 +1189,7 @@ void Msg_ExpSntMsg (void)
Err_WrongMessageExit ();
/***** Expand the message *****/
- Msg_ExpandSentMsg (Messages.ExpandedMsgCod);
+ Msg_DB_ExpandSntMsg (Messages.ExpandedMsgCod);
/***** Show again the messages *****/
Msg_ShowSntMsgs ();
@@ -1265,7 +1211,7 @@ void Msg_ExpRecMsg (void)
Err_WrongMessageExit ();
/***** Expand the message *****/
- Msg_ExpandReceivedMsg (Messages.ExpandedMsgCod);
+ Msg_DB_ExpandRcvMsg (Messages.ExpandedMsgCod);
/***** Mark possible notification as seen *****/
Ntf_MarkNotifAsSeen (Ntf_EVENT_MESSAGE,
@@ -1289,7 +1235,7 @@ void Msg_ConSntMsg (void)
Err_WrongMessageExit ();
/***** Contract the message *****/
- Msg_DB_ContractSentMsg (MsgCod);
+ Msg_DB_ContractSntMsg (MsgCod);
/***** Show again the messages *****/
Msg_ShowSntMsgs ();
@@ -1308,95 +1254,12 @@ void Msg_ConRecMsg (void)
Err_WrongMessageExit ();
/***** Contract the message *****/
- Msg_DB_ContractReceivedMsg (MsgCod);
+ Msg_DB_ContractRcvMsg (MsgCod);
/***** Show again the messages *****/
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 **********************/
/*****************************************************************************/
@@ -1457,9 +1320,9 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
/************** Delete some received or sent messages of a user **************/
/*****************************************************************************/
-static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
- long UsrCod,
- const char *FilterFromToSubquery)
+static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *Messages,
+ long UsrCod,
+ const char *FilterFromToSubquery)
{
MYSQL_RES *mysql_res;
unsigned NumMsgs;
@@ -1467,10 +1330,8 @@ static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Mess
long MsgCod;
/***** Get some of the messages received or sent by this user from database *****/
- NumMsgs = Msg_GetSentOrReceivedMsgs (Messages,
- UsrCod,
- FilterFromToSubquery,
- &mysql_res);
+ NumMsgs = Msg_DB_GetSntOrRcvMsgs (&mysql_res,
+ Messages,UsrCod,FilterFromToSubquery);
/***** Delete each message *****/
for (NumMsg = 0;
@@ -1483,10 +1344,10 @@ static unsigned long Msg_DelSomeRecOrSntMsgsUsr (const struct Msg_Messages *Mess
switch (Messages->TypeOfMessages)
{
case Msg_RECEIVED:
- Msg_MoveReceivedMsgToDeleted (MsgCod,UsrCod);
+ Msg_MoveRcvMsgToDeleted (MsgCod,UsrCod);
break;
case Msg_SENT:
- Msg_MoveSentMsgToDeleted (MsgCod);
+ Msg_MoveSntMsgToDeleted (MsgCod);
break;
default:
break;
@@ -1549,7 +1410,7 @@ void Msg_DelAllRecAndSntMsgsUsr (long UsrCod)
/**** 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 *****/
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 ***********/
/*****************************************************************************/
-static void Msg_DB_SetReceivedMsgAsReplied (long MsgCod)
+static void Msg_DB_SetRcvMsgAsReplied (long MsgCod)
{
/***** Update received message by setting Replied field to true *****/
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 ***************/
/*****************************************************************************/
-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 *****/
/* Insert message into msg_rcv_deleted */
@@ -1610,8 +1471,8 @@ static void Msg_MoveReceivedMsgToDeleted (long MsgCod,long UsrCod)
UsrCod);
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
- if (Msg_DB_CheckIfSentMsgIsDeleted (MsgCod))
- if (Msg_DB_CheckIfReceivedMsgIsDeletedForAllItsRecipients (MsgCod))
+ if (Msg_DB_CheckIfSntMsgIsDeleted (MsgCod))
+ if (Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (MsgCod))
Msg_MoveMsgContentToDeleted (MsgCod);
/***** 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 *****************/
/*****************************************************************************/
-static void Msg_MoveSentMsgToDeleted (long MsgCod)
+static void Msg_MoveSntMsgToDeleted (long MsgCod)
{
/***** Move message from msg_snt to msg_snt_deleted *****/
/* Insert message into msg_snt_deleted */
@@ -1644,7 +1505,7 @@ static void Msg_MoveSentMsgToDeleted (long MsgCod)
MsgCod);
/***** 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);
}
@@ -1681,7 +1542,7 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
/***** 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 *****/
/* Insert message content into msg_content_deleted */
@@ -1717,7 +1578,7 @@ void Msg_MoveUnusedMsgsContentToDeleted (void)
/******************** 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 *****/
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 ****/
/*****************************************************************************/
-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 *****/
return (DB_QueryCOUNT ("can not check if a received message"
@@ -1848,7 +1709,7 @@ void Msg_ShowSntMsgs (void)
/***** Show the sent messages *****/
Messages.TypeOfMessages = Msg_SENT;
- Msg_ShowSentOrReceivedMessages (&Messages);
+ Msg_ShowSntOrRcvMessages (&Messages);
}
/*****************************************************************************/
@@ -1872,14 +1733,14 @@ void Msg_ShowRecMsgs (void)
/***** Show the received messages *****/
Messages.TypeOfMessages = Msg_RECEIVED;
- Msg_ShowSentOrReceivedMessages (&Messages);
+ Msg_ShowSntOrRcvMessages (&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_filter;
@@ -1891,10 +1752,8 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
- unsigned long NumRow;
- unsigned long NumRows;
+ unsigned NumMsg;
char *NumMsgsStr;
- unsigned long NumMsg;
unsigned NumUnreadMsgs;
struct Pagination Pagination;
long MsgCod;
@@ -1930,7 +1789,7 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
Msg_GetParamMsgsCrsCod (Messages);
Msg_GetParamFilterFromTo (Messages);
Msg_GetParamFilterContent (Messages);
- Msg_MakeFilterFromToSubquery (Messages,FilterFromToSubquery);
+ Msg_DB_MakeFilterFromToSubquery (Messages,FilterFromToSubquery);
Msg_GetDistinctCoursesInMyMessages (Messages);
/***** Get number of unread messages *****/
@@ -1950,11 +1809,9 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
}
/***** Get messages from database *****/
- NumRows = Msg_GetSentOrReceivedMsgs (Messages,
- Gbl.Usrs.Me.UsrDat.UsrCod,
- FilterFromToSubquery,
- &mysql_res);
- Messages->NumMsgs = (unsigned) NumRows;
+ Messages->NumMsgs = Msg_DB_GetSntOrRcvMsgs (&mysql_res,
+ Messages,Gbl.Usrs.Me.UsrDat.UsrCod,
+ FilterFromToSubquery);
/***** Begin box with messages *****/
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
{
/***** Get the page where the expanded message is inside *****/
- for (NumRow = 0;
- NumRow < NumRows;
- NumRow++)
+ for (NumMsg = 0;
+ NumMsg < Messages->NumMsgs;
+ NumMsg++)
{
row = mysql_fetch_row (mysql_res);
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
{
- Messages->CurrentPage = (unsigned) (NumRow / Pag_ITEMS_PER_PAGE) + 1;
+ Messages->CurrentPage = NumMsg / Pag_ITEMS_PER_PAGE + 1;
break;
}
}
@@ -2034,16 +1891,17 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
HTM_TABLE_BeginWidePadding (2);
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible - 1));
- for (NumRow = Pagination.FirstItemVisible;
- NumRow <= Pagination.LastItemVisible;
- NumRow++)
+ for (NumMsg = Pagination.FirstItemVisible;
+ NumMsg <= Pagination.LastItemVisible;
+ NumMsg++)
{
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&MsgCod) != 1)
Err_WrongMessageExit ();
- NumMsg = NumRows - NumRow + 1;
- Msg_ShowASentOrReceivedMessage (Messages,NumMsg,MsgCod);
+ Msg_ShowASentOrReceivedMessage (Messages,
+ Messages->NumMsgs - NumMsg + 1,
+ MsgCod);
}
HTM_TABLE_End ();
@@ -2060,21 +1918,6 @@ static void Msg_ShowSentOrReceivedMessages (struct Msg_Messages *Messages)
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 *******************/
/*****************************************************************************/
@@ -2089,220 +1932,12 @@ static void Msg_PutLinkToViewBannedUsers(void)
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 ****/
/*****************************************************************************/
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
{
- /***** Get the number of unique messages sent by any teacher from this course *****/
return (unsigned)
DB_QueryCOUNT ("can not get the number of messages sent by teachers",
"SELECT COUNT(*)"
@@ -2310,11 +1945,12 @@ unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
"crs_users"
" WHERE msg_snt.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",
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)
{
- /***** Get the number of unique messages sent by any teacher from this course *****/
return (unsigned)
DB_QueryCOUNT ("can not get the number of messages sent by a user",
"SELECT"
@@ -2343,7 +1978,7 @@ unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod)
/******** (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";
@@ -2437,7 +2072,7 @@ unsigned Msg_GetNumMsgsSent (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
/****** (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;
@@ -3122,21 +2757,6 @@ static void Msg_GetMsgSntData (long MsgCod,long *CrsCod,long *UsrCod,
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 *****************/
/*****************************************************************************/
@@ -3170,64 +2790,6 @@ static void Msg_GetMsgContent (long MsgCod,char Content[Cns_MAX_BYTES_LONG_TEXT
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) *********/
/*****************************************************************************/
@@ -3269,10 +2831,10 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
switch (Messages->TypeOfMessages)
{
case Msg_RECEIVED:
- Msg_GetStatusOfReceivedMsg (MsgCod,&Open,&Replied,&Expanded);
+ Msg_DB_GetStatusOfRcvMsg (MsgCod,&Open,&Replied,&Expanded);
break;
case Msg_SENT:
- Expanded = Msg_DB_GetStatusOfSentMsg (MsgCod);
+ Expanded = Msg_DB_GetStatusOfSntMsg (MsgCod);
break;
default:
break;
diff --git a/swad_message.h b/swad_message.h
index 3c76adfe..4ae5c29e 100644
--- a/swad_message.h
+++ b/swad_message.h
@@ -104,15 +104,15 @@ void Msg_ConRecMsg (void);
void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod);
void Msg_DelAllRecAndSntMsgsUsr (long UsrCod);
-void Msg_MoveUnusedMsgsContentToDeleted (void);
+void Msg_DB_MoveUnusedMsgsContentToDeleted (void);
void Msg_ShowSntMsgs (void);
void Msg_ShowRecMsgs (void);
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod);
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod);
-unsigned Msg_GetNumMsgsSent (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
-unsigned Msg_GetNumMsgsReceived (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
+unsigned Msg_DB_GetNumSntMsgs (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_GetNotifMessage (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
diff --git a/swad_message_database.c b/swad_message_database.c
new file mode 100644
index 00000000..17f89875
--- /dev/null
+++ b/swad_message_database.c
@@ -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 .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+#define _GNU_SOURCE // For asprintf
+// #include // For PATH_MAX
+// #include // For NULL
+#include // For asprintf
+// #include // For free
+#include // For string functions
+// #include // 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);
+ }
diff --git a/swad_message_database.h b/swad_message_database.h
new file mode 100644
index 00000000..4cd07f5e
--- /dev/null
+++ b/swad_message_database.h
@@ -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 .
+*/
+/*****************************************************************************/
+/********************************** Headers **********************************/
+/*****************************************************************************/
+
+#include // 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