package org.buckit.datasource.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.buckit.Config;
import org.buckit.datasource.DataSourceManager;
import org.buckit.datasource.type.WarpsDataSource;
import org.buckit.model.Warp;
import org.bukkit.Location;
public class DatabaseWarpsDataSource implements WarpsDataSource{
private static String INSERT_WARP = "REPLACE INTO " + Config.DATABASE_WARPS_TABLE + " (name,groupname,world,x,y,z,rotX,rotY) VALUES (?,?,?,?,?,?,?,?)";
private static String DELETE_WARP = "DELETE FROM " + Config.DATABASE_WARPS_TABLE + " WHERE id = ?";
private static String SELECT_WARPS = "SELECT id,name,groupname,world,x,y,z,rotX,rotY,minaccesslevel FROM " + Config.DATABASE_WARPS_TABLE;
private Map<String, Warp> warps;
private Map<String, List<Warp>> warpgroups;
private DataSourceManager datasource;
public DatabaseWarpsDataSource(DataSourceManager dataSource) {
datasource = dataSource;
}
public DataSourceManager getDataSource(){
return datasource;
}
@Override
public boolean addWarp(String groupname, String name, Location warp, int minaccesslevel) {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(INSERT_WARP, Statement.RETURN_GENERATED_KEYS);
st.setString(1, name);
st.setString(2, groupname);
st.setString(3, warp.getWorld().getName());
st.setDouble(4, warp.getX());
st.setDouble(5, warp.getY());
st.setDouble(6, warp.getZ());
st.setFloat(7, warp.getPitch());
st.setFloat(8, warp.getYaw());
st.execute();
rs = st.getGeneratedKeys();
if (rs.next()) {
addWarp(new Warp(rs.getInt("id"), name, groupname, warp, minaccesslevel));
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
if (rs != null)
rs.close();
} catch (Exception e) {
}
}
return true;
}
@Override
public boolean removeWarp(Warp warp) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(DELETE_WARP);
st.setInt(1, warp.getId());
st.execute();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
} catch (Exception e) {
}
}
return true;
}
@Override
public Collection<Warp> getAllWarps() {
return warps.values();
}
@Override
public Warp getWarp(String groupname, String name) {
return warps.get(groupname + "." + name);
}
@Override
public Collection<Warp> getWarps(String groupname) {
return warpgroups.get(groupname);
}
@Override
public boolean load() {
warps = new HashMap<String, Warp>();
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(SELECT_WARPS);
rs = st.executeQuery();
Warp warp;
while (rs.next()) {
warp = new Warp(rs.getInt("id"), rs.getString("name"), rs.getString("groupname"), new Location(datasource.getServer().getWorld(rs.getString("world")), rs.getDouble("x"), rs.getDouble("y"), rs.getDouble("z"), rs.getFloat("rotX"), rs.getFloat("rotY")), rs.getInt("minaccesslevel"));
addWarp(warp);
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
if (rs != null)
rs.close();
} catch (Exception e) {
}
}
return true;
}
private void addWarp(Warp warp) {
warps.put(warp.getGroup() + "." + warp.getName(), warp);
if (warpgroups.containsKey(warp.getGroup())) {
if (!warpgroups.get(warp.getGroup()).contains(warp)) {
warpgroups.get(warp.getGroup()).add(warp);
}
} else {
ArrayList<Warp> list = new ArrayList<Warp>();
list.add(warp);
warpgroups.put(warp.getGroup(), list);
}
}
}