package org.beanfuse.db.sequence.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.beanfuse.db.sequence.TableSequence;
import org.beanfuse.db.sequence.TableSequenceDao;
import org.beanfuse.db.sequence.SequenceNamePattern;
import org.springframework.jdbc.core.JdbcTemplate;
public class OracleTableSequenceDao extends JdbcTemplate implements TableSequenceDao {
private SequenceNamePattern relation;
public boolean drop(String sequence_name) {
String sql = "drop sequence " + sequence_name;
execute(sql);
return true;
}
public List getInconsistent() {
ArrayList err_seqs = new ArrayList();
List list = getAll();
for (Iterator iter = list.iterator(); iter.hasNext();) {
String seqName = (String) iter.next();
String tempSeqSql = "select last_number from user_sequences seqs where seqs.sequence_name='"
+ seqName + "'";
long seqLast_number = queryForLong(tempSeqSql);
String tableName = relation.getTableName(seqName);
boolean exists = queryForInt("select count(*) from user_tables tbl where tbl.table_name='"
+ tableName + "'") > 0;
if (exists) {
long dataCount = queryForLong("select count(*) from " + tableName);
if (dataCount > 0) {
long tableLMaxId = queryForLong("select max(id) from " + tableName);
if (seqLast_number < tableLMaxId) {
TableSequence seq = new TableSequence();
seq.setSeqName(seqName);
seq.setTableName(tableName);
seq.setLastNumber(seqLast_number);
seq.setMaxId(tableLMaxId);
err_seqs.add(seq);
}
}
} else {
TableSequence seq = new TableSequence();
seq.setSeqName(seqName);
seq.setLastNumber(seqLast_number);
err_seqs.add(seq);
}
}
return err_seqs;
}
/**
* ��seq
*
* @param sequence
* @param table
* @param column
*/
public Long adjust(TableSequence tableSequence) {
String sequence = tableSequence.getSeqName();
String getSql = "select " + sequence + ".nextval from dual";
long current = queryForLong(getSql);
String countSql = "select max(" + tableSequence.getIdColumnName() + ") maxid from "
+ tableSequence.getTableName();
List rs = queryForList(countSql);
long max = 0;
if (!rs.isEmpty()) {
Map maxNum = new CaseInsensitiveMap((Map) rs.get(0));
max = ((Number) maxNum.get("maxid")).longValue();
}
long repaired = 0;
String updateIncrease = null;
if (max > current) {
if (max - current > 1) {
updateIncrease = "ALTER SEQUENCE " + sequence + " INCREMENT BY "
+ (max - current - 1);
execute(updateIncrease);
queryForLong(getSql);
//
updateIncrease = "ALTER SEQUENCE " + sequence + " INCREMENT BY 1";
execute(updateIncrease);
}
repaired = queryForLong(getSql);
} else {
if (1 == current)
return new Long(1);
updateIncrease = "ALTER SEQUENCE " + sequence + " INCREMENT BY -1";
execute(updateIncrease);
repaired = queryForLong(getSql);
updateIncrease = "ALTER SEQUENCE " + sequence + " INCREMENT BY 1";
execute(updateIncrease);
}
return new Long(repaired);
}
public List getAll() {
String sql = "select sequence_name from user_sequences order by sequence_name";
List seqs = queryForList(sql);
List sequenceNames = new ArrayList(seqs.size());
for (Iterator iter = seqs.iterator(); iter.hasNext();) {
Map seqNameMap = new CaseInsensitiveMap((Map) iter.next());
String name = (String) seqNameMap.get("sequence_name");
if (null == name)
continue;
sequenceNames.add(name);
}
return sequenceNames;
}
public List getNoneReferenced() {
ArrayList err_seqs = new ArrayList();
List list = getAll();
for (Iterator iter = list.iterator(); iter.hasNext();) {
String seqName = (String) iter.next();
String tableName = relation.getTableName(seqName);
boolean exists = queryForInt("select count(*) from user_tables tbl where tbl.table_name='"
+ tableName + "'") > 0;
if (!exists) {
err_seqs.add(seqName);
}
}
return err_seqs;
}
public void setRelation(SequenceNamePattern relation) {
this.relation = relation;
}
}