package com.juick.service; import com.juick.Message; import com.juick.Tag; import com.juick.User; import com.juick.server.helpers.PrivacyOpts; import com.juick.util.MessageUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import javax.inject.Inject; import java.sql.*; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * Created by aalexeev on 11/13/16. */ @Repository public class MessagesServiceImpl extends BaseJdbcService implements MessagesService { private final UserService userService; @Inject public MessagesServiceImpl(JdbcTemplate jdbcTemplate, UserService userService) { super(jdbcTemplate, null); Assert.notNull(userService); this.userService = userService; } private class MessageMapper implements RowMapper { @Override public Message mapRow(ResultSet rs, int rowNum) throws SQLException { Message msg = new Message(); msg.setMid(rs.getInt(1)); msg.setRid(rs.getInt(2)); msg.setReplyto(rs.getInt(3)); User user = new User(); user.setUid(rs.getInt(4)); user.setName(rs.getString(5)); user.setBanned(rs.getBoolean(6)); msg.setUser(user); msg.TimeAgo = rs.getInt(7); msg.setDate(rs.getTimestamp(8)); msg.ReadOnly = rs.getBoolean(9); msg.setPrivacy(rs.getInt(10)); msg.FriendsOnly = msg.getPrivacy() < 0; msg.Replies = rs.getInt(11); msg.AttachmentType = rs.getString(12); if (rs.getDouble(13) != 0) { msg.Place = new com.juick.Place(); msg.Place.lat = rs.getDouble(14); msg.Place.lon = rs.getDouble(15); } msg.Likes = rs.getInt(16); msg.Hidden = rs.getBoolean(17); // parse tags string String tagsStr = rs.getString(18); if (tagsStr != null) { Arrays.stream(tagsStr.split(" ")).forEach(t -> msg.getTags().add(new Tag(t))); } msg.RepliesBy = rs.getString(19); msg.setText(rs.getString(20)); msg.setReplyQuote(MessageUtils.formatQuote(rs.getString(21))); return msg; } } @Transactional @Override public int createMessage(final int uid, final String txt, final String attachment, final List tags) { KeyHolder holder = new GeneratedKeyHolder(); getJdbcTemplate().update(con -> { PreparedStatement stmt = con.prepareStatement( "INSERT INTO messages(user_id,attach) VALUES (?,?)", Statement.RETURN_GENERATED_KEYS); stmt.setInt(1, uid); if (attachment != null) { stmt.setString(2, attachment); } else { stmt.setNull(2, Types.VARCHAR); } return stmt; }, holder); int mid = holder.getKey().intValue(); if (mid > 0) { String tagsNames = ""; String tagsIDs = ""; for (int i = 0; i < tags.size(); i++) { if (i > 0) { tagsNames += " "; tagsIDs += ","; } tagsNames += tags.get(i).getName(); tagsIDs += "(" + mid + "," + tags.get(i).TID + ")"; } if (tags.size() > 0) { getJdbcTemplate().execute( "INSERT INTO messages_tags(message_id,tag_id) VALUES " + tagsIDs); } final String finalTagsNames = tagsNames; getJdbcTemplate().update(con -> { PreparedStatement stmt = con.prepareStatement( "INSERT INTO messages_txt(message_id,tags,txt) " + "VALUES (?,?,?)", Statement.NO_GENERATED_KEYS); stmt.setInt(1, mid); if (finalTagsNames.isEmpty()) { stmt.setNull(2, Types.VARCHAR); } else { stmt.setString(2, finalTagsNames); } stmt.setString(3, txt); return stmt; }); } return mid; } @Transactional @Override public int createReply(final int mid, final int rid, final int uid, final String txt, final String attachment) { int ridnew = getReplyIDIncrement(mid); getJdbcTemplate().update(con -> { PreparedStatement stmt = con.prepareStatement( "INSERT INTO replies(message_id,reply_id,user_id,replyto,attach,txt) VALUES (?,?,?,?,?,?)", Statement.NO_GENERATED_KEYS); stmt.setInt(1, mid); stmt.setInt(2, ridnew); stmt.setInt(3, uid); stmt.setInt(4, rid); if (attachment != null) { stmt.setString(5, attachment); } else { stmt.setNull(5, Types.VARCHAR); } stmt.setString(6, txt); return stmt; }); if (ridnew > 0) getJdbcTemplate().update( "UPDATE messages SET replies=replies+1 WHERE message_id=?", mid); return ridnew; } @Override public int getReplyIDIncrement(final int mid) { return getJdbcTemplate().execute((ConnectionCallback) conn -> { conn.setAutoCommit(false); final int replyNo; try (PreparedStatement ps = conn.prepareStatement("START TRANSACTION")) { ps.executeUpdate(); } try (PreparedStatement ps = conn.prepareStatement("SELECT maxreplyid+1 FROM messages WHERE message_id=? FOR UPDATE")) { ps.setInt(1, mid); try (ResultSet resultSet = ps.executeQuery()) { if (resultSet.next()) { replyNo = resultSet.getInt(1); } else { throw new IncorrectResultSizeDataAccessException("while getting getReplyIDIncrement, mid=" + mid, 1, 0); } } } try (PreparedStatement ps = conn.prepareStatement("UPDATE messages SET maxreplyid=? WHERE message_id=?")) { ps.setInt(1, replyNo); ps.setInt(2, mid); if (ps.executeUpdate() != 1) { throw new IncorrectResultSizeDataAccessException("Cannot find a message to update: " + mid, 1, 0); } } conn.commit(); return replyNo; }); } @Transactional @Override public boolean recommendMessage(final int mid, final int vuid) { boolean res = getJdbcTemplate().update( "INSERT IGNORE INTO favorites(user_id,message_id) VALUES (" + vuid + "," + mid + ")") == 1; if (res) { getJdbcTemplate().update( "UPDATE messages SET likes=likes+1 WHERE message_id=?", mid); } return res; } @Transactional(readOnly = true) @Override public boolean canViewThread(final int mid, final int uid) { PrivacyOpts privacyOpts; try { privacyOpts = getJdbcTemplate().queryForObject( "SELECT user_id,privacy FROM messages WHERE messages.message_id=?", (rs, rowNum) -> { PrivacyOpts res = new PrivacyOpts(); res.setUid(rs.getInt(1)); res.setPrivacy(rs.getInt(2)); return res; }, mid); } catch (EmptyResultDataAccessException e) { return true; } return privacyOpts.getPrivacy() >= 0 || uid == privacyOpts.getUid() || ((privacyOpts.getPrivacy() == -1 || privacyOpts.getPrivacy() == -2) && uid > 0 && userService.isInWL(privacyOpts.getUid(), uid)); } @Transactional(readOnly = true) @Override public boolean isReadOnly(final int mid) { try { return getJdbcTemplate().queryForObject( "SELECT readonly FROM messages WHERE message_id=?", new Object[]{mid}, Integer.class) == 1; } catch (EmptyResultDataAccessException e) { return false; } } @Transactional(readOnly = true) @Override public boolean isSubscribed(final int uid, final int mid) { try { return getJdbcTemplate().queryForObject( "SELECT 1 FROM subscr_messages WHERE suser_id=? AND message_id=?", new Object[]{uid, mid}, Integer.class) == 1; } catch (EmptyResultDataAccessException e) { return false; } } @Transactional(readOnly = true) @Override public int getMessagePrivacy(final int mid) { try { return getJdbcTemplate().queryForObject( "SELECT privacy FROM messages WHERE message_id=?", new Object[]{mid}, Integer.class); } catch (EmptyResultDataAccessException e) { return -4; } } @Transactional(readOnly = true) @Override public com.juick.Message getMessage(final int mid) { try { return getJdbcTemplate().queryForObject( "SELECT messages.message_id, 0 as rid, 0 as replyto, " + "messages.user_id,users.nick, 0 as banned, " + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," + "messages.ts," + "messages.readonly,messages.privacy,messages.replies," + "messages.attach,messages.place_id,messages.lat," + "messages.lon,messages.likes,messages.hidden," + "txt.tags,txt.repliesby,txt.txt, '' as q FROM messages " + "INNER JOIN users ON messages.user_id=users.id " + "INNER JOIN messages_txt AS txt " + "ON messages.message_id=txt.message_id " + "WHERE messages.message_id=?", new MessageMapper(), mid); } catch (EmptyResultDataAccessException e) { return null; } } @Transactional(readOnly = true) @Override public com.juick.Message getReply(final int mid, final int rid) { try { return getJdbcTemplate().queryForObject( "SELECT replies.user_id,users.nick," + "replies.replyto,replies.ts," + "replies.attach,replies.txt, IFNULL(q.txt,t.txt) as quote FROM replies INNER JOIN users " + "ON replies.user_id=users.id " + "LEFT JOIN replies q " + "ON replies.message_id=q.message_id and replies.replyto=q.reply_id " + "LEFT JOIN messages_txt t ON replies.message_id=t.message_id " + "WHERE replies.message_id=? AND replies.reply_id=?", (rs, num) -> { Message msg = new Message(); msg.setMid(mid); msg.setRid(rid); msg.setUser(new User()); msg.getUser().setUid(rs.getInt(1)); msg.getUser().setName(rs.getString(2)); msg.setReplyto(rs.getInt(3)); msg.setDate(rs.getTimestamp(4)); msg.AttachmentType = rs.getString(5); msg.setText(rs.getString(6)); String quote = rs.getString(7); if (!StringUtils.isEmpty(quote)) { msg.setReplyQuote(MessageUtils.formatQuote(quote)); } return msg; }, mid, rid); } catch (EmptyResultDataAccessException e) { return null; } } @Transactional(readOnly = true) @Override public User getMessageAuthor(final int mid) { try { return getJdbcTemplate().queryForObject( "SELECT messages.user_id,users.nick " + "FROM messages INNER JOIN users " + "ON messages.user_id=users.id WHERE messages.message_id=?", new Object[]{mid}, (rs, num) -> { User res = new com.juick.User(); res.setUid(rs.getInt(1)); res.setName(rs.getString(2)); return res; }); } catch (EmptyResultDataAccessException e) { return null; } } @Transactional(readOnly = true) @Override public List getMessageTags(final int mid) { return getJdbcTemplate().query( "SELECT tags.tag_id,synonym_id,name,stat_messages FROM tags " + "INNER JOIN messages_tags ON (messages_tags.message_id=? AND messages_tags.tag_id=tags.tag_id)", new Object[]{mid}, (rs, num) -> { com.juick.Tag t = new com.juick.Tag(StringEscapeUtils.unescapeHtml4(rs.getString(3))); t.TID = rs.getInt(1); t.SynonymID = rs.getInt(2); t.UsageCnt = rs.getInt(4); return t; }); } @Transactional(readOnly = true) @Override public List getMessageTagsIDs(final int mid) { return getJdbcTemplate().queryForList( "SELECT tag_id FROM messages_tags WHERE message_id=?", new Object[]{mid}, Integer.class); } @Transactional(readOnly = true) @Override public List getMessageRecommendations(final int mid) { return getJdbcTemplate().queryForList( "SELECT users.nick FROM favorites INNER JOIN users " + "ON (favorites.message_id=? AND favorites.user_id=users.id)", new Object[]{mid}, String.class); } @Transactional(readOnly = true) @Override public List getAll(final int visitor_uid, final int before) { if (visitor_uid > 1) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE message_id0 OR user_id=?) AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", new Object[]{before, visitor_uid, visitor_uid}, Integer.class); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE hidden=0" + " AND (privacy>0 OR user_id=?)" + " AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?)" + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", new Object[]{visitor_uid, visitor_uid}, Integer.class); } } else { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE message_id0 AND user_id NOT IN (SELECT id from users WHERE banned=1) " + " ORDER BY message_id DESC LIMIT 20", new Object[]{before}, Integer.class); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE hidden=0 AND privacy>0" + " AND user_id NOT IN (SELECT id from users WHERE banned=1) ORDER BY message_id DESC LIMIT 20", Integer.class); } } } @Transactional(readOnly = true) @Override public List getTag(final int tid, final int visitor_uid, final int before, final int cnt) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM (tags INNER JOIN messages_tags " + "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + "INNER JOIN messages USING(message_id) WHERE messages.message_id0 OR messages.user_id=?) ORDER BY message_id DESC LIMIT ?", new Object[]{tid, tid, before, visitor_uid, cnt}, Integer.class); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM (tags INNER JOIN messages_tags " + "ON ((tags.synonym_id=? OR tags.tag_id=?) AND tags.tag_id=messages_tags.tag_id)) " + "INNER JOIN messages USING(message_id) WHERE messages.privacy>0 OR messages.user_id=? " + "ORDER BY message_id DESC LIMIT ?", new Object[]{tid, tid, visitor_uid, cnt}, Integer.class); } } @Transactional(readOnly = true) @Override public List getTags(final String tids, final int visitor_uid, final int before, final int cnt) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT messages.message_id FROM messages_tags " + "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + "AND messages.message_id0 OR messages.user_id=?) " + "ORDER BY messages.message_id DESC LIMIT ?", new Object[]{before, visitor_uid, cnt}, Integer.class); } else { return getJdbcTemplate().queryForList( "SELECT messages.message_id FROM messages_tags " + "INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id IN (" + tids + ") " + "AND (messages.privacy>0 OR messages.user_id=?) " + "ORDER BY messages.message_id DESC LIMIT ?", new Object[]{visitor_uid, cnt}, Integer.class); } } @Transactional(readOnly = true) @Override public List getPlace(final int place_id, final int visitor_uid, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE place_id=? AND message_id0 OR user_id=?) ORDER BY message_id DESC LIMIT 20", new Object[]{place_id, before, visitor_uid}, Integer.class); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE place_id=? AND (privacy>0 OR user_id=?) " + "ORDER BY message_id DESC LIMIT 20", new Object[]{place_id, visitor_uid}, Integer.class); } } @Transactional(readOnly = true) @Override public List getMyFeed(final int uid, final int before) { List mids; if (before > 0) { mids = getJdbcTemplate().queryForList( "SELECT message_id FROM messages " + "INNER JOIN subscr_users ON (subscr_users.suser_id=? AND subscr_users.user_id=messages.user_id) " + "WHERE message_id=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", Integer.class, uid, before, uid); } else { mids = getJdbcTemplate().queryForList( "SELECT message_id FROM messages " + "INNER JOIN subscr_users ON (subscr_users.suser_id=? " + "AND subscr_users.user_id=messages.user_id) " + "WHERE (privacy>=0 OR (privacy>=-2 AND privacy<=-1 AND messages.user_id " + "IN (SELECT user_id FROM wl_users WHERE wl_user_id=?))) ORDER BY message_id DESC LIMIT 20", Integer.class, uid, uid); } if (before > 0) { mids.addAll(getJdbcTemplate().queryForList( "SELECT message_id FROM messages " + "WHERE user_id=? AND message_id getPrivate(final int uid, final int before) { if (before > 0) { return getJdbcTemplate().queryForList ("SELECT message_id FROM messages WHERE user_id=? AND privacy<0 AND message_id getDiscussions(final int uid, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM subscr_messages WHERE suser_id=? AND message_id getRecommended(final int uid, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM favorites WHERE user_id " + "IN (SELECT user_id FROM subscr_users WHERE suser_id=?) AND message_id getPopular(final int visitor_uid, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE message_id0 " + "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + "ORDER BY message_id DESC LIMIT 20", Integer.class, before, visitor_uid); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE privacy>0 " + "AND popular>0 AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + "ORDER BY message_id DESC LIMIT 20", Integer.class, visitor_uid); } } @Transactional(readOnly = true) @Override public List getPhotos(final int visitor_uid, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE message_id0 OR user_id=?) " + "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + "ORDER BY message_id DESC LIMIT 20", Integer.class, before, visitor_uid, visitor_uid); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE (privacy>0 OR user_id=?) " + "AND attach IS NOT NULL AND user_id NOT IN (SELECT id from users WHERE banned=1) " + "AND user_id NOT IN (SELECT bl_user_id FROM bl_users WHERE user_id=?) " + "ORDER BY message_id DESC LIMIT 20", Integer.class, visitor_uid, visitor_uid); } } @Transactional(readOnly = true) @Override public List getSearch(final JdbcTemplate sqlSearch, final String search, final int before) { List mids; if (before > 0) { mids = sqlSearch.queryForList( "SELECT id AS message_id FROM messages WHERE MATCH(?) AND id 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE message_id " + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>0 ORDER BY message_id DESC LIMIT 20", Integer.class); } return mids; } @Transactional(readOnly = true) @Override public List getUserBlog(final int UID, final int privacy, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE user_id=? AND message_id=" + privacy + " ORDER BY message_id DESC LIMIT 20", Integer.class, UID, before); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + " ORDER BY message_id DESC LIMIT 20", Integer.class, UID); } } @Transactional(readOnly = true) @Override public List getUserTag(final int UID, final int TID, final int privacy, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT messages.message_id FROM messages_tags INNER JOIN messages " + "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + "AND messages.message_id=" + privacy + " ORDER BY messages.message_id DESC LIMIT 20", Integer.class, UID, TID, before); } else { return getJdbcTemplate().queryForList( "SELECT messages.message_id FROM messages_tags INNER JOIN messages " + "USING(message_id) WHERE messages.user_id=? AND messages_tags.tag_id=? " + "AND messages.privacy>=" + privacy + " ORDER BY messages.message_id DESC LIMIT 20", Integer.class, UID, TID); } } @Transactional(readOnly = true) @Override public List getUserRecommendations(final int UID, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM favorites " + "WHERE user_id=? AND message_id getUserPhotos(final int UID, final int privacy, final int before) { if (before > 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE user_id=? AND message_id=" + privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", new Object[]{UID, before}, Integer.class); } else { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20", new Object[]{UID}, Integer.class); } } @Transactional(readOnly = true) @Override public List getUserSearch(final JdbcTemplate sqlSearch, final int UID, final String search, final int privacy, final int before) { List mids; if (before > 0) { mids = sqlSearch.queryForList( "SELECT id AS message_id FROM messages WHERE user_id=? AND MATCH(?) AND id 0) { return getJdbcTemplate().queryForList( "SELECT message_id FROM messages WHERE message_id IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") AND privacy>=" + privacy + " ORDER BY message_id DESC", Integer.class); } return mids; } @Transactional(readOnly = true) @Override public List getMessages(final List mids) { if (!mids.isEmpty()) { return getJdbcTemplate().query( "SELECT messages.message_id, 0 as rid, 0 as replyto, " + "messages.user_id,users.nick, 0 as banned, " + "TIMESTAMPDIFF(MINUTE,messages.ts,NOW())," + "messages.ts," + "messages.readonly,messages.privacy,messages.replies," + "messages.attach,messages.place_id,messages.lat," + "messages.lon,messages.likes,messages.hidden," + "messages_txt.tags,messages_txt.repliesby, messages_txt.txt, '' as q " + "FROM (messages INNER JOIN messages_txt " + "ON messages.message_id=messages_txt.message_id) " + "INNER JOIN users ON messages.user_id=users.id " + "WHERE messages.message_id " + "IN (" + StringUtils.arrayToCommaDelimitedString(mids.toArray()) + ") " + "ORDER BY messages.message_id DESC", new MessageMapper()); } return Collections.emptyList(); } @Transactional(readOnly = true) @Override public List getReplies(final int mid) { return getJdbcTemplate().query( "SELECT ? as mid, replies.reply_id,replies.replyto, " + "replies.user_id,users.nick,users.banned, " + "TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts," + "0 as readonly, 0 as privacy, 0 as replies," + "replies.attach, 0 as place_id, 0 as lat," + "0 as lon, 0 as likes, 0 as hidden," + "NULL as tags,NULL as repliesby, replies.txt, " + "IFNULL(qw.txt, t.txt) as q " + "FROM replies INNER JOIN users " + "ON replies.user_id=users.id " + "LEFT JOIN replies qw ON replies.message_id=qw.message_id and replies.replyto=qw.reply_id " + "LEFT JOIN messages_txt t on replies.message_id=t.message_id " + "WHERE replies.message_id=? " + "ORDER BY replies.reply_id ASC", new MessageMapper(), mid, mid); } @Transactional @Override public boolean setMessagePopular(final int mid, final int popular) { boolean ret; switch (popular) { case -2: ret = getJdbcTemplate().update("UPDATE messages SET hidden=1 WHERE message_id=?", mid) > 0; break; case -1: ret = getJdbcTemplate().update("UPDATE messages SET popular=0 WHERE message_id=?", mid) > 0; break; default: ret = getJdbcTemplate().update("UPDATE messages SET popular=? WHERE message_id=?", popular, mid) > 0; break; } if (popular == -1) { ret = getJdbcTemplate().update("INSERT INTO top_ignore_messages VALUES (?)", mid) > 0; } return ret; } @Transactional @Override public boolean setMessagePrivacy(final int mid) { return getJdbcTemplate().update("UPDATE messages SET privacy=1 WHERE message_id=?", mid) > 0; } @Transactional @Override public boolean deleteMessage(final int uid, final int mid) { if (getJdbcTemplate().update("DELETE FROM messages WHERE message_id=? AND user_id=?", mid, uid) > 0) { getJdbcTemplate().update("DELETE FROM messages_txt WHERE message_id=?", mid); getJdbcTemplate().update("DELETE FROM replies WHERE message_id=?", mid); getJdbcTemplate().update("DELETE FROM subscr_messages WHERE message_id=?", mid); getJdbcTemplate().update("DELETE FROM messages_tags WHERE message_id=?", mid); return true; } return false; } }