/* * Juick * Copyright (C) 2008-2011, Ugnich Anton * * 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 . */ package com.juick.server; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; /** * * @author Ugnich Anton */ public class MessagesQueries { public static boolean canViewThread(Connection sql, int mid, int uid) { int privacy = 0; int owner_uid = 0; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT user_id,privacy FROM messages WHERE messages.message_id=?"); stmt.setInt(1, mid); rs = stmt.executeQuery(); if (rs.first()) { owner_uid = rs.getInt(1); privacy = rs.getInt(2); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return privacy >= 0 || uid == owner_uid || ((privacy == -1 || privacy == -2) && uid > 0 && UserQueries.isInWL(sql, owner_uid, uid)) || (privacy == -3 && uid > 0 && hasAccessToMessage(sql, mid, uid)); } public static boolean hasAccessToMessage(Connection sql, int mid, int uid) { boolean ret = false; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT 1 FROM messages_access WHERE message_id=? AND user_id=?"); stmt.setInt(1, mid); stmt.setInt(2, uid); rs = stmt.executeQuery(); if (rs.first()) { ret = rs.getInt(1) == 1; } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return ret; } public static boolean isReadOnly(Connection sql, int mid) { boolean ret = false; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT readonly FROM messages WHERE message_id=?"); stmt.setInt(1, mid); rs = stmt.executeQuery(); if (rs.first()) { ret = rs.getInt(1) == 1; } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return ret; } public static boolean isSubscribed(Connection sql, int uid, int mid) { boolean ret = false; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT 1 FROM subscr_messages WHERE suser_id=? AND message_id=?"); stmt.setInt(1, uid); stmt.setInt(2, mid); rs = stmt.executeQuery(); if (rs.first()) { ret = rs.getInt(1) == 1; } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return ret; } public static com.juick.Message getMessage(Connection sql, int mid) { com.juick.Message msg = null; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT messages.user_id,users.nick,TIMESTAMPDIFF(MINUTE,messages.ts,NOW()),messages.ts,messages.readonly,messages.privacy,messages.replies,messages.attach,messages.place_id,messages.lat,messages.lon FROM messages INNER JOIN users ON messages.user_id=users.id WHERE messages.message_id=?"); stmt.setInt(1, mid); rs = stmt.executeQuery(); if (rs.first()) { msg = new com.juick.Message(); msg.MID = mid; msg.User = new com.juick.User(); msg.User.UID = rs.getInt(1); msg.User.UName = rs.getString(2); msg.TimeAgo = rs.getInt(3); msg.TimestampString = rs.getString(4); msg.ReadOnly = rs.getBoolean(5); msg.Privacy = rs.getInt(6); msg.Replies = rs.getInt(7); msg.AttachmentType = rs.getString(8); if (rs.getInt(9) > 0) { msg.Place = PlacesQueries.getPlace(sql, rs.getInt(9)); } if (rs.getDouble(10) != 0) { msg.Place = new com.juick.Place(); msg.Place.lat = rs.getDouble(10); msg.Place.lon = rs.getDouble(11); } } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } if (msg == null) { return null; } try { stmt = sql.prepareStatement("SELECT tags,repliesby,txt FROM messages_txt WHERE message_id=?"); stmt.setInt(1, mid); rs = stmt.executeQuery(); if (rs.first()) { if (rs.getString(1) != null) { msg.parseTags(rs.getString(1)); } msg.RepliesBy = rs.getString(2); msg.Text = rs.getString(3); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return msg; } public static com.juick.Message getReply(Connection sql, int mid, int rid) { com.juick.Message msg = null; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT replies.user_id,users.nick,replies.replyto,replies.ts,replies.attach,replies.txt FROM replies INNER JOIN users ON replies.user_id=users.id WHERE replies.message_id=? AND replies.reply_id=?"); stmt.setInt(1, mid); stmt.setInt(2, rid); rs = stmt.executeQuery(); if (rs.first()) { msg = new com.juick.Message(); msg.MID = mid; msg.RID = rid; msg.User = new com.juick.User(); msg.User.UID = rs.getInt(1); msg.User.UName = rs.getString(2); msg.ReplyTo = rs.getInt(3); msg.TimestampString = rs.getString(4); msg.AttachmentType = rs.getString(5); msg.Text = rs.getString(6); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return msg; } public static com.juick.User getMessageAuthor(Connection sql, int mid) { com.juick.User user = null; PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT messages.user_id,users.nick FROM messages INNER JOIN users ON messages.user_id=users.id WHERE messages.message_id=?"); stmt.setInt(1, mid); rs = stmt.executeQuery(); if (rs.first()) { user = new com.juick.User(); user.UID = rs.getInt(1); user.UName = rs.getString(2); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return user; } public static ArrayList getMessageRecommendations(Connection sql, int mid) { ArrayList users = new ArrayList(); PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT users.nick FROM favorites INNER JOIN users ON (favorites.message_id=? AND favorites.user_id=users.id)"); stmt.setInt(1, mid); rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { users.add(rs.getString(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return users; } public static ArrayList getAll(Connection sql, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT messages.message_id FROM messages WHERE messages.message_id0 ORDER BY messages.message_id DESC LIMIT 20"); stmt.setInt(1, before); } else { stmt = sql.prepareStatement("SELECT messages.message_id FROM messages WHERE messages.privacy>0 ORDER BY messages.message_id DESC LIMIT 20"); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getTag(Connection sql, int tid, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT messages.message_id FROM messages_tags INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id=? AND messages.message_id0 ORDER BY messages.message_id DESC LIMIT 20"); stmt.setInt(1, tid); stmt.setInt(2, before); } else { stmt = sql.prepareStatement("SELECT messages.message_id FROM messages_tags INNER JOIN messages USING(message_id) WHERE messages_tags.tag_id=? AND messages.privacy>0 ORDER BY messages.message_id DESC LIMIT 20"); stmt.setInt(1, tid); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getPlace(Connection sql, int place_id, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE place_id=? AND message_id0 ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, place_id); stmt.setInt(2, before); } else { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE place_id=? AND privacy>0 ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, place_id); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getMyFeed(Connection sql, int uid, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("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=-1 AND messages.user_id IN (SELECT user_id FROM wl_users WHERE wl_user_id=?)) AND message_id NOT IN (SELECT message_id FROM messages_tags WHERE tag_id IN (SELECT tag_id FROM bl_tags WHERE user_id=?)) ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, uid); stmt.setInt(2, before); stmt.setInt(3, uid); stmt.setInt(4, uid); } else { stmt = sql.prepareStatement("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=-1 AND messages.user_id IN (SELECT user_id FROM wl_users WHERE wl_user_id=?)) AND message_id NOT IN (SELECT message_id FROM messages_tags WHERE tag_id IN (SELECT tag_id FROM bl_tags WHERE user_id=?)) ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, uid); stmt.setInt(2, uid); stmt.setInt(3, uid); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getPrivate(Connection sql, int uid, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM (SELECT message_id FROM messages_access WHERE user_id=? AND message_id getDiscussions(Connection sql, int uid, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM subscr_messages WHERE suser_id=? AND message_id getRecommended(Connection sql, int uid, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM favorites WHERE user_id IN (SELECT user_id FROM subscr_users WHERE suser_id=?) AND message_id getPopular(Connection sql, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT messages.message_id FROM messages INNER JOIN favorites ON (favorites.user_id=11574 AND favorites.message_id=messages.message_id) WHERE messages.message_id0 ORDER BY messages.message_id DESC LIMIT 20"); stmt.setInt(1, before); } else { stmt = sql.prepareStatement("SELECT messages.message_id FROM messages INNER JOIN favorites ON (favorites.user_id=11574 AND favorites.message_id=messages.message_id) WHERE messages.privacy>0 ORDER BY messages.message_id DESC LIMIT 20"); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getPhotos(Connection sql, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE message_id0 AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, before); } else { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE privacy>0 AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20"); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getSearch(Connection sql, Connection sqlSearch, String search, int before) { ArrayList mids0 = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sqlSearch.prepareStatement("SELECT @id AS message_id FROM messages WHERE MATCH(?) AND @id mids = new ArrayList(20); if (mids0.size() > 0) { try { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE message_id IN (" + Utils.convertArray2String(mids0) + ") AND privacy>0 ORDER BY message_id DESC"); rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } } return mids; } public static ArrayList getUserBlog(Connection sql, int UID, int privacy, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE user_id=? AND message_id=" + privacy + " ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, UID); stmt.setInt(2, before); } else { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + " ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, UID); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getUserTag(Connection sql, int UID, int TID, int privacy, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("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"); stmt.setInt(1, UID); stmt.setInt(2, TID); stmt.setInt(3, before); } else { stmt = sql.prepareStatement("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"); stmt.setInt(1, UID); stmt.setInt(2, TID); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getUserRecommendations(Connection sql, int UID, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM favorites WHERE user_id=? AND message_id getUserPhotos(Connection sql, int UID, int privacy, int before) { ArrayList mids = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE user_id=? AND message_id=" + privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, UID); stmt.setInt(2, before); } else { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE user_id=? AND privacy>=" + privacy + " AND attach IS NOT NULL ORDER BY message_id DESC LIMIT 20"); stmt.setInt(1, UID); } rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return mids; } public static ArrayList getUserSearch(Connection sql, Connection sqlSearch, int UID, String search, int privacy, int before) { ArrayList mids0 = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { if (before > 0) { stmt = sqlSearch.prepareStatement("SELECT @id AS message_id FROM messages WHERE user_id=? AND MATCH(?) AND @id mids = new ArrayList(20); if (mids0.size() > 0) { try { stmt = sql.prepareStatement("SELECT message_id FROM messages WHERE message_id IN (" + Utils.convertArray2String(mids0) + ") AND privacy>=" + privacy + " ORDER BY message_id DESC"); rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { mids.add(rs.getInt(1)); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } } return mids; } public static ArrayList getMessages(Connection sql, ArrayList mids) { ArrayList msgs = new ArrayList(20); PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT STRAIGHT_JOIN messages.message_id,messages.user_id,users.nick,messages_txt.tags,messages.readonly,messages.privacy,messages_txt.txt,TIMESTAMPDIFF(MINUTE,messages.ts,NOW()),messages.ts,messages.replies,messages_txt.repliesby,messages.attach,messages.place_id,places.name,messages.lat,messages.lon FROM ((messages INNER JOIN messages_txt ON messages.message_id=messages_txt.message_id) INNER JOIN users ON messages.user_id=users.id) LEFT JOIN places ON messages.place_id=places.place_id WHERE messages.message_id IN (" + Utils.convertArray2String(mids) + ") ORDER BY messages.message_id DESC"); rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { com.juick.Message msg = new com.juick.Message(); msg.User = new com.juick.User(); msg.MID = rs.getInt(1); msg.User.UID = rs.getInt(2); msg.User.UName = rs.getString(3); if (rs.getString(4) != null) { msg.parseTags(rs.getString(4)); } msg.ReadOnly = rs.getInt(5) == 1; msg.Privacy = rs.getInt(6); msg.Text = rs.getString(7); msg.TimeAgo = rs.getInt(8); msg.TimestampString = rs.getString(9); msg.Replies = rs.getInt(10); msg.RepliesBy = rs.getString(11); msg.AttachmentType = rs.getString(12); if (rs.getInt(13) > 0) { msg.Place = new com.juick.Place(); msg.Place.pid = rs.getInt(13); msg.Place.name = rs.getString(14); msg.Place.lat = rs.getDouble(15); msg.Place.lon = rs.getDouble(16); } msgs.add(msg); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return msgs; } public static ArrayList getReplies(Connection sql, int mid) { ArrayList replies = new ArrayList(); PreparedStatement stmt = null; ResultSet rs = null; try { stmt = sql.prepareStatement("SELECT replies.reply_id,replies.replyto,replies.user_id,users.nick,replies.txt,TIMESTAMPDIFF(MINUTE,replies.ts,NOW()),replies.ts,replies.attach FROM replies INNER JOIN users ON replies.user_id=users.id WHERE replies.message_id=? ORDER BY replies.reply_id ASC"); stmt.setInt(1, mid); rs = stmt.executeQuery(); rs.beforeFirst(); while (rs.next()) { com.juick.Message msg = new com.juick.Message(); msg.MID = mid; msg.RID = rs.getInt(1); msg.ReplyTo = rs.getInt(2); msg.User = new com.juick.User(); msg.User.UID = rs.getInt(3); msg.User.UName = rs.getString(4); msg.Text = rs.getString(5); msg.TimeAgo = rs.getInt(6); msg.TimestampString = rs.getString(7); msg.AttachmentType = rs.getString(8); replies.add(msg); } } catch (SQLException e) { System.err.println(e); } finally { Utils.finishSQL(rs, stmt); } return replies; } }