/*******************************************************************************
* Copyright 2010 Universidade do Minho, Ricardo Vila�a and Francisco Cruz
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.ublog.benchmark.mysql;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import org.apache.log4j.Logger;
import org.ublog.utils.Pair;
public class TMultiPutMySqlUsers implements Callable<Pair<String,Boolean>> {
private String userid;
private Map<String,String> value;
private java.sql.Connection conn;
private Logger logger= Logger.getLogger(TMultiPutMySqlUsers.class);
public TMultiPutMySqlUsers(java.sql.Connection conn,String userid, Map<String,String> value){
this.userid = userid;
this.value = value;
this.conn = conn;
}
@Override
public Pair<String,Boolean> call() {
String query;
int i;
if(value.size()<7){
i=0;
query = "update users set ";
}
else{
i=1;
query = "insert into users ";// (userID,name,password,following,followers,username,lasttweet,created) values (?,?,?,?,?,?,?,?)";
}
Set<String> keys = value.keySet();
Iterator<String> iter = keys.iterator();
ArrayList<String> columnNames = new ArrayList<String>();
ArrayList<String> columnValues = new ArrayList<String>();
while(iter.hasNext()){
String columnName = iter.next();
columnNames.add(columnName);
columnValues.add(value.get(columnName));
}
Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e2) {
e2.printStackTrace();
}
try {
if(i==0) query += this.buildUpdateQuery("userID", this.userid, columnNames, columnValues);
else query += this.buildInsertNamesQuery("userID", columnNames) +" values " +this.buildInsertValuesQuery(this.userid, columnValues)
+" on duplicate key update "+this.buildDuplicateNamesQuery(columnNames);
stmt.executeUpdate(query);
} catch (SQLException e1) {
e1.printStackTrace();
}
finally {
try {
stmt.close();
} catch(Exception e) {}
try {
this.conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (logger.isInfoEnabled())
logger.info("ThreadMultiPut:"+userid+":"+value);
Boolean res = true;
return new Pair<String,Boolean>(userid,res);
}
private String buildInsertNamesQuery(String keyName, ArrayList<String> columnNames){
String res = "("+keyName;
if(!columnNames.isEmpty()){
res+=",";
Iterator<String> iter = columnNames.iterator();
while(iter.hasNext()){
String columnName = iter.next();
res += columnName;
if(iter.hasNext()){
res+=",";
}
else{
res+=")";
}
}
}
else res+=")";
return res;
}
private String buildInsertValuesQuery(String keyName, ArrayList<String> columnNames){
String res = "('"+keyName;
if(!columnNames.isEmpty()){
res+="',";
Iterator<String> iter = columnNames.iterator();
while(iter.hasNext()){
String columnName = iter.next();
res += "'"+columnName+"'";
if(iter.hasNext()){
res+=",";
}
else{
res+=")";
}
}
}
else res+=")";
return res;
}
private String buildUpdateQuery(String key, String value, ArrayList<String> columnNames, ArrayList<String> columnValues){
String res = "";
if(!columnNames.isEmpty() && !columnValues.isEmpty()){
Iterator<String> iterName = columnNames.iterator();
Iterator<String> iterValue = columnValues.iterator();
while(iterName.hasNext()){
String columnName = iterName.next();
String columnValue = iterValue.next();
res += columnName+"='"+columnValue+"'";
if(iterName.hasNext()){
res+=",";
}
}
res+=" where "+key+" = "+"'"+value+"'";
}
return res;
}
private String buildDuplicateNamesQuery(ArrayList<String> columnNames){
String res = "";// = "("+keyName;
if(!columnNames.isEmpty()){
Iterator<String> iter = columnNames.iterator();
while(iter.hasNext()){
String columnName = iter.next();
res += columnName + "=values("+columnName+")";
if(iter.hasNext()){
res+=",";
}
}
}
return res;
}
}