/*
* 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 PMQueries {
public static boolean createPM(Connection sql, int uid_from, int uid_to, String body) {
boolean ret = false;
PreparedStatement stmt = null;
try {
stmt = sql.prepareStatement("INSERT INTO pm(user_id,user_id_to,txt) VALUES (?,?,?)");
stmt.setInt(1, uid_from);
stmt.setInt(2, uid_to);
stmt.setString(3, body);
ret = stmt.executeUpdate() > 0;
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(null, stmt);
}
if (ret) {
PreparedStatement stmt2 = null;
try {
stmt2 = sql.prepareStatement("INSERT INTO pm_streams(user_id,user_id_to,lastmessage,unread) VALUES (?,?,NOW(),1) ON DUPLICATE KEY UPDATE lastmessage=NOW(),unread=unread+1");
stmt2.setInt(1, uid_from);
stmt2.setInt(2, uid_to);
stmt2.executeUpdate();
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(null, stmt2);
}
}
return ret;
}
public static boolean addPMinRoster(Connection sql, int uid, String jid) {
boolean ret = false;
PreparedStatement stmt = null;
try {
stmt = sql.prepareStatement("INSERT INTO pm_inroster(user_id,jid) VALUES (?,?)");
stmt.setInt(1, uid);
stmt.setString(2, jid);
ret = stmt.executeUpdate() > 0;
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(null, stmt);
}
return ret;
}
public static boolean removePMinRoster(Connection sql, int uid, String jid) {
boolean ret = false;
PreparedStatement stmt = null;
try {
stmt = sql.prepareStatement("DELETE FROM pm_inroster WHERE user_id=? AND jid=?");
stmt.setInt(1, uid);
stmt.setString(2, jid);
ret = stmt.executeUpdate() > 0;
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(null, stmt);
}
return ret;
}
public static boolean havePMinRoster(Connection sql, int uid, String jid) {
boolean ret = false;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT 1 FROM pm_inroster WHERE user_id=? AND jid=?");
stmt.setInt(1, uid);
stmt.setString(2, jid);
rs = stmt.executeQuery();
if (rs.first()) {
ret = true;
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
return ret;
}
public static String getLastView(Connection sql, int uid_from, int uid_to) {
String ret = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT lastview FROM pm_streams WHERE user_id=? AND user_id_to=?");
stmt.setInt(1, uid_from);
stmt.setInt(2, uid_to);
rs = stmt.executeQuery();
if (rs.first()) {
ret = rs.getString(1);
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
return ret;
}
public static ArrayList getPMLastConversationsUsers(Connection sql, int uid, int cnt) {
ArrayList users = new ArrayList();
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT user_id,unread FROM pm_streams WHERE user_id_to=? AND unread>0 ORDER BY lastmessage DESC LIMIT " + cnt);
stmt.setInt(1, uid);
rs = stmt.executeQuery();
rs.beforeFirst();
while (rs.next()) {
com.juick.User u = new com.juick.User();
u.UID = rs.getInt(1);
u.MessagesCount = rs.getInt(2);
users.add(u);
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
if (users.size() < cnt) {
try {
stmt = sql.prepareStatement("SELECT user_id,user_id_to FROM pm_streams WHERE (user_id=? OR user_id_to=?) AND lastmessage>TIMESTAMPADD(MONTH,-1,NOW()) ORDER BY lastmessage DESC LIMIT ?");
stmt.setInt(1, uid);
stmt.setInt(2, uid);
stmt.setInt(3, cnt * 2);
rs = stmt.executeQuery();
rs.beforeFirst();
while (rs.next()) {
int uuid = rs.getInt(1) + rs.getInt(2) - uid;
if (!haveUserInArray(users, uuid)) {
com.juick.User u = new com.juick.User();
u.UID = uuid;
users.add(u);
if (users.size() >= cnt) {
break;
}
}
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
}
if (!users.isEmpty()) {
UserQueries.fillUsersByID(sql, users);
}
return users;
}
public static boolean haveUserInArray(ArrayList arr, int uid) {
int s = arr.size();
for (int i = 0; i < s; i++) {
if (arr.get(i).UID == uid) {
return true;
}
}
return false;
}
public static ArrayList getPMMessages(Connection sql, int uid, int uid_to) {
ArrayList msgs = new ArrayList(20);
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT user_id,txt,ts FROM pm WHERE (user_id=? AND user_id_to=?) OR (user_id_to=? AND user_id=?) ORDER BY ts DESC LIMIT 20");
stmt.setInt(1, uid);
stmt.setInt(2, uid_to);
stmt.setInt(3, uid);
stmt.setInt(4, uid_to);
rs = stmt.executeQuery();
rs.beforeFirst();
while (rs.next()) {
com.juick.Message msg = new com.juick.Message();
int uuid = rs.getInt(1);
msg.User = new com.juick.User();
msg.User.UID = uuid;
msg.Text = rs.getString(2);
msg.TimestampString = rs.getString(3);
msgs.add(0, msg);
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
PreparedStatement stmt2 = null;
try {
stmt2 = sql.prepareStatement("UPDATE pm_streams SET lastview=NOW(),unread=0 WHERE user_id_to=? AND user_id=?");
stmt2.setInt(1, uid);
stmt2.setInt(2, uid_to);
stmt2.executeUpdate();
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(null, stmt2);
}
return msgs;
}
public static ArrayList getLastPMMessages(Connection sql, int uid) {
ArrayList msgs = new ArrayList(20);
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = sql.prepareStatement("SELECT pm.user_id,users.nick,pm.txt,TIMESTAMPDIFF(MINUTE,pm.ts,NOW()),DATE_FORMAT(pm.ts,'%Y-%m-%d %H:%i:%s') FROM pm INNER JOIN users ON pm.user_id=users.id WHERE pm.user_id_to=? ORDER BY pm.ts DESC LIMIT 20");
stmt.setInt(1, uid);
rs = stmt.executeQuery();
rs.beforeFirst();
while (rs.next()) {
com.juick.Message msg = new com.juick.Message();
msg.User = new com.juick.User();
msg.User.UID = rs.getInt(1);
msg.User.UName = rs.getString(2);
msg.Text = rs.getString(3);
msg.TimeAgo = rs.getInt(4);
msg.TimestampString = rs.getString(5);
msgs.add(0, msg);
}
} catch (SQLException e) {
System.err.println(e);
} finally {
Utils.finishSQL(rs, stmt);
}
return msgs;
}
}