Version 21.17.2: Sep 27, 2021 Queries moved to module swad_message_database.

This commit is contained in:
acanas 2021-09-27 23:59:50 +02:00
parent 71117ce06f
commit f9b99de2bb
12 changed files with 781 additions and 704 deletions

View File

@ -53,6 +53,7 @@
#include "swad_mail_database.h"
#include "swad_match.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_network.h"
#include "swad_nickname.h"
#include "swad_notification.h"
@ -1028,7 +1029,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat,
Ntf_DB_RemoveUsrNtfs (UsrDat->UsrCod);
/***** Delete user's messages sent and received *****/
Msg_DelAllRecAndSntMsgsUsr (UsrDat->UsrCod);
Msg_DB_RemoveAllRecAndSntMsgsUsr (UsrDat->UsrCod);
if (QuietOrVerbose == Cns_VERBOSE)
Ale_ShowAlert (Ale_SUCCESS,Txt_Messages_of_THE_USER_X_have_been_deleted,
UsrDat->FullName);

View File

@ -602,13 +602,15 @@ 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.17 (2021-09-27)"
#define Log_PLATFORM_VERSION "SWAD 21.17.2 (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.2: Sep 27, 2021 Queries moved to module swad_message_database. (317358 lines)
Version 21.17.1: Sep 27, 2021 Queries moved to module swad_message_database. (317325 lines)
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)

View File

@ -52,6 +52,7 @@
#include "swad_mail_database.h"
#include "swad_match.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_notification.h"
#include "swad_parameter.h"
#include "swad_photo.h"

View File

@ -54,6 +54,7 @@
#include "swad_institution_database.h"
#include "swad_logo.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_network.h"
#include "swad_notice.h"
#include "swad_privacy.h"

View File

@ -43,6 +43,7 @@
#include "swad_indicator.h"
#include "swad_indicator_database.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_parameter.h"
#include "swad_theme.h"

View File

@ -137,13 +137,9 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
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_CheckIfSntMsgIsDeleted (long MsgCod);
static bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod);
static unsigned Msg_GetNumUnreadMsgs (const struct Msg_Messages *Messages,
const char *FilterFromToSubquery);
@ -1260,22 +1256,6 @@ void Msg_ConRecMsg (void)
Msg_ShowRecMsgs ();
}
/*****************************************************************************/
/********************** Mark a received message as open **********************/
/*****************************************************************************/
void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod)
{
/***** Mark message as read by user *****/
DB_QueryUPDATE ("can not mark a received message as open",
"UPDATE msg_rcv"
" SET Open='Y'"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
UsrCod);
}
/*****************************************************************************/
/********************** Insert a message in the database *********************/
/*****************************************************************************/
@ -1290,25 +1270,10 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content,
Med_RemoveKeepOrStoreMedia (-1L,Media);
/***** Insert message subject and content in the database *****/
MsgCod =
DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content"
" (Subject,Content,MedCod)"
" VALUES"
" ('%s','%s',%ld)",
Subject,
Content,
Media->MedCod);
MsgCod = Msg_DB_CreateNewMsg (Subject,Content,Media->MedCod);
/***** Insert message in sent messages *****/
DB_QueryINSERT ("can not create message",
"INSERT INTO msg_snt"
" (MsgCod,CrsCod,UsrCod,Expanded,CreatTime)"
" VALUES"
" (%ld,%ld,%ld,'N',NOW())",
MsgCod,
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
Msg_DB_CreateSntMsg (MsgCod);
/***** Increment number of messages sent by me *****/
Prf_DB_IncrementNumMsgSntUsr (Gbl.Usrs.Me.UsrDat.UsrCod);
@ -1360,86 +1325,6 @@ static unsigned long Msg_RemoveSomeRecOrSntMsgsUsr (const struct Msg_Messages *M
return NumMsgs;
}
/*****************************************************************************/
/*************** Delete all received or sent messages of a user **************/
/*****************************************************************************/
void Msg_DelAllRecAndSntMsgsUsr (long UsrCod)
{
/***** Move messages from msg_rcv to msg_rcv_deleted *****/
/* Insert messages into msg_rcv_deleted */
DB_QueryINSERT ("can not remove received messages",
"INSERT IGNORE INTO msg_rcv_deleted"
" (MsgCod,UsrCod,Notified,Open,Replied)"
" SELECT MsgCod,"
"UsrCod,"
"Notified,"
"Open,"
"Replied"
" FROM msg_rcv"
" WHERE UsrCod=%ld",
UsrCod);
/* Delete messages from msg_rcv *****/
DB_QueryDELETE ("can not remove received messages",
"DELETE FROM msg_rcv"
" WHERE UsrCod=%ld",
UsrCod);
/***** Move message from msg_snt to msg_snt_deleted *****/
/* Insert message into msg_snt_deleted */
DB_QueryINSERT ("can not remove sent messages",
"INSERT IGNORE INTO msg_snt_deleted"
" (MsgCod,CrsCod,UsrCod,CreatTime)"
" SELECT MsgCod,"
"CrsCod,"
"UsrCod,"
"CreatTime"
" FROM msg_snt"
" WHERE UsrCod=%ld",
UsrCod);
/* Delete message from msg_snt *****/
DB_QueryDELETE ("can not remove sent messages",
"DELETE FROM msg_snt"
" WHERE UsrCod=%ld",
UsrCod);
}
/*****************************************************************************/
/**** Insert a message y su destinatario in the table of messages received ***/
/*****************************************************************************/
static void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail)
{
/***** Insert message received in the database *****/
DB_QueryINSERT ("can not create received message",
"INSERT INTO msg_rcv"
" (MsgCod,UsrCod,Notified,Open,Replied,Expanded)"
" VALUES"
" (%ld,%ld,'%c','N','N','N')",
MsgCod,
UsrCod,
NotifyByEmail ? 'Y' :
'N');
}
/*****************************************************************************/
/******** Update received message by setting Replied field to true ***********/
/*****************************************************************************/
static void Msg_DB_SetRcvMsgAsReplied (long MsgCod)
{
/***** Update received message by setting Replied field to true *****/
DB_QueryUPDATE ("can not update a received message",
"UPDATE msg_rcv"
" SET Replied='Y'"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/************ Delete a message from the received message table ***************/
/*****************************************************************************/
@ -1448,27 +1333,10 @@ static void Msg_MoveRcvMsgToDeleted (long MsgCod,long UsrCod)
{
/***** Move message from msg_rcv to msg_rcv_deleted *****/
/* Insert message into msg_rcv_deleted */
DB_QueryINSERT ("can not remove a received message",
"INSERT IGNORE INTO msg_rcv_deleted"
" (MsgCod,UsrCod,Notified,Open,Replied)"
" SELECT MsgCod,"
"UsrCod,"
"Notified,"
"Open,"
"Replied"
" FROM msg_rcv"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
UsrCod);
Msg_DB_MoveRcvMsgToDeleted (MsgCod,UsrCod);
/* Delete message from msg_rcv *****/
DB_QueryDELETE ("can not remove a received message",
"DELETE FROM msg_rcv"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
UsrCod);
Msg_DB_RemoveRcvMsg (MsgCod,UsrCod);
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
if (Msg_DB_CheckIfSntMsgIsDeleted (MsgCod))
@ -1487,22 +1355,10 @@ static void Msg_MoveSntMsgToDeleted (long MsgCod)
{
/***** Move message from msg_snt to msg_snt_deleted *****/
/* Insert message into msg_snt_deleted */
DB_QueryINSERT ("can not remove a sent message",
"INSERT IGNORE INTO msg_snt_deleted"
" (MsgCod,CrsCod,UsrCod,CreatTime)"
" SELECT MsgCod,"
"CrsCod,"
"UsrCod,"
"CreatTime"
" FROM msg_snt"
" WHERE MsgCod=%ld",
MsgCod);
Msg_DB_MoveSntMsgToDeleted (MsgCod);
/* Delete message from msg_snt *****/
DB_QueryDELETE ("can not remove a sent message",
"DELETE FROM msg_snt"
" WHERE MsgCod=%ld",
MsgCod);
Msg_DB_RemoveSntMsg (MsgCod);
/***** If message content is not longer necessary, move it to msg_content_deleted *****/
if (Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (MsgCod))
@ -1538,75 +1394,6 @@ static void Msg_MoveMsgContentToDeleted (long MsgCod)
MsgCod);
}
/*****************************************************************************/
/***** Delete the subject and content of all completely deleted messages *****/
/*****************************************************************************/
void Msg_DB_MoveUnusedMsgsContentToDeleted (void)
{
/***** Move messages from msg_content to msg_content_deleted *****/
/* Insert message content into msg_content_deleted */
DB_QueryINSERT ("can not remove the content of some messages",
"INSERT IGNORE INTO msg_content_deleted"
" (MsgCod,Subject,Content)"
" SELECT MsgCod,"
"Subject,"
"Content"
" FROM msg_content"
" WHERE MsgCod NOT IN"
" (SELECT MsgCod"
" FROM msg_snt)"
" AND MsgCod NOT IN"
" (SELECT DISTINCT MsgCod"
" FROM msg_rcv)");
/* Messages in msg_content_deleted older than a certain time
should be deleted to ensure the protection of personal data */
/* Delete message from msg_content *****/
DB_QueryDELETE ("can not remove the content of some messages",
"DELETE FROM msg_content"
" WHERE MsgCod NOT IN"
" (SELECT MsgCod"
" FROM msg_snt)"
" AND MsgCod NOT IN"
" (SELECT DISTINCT MsgCod"
" FROM msg_rcv)");
}
/*****************************************************************************/
/******************** Check if a sent message is deleted *********************/
/*****************************************************************************/
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",
"SELECT COUNT(*)"
" FROM msg_snt"
" WHERE MsgCod=%ld",
MsgCod) == 0); // The message has been deleted
// by its author when it is not present
// in table of sent messages undeleted
}
/*****************************************************************************/
/***** Check if a received message has been deleted by all its recipients ****/
/*****************************************************************************/
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"
" is deleted by all recipients",
"SELECT COUNT(*)"
" FROM msg_rcv"
" WHERE MsgCod=%ld",
MsgCod) == 0); // The message has been deleted
// by all its recipients when it is not present
// in table of received messages undeleted
}
/*****************************************************************************/
/******** Get number of received messages that haven't been read by me *******/
/*****************************************************************************/
@ -1932,401 +1719,6 @@ static void Msg_PutLinkToViewBannedUsers(void)
Txt_Banned_users);
}
/*****************************************************************************/
/**** Get the number of unique messages sent by any teacher from a course ****/
/*****************************************************************************/
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
{
return (unsigned)
DB_QueryCOUNT ("can not get the number of messages sent by teachers",
"SELECT COUNT(*)"
" FROM msg_snt,"
"crs_users"
" WHERE msg_snt.CrsCod=%ld"
" AND crs_users.CrsCod=%ld"
" AND crs_users.Role IN (%u,%u)"
" AND msg_snt.UsrCod=crs_users.UsrCod",
CrsCod,
CrsCod,
(unsigned) Rol_NET, // Non-editing teacher
(unsigned) Rol_TCH); // Teacher
}
/*****************************************************************************/
/************** Get the number of unique messages sent by a user *************/
/*****************************************************************************/
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod)
{
return (unsigned)
DB_QueryCOUNT ("can not get the number of messages sent by a user",
"SELECT"
" (SELECT COUNT(*)"
" FROM msg_snt"
" WHERE UsrCod=%ld)"
" +"
" (SELECT COUNT(*)"
" FROM msg_snt_deleted"
" WHERE UsrCod=%ld)",
UsrCod,
UsrCod);
}
/*****************************************************************************/
/******** Get the number of unique messages sent from this location **********/
/******** (all the platform, current degree or current course) **********/
/*****************************************************************************/
unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
{
const char *Table = "msg_snt";
/***** Get the number of messages sent from this location
(all the platform, current degree or current course) from database *****/
switch (MsgStatus)
{
case Msg_STATUS_ALL:
case Msg_STATUS_NOTIFIED:
Table = "msg_snt";
break;
case Msg_STATUS_DELETED:
Table = "msg_snt_deleted";
break;
}
switch (Scope)
{
case HieLvl_SYS:
return (unsigned) DB_GetNumRowsTable (Table);
case HieLvl_CTY:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Cty.CtyCod,
Table);
case HieLvl_INS:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Ins.InsCod,
Table);
case HieLvl_CTR:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"%s"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Ctr.CtrCod,
Table);
case HieLvl_DEG:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM crs_courses,"
"%s"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Deg.DegCod,
Table);
case HieLvl_CRS:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM %s"
" WHERE CrsCod=%ld",
Table,
Gbl.Hierarchy.Crs.CrsCod);
default:
return 0;
}
}
/*****************************************************************************/
/****** Get the number of unique messages received from this location ********/
/****** (all the platform, current degree or current course) ********/
/*****************************************************************************/
unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
{
char *Table;
/***** Get the number of unique messages sent from this location
(all the platform, current degree or current course) from database *****/
switch (MsgStatus)
{
case Msg_STATUS_ALL:
case Msg_STATUS_DELETED:
Table = (MsgStatus == Msg_STATUS_ALL) ? "msg_rcv" :
"msg_rcv_deleted";
switch (Scope)
{
case HieLvl_SYS:
return (unsigned) DB_GetNumRowsTable (Table);
case HieLvl_CTY:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s,"
"msg_snt"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Cty.CtyCod,
Table);
case HieLvl_INS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s,"
"msg_snt"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Ins.InsCod,
Table);
case HieLvl_CTR:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"%s,"
"msg_snt"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Ctr.CtrCod,
Table);
case HieLvl_DEG:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM crs_courses,"
"%s,"
"msg_snt"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Deg.DegCod,
Table);
case HieLvl_CRS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM msg_snt,"
"%s"
" WHERE msg_snt.CrsCod=%ld"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Crs.CrsCod,
Table);
case HieLvl_UNK:
default:
return 0;
}
return 0;
case Msg_STATUS_NOTIFIED:
switch (Scope)
{
case HieLvl_SYS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM msg_rcv"
" WHERE Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM msg_rcv_deleted"
" WHERE Notified='Y')");
case HieLvl_CTY:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Cty.CtyCod,
Gbl.Hierarchy.Cty.CtyCod);
case HieLvl_INS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Ins.InsCod,
Gbl.Hierarchy.Ins.InsCod);
case HieLvl_CTR:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Ctr.CtrCod,
Gbl.Hierarchy.Ctr.CtrCod);
case HieLvl_DEG:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Deg.DegCod,
Gbl.Hierarchy.Deg.DegCod);
case HieLvl_CRS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM msg_snt,"
"msg_rcv"
" WHERE msg_snt.CrsCod=%ld"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM msg_snt,"
"msg_rcv_deleted"
" WHERE msg_snt.CrsCod=%ld"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Hierarchy.Crs.CrsCod);
case HieLvl_UNK:
default:
return 0;
}
return 0;
default:
return 0;
}
}
/*****************************************************************************/
/***** Set string with number of messages and number of unread messages ******/
/*****************************************************************************/
@ -3688,34 +3080,6 @@ static void Msg_UnbanSender (void)
Gbl.Usrs.Other.UsrDat.FullName);
}
/*****************************************************************************/
/**************** Chech if a user is banned by another user ******************/
/*****************************************************************************/
bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod)
{
/***** Get if FromUsrCod is banned by ToUsrCod *****/
return (DB_QueryCOUNT ("can not check if a user is banned",
"SELECT COUNT(*)"
" FROM msg_banned"
" WHERE FromUsrCod=%ld"
" AND ToUsrCod=%ld",
FromUsrCod,ToUsrCod) != 0);
}
/*****************************************************************************/
/************************ Remove user from banned table **********************/
/*****************************************************************************/
void Msg_DB_RemoveUsrFromBanned (long UsrCod)
{
DB_QueryDELETE ("can not remove user from table of banned users",
"DELETE FROM msg_banned"
" WHERE FromUsrCod=%ld"
" OR ToUsrCod=%ld",
UsrCod,UsrCod);
}
/*****************************************************************************/
/*********** List banned users, who can not sent messages to me **************/
/*****************************************************************************/
@ -3730,22 +3094,8 @@ void Msg_ListBannedUsrs (void)
unsigned NumUsrs;
struct UsrData UsrDat;
/***** Get my banned users *****/
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get banned users",
"SELECT msg_banned.FromUsrCod"
" FROM msg_banned,"
"usr_data"
" WHERE msg_banned.ToUsrCod=%ld"
" AND msg_banned.FromUsrCod=usr_data.UsrCod"
" ORDER BY usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName",
Gbl.Usrs.Me.UsrDat.UsrCod);
if (NumUsrs == 0) // If not result ==> sent message is deleted
Ale_ShowAlert (Ale_INFO,Txt_You_have_not_banned_any_sender);
else
/***** Get users banned by me *****/
if ((NumUsrs = Msg_DB_GetUsrsBannedByMe (&mysql_res)))
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
@ -3755,42 +3105,42 @@ void Msg_ListBannedUsrs (void)
NULL,NULL,
NULL,Box_NOT_CLOSABLE,2);
/***** List users *****/
for (NumUsr = 1;
NumUsr <= NumUsrs;
NumUsr++)
{
/* Get user's code */
UsrDat.UsrCod = DB_GetNextCode (mysql_res);
/***** List users *****/
for (NumUsr = 1;
NumUsr <= NumUsrs;
NumUsr++)
{
/* Get user's code */
UsrDat.UsrCod = DB_GetNextCode (mysql_res);
/* Get user's data from database */
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS))
{
HTM_TR_Begin (NULL);
/* Get user's data from database */
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS))
{
HTM_TR_Begin (NULL);
/* Put form to unban user */
HTM_TD_Begin ("class=\"BM\"");
Frm_BeginForm (ActUnbUsrLst);
Usr_PutParamUsrCodEncrypted (UsrDat.EnUsrCod);
Ico_PutIconLink ("lock.svg",Txt_Sender_banned_click_to_unban_him);
Frm_EndForm ();
HTM_TD_End ();
/* Put form to unban user */
HTM_TD_Begin ("class=\"BM\"");
Frm_BeginForm (ActUnbUsrLst);
Usr_PutParamUsrCodEncrypted (UsrDat.EnUsrCod);
Ico_PutIconLink ("lock.svg",Txt_Sender_banned_click_to_unban_him);
Frm_EndForm ();
HTM_TD_End ();
/* Show photo */
HTM_TD_Begin ("class=\"LM\" style=\"width:30px;\"");
Pho_ShowUsrPhotoIfAllowed (&UsrDat,"PHOTO21x28",Pho_ZOOM,false);
HTM_TD_End ();
/* Show photo */
HTM_TD_Begin ("class=\"LM\" style=\"width:30px;\"");
Pho_ShowUsrPhotoIfAllowed (&UsrDat,"PHOTO21x28",Pho_ZOOM,false);
HTM_TD_End ();
/* Write user's full name */
HTM_TD_Begin ("class=\"DAT LM\"");
HTM_Txt (UsrDat.FullName);
HTM_TD_End ();
/* Write user's full name */
HTM_TD_Begin ("class=\"DAT LM\"");
HTM_Txt (UsrDat.FullName);
HTM_TD_End ();
HTM_TR_End ();
}
}
HTM_TR_End ();
}
}
/***** End table and box *****/
Box_BoxTableEnd ();
@ -3798,6 +3148,8 @@ void Msg_ListBannedUsrs (void)
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
else // If not result ==> sent message is deleted
Ale_ShowAlert (Ale_INFO,Txt_You_have_not_banned_any_sender);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);

View File

@ -101,19 +101,10 @@ void Msg_ExpSntMsg (void);
void Msg_ExpRecMsg (void);
void Msg_ConSntMsg (void);
void Msg_ConRecMsg (void);
void Msg_DB_SetReceivedMsgAsOpen (long MsgCod,long UsrCod);
void Msg_DelAllRecAndSntMsgsUsr (long UsrCod);
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_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],
char **ContentStr,long MsgCod,bool GetContent);
@ -128,8 +119,6 @@ void Msg_PutHiddenParamMsgCod (long MsgCod);
void Msg_BanSenderWhenShowingMsgs (void);
void Msg_UnbanSenderWhenShowingMsgs (void);
void Msg_UnbanSenderWhenListingUsrs (void);
bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod);
void Msg_DB_RemoveUsrFromBanned (long UsrCod);
void Msg_ListBannedUsrs (void);
#endif

View File

@ -75,6 +75,72 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/
/*****************************************************************************/
/*****************************************************************************/
/************* Insert message subject and content in the database ************/
/*****************************************************************************/
// Return the code of the new inserted message
long Msg_DB_CreateNewMsg (const char *Subject,const char *Content,long MedCod)
{
return
DB_QueryINSERTandReturnCode ("can not create message",
"INSERT INTO msg_content"
" (Subject,Content,MedCod)"
" VALUES"
" ('%s','%s',%ld)",
Subject,
Content,
MedCod);
}
/*****************************************************************************/
/************* Insert a message in the table of sent messages ****************/
/*****************************************************************************/
void Msg_DB_CreateSntMsg (long MsgCod)
{
DB_QueryINSERT ("can not create sent message",
"INSERT INTO msg_snt"
" (MsgCod,CrsCod,UsrCod,Expanded,CreatTime)"
" VALUES"
" (%ld,%ld,%ld,'N',NOW())",
MsgCod,
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/*********** Insert a message in the table of received messages **************/
/*****************************************************************************/
void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail)
{
DB_QueryINSERT ("can not create received message",
"INSERT INTO msg_rcv"
" (MsgCod,UsrCod,Notified,Open,Replied,Expanded)"
" VALUES"
" (%ld,%ld,'%c','N','N','N')",
MsgCod,
UsrCod,
NotifyByEmail ? 'Y' :
'N');
}
/*****************************************************************************/
/******** Update received message by setting Replied field to true ***********/
/*****************************************************************************/
void Msg_DB_SetRcvMsgAsReplied (long MsgCod)
{
DB_QueryUPDATE ("can not update a received message",
"UPDATE msg_rcv"
" SET Replied='Y'"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/**************************** Expand a sent message **************************/
/*****************************************************************************/
@ -158,6 +224,61 @@ void Msg_DB_ContractRcvMsg (long MsgCod)
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/********************** Mark a received message as open **********************/
/*****************************************************************************/
void Msg_DB_SetRcvMsgAsOpen (long MsgCod,long UsrCod)
{
/***** Mark message as read by user *****/
DB_QueryUPDATE ("can not mark a received message as open",
"UPDATE msg_rcv"
" SET Open='Y'"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
UsrCod);
}
/*****************************************************************************/
/******************* Insert received message into deleted ********************/
/*****************************************************************************/
void Msg_DB_MoveRcvMsgToDeleted (long MsgCod,long UsrCod)
{
DB_QueryINSERT ("can not remove a received message",
"INSERT IGNORE INTO msg_rcv_deleted"
" (MsgCod,UsrCod,Notified,Open,Replied)"
" SELECT MsgCod,"
"UsrCod,"
"Notified,"
"Open,"
"Replied"
" FROM msg_rcv"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
UsrCod);
}
/*****************************************************************************/
/******************* Insert received message into deleted ********************/
/*****************************************************************************/
void Msg_DB_MoveSntMsgToDeleted (long MsgCod)
{
DB_QueryINSERT ("can not remove a sent message",
"INSERT IGNORE INTO msg_snt_deleted"
" (MsgCod,CrsCod,UsrCod,CreatTime)"
" SELECT MsgCod,"
"CrsCod,"
"UsrCod,"
"CreatTime"
" FROM msg_snt"
" WHERE MsgCod=%ld",
MsgCod);
}
/*****************************************************************************/
/************************* Make "from"/"to" subquery *************************/
/*****************************************************************************/
@ -487,7 +608,541 @@ void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
}
/*****************************************************************************/
/********************* Get number of user I have banned **********************/
/******************** Check if a sent message is deleted *********************/
/*****************************************************************************/
bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod)
{
return (DB_QueryCOUNT ("can not check if a sent message is deleted",
"SELECT COUNT(*)"
" FROM msg_snt"
" WHERE MsgCod=%ld",
MsgCod) == 0); // The message has been deleted
// by its author when it is not present
// in table of sent messages undeleted
}
/*****************************************************************************/
/***** Check if a received message has been deleted by all its recipients ****/
/*****************************************************************************/
bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod)
{
return (DB_QueryCOUNT ("can not check if a received message"
" is deleted by all recipients",
"SELECT COUNT(*)"
" FROM msg_rcv"
" WHERE MsgCod=%ld",
MsgCod) == 0); // The message has been deleted
// by all its recipients when it is not present
// in table of received messages undeleted
}
/*****************************************************************************/
/******** Get the number of unique messages sent from this location **********/
/******** (all the platform, current degree or current course) **********/
/*****************************************************************************/
unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
{
const char *Table = "msg_snt";
/***** Get the number of messages sent from this location
(all the platform, current degree or current course) from database *****/
switch (MsgStatus)
{
case Msg_STATUS_ALL:
case Msg_STATUS_NOTIFIED:
Table = "msg_snt";
break;
case Msg_STATUS_DELETED:
Table = "msg_snt_deleted";
break;
}
switch (Scope)
{
case HieLvl_SYS:
return (unsigned) DB_GetNumRowsTable (Table);
case HieLvl_CTY:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Cty.CtyCod,
Table);
case HieLvl_INS:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Ins.InsCod,
Table);
case HieLvl_CTR:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"%s"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Ctr.CtrCod,
Table);
case HieLvl_DEG:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM crs_courses,"
"%s"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=%s.CrsCod",
Table,
Gbl.Hierarchy.Deg.DegCod,
Table);
case HieLvl_CRS:
return (unsigned)
DB_QueryCOUNT ("can not get number of sent messages",
"SELECT COUNT(*)"
" FROM %s"
" WHERE CrsCod=%ld",
Table,
Gbl.Hierarchy.Crs.CrsCod);
default:
return 0;
}
}
/*****************************************************************************/
/****** Get the number of unique messages received from this location ********/
/****** (all the platform, current degree or current course) ********/
/*****************************************************************************/
unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus)
{
char *Table;
/***** Get the number of unique messages sent from this location
(all the platform, current degree or current course) from database *****/
switch (MsgStatus)
{
case Msg_STATUS_ALL:
case Msg_STATUS_DELETED:
Table = (MsgStatus == Msg_STATUS_ALL) ? "msg_rcv" :
"msg_rcv_deleted";
switch (Scope)
{
case HieLvl_SYS:
return (unsigned) DB_GetNumRowsTable (Table);
case HieLvl_CTY:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s,"
"msg_snt"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Cty.CtyCod,
Table);
case HieLvl_INS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"%s,"
"msg_snt"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Ins.InsCod,
Table);
case HieLvl_CTR:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"%s,"
"msg_snt"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Ctr.CtrCod,
Table);
case HieLvl_DEG:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM crs_courses,"
"%s,"
"msg_snt"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Deg.DegCod,
Table);
case HieLvl_CRS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT COUNT(*)"
" FROM msg_snt,"
"%s"
" WHERE msg_snt.CrsCod=%ld"
" AND msg_snt.MsgCod=%s.MsgCod",
Table,
Gbl.Hierarchy.Crs.CrsCod,
Table);
case HieLvl_UNK:
default:
return 0;
}
return 0;
case Msg_STATUS_NOTIFIED:
switch (Scope)
{
case HieLvl_SYS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM msg_rcv"
" WHERE Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM msg_rcv_deleted"
" WHERE Notified='Y')");
case HieLvl_CTY:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM ins_instits,"
"ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Cty.CtyCod,
Gbl.Hierarchy.Cty.CtyCod);
case HieLvl_INS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM ctr_centers,"
"deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Ins.InsCod,
Gbl.Hierarchy.Ins.InsCod);
case HieLvl_CTR:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM deg_degrees,"
"crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Ctr.CtrCod,
Gbl.Hierarchy.Ctr.CtrCod);
case HieLvl_DEG:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM crs_courses,"
"msg_snt,"
"msg_rcv"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM crs_courses,"
"msg_snt,"
"msg_rcv_deleted"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=msg_snt.CrsCod"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Deg.DegCod,
Gbl.Hierarchy.Deg.DegCod);
case HieLvl_CRS:
return (unsigned)
DB_QueryCOUNT ("can not get number of received messages",
"SELECT "
"(SELECT COUNT(*)"
" FROM msg_snt,"
"msg_rcv"
" WHERE msg_snt.CrsCod=%ld"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.Notified='Y')"
" + "
"(SELECT COUNT(*)"
" FROM msg_snt,"
"msg_rcv_deleted"
" WHERE msg_snt.CrsCod=%ld"
" AND msg_snt.MsgCod=msg_rcv_deleted.MsgCod"
" AND msg_rcv_deleted.Notified='Y')",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Hierarchy.Crs.CrsCod);
case HieLvl_UNK:
default:
return 0;
}
return 0;
default:
return 0;
}
}
/*****************************************************************************/
/**** Get the number of unique messages sent by any teacher from a course ****/
/*****************************************************************************/
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod)
{
return (unsigned)
DB_QueryCOUNT ("can not get the number of messages sent by teachers",
"SELECT COUNT(*)"
" FROM msg_snt,"
"crs_users"
" WHERE msg_snt.CrsCod=%ld"
" AND crs_users.CrsCod=%ld"
" AND crs_users.Role IN (%u,%u)"
" AND msg_snt.UsrCod=crs_users.UsrCod",
CrsCod,
CrsCod,
(unsigned) Rol_NET, // Non-editing teacher
(unsigned) Rol_TCH); // Teacher
}
/*****************************************************************************/
/************** Get the number of unique messages sent by a user *************/
/*****************************************************************************/
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod)
{
return (unsigned)
DB_QueryCOUNT ("can not get the number of messages sent by a user",
"SELECT"
" (SELECT COUNT(*)"
" FROM msg_snt"
" WHERE UsrCod=%ld)"
" +"
" (SELECT COUNT(*)"
" FROM msg_snt_deleted"
" WHERE UsrCod=%ld)",
UsrCod,
UsrCod);
}
/*****************************************************************************/
/****************** Remove message from received messages ********************/
/*****************************************************************************/
void Msg_DB_RemoveRcvMsg (long MsgCod,long UsrCod)
{
DB_QueryDELETE ("can not remove a received message",
"DELETE FROM msg_rcv"
" WHERE MsgCod=%ld"
" AND UsrCod=%ld",
MsgCod,
UsrCod);
}
/*****************************************************************************/
/******************* Remove message from sent messages ***********************/
/*****************************************************************************/
void Msg_DB_RemoveSntMsg (long MsgCod)
{
DB_QueryDELETE ("can not remove a sent message",
"DELETE FROM msg_snt"
" WHERE MsgCod=%ld",
MsgCod);
}
/*****************************************************************************/
/*************** Remove all received or sent messages of a user **************/
/*****************************************************************************/
void Msg_DB_RemoveAllRecAndSntMsgsUsr (long UsrCod)
{
/***** Move messages from msg_rcv to msg_rcv_deleted *****/
/* Insert messages into msg_rcv_deleted */
DB_QueryINSERT ("can not remove received messages",
"INSERT IGNORE INTO msg_rcv_deleted"
" (MsgCod,UsrCod,Notified,Open,Replied)"
" SELECT MsgCod,"
"UsrCod,"
"Notified,"
"Open,"
"Replied"
" FROM msg_rcv"
" WHERE UsrCod=%ld",
UsrCod);
/* Delete messages from msg_rcv *****/
DB_QueryDELETE ("can not remove received messages",
"DELETE FROM msg_rcv"
" WHERE UsrCod=%ld",
UsrCod);
/***** Move message from msg_snt to msg_snt_deleted *****/
/* Insert message into msg_snt_deleted */
DB_QueryINSERT ("can not remove sent messages",
"INSERT IGNORE INTO msg_snt_deleted"
" (MsgCod,CrsCod,UsrCod,CreatTime)"
" SELECT MsgCod,"
"CrsCod,"
"UsrCod,"
"CreatTime"
" FROM msg_snt"
" WHERE UsrCod=%ld",
UsrCod);
/* Delete message from msg_snt *****/
DB_QueryDELETE ("can not remove sent messages",
"DELETE FROM msg_snt"
" WHERE UsrCod=%ld",
UsrCod);
}
/*****************************************************************************/
/***** Delete the subject and content of all completely deleted messages *****/
/*****************************************************************************/
void Msg_DB_MoveUnusedMsgsContentToDeleted (void)
{
/***** Move messages from msg_content to msg_content_deleted *****/
/* Insert message content into msg_content_deleted */
DB_QueryINSERT ("can not remove the content of some messages",
"INSERT IGNORE INTO msg_content_deleted"
" (MsgCod,Subject,Content)"
" SELECT MsgCod,"
"Subject,"
"Content"
" FROM msg_content"
" WHERE MsgCod NOT IN"
" (SELECT MsgCod"
" FROM msg_snt)"
" AND MsgCod NOT IN"
" (SELECT DISTINCT MsgCod"
" FROM msg_rcv)");
/* Messages in msg_content_deleted older than a certain time
should be deleted to ensure the protection of personal data */
/* Delete message from msg_content *****/
DB_QueryDELETE ("can not remove the content of some messages",
"DELETE FROM msg_content"
" WHERE MsgCod NOT IN"
" (SELECT MsgCod"
" FROM msg_snt)"
" AND MsgCod NOT IN"
" (SELECT DISTINCT MsgCod"
" FROM msg_rcv)");
}
/*****************************************************************************/
/******************** Get number of users I have banned **********************/
/*****************************************************************************/
unsigned Msg_DB_GetNumUsrsBannedByMe (void)
@ -499,3 +1154,50 @@ unsigned Msg_DB_GetNumUsrsBannedByMe (void)
" WHERE ToUsrCod=%ld",
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/************************* Get users I have banned ***************************/
/*****************************************************************************/
unsigned Msg_DB_GetUsrsBannedByMe (MYSQL_RES **mysql_res)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get banned users",
"SELECT msg_banned.FromUsrCod"
" FROM msg_banned,"
"usr_data"
" WHERE msg_banned.ToUsrCod=%ld"
" AND msg_banned.FromUsrCod=usr_data.UsrCod"
" ORDER BY usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName",
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/**************** Chech if a user is banned by another user ******************/
/*****************************************************************************/
bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod)
{
/***** Get if FromUsrCod is banned by ToUsrCod *****/
return (DB_QueryCOUNT ("can not check if a user is banned",
"SELECT COUNT(*)"
" FROM msg_banned"
" WHERE FromUsrCod=%ld"
" AND ToUsrCod=%ld",
FromUsrCod,ToUsrCod) != 0);
}
/*****************************************************************************/
/************************ Remove user from banned table **********************/
/*****************************************************************************/
void Msg_DB_RemoveUsrFromBanned (long UsrCod)
{
DB_QueryDELETE ("can not remove user from table of banned users",
"DELETE FROM msg_banned"
" WHERE FromUsrCod=%ld"
" OR ToUsrCod=%ld",
UsrCod,UsrCod);
}

View File

@ -30,6 +30,7 @@
#include <mysql/mysql.h> // To access MySQL databases
// #include "swad_course.h"
#include "swad_hierarchy_level.h"
// #include "swad_notification.h"
// #include "swad_statistic.h"
@ -47,10 +48,17 @@
/****************************** Public prototypes ****************************/
/*****************************************************************************/
long Msg_DB_CreateNewMsg (const char *Subject,const char *Content,long MedCod);
void Msg_DB_CreateSntMsg (long MsgCod);
void Msg_DB_CreateRcvMsg (long MsgCod,long UsrCod,bool NotifyByEmail);
void Msg_DB_SetRcvMsgAsReplied (long MsgCod);
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_SetRcvMsgAsOpen (long MsgCod,long UsrCod);
void Msg_DB_MoveRcvMsgToDeleted (long MsgCod,long UsrCod);
void Msg_DB_MoveSntMsgToDeleted (long MsgCod);
void Msg_DB_MakeFilterFromToSubquery (const struct Msg_Messages *Messages,
char FilterFromToSubquery[Msg_MAX_BYTES_MESSAGES_QUERY + 1]);
@ -63,6 +71,23 @@ 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);
bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod);
bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod);
unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus);
unsigned Msg_DB_GetNumMsgsSentByTchsCrs (long CrsCod);
unsigned Msg_DB_GetNumMsgsSentByUsr (long UsrCod);
void Msg_DB_RemoveRcvMsg (long MsgCod,long UsrCod);
void Msg_DB_RemoveSntMsg (long MsgCod);
void Msg_DB_RemoveAllRecAndSntMsgsUsr (long UsrCod);
void Msg_DB_MoveUnusedMsgsContentToDeleted (void);
//--------------------------- Users banned ------------------------------------
unsigned Msg_DB_GetNumUsrsBannedByMe (void);
unsigned Msg_DB_GetUsrsBannedByMe (MYSQL_RES **mysql_res);
bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod);
void Msg_DB_RemoveUsrFromBanned (long UsrCod);
#endif

View File

@ -50,6 +50,7 @@
#include "swad_HTML.h"
#include "swad_mark.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_notice.h"
#include "swad_notification.h"
#include "swad_notification_database.h"
@ -907,7 +908,7 @@ void Ntf_GetNotifSummaryAndContent (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
Msg_GetNotifMessage (SummaryStr,ContentStr,Cod,GetContent);
if (Gbl.WebService.IsWebService)
/* Set the message as open by me, because I can read it in an extern application */
Msg_DB_SetReceivedMsgAsOpen (Cod,UsrCod);
Msg_DB_SetRcvMsgAsOpen (Cod,UsrCod);
break;
case Ntf_EVENT_SURVEY:
Svy_GetNotifSurvey (SummaryStr,ContentStr,Cod,GetContent);

View File

@ -45,6 +45,7 @@
#include "swad_HTML.h"
#include "swad_language.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_network.h"
#include "swad_nickname.h"
#include "swad_notification.h"

View File

@ -49,6 +49,7 @@
#include "swad_ID.h"
#include "swad_logo.h"
#include "swad_message.h"
#include "swad_message_database.h"
#include "swad_network.h"
#include "swad_parameter.h"
#include "swad_photo.h"