// 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-2023 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 asprintf #include // For free #include // For string functions #include "swad_database.h" #include "swad_error.h" #include "swad_global.h" #include "swad_message.h" #include "swad_message_database.h" /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ extern struct Globals Gbl; /*****************************************************************************/ /************* 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,long CrsCod) { DB_QueryINSERT ("can not create sent message", "INSERT INTO msg_snt" " (MsgCod,CrsCod,UsrCod,Expanded,CreatTime)" " VALUES" " (%ld,%ld,%ld,'N',NOW())", MsgCod, 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 **************************/ /*****************************************************************************/ 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); } /*****************************************************************************/ /********************** 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_CopyRcvMsgToDeleted (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_CopySntMsgToDeleted (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); } /*****************************************************************************/ /*************** Get dictinct courses in my received messages ****************/ /*****************************************************************************/ unsigned Msg_DB_GetDistinctCrssInMyRcvMsgs (MYSQL_RES **mysql_res) { return (unsigned) DB_QuerySELECT (mysql_res,"can not get distinct courses in your messages", "SELECT DISTINCT " "crs_courses.CrsCod," // row[0] "crs_courses.ShortName" // row[1] " FROM msg_rcv," "msg_snt," "crs_courses" " WHERE msg_rcv.UsrCod=%ld" " AND msg_rcv.MsgCod=msg_snt.MsgCod" " AND msg_snt.CrsCod=crs_courses.CrsCod" " ORDER BY crs_courses.ShortName", Gbl.Usrs.Me.UsrDat.UsrCod); } /*****************************************************************************/ /***************** Get dictinct courses in my sent messages ******************/ /*****************************************************************************/ unsigned Msg_DB_GetDistinctCrssInMySntMsgs (MYSQL_RES **mysql_res) { return (unsigned) DB_QuerySELECT (mysql_res,"can not get distinct courses in your messages", "SELECT DISTINCT " "crs_courses.CrsCod," // row[0] "crs_courses.ShortName" // row[1] " FROM msg_snt," "crs_courses" " WHERE msg_snt.UsrCod=%ld" " AND msg_snt.CrsCod=crs_courses.CrsCod" " ORDER BY crs_courses.ShortName", Gbl.Usrs.Me.UsrDat.UsrCod); } /*****************************************************************************/ /************************* Make "from"/"to" subquery *************************/ /*****************************************************************************/ void Msg_DB_MakeFilterFromToSubquery (const struct Msg_Messages *Messages, char FilterFromToSubquery[Msg_DB_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_DB_MAX_BYTES_MESSAGES_QUERY); while (*Ptr) { Str_GetNextStringUntilSpace (&Ptr,SearchWord,Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME); if (strlen (FilterFromToSubquery) + strlen (SearchWord) + 512 > Msg_DB_MAX_BYTES_MESSAGES_QUERY) // Prevent string overflow break; Str_Concat (FilterFromToSubquery,"%",Msg_DB_MAX_BYTES_MESSAGES_QUERY); Str_Concat (FilterFromToSubquery,SearchWord,Msg_DB_MAX_BYTES_MESSAGES_QUERY); } Str_Concat (FilterFromToSubquery,"%'",Msg_DB_MAX_BYTES_MESSAGES_QUERY); } else FilterFromToSubquery[0] = '\0'; } /*****************************************************************************/ /******** Get number of received messages that haven't been read by me *******/ /*****************************************************************************/ unsigned Msg_DB_GetNumUnreadMsgs (const struct Msg_Messages *Messages, const char FilterFromToSubquery[Msg_DB_MAX_BYTES_MESSAGES_QUERY + 1]) { char *SubQuery; unsigned NumMsgs; /***** Get number of unread messages from database *****/ if (Messages->FilterCrsCod > 0) // If origin course selected { if (FilterFromToSubquery[0]) { if (asprintf (&SubQuery,"SELECT msg_rcv.MsgCod" " FROM msg_rcv," "msg_snt," "usr_data" " WHERE msg_rcv.UsrCod=%ld" " AND msg_rcv.Open='N'" " AND msg_rcv.MsgCod=msg_snt.MsgCod" " AND msg_snt.CrsCod=%ld" " AND msg_snt.UsrCod=usr_data.UsrCod%s", Gbl.Usrs.Me.UsrDat.UsrCod, Messages->FilterCrsCod, FilterFromToSubquery) < 0) Err_NotEnoughMemoryExit (); } else { if (asprintf (&SubQuery,"SELECT msg_rcv.MsgCod" " FROM msg_rcv," "msg_snt" " WHERE msg_rcv.UsrCod=%ld" " AND msg_rcv.Open='N'" " AND msg_rcv.MsgCod=msg_snt.MsgCod" " AND msg_snt.CrsCod=%ld", Gbl.Usrs.Me.UsrDat.UsrCod, Messages->FilterCrsCod) < 0) Err_NotEnoughMemoryExit (); } } else // If no origin course selected { if (FilterFromToSubquery[0]) { if (asprintf (&SubQuery,"SELECT msg_rcv.MsgCod" " FROM msg_rcv," "msg_snt," "usr_data" " WHERE msg_rcv.UsrCod=%ld" " AND msg_rcv.Open='N'" " AND msg_rcv.MsgCod=msg_snt.MsgCod" " AND msg_snt.UsrCod=usr_data.UsrCod%s", Gbl.Usrs.Me.UsrDat.UsrCod, FilterFromToSubquery) < 0) Err_NotEnoughMemoryExit (); } else { if (asprintf (&SubQuery,"SELECT MsgCod" " FROM msg_rcv" " WHERE UsrCod=%ld" " AND Open='N'", Gbl.Usrs.Me.UsrDat.UsrCod) < 0) Err_NotEnoughMemoryExit (); } } if (Messages->FilterContent[0]) NumMsgs = (unsigned) DB_QueryCOUNT ("can not get number of unread messages", "SELECT COUNT(*)" " FROM msg_content" " WHERE MsgCod IN (%s)" " AND MATCH (Subject,Content) AGAINST ('%s')", SubQuery, Messages->FilterContent); else NumMsgs = (unsigned) DB_QueryCOUNT ("can not get number of unread messages", "SELECT COUNT(*)" " FROM (%s) AS T", SubQuery); free (SubQuery); return NumMsgs; } /*****************************************************************************/ /********* 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[Msg_DB_MAX_BYTES_MESSAGES_QUERY + 1]) { 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 content and optional image of a message *****************/ /*****************************************************************************/ unsigned Msg_DB_GetMsgContent (MYSQL_RES **mysql_res,long MsgCod) { return (unsigned) DB_QuerySELECT (mysql_res,"can not get the content of a message", "SELECT Content," // row[0] "MedCod" // row[1] " FROM msg_content" " WHERE MsgCod=%ld", MsgCod); } /*****************************************************************************/ /***************************** Get data of a message *************************/ /*****************************************************************************/ unsigned Msg_DB_GetMsgSntData (MYSQL_RES **mysql_res,long MsgCod,bool *Deleted) { unsigned NumRows; /***** Get data of message from table msg_snt *****/ *Deleted = false; NumRows = (unsigned) DB_QuerySELECT (mysql_res,"can not get data of a message", "SELECT CrsCod," // row[0] "UsrCod," // row[1] "UNIX_TIMESTAMP(CreatTime)" // row[2] " FROM msg_snt" " WHERE MsgCod=%ld", MsgCod); if (NumRows == 0) // If not result ==> sent message is deleted { /***** Get data of message from table msg_snt_deleted *****/ NumRows = (unsigned) DB_QuerySELECT (mysql_res,"can not get data of a message", "SELECT CrsCod," // row[0] "UsrCod," // row[1] "UNIX_TIMESTAMP(CreatTime)" // row[2] " FROM msg_snt_deleted" " WHERE MsgCod=%ld", MsgCod); *Deleted = true; } return NumRows; } /*****************************************************************************/ /********************** 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); } /*****************************************************************************/ /******************** Check if a sent message is deleted *********************/ /*****************************************************************************/ bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod) { return !DB_QueryEXISTS ("can not check if a sent message is deleted", "SELECT EXISTS" "(SELECT *" " FROM msg_snt" " WHERE MsgCod=%ld)", MsgCod); // 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_QueryEXISTS ("can not check if a received message is deleted by all recipients", "SELECT EXISTS" "(SELECT *" " FROM msg_rcv" " WHERE MsgCod=%ld)", MsgCod); // The message has been deleted // by all its recipients when it is not present // in table of received messages undeleted } /*****************************************************************************/ /************************* Get the sender of a message ***********************/ /*****************************************************************************/ long Msg_DB_GetSender (long MsgCod) { return DB_QuerySELECTCode ("can not get sender", "SELECT UsrCod" " FROM msg_snt" " WHERE MsgCod=%ld" " UNION " "SELECT UsrCod" " FROM msg_snt_deleted" " WHERE MsgCod=%ld", MsgCod, MsgCod); } /*****************************************************************************/ /************** Check if a message has been really received by me ************/ /*****************************************************************************/ bool Msg_DB_CheckIfMsgHasBeenReceivedByMe (long MsgCod) { return DB_QueryEXISTS ("can not check original message", "SELECT EXISTS" "(SELECT *" " FROM msg_rcv" " WHERE UsrCod=%ld" " AND MsgCod=%ld" " UNION" " SELECT *" " FROM msg_rcv_deleted" " WHERE UsrCod=%ld" " AND MsgCod=%ld)", Gbl.Usrs.Me.UsrDat.UsrCod,MsgCod, Gbl.Usrs.Me.UsrDat.UsrCod,MsgCod); } /*****************************************************************************/ /***************************** Get recipients' codes *************************/ /*****************************************************************************/ #define Msg_DB_MAX_BYTES_QUERY_RECIPIENTS (16 * 1024 - 1) unsigned Msg_DB_GetRecipientsCods (MYSQL_RES **mysql_res, long ReplyUsrCod,const char *ListRecipients) { char *Query = NULL; const char *Ptr; char Nick[Nck_MAX_BYTES_NICK_WITH_ARROBA + 1]; bool FirstNickname = true; bool ThereAreNicknames = false; unsigned NumUsrs = 0; /***** Allocate space for query *****/ if ((Query = malloc (Msg_DB_MAX_BYTES_QUERY_RECIPIENTS + 1)) == NULL) Err_NotEnoughMemoryExit (); /***** Build query for recipients from database *****/ if (ReplyUsrCod > 0) snprintf (Query,Msg_DB_MAX_BYTES_QUERY_RECIPIENTS + 1, "SELECT UsrCod" " FROM usr_data" " WHERE UsrCod=%ld", ReplyUsrCod); else Query[0] = '\0'; /***** Loop over recipients' nicknames building query *****/ Ptr = ListRecipients; while (*Ptr) { /* Find next string in text until comma (leading and trailing spaces are removed) */ Str_GetNextStringUntilComma (&Ptr,Nick,sizeof (Nick) - 1); // With leading arrobas /* Check if string is a valid nickname */ if (Nck_CheckIfNickWithArrIsValid (Nick)) // String is a nickname (with leading arrobas)? { Str_RemoveLeadingArrobas (Nick); /* Check for overflow in query */ if (strlen (Query) + Nck_MAX_BYTES_NICK_WITHOUT_ARROBA + 32 > Msg_DB_MAX_BYTES_QUERY_RECIPIENTS) Err_NotEnoughMemoryExit (); /* Add this nickname to query */ if (FirstNickname) { if (ReplyUsrCod > 0) Str_Concat (Query," UNION ",Msg_DB_MAX_BYTES_QUERY_RECIPIENTS); Str_Concat (Query,"SELECT UsrCod" " FROM usr_nicknames" " WHERE Nickname IN ('", Msg_DB_MAX_BYTES_QUERY_RECIPIENTS); FirstNickname = false; ThereAreNicknames = true; } else Str_Concat (Query,",'",Msg_DB_MAX_BYTES_QUERY_RECIPIENTS); Str_Concat (Query,Nick,Msg_DB_MAX_BYTES_QUERY_RECIPIENTS); // Leading arrobas already removed Str_Concat (Query,"'",Msg_DB_MAX_BYTES_QUERY_RECIPIENTS); } } if (ThereAreNicknames) Str_Concat (Query,")",Msg_DB_MAX_BYTES_QUERY_RECIPIENTS); if (ReplyUsrCod > 0 || ThereAreNicknames) // There are a recipient to reply or nicknames in list { /***** Get users *****/ NumUsrs = (unsigned) DB_QuerySELECT (mysql_res,"can not get users", "%s", Query); } /***** Free space for query *****/ free (Query); return NumUsrs; } /*****************************************************************************/ /************ Get number of recipients of a message from database ************/ /*****************************************************************************/ unsigned Msg_DB_GetNumRecipients (long MsgCod) { return (unsigned) DB_QueryCOUNT ("can not get number of recipients", "SELECT " "(SELECT COUNT(*)" " FROM msg_rcv" " WHERE MsgCod=%ld)" " + " "(SELECT COUNT(*)" " FROM msg_rcv_deleted" " WHERE MsgCod=%ld)", MsgCod, MsgCod); } /*****************************************************************************/ /*************** Get known recipients of a message from database *************/ /*****************************************************************************/ unsigned Msg_DB_GetKnownRecipients (MYSQL_RES **mysql_res,long MsgCod) { return (unsigned) DB_QuerySELECT (mysql_res,"can not get recipients of a message", "(SELECT msg_rcv.UsrCod," // row[0] "'N'," // row[1] "msg_rcv.Open," // row[2] "usr_data.Surname1 AS S1," // row[3] "usr_data.Surname2 AS S2," // row[4] "usr_data.FirstName AS FN" // row[5] " FROM msg_rcv," "usr_data" " WHERE msg_rcv.MsgCod=%ld" " AND msg_rcv.UsrCod=usr_data.UsrCod)" " UNION " "(SELECT msg_rcv_deleted.UsrCod," // row[0] "'Y'," // row[1] "msg_rcv_deleted.Open," // row[2] "usr_data.Surname1 AS S1," // row[3] "usr_data.Surname2 AS S2," // row[4] "usr_data.FirstName AS FN" // row[5] " FROM msg_rcv_deleted," "usr_data" " WHERE msg_rcv_deleted.MsgCod=%ld" " AND msg_rcv_deleted.UsrCod=usr_data.UsrCod)" " ORDER BY S1," "S2," "FN", MsgCod, MsgCod); } /*****************************************************************************/ /******** 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) { static const char *Table[Msg_NUM_STATUS] = { [Msg_STATUS_ALL ] = "msg_snt", [Msg_STATUS_DELETED ] = "msg_snt_deleted", [Msg_STATUS_NOTIFIED] = "msg_snt", }; /***** Get the number of messages sent from this location (all the platform, current degree or current course) from database *****/ switch (Scope) { case HieLvl_SYS: return (unsigned) DB_GetNumRowsTable (Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Cty.CtyCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Ins.InsCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Ctr.CtrCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Deg.DegCod, Table[MsgStatus]); case HieLvl_CRS: return (unsigned) DB_QueryCOUNT ("can not get number of sent messages", "SELECT COUNT(*)" " FROM %s" " WHERE CrsCod=%ld", Table[MsgStatus], 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) { static const char *Table[Msg_NUM_STATUS] = { [Msg_STATUS_ALL ] = "msg_rcv", [Msg_STATUS_DELETED ] = "msg_rcv_deleted", [Msg_STATUS_NOTIFIED] = "msg_rcv", // Not used }; /***** 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: switch (Scope) { case HieLvl_SYS: return (unsigned) DB_GetNumRowsTable (Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Cty.CtyCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Ins.InsCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Ctr.CtrCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Deg.DegCod, Table[MsgStatus]); 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[MsgStatus], Gbl.Hierarchy.Crs.CrsCod, Table[MsgStatus]); 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 a message *****************/ /*****************************************************************************/ void Msg_DB_MoveMsgContentToDeleted (long MsgCod) { /***** Move message from msg_content to msg_content_deleted *****/ /* Insert message content into msg_content_deleted */ DB_QueryINSERT ("can not remove the content of a message", "INSERT IGNORE INTO msg_content_deleted" " (MsgCod,Subject,Content,MedCod)" " SELECT MsgCod," "Subject," "Content," "MedCod" " FROM msg_content" " WHERE MsgCod=%ld", MsgCod); /* TODO: 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 a message", "DELETE FROM msg_content" " WHERE MsgCod=%ld", 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)"); } /*****************************************************************************/ /***** Insert pair (sender's code - my code) in table of banned senders ******/ /*****************************************************************************/ void Msg_DB_CreateUsrsPairIntoBanned (long FromUsrCod,long ToUsrCod) { DB_QueryREPLACE ("can not ban sender", "REPLACE INTO msg_banned" " (FromUsrCod,ToUsrCod)" " VALUES" " (%ld,%ld)", FromUsrCod, ToUsrCod); } /*****************************************************************************/ /******************** Get number of users I have banned **********************/ /*****************************************************************************/ unsigned Msg_DB_GetNumUsrsBannedBy (long UsrCod) { return (unsigned) DB_QueryCOUNT ("can not get number of users banned", "SELECT COUNT(*)" " FROM msg_banned" " WHERE ToUsrCod=%ld", UsrCod); } /*****************************************************************************/ /************************* Get users I have banned ***************************/ /*****************************************************************************/ unsigned Msg_DB_GetUsrsBannedBy (MYSQL_RES **mysql_res,long UsrCod) { 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", UsrCod); } /*****************************************************************************/ /**************** Chech if a user is banned by another user ******************/ /*****************************************************************************/ bool Msg_DB_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod) { return DB_QueryEXISTS ("can not check if a user is banned", "SELECT EXISTS" "(SELECT *" " FROM msg_banned" " WHERE FromUsrCod=%ld" " AND ToUsrCod=%ld)", FromUsrCod, ToUsrCod); } /*****************************************************************************/ /**** Remove pair (sender's code - recipient's code) from table of banned ****/ /*****************************************************************************/ void Msg_DB_RemoveUsrsPairFromBanned (long FromUsrCod,long ToUsrCod) { DB_QueryDELETE ("can not unban sender", "DELETE FROM msg_banned" " WHERE FromUsrCod=%ld" " AND ToUsrCod=%ld", FromUsrCod, ToUsrCod); } /*****************************************************************************/ /**************** Remove user from table of banned senders *******************/ /*****************************************************************************/ 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); }