package com.meidusa.amoeba.seq.provider;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import com.meidusa.amoeba.exception.AmoebaRuntimeException;
import com.meidusa.amoeba.parser.dbobject.Table;
import com.meidusa.amoeba.seq.fetcher.SeqProvider;
import com.meidusa.amoeba.seq.fetcher.SeqOperationResult;
import com.meidusa.amoeba.util.StringUtil;
// 一个简单的全局序列发生器
public class DummySeqProvider extends SeqProvider{
private final static Map<DummySeqProvider.Sequence, AtomicLong> seqs = new ConcurrentHashMap<DummySeqProvider.Sequence, AtomicLong>();
@Override
public SeqOperationResult createSeq(String schema, String seqName, long start, long offset) {
Sequence seqKey = new Sequence(schema, seqName);
AtomicLong seqVal = seqs.get(seqKey);
if (seqVal == null) {
seqVal = new AtomicLong(start);
seqs.put(seqKey, seqVal);
return new SeqOperationResult(true, "");
} else {
return new SeqOperationResult(false, seqKey +" has existed");
}
}
@Override
public long getSeqCurrVal(String schema, String seqName) {
Sequence seqKey = new Sequence(schema, seqName);
AtomicLong seqVal = seqs.get(seqKey);
if (seqVal == null) {
throw new AmoebaRuntimeException(seqKey + " not found");
}
return seqVal.get();
}
@Override
public long getSeqNextVal(String schema, String seqName) {
Sequence seqKey = new Sequence(schema, seqName);
AtomicLong seqVal = seqs.get(seqKey);
if (seqVal == null) {
throw new AmoebaRuntimeException(seqKey + " not found");
}
return seqVal.incrementAndGet();
}
@Override
public long batchGetSeqVal(String schema, String seqName, long count) {
Sequence seqKey = new Sequence(schema, seqName);
AtomicLong seqVal = seqs.get(seqKey);
if (seqVal == null) {
throw new AmoebaRuntimeException(seqKey + " not found");
}
return seqVal.addAndGet(count);
}
@Override
public SeqOperationResult deleteSeq(String schema, String seqName) {
Sequence seqKey = new Sequence(schema, seqName);
AtomicLong seqVal = seqs.get(seqKey);
if (seqVal == null) {
return new SeqOperationResult(false, seqKey + " not found");
}
else {
seqs.remove(seqKey);
return new SeqOperationResult(true, "");
}
}
class Sequence{
public String schema;
public String seqName;
public Sequence(String schema, String seqName) {
super();
this.schema = schema;
this.seqName = seqName;
}
@Override
public String toString() {
return schema + "." + seqName;
}
@Override
public int hashCode() {
return 211 + (schema == null ? 0 : schema.toLowerCase().hashCode()) + (seqName == null ? 0 : seqName.toLowerCase().hashCode());
}
@Override
public boolean equals(Object object) {
boolean isMatched = true;
if (object instanceof Sequence) {
Sequence other = (Sequence) object;
isMatched = isMatched && StringUtil.equalsIgnoreCase(other.schema, schema);
isMatched = isMatched && StringUtil.equalsIgnoreCase(other.seqName, seqName);
return isMatched;
} else {
return false;
}
}
}
}