package com.piglet.core;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import com.piglet.dao.pojo.ConnectionInfo;
import com.piglet.dao.pojo.Database;
import com.piglet.dao.pojo.Table;
import com.piglet.dao.pojo.TableProperty;
import com.piglet.utils.Constant;
/**
* 实际上这里的Connection是以库为单位的。
*
* @author Enbandari
*
*/
public class MysqlConnection {
private JdbcTemplate jdbcTemplate;
private ConnectionInfo info;
private BasicDataSource ds;
public MysqlConnection(ConnectionInfo info) {
this.info = info;
ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://" + info.getHost() + ":" + info.getPort() + "/" + info.getDbname()+"?connectTimeout=3000&socketTimeout=20000");
ds.setUsername(info.getUsername());
ds.setPassword(info.getPassword());
ds.setMaxWait(5000);
ds.setMinIdle(2);
jdbcTemplate = new JdbcTemplate(ds);
jdbcTemplate.setQueryTimeout(5000);
}
public void close() {
try {
ds.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
private JdbcTemplate getJdbcTemplate() {
if(ds == null || ds.isClosed()){
ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://" + info.getHost() + ":" + info.getPort() + "/" + info.getDbname());
ds.setUsername(info.getUsername());
ds.setPassword(info.getPassword());
jdbcTemplate = new JdbcTemplate(ds);
}
return jdbcTemplate;
}
public ConnectionInfo getInfo() {
return info;
}
public void setInfo(ConnectionInfo info) {
this.info = info;
}
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o instanceof ConnectionInfo && (this == o || this.info.equals(((MysqlConnection) o).info))) {
return true;
} else {
return false;
}
}
@Override
public int hashCode() {
return super.hashCode();
}
public List<Database> showDbs() {
String sql = "show databases";
List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql);
debug(sql, list);
List<Database> dblist = new ArrayList<Database>();
Iterator<Map<String, Object>> it = list.iterator();
while (it.hasNext()) {
Map<String, Object> map = it.next();
Database db = new Database();
db.setName(map.get(Constant.key.DATABASE).toString());
dblist.add(db);
}
return dblist;
}
public List<Table> showTables() {
String sql = "show tables";
List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql);
debug(sql, list);
List<Table> tblist = new ArrayList<Table>();
Iterator<Map<String, Object>> it = list.iterator();
while (it.hasNext()) {
Map<String, Object> map = it.next();
Table tb = new Table();
tb.setName(map.values().toArray()[0].toString());
tblist.add(tb);
}
return tblist;
}
public void useDb(String dbname) {
String sql = "use " + dbname;
jdbcTemplate.execute(sql);
debug(sql);
}
public List<TableProperty> schema(String tablename) {
String sql = "desc " + tablename;
List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql);
debug(sql, list);
List<TableProperty> tbproplist = new ArrayList<TableProperty>();
Iterator<Map<String, Object>> it = list.iterator();
while (it.hasNext()) {
Map<String, Object> map = it.next();
TableProperty tbprop = new TableProperty();
tbprop.setField(getValue(map, "Field"));
tbprop.setKey(getValue(map, "Key"));
tbprop.setType(getValue(map, "Type"));
tbprop.setExtra(getValue(map, "Extra"));
tbprop.set_null(getValue(map, "Null"));
tbprop.set_default(getValue(map, "Default"));
tbproplist.add(tbprop);
}
return tbproplist;
}
public List<Map<String, Object>> queryAll(String tablename , int page, int pagesize) {
int offset = (page - 1) * pagesize;
String sql = "select * from " + tablename + " limit "+ pagesize + " offset "+offset;
List<Map<String, Object>> list = getJdbcTemplate().queryForList(sql);
debug(sql, list);
return list;
}
public int queryItemCount(String tablename){
String sql = "select count(*) from "+tablename;
debug(sql);
return getJdbcTemplate().queryForInt(sql);
}
public HashMap<String, Object> dosql(String sql){
sql = sql.trim();
HashMap<String, Object> result = new HashMap<String, Object>();
if(sql.endsWith("\\G") || sql.endsWith("\\g")){
sql = sql.substring(0, sql.length()-2);
}
long begin = new Date().getTime();
if(sql.toLowerCase().equals("help")){
List<Map<String, Object>> list = MysqlHelper.getHelpList();
result.put(Constant.key.QUERY_TYPE, 0);
result.put(Constant.key.QUERY_RESULT, list);
}else if(sql.toLowerCase().matches("^\\s*(select|show|desc)\\s+.*$")){
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
result.put(Constant.key.QUERY_TYPE, 0);
if(list == null){
list = new ArrayList<Map<String, Object>>();
}
result.put(Constant.key.QUERY_RESULT, list);
}else{
int count = jdbcTemplate.update(sql);
result.put(Constant.key.QUERY_TYPE, 1);
result.put(Constant.key.QUERY_RESULT, count);
}
float time = (new Date().getTime() - begin) / 1000.0f;
result.put(Constant.key.QUERY_TIME, time );
return result;
}
private String getValue(Map<String, Object> map, String key){
return map.get(key) == null? "" : map.get(key).toString();
}
private void debug(String sql, List<Map<String, Object>> list) {
System.out.println("***************************************");
System.out.println(sql);
System.out.println("---------------------------------------");
for (Map<String, Object> map : list) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}
System.out.println("***************************************");
}
private void debug(String sql) {
System.out.println(sql);
}
}