38 " SELECT messageID, statusMask, labelMask "
40 " WHERE characterID = %u" , charId)) {
41 codelog(DATABASE__ERROR,
" Failed to get mail status" );
51 " SELECT m.messageID, m.senderID, m.toCharacterIDs, m.toListID, "
52 " m.toCorpOrAllianceID, m.title, m.sentDate FROM mailStatus AS s"
53 " LEFT JOIN mailMessage AS m USING (messageID) "
54 " WHERE s.characterID = %u" , charId))
59 int MailDB::SendMail(
int sender, std::vector<int>& toCharacterIDs,
int toListID,
int toCorpOrAllianceID, std::string& title, std::string& body,
int isReplyTo,
int isForwardedFrom)
63 for (
size_t i = 0; i < toCharacterIDs.size(); i++)
65 toStr += std::to_string(toCharacterIDs[i]);
67 if (i != (toCharacterIDs.size() - 1))
74 if (toCorpOrAllianceID == -1)
75 toCorpOrAllianceID = 0;
79 Buffer bodyInput(body.begin(), body.end());
83 std::string bodyCompressedStr(bodyCompressed.
begin<
char>(), bodyCompressed.
end<
char>());
86 std::string bodyEscaped;
87 sDatabase.DoEscapeString(bodyEscaped, bodyCompressedStr);
90 const int defaultLabel = 1;
97 if (!
sDatabase.RunQueryLID(err, messageID,
98 " INSERT INTO mailMessage "
99 " (senderID, toCharacterIDs, toListID, toCorpOrAllianceID, "
100 " title, body, sentDate) "
101 " VALUES (%u, '%s', %d, %d, '%s', '%s', %" PRIu64 " )" ,
102 sender, toStr.c_str(), toListID, toCorpOrAllianceID, title.c_str(),
105 codelog(DATABASE__ERROR,
" Failed to insert mailMessage" );
109 if (toCharacterIDs.size() > 0) {
110 for (
int i = 0; i < toCharacterIDs.size(); i++) {
111 uint32 id = toCharacterIDs[i];
113 " INSERT INTO mailStatus "
114 " (messageID, characterID, statusMask, labelMask)"
117 codelog(DATABASE__ERROR,
" Failed to insert mailStatus for character ids" );
126 " SELECT characterID FROM mailListUsers "
127 " WHERE listID = %u" , toListID))
129 codelog(DATABASE__ERROR,
" Failed to get mailing list members" );
137 " INSERT INTO mailStatus "
138 " (messageID, characterID, statusMask, labelMask)"
141 codelog(DATABASE__ERROR,
" Failed to insert mailStatus for character ids" );
154 if (!
sDatabase.RunQuery(res,
" SELECT body FROM mailMessage WHERE messageID = %u" ,
id))
191 " UPDATE mailMessage "
192 " SET statusMask = statusMask & ~%u "
194 codelog(DATABASE__ERROR,
" Failed to mark all as read" );
205 " UPDATE mailMessage "
206 " SET statusMask = statusMask | %u "
208 codelog(DATABASE__ERROR,
" Failed to mark all as read" );
219 " UPDATE mailMessage SET "
220 " statusMask = statusMask & ~%u "
221 " WHERE toCharacterIDs LIKE '%%%u%%' "
222 " AND (labelMask & (1 << %u)) > 0" , characterID, bit))
224 codelog(DATABASE__ERROR,
" Failed to mark all as read by label" );
236 " UPDATE mailMessage "
237 " SET statusMask = statusMask | %u "
238 " WHERE toCharacterIDs LIKE '%%%u%%' "
239 " AND (labelMask & (1 << %u)) > 0" , characterID, bit))
241 codelog(DATABASE__ERROR,
" Failed to mark all as read by label" );
250 if (messageIDs.size() == 0) {
255 std::ostringstream query;
256 query <<
" UPDATE mailMessage SET labelMask = labelMask & ~(1 << " << bit <<
" ) " ;
258 query <<
" WHERE (labelMask & (1 << " << bit <<
" )) > 0 AND (" ;
259 query <<
" messageID = " << messageIDs[0];
261 for (
int i = 1; i < messageIDs.size(); i++) {
262 query <<
" OR messageID = " << messageIDs[i];
266 _log(DATABASE__ERROR, query.str().c_str());
271 codelog(DATABASE__ERROR,
" Failed to delete labels" );
285 if (!
sDatabase.RunQuery(res,
" SELECT bit, name, color FROM mailLabel WHERE ownerID = %u" , characterID))
294 label.id = (int)pow((
float)2, row.
GetInt(0));
296 label.color = row.
GetInt(2);
308 sDatabase.RunQuery(res,
" SELECT bit FROM mailLabel WHERE ownerID = %u ORDER BY bit DESC LIMIT 1" , characterID);
322 if (!
sDatabase.RunQuery(error,
" INSERT INTO mailLabel (bit, name, color, ownerID) VALUES (%u, '%s', %u, %u)" , bit, args.name.
c_str(), args.color, characterID))
324 codelog(DATABASE__ERROR,
" Failed to insert new mail label into database" );
331 newID = (
uint32)pow((
float)2, bit);
340 " UPDATE mailMessage "
341 " SET labelMask = labelMask & ~(1 << ~%u) "
342 " WHERE (labelMask & (1 << %u)) > 0 "
343 " AND toCharacterIDs LIKE '%%%u%%';" , bit, bit, characterID))
345 codelog(DATABASE__ERROR,
" Failed to delete label" );
350 " DELETE FROM mailLabel "
351 " WHERE ownerID = %u AND bit = %u;" , characterID, bit);
359 if (args.name.length() == 0) {
360 sDatabase.RunQuery(error,
" UPDATE mailLabel SET color = %u WHERE bit = %u AND ownerID = %u" , args.color, bit, characterID);
361 }
else if (args.color == -1) {
362 sDatabase.RunQuery(error,
" UPDATE mailLabel SET name = '%s' WHERE bit = %u AND ownerID = %u" , args.name.
c_str(), bit, characterID);
364 sDatabase.RunQuery(error,
" UPDATE mailLabel SET name = '%s', color = %u WHERE bit = %u AND ownerID = %u" , args.name.
c_str(), args.color, bit, characterID);
379 " DELETE FROM mailStatus "
380 " WHERE messageID = %u;" , messageID)) {
382 codelog(DATABASE__ERROR,
" Failed to delete mail" );
390 " DELETE FROM mailMessage "
391 " WHERE senderID = %u "
393 codelog(DATABASE__ERROR,
" Failed to deleted trash mails" );
401 " UPDATE mailMessage "
402 " WHERE senderID = %u "
404 codelog(DATABASE__ERROR,
" Failed to move all from trash" );
412 " UPDATE mailMessage "
413 " WHERE characterID LIKE '%%%u%%' "
415 codelog(DATABASE__ERROR,
" Failed to move message to trash" );
424 " UPDATE mailMessage "
425 " WHERE messageID = %u "
427 codelog(DATABASE__ERROR,
" Failed to move message to trash" );
439 " UPDATE mailMessage "
440 " SET labelMask = -1 "
441 " WHERE toCharacterIDs LIKE '%%%u%%' "
442 " AND (labelMask & (1 << %u)) > 0" , characterID, bit))
444 codelog(DATABASE__ERROR,
" Failed to move message to trash by label" );
450 if (messageIDs.size() == 0) {
454 std::ostringstream query;
456 query <<
" UPDATE mailStatus SET statusMask = statusMask | " << mask <<
" WHERE " ;
457 query <<
" messageID = " << messageIDs[0];
458 for (
int i = 1; i < messageIDs.size(); i++) {
459 query <<
" OR messageID = " << messageIDs[i];
465 codelog(DATABASE__ERROR,
" Failed apply status mask" );
471 if (messageIDs.size() == 0) {
475 std::ostringstream query;
477 query <<
" UPDATE mailStatus SET statusMask = statusMask & ~" << mask <<
" WHERE " ;
478 query <<
" messageID = " << messageIDs[0];
479 for (
int i = 1; i < messageIDs.size(); i++) {
480 query <<
" OR messageID = " << messageIDs[i];
486 codelog(DATABASE__ERROR,
" Failed to remove status mask" );
494 " UPDATE mailStatus "
495 " SET statusMask = statusMask | %u "
496 " WHERE messageID = %u" , mask, messageID)) {
497 codelog(DATABASE__ERROR,
" Failed to apply status mask" );
506 " UPDATE mailStatus "
507 " SET statusMask = statusMask & ~%u "
508 " WHERE messageID = %u" , mask, messageID)) {
509 codelog(DATABASE__ERROR,
" Failed to remove status mask" );
519 " UPDATE mailStatus "
520 " SET labelMask = (labelMask | %u) "
521 " WHERE messageID = %u;" , mask, messageID))
523 codelog(DATABASE__ERROR,
" Failed to apply label mask to message" );
532 " UPDATE mailStatus "
533 " SET labelMask = (labelMask & ~%u) "
534 " WHERE messageID = %u;" , mask, messageID))
536 codelog(DATABASE__ERROR,
" Failed to apply label mask to message" );
544 if (messageIDs.size() == 0) {
548 std::ostringstream query;
549 query <<
" UPDATE mailStatus SET labelMask = labelMask | " << mask <<
" " ;
551 query <<
" WHERE messageID = " << messageIDs[0];
553 for (
int i = 1; i < messageIDs.size(); i++) {
554 query <<
" OR messageID = " << messageIDs[i];
557 _log(DATABASE__ERROR, query.str().c_str());
562 codelog(DATABASE__ERROR,
" Failed to apply labels" );
571 if (messageIDs.size() == 0) {
575 std::ostringstream query;
576 query <<
" UPDATE mailStatus SET labelMask = labelMask & ~" << mask <<
" " ;
578 query <<
" WHERE messageID = " << messageIDs[0];
580 for (
int i = 1; i < messageIDs.size(); i++) {
581 query <<
" OR messageID = " << messageIDs[i];
584 _log(DATABASE__ERROR, query.str().c_str());
589 codelog(DATABASE__ERROR,
" Failed to apply labels" );
598 for (
int i = 0; i < (
sizeof(int)*8); i++)
599 if ((
id & (1 << i)) > 0)
603 sLog.Error(
" MailDB::BitFromLabelID" ,
" ERROR: Could not get bit." );
614 " SELECT l.id, l.displayName, l.defaultAccess, l.defaultMemberAccess, l.cost,"
615 " u.listID, u.characterID, u.role, u.access"
616 " FROM mailListUsers AS u "
617 " LEFT JOIN mailList AS l ON l.id = u.listID "
618 " WHERE u.characterID = %u" , characterID))
620 codelog(DATABASE__ERROR,
" Failed to get joined mailing lists" );
666 " INSERT INTO mailList "
667 " (displayName, defaultAccess, defaultMemberAccess, cost) "
668 " VALUES( '%s', %u, %u, %u) " , name.
c_str(), defaultAccess,
669 defaultMemberAccess, cost))
671 codelog(DATABASE__ERROR,
" Failed to create mailing list" );
676 " INSERT INTO mailListUsers "
677 " (listID, characterID, role, access) "
681 codelog(DATABASE__ERROR,
" Failed to insert owner of mailing list" );
692 " SELECT listID, characterID, role, access FROM mailListUsers "
693 " WHERE listID = %u" , listID))
695 codelog(DATABASE__ERROR,
" Failed to get mailing list members" );
719 " SELECT id, displayName, defaultAccess, defaultMemberAccess, cost FROM mailList "
720 " WHERE id = %u" , listID))
722 codelog(DATABASE__ERROR,
" Failed to get mailing list settings" );
728 codelog(DATABASE__ERROR,
" mailList didn't give us a row" );
739 " SELECT listID, characterID, role, access FROM mailListUsers "
740 " WHERE listID = %u" , listID))
742 codelog(DATABASE__ERROR,
" Failed to get mailing list settings" );
755 return new PyObject(
" util.KeyVal" , ret);
765 " SET defaultAccess = %u, defaultMemberAccess = %u, cost = %u "
766 " WHERE id = %u" , defaultAccess, defaultMemberAccess, cost, listID))
768 codelog(DATABASE__ERROR,
" Failed to update mailing list defaults" );
PyRep * GetLabels(int characterID) const
void DeleteMail(int32 messageID)
void MarkAllAsUnreadByLabel(uint32 characterID, int labelID)
void DeleteLabel(int characterID, int labelID) const
uint32 ColumnLength(uint32 index) const
const char * GetText(uint32 index) const
#define _log(type, fmt,...)
PyObjectEx * DBResultToCRowset(DBQueryResult &result)
#define mailingListMemberMuted
int32 GetInt(uint32 index) const
void MoveToTrashByLabel(int32 characterID, int32 labelID)
void EditLabel(int characterID, Call_EditLabel &args) const
void MoveAllToTrash(uint32 characterID)
void SetMailingListDefaultAccess(int32 listID, int32 defaultAccess, int32 defaultMemberAccess, int32 cost)
void RemoveLabelMask(int32 messageID, int mask)
static int BitFromLabelID(int id)
PyDict * GetJoinedMailingLists(uint32 characterID)
void ApplyLabelMasks(std::vector< int32 > messageIDs, int mask)
void DeleteMailingList(uint32 characterID, int32 listID)
void RemoveStatusMask(int32 messageID, int mask)
#define mailingListMemberOwner
void ApplyStatusMask(int32 messageID, int mask)
void RemoveStatusMasks(std::vector< int32 > messageIDs, int mask)
void SetMailUnread(int id)
bool GetRow(DBResultRow &into)
#define sLog
Evaluates to a NewLog instance.
void MarkAllAsReadByLabel(uint32 characterID, int labelID)
Generic class for buffers.
const char * c_str() const
void LeaveMailingList(uint32 characterID, int32 listID)
#define codelog(type, fmt,...)
void EmptyTrash(uint32 characterID)
bool DeflateData(Buffer &data)
Deflates given data.
PyDict * GetMailingListMembers(int32 listID)
void MoveToTrash(int32 messageID)
#define mailingListMemberOperator
void ApplyLabel(int32 messageID, int labelID)
void MarkAllAsRead(uint32 characterID)
uint32 CreateMailingList(uint32 creator, std::string name, int32 defaultAccess, int32 defaultMemberAccess, int32 cost)
void ApplyLabels(std::vector< int32 > messageIDs, int labelID)
void MarkAllAsUnread(uint32 characterID)
bool IsNull(uint32 index) const
int SendMail(int sender, std::vector< int > &toCharacterIDs, int toListID, int toCorpOrAllianceID, std::string &title, std::string &body, int isReplyTo, int isForwardedFrom)
void MailingListSetEntityAccess(int32 entity, int32 access, int32 listID)
void ApplyLabelMask(int32 messageID, int mask)
PyRep * GetNewMail(int charId)
PyString * GetMailBody(int id) const
void MoveFromTrash(int32 messageID)
PyRep * GetMailStatus(int charId)
PyObject * MailingListGetSettings(int32 listID)
void SetMailsRead(std::vector< int32 > ids)
void MailingListClearEntityAccess(int32 entity, int32 listID)
void JoinMailingList(uint32 characterID, std::string name)
bool CreateLabel(int characterID, Call_CreateLabel &args, uint32 &newID) const
#define mailingListAllowed
void RemoveLabelMasks(std::vector< int32 > messageIDs, int mask)
void SetItem(PyRep *key, PyRep *value)
SetItem adds or sets a database entry.
void RemoveLabels(std::vector< int32 > messageIDs, int labelID)
void ApplyStatusMasks(std::vector< int32 > messageIDs, int mask)
void SetItemString(const char *key, PyRep *value)
SetItemString adds or sets a database entry.
void SetMailsUnread(std::vector< int32 > ids)
void MoveAllFromTrash(uint32 characterID)