fixes FTR to delay tx chunk reading
This commit is contained in:
parent
b391d19303
commit
1b7d4c3ed6
|
@ -33,8 +33,7 @@ class FstFileParser {
|
||||||
public boolean open(IFstDatabaseBuilder builder) {
|
public boolean open(IFstDatabaseBuilder builder) {
|
||||||
fst = FstLibrary.fstReaderOpen(file.getAbsolutePath());
|
fst = FstLibrary.fstReaderOpen(file.getAbsolutePath());
|
||||||
if(!fst.equals(Pointer.NULL)) {
|
if(!fst.equals(Pointer.NULL)) {
|
||||||
String version = FstLibrary.fstReaderGetVersionString(fst);
|
// String version = FstLibrary.fstReaderGetVersionString(fst);
|
||||||
System.out.println(version);
|
|
||||||
long endTime = FstLibrary.fstReaderGetEndTime(fst);
|
long endTime = FstLibrary.fstReaderGetEndTime(fst);
|
||||||
byte timeScale = FstLibrary.fstReaderGetTimescale(fst);
|
byte timeScale = FstLibrary.fstReaderGetTimescale(fst);
|
||||||
builder.setMaxTime(endTime, -timeScale);
|
builder.setMaxTime(endTime, -timeScale);
|
||||||
|
|
|
@ -37,7 +37,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||||
protected FtrDbLoader loader;
|
protected FtrDbLoader loader;
|
||||||
|
|
||||||
/** The events. */
|
/** The events. */
|
||||||
IEventList events = new EventList();
|
protected IEventList events = new EventList();
|
||||||
|
|
||||||
/** The max concurrency. */
|
/** The max concurrency. */
|
||||||
private int rowCount = -1;
|
private int rowCount = -1;
|
||||||
|
@ -74,16 +74,6 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||||
events.put(evt.getTime(), evt);
|
events.put(evt.getTime(), evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the events.
|
|
||||||
*
|
|
||||||
* @return the events
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public IEventList getEvents() {
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the events at time.
|
* Gets the events at time.
|
||||||
*
|
*
|
||||||
|
@ -155,7 +145,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||||
return;
|
return;
|
||||||
ArrayList<Long> rowEndTime = new ArrayList<>();
|
ArrayList<Long> rowEndTime = new ArrayList<>();
|
||||||
HashMap<Long, Integer> rowByTxId = new HashMap<>();
|
HashMap<Long, Integer> rowByTxId = new HashMap<>();
|
||||||
for(EventEntry entry: events) {
|
for(EventEntry entry: getEvents()) {
|
||||||
for(IEvent evt:entry.events) {
|
for(IEvent evt:entry.events) {
|
||||||
TxEvent txEvt = (TxEvent) evt;
|
TxEvent txEvt = (TxEvent) evt;
|
||||||
ITx tx = txEvt.getTransaction();
|
ITx tx = txEvt.getTransaction();
|
||||||
|
@ -189,5 +179,4 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
|
||||||
rowCount=rowEndTime.size()>0?rowEndTime.size():1;
|
rowCount=rowEndTime.size()>0?rowEndTime.size():1;
|
||||||
getChildNodes().parallelStream().forEach(c -> ((TxGenerator)c).calculateConcurrency());
|
getChildNodes().parallelStream().forEach(c -> ((TxGenerator)c).calculateConcurrency());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,17 +49,17 @@ import jacob.CborType;
|
||||||
*/
|
*/
|
||||||
public class FtrDbLoader implements IWaveformDbLoader {
|
public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
|
|
||||||
enum FileType { NONE, PLAIN, GZIP, LZ4};
|
static final private CborType break_type = CborType.valueOf(0xff);
|
||||||
|
|
||||||
/** The max time. */
|
/** The max time. */
|
||||||
private Long maxTime = 0L;
|
private long maxTime = 0L;
|
||||||
|
|
||||||
ArrayList<String> strDict = new ArrayList<>();
|
ArrayList<String> strDict = new ArrayList<>();
|
||||||
|
|
||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
|
|
||||||
FileLock lock = null;
|
FileLock lock = null;
|
||||||
|
|
||||||
/** The attr values. */
|
/** The attr values. */
|
||||||
final List<String> attrValues = new ArrayList<>();
|
final List<String> attrValues = new ArrayList<>();
|
||||||
|
|
||||||
|
@ -91,14 +91,13 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
List<Thread> threads = new ArrayList<>();
|
List<Thread> threads = new ArrayList<>();
|
||||||
|
|
||||||
File file;
|
File file;
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(FtrDbLoader.class);
|
private static final Logger LOG = LoggerFactory.getLogger(FtrDbLoader.class);
|
||||||
|
|
||||||
/** The pcs. */
|
/** The pcs. */
|
||||||
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
||||||
|
|
||||||
long time_scale_factor = 1000l;
|
long time_scale_factor = 1000l;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the property change listener.
|
* Adds the property change listener.
|
||||||
*
|
*
|
||||||
|
@ -108,7 +107,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
public void addPropertyChangeListener(PropertyChangeListener l) {
|
public void addPropertyChangeListener(PropertyChangeListener l) {
|
||||||
pcs.addPropertyChangeListener(l);
|
pcs.addPropertyChangeListener(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the property change listener.
|
* Removes the property change listener.
|
||||||
*
|
*
|
||||||
|
@ -118,7 +116,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
public void removePropertyChangeListener(PropertyChangeListener l) {
|
public void removePropertyChangeListener(PropertyChangeListener l) {
|
||||||
pcs.removePropertyChangeListener(l);
|
pcs.removePropertyChangeListener(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the max time.
|
* Gets the max time.
|
||||||
*
|
*
|
||||||
|
@ -128,7 +125,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
public long getMaxTime() {
|
public long getMaxTime() {
|
||||||
return maxTime;
|
return maxTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the transaction.
|
* Gets the transaction.
|
||||||
*
|
*
|
||||||
|
@ -153,7 +149,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
else
|
else
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the all waves.
|
* Gets the all waves.
|
||||||
*
|
*
|
||||||
|
@ -165,7 +160,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
ret.addAll(txGenerators.values());
|
ret.addAll(txGenerators.values());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the all relation types.
|
* Gets the all relation types.
|
||||||
*
|
*
|
||||||
|
@ -174,7 +168,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
public Collection<RelationType> getAllRelationTypes() {
|
public Collection<RelationType> getAllRelationTypes() {
|
||||||
return relationTypes.values();
|
return relationTypes.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load.
|
* Load.
|
||||||
*
|
*
|
||||||
|
@ -189,8 +182,9 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
this.file=file;
|
this.file=file;
|
||||||
try {
|
try {
|
||||||
fis = new FileInputStream(file);
|
fis = new FileInputStream(file);
|
||||||
lock=fis.getChannel().lock(0, Long.MAX_VALUE, true);
|
FileChannel channel = fis.getChannel();
|
||||||
new CborDbParser(this, fis);
|
lock=channel.lock(0, Long.MAX_VALUE, true);
|
||||||
|
parseInput(new CborDecoder(fis), channel);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("Problem parsing file "+file.getName()+": " , e);
|
LOG.warn("Problem parsing file "+file.getName()+": " , e);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -198,10 +192,9 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
transactions.clear();
|
transactions.clear();
|
||||||
throw new InputFormatException(e.toString());
|
throw new InputFormatException(e.toString());
|
||||||
}
|
}
|
||||||
txStreams.values().parallelStream().forEach(TxStream::calculateConcurrency);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<? extends byte[]> getChunksAtOffsets(ArrayList<Long> fileOffsets) throws InputFormatException {
|
public synchronized List<? extends byte[]> getChunksAtOffsets(ArrayList<Long> fileOffsets) throws InputFormatException {
|
||||||
List<byte[]> ret = new ArrayList<>();
|
List<byte[]> ret = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
FileChannel fc = fis.getChannel();
|
FileChannel fc = fis.getChannel();
|
||||||
|
@ -226,6 +219,72 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void parseTx(TxStream txStream, long blockId, byte[] chunk) throws IOException {
|
||||||
|
CborDecoder cborDecoder = new CborDecoder(new ByteArrayInputStream(chunk));
|
||||||
|
long size = cborDecoder.readArrayLength();
|
||||||
|
assert(size==-1);
|
||||||
|
CborType next = cborDecoder.peekType();
|
||||||
|
while(next != null && !break_type.isEqualType(next)) {
|
||||||
|
long blockOffset = cborDecoder.getPos();
|
||||||
|
long tx_size = cborDecoder.readArrayLength();
|
||||||
|
long txId = 0;
|
||||||
|
long genId = 0;
|
||||||
|
for(long i = 0; i<tx_size; ++i) {
|
||||||
|
long tag = cborDecoder.readTag();
|
||||||
|
switch((int)tag) {
|
||||||
|
case 6: // id/generator/start/end
|
||||||
|
long len = cborDecoder.readArrayLength();
|
||||||
|
assert(len==4);
|
||||||
|
txId = cborDecoder.readInt();
|
||||||
|
genId = cborDecoder.readInt();
|
||||||
|
long startTime = cborDecoder.readInt()*time_scale_factor;
|
||||||
|
long endTime = cborDecoder.readInt()*time_scale_factor;
|
||||||
|
TxGenerator gen = txGenerators.get(genId);
|
||||||
|
FtrTx scvTx = new FtrTx(txId, gen.stream.getId(), genId, startTime, endTime, blockId, blockOffset);
|
||||||
|
updateTransactions(txId, scvTx);
|
||||||
|
TxStream stream = txStreams.get(gen.stream.getId());
|
||||||
|
if (scvTx.beginTime == scvTx.endTime) {
|
||||||
|
stream.addEvent(new TxEvent(this, EventKind.SINGLE, txId, scvTx.beginTime));
|
||||||
|
gen.addEvent(new TxEvent(this, EventKind.SINGLE, txId, scvTx.beginTime));
|
||||||
|
} else {
|
||||||
|
stream.addEvent(new TxEvent(this, EventKind.BEGIN, txId, scvTx.beginTime));
|
||||||
|
gen.addEvent(new TxEvent(this, EventKind.BEGIN, txId, scvTx.beginTime));
|
||||||
|
stream.addEvent(new TxEvent(this, EventKind.END, txId, scvTx.endTime));
|
||||||
|
gen.addEvent(new TxEvent(this, EventKind.END, txId, scvTx.endTime));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: { // skip over 7:begin attr, 8:record attr, 9:end attr
|
||||||
|
long sz = cborDecoder.readArrayLength();
|
||||||
|
assert(sz==3);
|
||||||
|
cborDecoder.readInt();
|
||||||
|
long type_id = cborDecoder.readInt();
|
||||||
|
switch(DataType.values()[(int)type_id]) {
|
||||||
|
case BOOLEAN:
|
||||||
|
cborDecoder.readBoolean();
|
||||||
|
break;
|
||||||
|
case FLOATING_POINT_NUMBER: // FLOATING_POINT_NUMBER
|
||||||
|
case FIXED_POINT_INTEGER: // FIXED_POINT_INTEGER
|
||||||
|
case UNSIGNED_FIXED_POINT_INTEGER: // UNSIGNED_FIXED_POINT_INTEGER
|
||||||
|
cborDecoder.readFloat();
|
||||||
|
break;
|
||||||
|
case NONE: // UNSIGNED_FIXED_POINT_INTEGER
|
||||||
|
LOG.warn("Unsupported data type: "+type_id);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cborDecoder.readInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next = cborDecoder.peekType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void updateTransactions(long txId, FtrTx scvTx) {
|
||||||
|
maxTime = maxTime > scvTx.endTime ? maxTime : scvTx.endTime;
|
||||||
|
transactions.put(txId, scvTx);
|
||||||
|
}
|
||||||
|
|
||||||
public List<? extends ITxAttribute> parseAtrributes(byte[] chunk, long blockOffset) {
|
public List<? extends ITxAttribute> parseAtrributes(byte[] chunk, long blockOffset) {
|
||||||
List<ITxAttribute> ret = new ArrayList<>();
|
List<ITxAttribute> ret = new ArrayList<>();
|
||||||
ByteArrayInputStream bais = new ByteArrayInputStream(chunk);
|
ByteArrayInputStream bais = new ByteArrayInputStream(chunk);
|
||||||
|
@ -296,7 +355,6 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
TxAttributeType attrType = attributeTypes.get(attrName);
|
TxAttributeType attrType = attributeTypes.get(attrName);
|
||||||
return attrType;
|
return attrType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispose.
|
* Dispose.
|
||||||
*/
|
*/
|
||||||
|
@ -318,259 +376,177 @@ public class FtrDbLoader implements IWaveformDbLoader {
|
||||||
relationsOut.clear();
|
relationsOut.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static long calculateTimescaleMultipierPower(long power){
|
||||||
* The Class TextDbParser.
|
long answer = 1;
|
||||||
*/
|
if(power<=0){
|
||||||
static class CborDbParser extends CborDecoder {
|
return answer;
|
||||||
|
} else{
|
||||||
static final private CborType break_type = CborType.valueOf(0xff);
|
for(int i = 1; i<= power; i++)
|
||||||
|
answer *= 10;
|
||||||
/** The loader. */
|
return answer;
|
||||||
final FtrDbLoader loader;
|
|
||||||
|
|
||||||
static long calculateTimescaleMultipierPower(long power){
|
|
||||||
long answer = 1;
|
|
||||||
if(power<=0){
|
|
||||||
return answer;
|
|
||||||
} else{
|
|
||||||
for(int i = 1; i<= power; i++)
|
|
||||||
answer *= 10;
|
|
||||||
return answer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new text db parser.
|
|
||||||
*
|
|
||||||
* @param loader the loader
|
|
||||||
*/
|
|
||||||
public CborDbParser(FtrDbLoader loader, FileInputStream inputStream) {
|
|
||||||
super(inputStream);
|
|
||||||
this.loader = loader;
|
|
||||||
try {
|
|
||||||
long cbor_tag = readTag();
|
|
||||||
assert(cbor_tag == 55799);
|
|
||||||
long array_len = readArrayLength();
|
|
||||||
assert(array_len==-1);
|
|
||||||
CborType next = peekType();
|
|
||||||
while(next != null && !break_type.isEqualType(next)) {
|
|
||||||
long tag = readTag();
|
|
||||||
switch((int)tag) {
|
|
||||||
case 6: { // info
|
|
||||||
CborDecoder cbd = new CborDecoder(new ByteArrayInputStream(readByteString()));
|
|
||||||
long sz = cbd.readArrayLength();
|
|
||||||
assert(sz==2);
|
|
||||||
long time_scale=cbd.readInt();
|
|
||||||
long eff_time_scale=time_scale-IWaveformDb.databaseTimeScale;
|
|
||||||
loader.time_scale_factor = calculateTimescaleMultipierPower(eff_time_scale);
|
|
||||||
long epoch_tag = cbd.readTag();
|
|
||||||
assert(epoch_tag==1);
|
|
||||||
cbd.readInt(); // epoch
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 8: { // dictionary uncompressed
|
|
||||||
parseDict(new CborDecoder(new ByteArrayInputStream(readByteString())));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 9: { // dictionary compressed
|
|
||||||
long sz = readArrayLength();
|
|
||||||
assert(sz==2);
|
|
||||||
readInt(); // uncompressed size
|
|
||||||
parseDict(new CborDecoder(new BlockLZ4CompressorInputStream(new ByteArrayInputStream(readByteString()))));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10: { // directory uncompressed
|
|
||||||
parseDir(new CborDecoder(new ByteArrayInputStream(readByteString())));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 11: { // directory compressed
|
|
||||||
long sz = readArrayLength();
|
|
||||||
assert(sz==2);
|
|
||||||
readInt(); // uncompressed size
|
|
||||||
parseDir(new CborDecoder(new BlockLZ4CompressorInputStream(new ByteArrayInputStream(readByteString()))));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 12: { //tx chunk uncompressed
|
|
||||||
long len = readArrayLength();
|
|
||||||
assert(len==2);
|
|
||||||
long stream_id = readInt();
|
|
||||||
TxStream txStream = loader.txStreams.get(stream_id);
|
|
||||||
txStream.fileOffsets.add(inputStream.getChannel().position());
|
|
||||||
parseTx(txStream, txStream.fileOffsets.size()-1, readByteString());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 13: { //tx chunk compressed
|
|
||||||
long len = readArrayLength();
|
|
||||||
assert(len==3);
|
|
||||||
long stream_id = readInt();
|
|
||||||
readInt(); // uncompressed size
|
|
||||||
TxStream txStream = loader.txStreams.get(stream_id);
|
|
||||||
txStream.fileOffsets.add(0-inputStream.getChannel().position());
|
|
||||||
BlockLZ4CompressorInputStream decomp = new BlockLZ4CompressorInputStream(new ByteArrayInputStream(readByteString()));
|
|
||||||
parseTx(txStream, txStream.fileOffsets.size()-1, decomp.readAllBytes());
|
|
||||||
decomp.close();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 14: { // relations uncompressed
|
|
||||||
parseRel(new CborDecoder(new ByteArrayInputStream(readByteString())));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 15: { // relations uncompressed
|
|
||||||
long sz = readArrayLength();
|
|
||||||
assert(sz==2);
|
|
||||||
readInt(); // uncompressed size
|
|
||||||
parseRel(new CborDecoder(new BlockLZ4CompressorInputStream(new ByteArrayInputStream(readByteString()))));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next = peekType();
|
|
||||||
}
|
|
||||||
} catch(IOException e) {
|
|
||||||
long pos = 0;
|
|
||||||
try {pos=inputStream.getChannel().position(); } catch (Exception ee) {}
|
|
||||||
LOG.error("Error parsing file input stream at position" + pos, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void parseDict(CborDecoder cborDecoder) throws IOException {
|
|
||||||
long size = cborDecoder.readMapLength();
|
|
||||||
ArrayList<String> lst = new ArrayList<>((int)size);
|
|
||||||
for(long i = 0; i<size; ++i) {
|
|
||||||
long idx = cborDecoder.readInt();
|
|
||||||
assert(idx==loader.strDict.size()+lst.size());
|
|
||||||
lst.add(cborDecoder.readTextString());
|
|
||||||
}
|
|
||||||
loader.strDict.addAll(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseDir(CborDecoder cborDecoder) throws IOException {
|
|
||||||
long size = cborDecoder.readArrayLength();
|
|
||||||
if(size<0) {
|
|
||||||
CborType next = cborDecoder.peekType();
|
|
||||||
while(next != null && !break_type.isEqualType(next)) {
|
|
||||||
parseDictEntry(cborDecoder);
|
|
||||||
next = cborDecoder.peekType();
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
for(long i = 0; i<size; ++i) {
|
|
||||||
parseDictEntry(cborDecoder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void parseDictEntry(CborDecoder cborDecoder) throws IOException {
|
|
||||||
long id = cborDecoder.readTag();
|
|
||||||
if(id==16) { // a stream
|
|
||||||
long len = cborDecoder.readArrayLength();
|
|
||||||
assert(len==3);
|
|
||||||
long stream_id = cborDecoder.readInt();
|
|
||||||
long name_id = cborDecoder.readInt();
|
|
||||||
long kind_id = cborDecoder.readInt();
|
|
||||||
add(stream_id, new TxStream(loader, stream_id, loader.strDict.get((int)name_id), loader.strDict.get((int)kind_id)));
|
|
||||||
} else if(id==17) { // a generator
|
|
||||||
long len = cborDecoder.readArrayLength();
|
|
||||||
assert(len==3);
|
|
||||||
long gen_id = cborDecoder.readInt();
|
|
||||||
long name_id = cborDecoder.readInt();
|
|
||||||
long stream_id = cborDecoder.readInt();
|
|
||||||
if(loader.txStreams.containsKey(stream_id))
|
|
||||||
add(gen_id, new TxGenerator(loader, gen_id, loader.strDict.get((int)name_id), loader.txStreams.get(stream_id)));
|
|
||||||
} else {
|
|
||||||
throw new IOException("Illegal tage ncountered: "+id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseTx(TxStream txStream, long blockId, byte[] chunk) throws IOException {
|
|
||||||
CborDecoder cborDecoder = new CborDecoder(new ByteArrayInputStream(chunk));
|
|
||||||
long size = cborDecoder.readArrayLength();
|
|
||||||
assert(size==-1);
|
|
||||||
CborType next = cborDecoder.peekType();
|
|
||||||
while(next != null && !break_type.isEqualType(next)) {
|
|
||||||
long blockOffset = cborDecoder.getPos();
|
|
||||||
long tx_size = cborDecoder.readArrayLength();
|
|
||||||
long txId = 0;
|
|
||||||
long genId = 0;
|
|
||||||
for(long i = 0; i<tx_size; ++i) {
|
|
||||||
long tag = cborDecoder.readTag();
|
|
||||||
switch((int)tag) {
|
|
||||||
case 6: // id/generator/start/end
|
|
||||||
long len = cborDecoder.readArrayLength();
|
|
||||||
assert(len==4);
|
|
||||||
txId = cborDecoder.readInt();
|
|
||||||
genId = cborDecoder.readInt();
|
|
||||||
long startTime = cborDecoder.readInt()*loader.time_scale_factor;
|
|
||||||
long endTime = cborDecoder.readInt()*loader.time_scale_factor;
|
|
||||||
TxGenerator gen = loader.txGenerators.get(genId);
|
|
||||||
FtrTx scvTx = new FtrTx(txId, gen.stream.getId(), genId, startTime, endTime, blockId, blockOffset);
|
|
||||||
loader.maxTime = loader.maxTime > scvTx.endTime ? loader.maxTime : scvTx.endTime;
|
|
||||||
loader.transactions.put(txId, scvTx);
|
|
||||||
TxStream stream = loader.txStreams.get(gen.stream.getId());
|
|
||||||
if (scvTx.beginTime == scvTx.endTime) {
|
|
||||||
stream.addEvent(new TxEvent(loader, EventKind.SINGLE, txId, scvTx.beginTime));
|
|
||||||
gen.addEvent(new TxEvent(loader, EventKind.SINGLE, txId, scvTx.beginTime));
|
|
||||||
} else {
|
|
||||||
stream.addEvent(new TxEvent(loader, EventKind.BEGIN, txId, scvTx.beginTime));
|
|
||||||
gen.addEvent(new TxEvent(loader, EventKind.BEGIN, txId, scvTx.beginTime));
|
|
||||||
stream.addEvent(new TxEvent(loader, EventKind.END, txId, scvTx.endTime));
|
|
||||||
gen.addEvent(new TxEvent(loader, EventKind.END, txId, scvTx.endTime));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: { // skip over 7:begin attr, 8:record attr, 9:end attr
|
|
||||||
long sz = cborDecoder.readArrayLength();
|
|
||||||
assert(sz==3);
|
|
||||||
cborDecoder.readInt();
|
|
||||||
long type_id = cborDecoder.readInt();
|
|
||||||
switch(DataType.values()[(int)type_id]) {
|
|
||||||
case BOOLEAN:
|
|
||||||
cborDecoder.readBoolean();
|
|
||||||
break;
|
|
||||||
case FLOATING_POINT_NUMBER: // FLOATING_POINT_NUMBER
|
|
||||||
case FIXED_POINT_INTEGER: // FIXED_POINT_INTEGER
|
|
||||||
case UNSIGNED_FIXED_POINT_INTEGER: // UNSIGNED_FIXED_POINT_INTEGER
|
|
||||||
cborDecoder.readFloat();
|
|
||||||
break;
|
|
||||||
case NONE: // UNSIGNED_FIXED_POINT_INTEGER
|
|
||||||
LOG.warn("Unsupported data type: "+type_id);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
cborDecoder.readInt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next = cborDecoder.peekType();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseRel(CborDecoder cborDecoder) throws IOException {
|
|
||||||
long size = cborDecoder.readArrayLength();
|
|
||||||
assert(size==-1);
|
|
||||||
CborType next = cborDecoder.peekType();
|
|
||||||
while(next != null && !break_type.isEqualType(next)) {
|
|
||||||
long sz = cborDecoder.readArrayLength();
|
|
||||||
assert(sz==3);
|
|
||||||
long type_id = cborDecoder.readInt();
|
|
||||||
long from_id = cborDecoder.readInt();
|
|
||||||
long to_id = cborDecoder.readInt();
|
|
||||||
String rel_name = loader.strDict.get((int)type_id);
|
|
||||||
FtrRelation ftrRel = new FtrRelation(loader.relationTypes.getOrDefault(rel_name, RelationTypeFactory.create(rel_name)), from_id, to_id);
|
|
||||||
loader.relationsOut.put(from_id, ftrRel);
|
|
||||||
loader.relationsIn.put(to_id, ftrRel);
|
|
||||||
next = cborDecoder.peekType();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void add(Long id, TxStream stream) {
|
|
||||||
loader.txStreams.put(id, stream);
|
|
||||||
loader.pcs.firePropertyChange(IWaveformDbLoader.STREAM_ADDED, null, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void add(Long id, TxGenerator generator) {
|
|
||||||
loader.txGenerators.put(id, generator);
|
|
||||||
loader.pcs.firePropertyChange(IWaveformDbLoader.GENERATOR_ADDED, null, generator);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void parseInput(CborDecoder cborDecoder, FileChannel channel) {
|
||||||
|
try {
|
||||||
|
long cbor_tag = cborDecoder.readTag();
|
||||||
|
assert(cbor_tag == 55799);
|
||||||
|
long array_len = cborDecoder.readArrayLength();
|
||||||
|
assert(array_len==-1);
|
||||||
|
CborType next = cborDecoder.peekType();
|
||||||
|
while(next != null && !break_type.isEqualType(next)) {
|
||||||
|
long tag = cborDecoder.readTag();
|
||||||
|
switch((int)tag) {
|
||||||
|
case 6: { // info
|
||||||
|
CborDecoder cbd = new CborDecoder(new ByteArrayInputStream(cborDecoder.readByteString()));
|
||||||
|
long sz = cbd.readArrayLength();
|
||||||
|
assert(sz==2);
|
||||||
|
long time_scale=cbd.readInt();
|
||||||
|
long eff_time_scale=time_scale-IWaveformDb.databaseTimeScale;
|
||||||
|
time_scale_factor = calculateTimescaleMultipierPower(eff_time_scale);
|
||||||
|
long epoch_tag = cbd.readTag();
|
||||||
|
assert(epoch_tag==1);
|
||||||
|
cbd.readInt(); // epoch
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8: { // dictionary uncompressed
|
||||||
|
parseDict(new CborDecoder(new ByteArrayInputStream(cborDecoder.readByteString())));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 9: { // dictionary compressed
|
||||||
|
long sz = cborDecoder.readArrayLength();
|
||||||
|
assert(sz==2);
|
||||||
|
cborDecoder.readInt(); // uncompressed size
|
||||||
|
parseDict(new CborDecoder(new BlockLZ4CompressorInputStream(new ByteArrayInputStream(cborDecoder.readByteString()))));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10: { // directory uncompressed
|
||||||
|
parseDir(new CborDecoder(new ByteArrayInputStream(cborDecoder.readByteString())));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11: { // directory compressed
|
||||||
|
long sz = cborDecoder.readArrayLength();
|
||||||
|
assert(sz==2);
|
||||||
|
cborDecoder.readInt(); // uncompressed size
|
||||||
|
parseDir(new CborDecoder(new BlockLZ4CompressorInputStream(new ByteArrayInputStream(cborDecoder.readByteString()))));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 12: { //tx chunk uncompressed
|
||||||
|
long len = cborDecoder.readArrayLength();
|
||||||
|
assert(len==4);
|
||||||
|
long stream_id = cborDecoder.readInt();
|
||||||
|
cborDecoder.readInt(); // start time of block
|
||||||
|
long end_time = cborDecoder.readInt()*time_scale_factor;
|
||||||
|
maxTime = end_time>maxTime?end_time:maxTime;
|
||||||
|
txStreams.get(stream_id).fileOffsets.add(channel.position());
|
||||||
|
cborDecoder.readByteString();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 13: { //tx chunk compressed
|
||||||
|
long len = cborDecoder.readArrayLength();
|
||||||
|
assert(len==5);
|
||||||
|
long stream_id = cborDecoder.readInt();
|
||||||
|
cborDecoder.readInt(); // start time of block
|
||||||
|
long end_time = cborDecoder.readInt()*time_scale_factor;
|
||||||
|
cborDecoder.readInt(); // uncompressed size
|
||||||
|
maxTime = end_time>maxTime?end_time:maxTime;
|
||||||
|
txStreams.get(stream_id).fileOffsets.add(0-channel.position());
|
||||||
|
cborDecoder.readByteString();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 14: { // relations uncompressed
|
||||||
|
parseRel(new CborDecoder(new ByteArrayInputStream(cborDecoder.readByteString())));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 15: { // relations uncompressed
|
||||||
|
long sz = cborDecoder.readArrayLength();
|
||||||
|
assert(sz==2);
|
||||||
|
cborDecoder.readInt(); // uncompressed size
|
||||||
|
parseRel(new CborDecoder(new BlockLZ4CompressorInputStream(new ByteArrayInputStream(cborDecoder.readByteString()))));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next = cborDecoder.peekType();
|
||||||
|
}
|
||||||
|
} catch(IOException e) {
|
||||||
|
long pos = 0;
|
||||||
|
try {pos=channel.position(); } catch (Exception ee) {}
|
||||||
|
LOG.error("Error parsing file input stream at position" + pos, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseDict(CborDecoder cborDecoder) throws IOException {
|
||||||
|
long size = cborDecoder.readMapLength();
|
||||||
|
ArrayList<String> lst = new ArrayList<>((int)size);
|
||||||
|
for(long i = 0; i<size; ++i) {
|
||||||
|
long idx = cborDecoder.readInt();
|
||||||
|
assert(idx==strDict.size()+lst.size());
|
||||||
|
lst.add(cborDecoder.readTextString());
|
||||||
|
}
|
||||||
|
strDict.addAll(lst);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseDir(CborDecoder cborDecoder) throws IOException {
|
||||||
|
long size = cborDecoder.readArrayLength();
|
||||||
|
if(size<0) {
|
||||||
|
CborType next = cborDecoder.peekType();
|
||||||
|
while(next != null && !break_type.isEqualType(next)) {
|
||||||
|
parseDictEntry(cborDecoder);
|
||||||
|
next = cborDecoder.peekType();
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
for(long i = 0; i<size; ++i) {
|
||||||
|
parseDictEntry(cborDecoder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseDictEntry(CborDecoder cborDecoder) throws IOException {
|
||||||
|
long id = cborDecoder.readTag();
|
||||||
|
if(id==16) { // a stream
|
||||||
|
long len = cborDecoder.readArrayLength();
|
||||||
|
assert(len==3);
|
||||||
|
long stream_id = cborDecoder.readInt();
|
||||||
|
long name_id = cborDecoder.readInt();
|
||||||
|
long kind_id = cborDecoder.readInt();
|
||||||
|
add(stream_id, new TxStream(this, stream_id, strDict.get((int)name_id), strDict.get((int)kind_id)));
|
||||||
|
} else if(id==17) { // a generator
|
||||||
|
long len = cborDecoder.readArrayLength();
|
||||||
|
assert(len==3);
|
||||||
|
long gen_id = cborDecoder.readInt();
|
||||||
|
long name_id = cborDecoder.readInt();
|
||||||
|
long stream_id = cborDecoder.readInt();
|
||||||
|
if(txStreams.containsKey(stream_id))
|
||||||
|
add(gen_id, new TxGenerator(this, gen_id, strDict.get((int)name_id), txStreams.get(stream_id)));
|
||||||
|
} else {
|
||||||
|
throw new IOException("Illegal tage ncountered: "+id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseRel(CborDecoder cborDecoder) throws IOException {
|
||||||
|
long size = cborDecoder.readArrayLength();
|
||||||
|
assert(size==-1);
|
||||||
|
CborType next = cborDecoder.peekType();
|
||||||
|
while(next != null && !break_type.isEqualType(next)) {
|
||||||
|
long sz = cborDecoder.readArrayLength();
|
||||||
|
assert(sz==3);
|
||||||
|
long type_id = cborDecoder.readInt();
|
||||||
|
long from_id = cborDecoder.readInt();
|
||||||
|
long to_id = cborDecoder.readInt();
|
||||||
|
String rel_name = strDict.get((int)type_id);
|
||||||
|
FtrRelation ftrRel = new FtrRelation(relationTypes.getOrDefault(rel_name, RelationTypeFactory.create(rel_name)), from_id, to_id);
|
||||||
|
relationsOut.put(from_id, ftrRel);
|
||||||
|
relationsIn.put(to_id, ftrRel);
|
||||||
|
next = cborDecoder.peekType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void add(Long id, TxStream stream) {
|
||||||
|
txStreams.put(id, stream);
|
||||||
|
pcs.firePropertyChange(IWaveformDbLoader.STREAM_ADDED, null, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void add(Long id, TxGenerator generator) {
|
||||||
|
txGenerators.put(id, generator);
|
||||||
|
pcs.firePropertyChange(IWaveformDbLoader.GENERATOR_ADDED, null, generator);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,13 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ftr;
|
package com.minres.scviewer.database.ftr;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.minres.scviewer.database.IEventList;
|
||||||
import com.minres.scviewer.database.IWaveform;
|
import com.minres.scviewer.database.IWaveform;
|
||||||
|
import com.minres.scviewer.database.InputFormatException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class TxGenerator.
|
* The Class TxGenerator.
|
||||||
|
@ -54,6 +57,30 @@ class TxGenerator extends AbstractTxStream {
|
||||||
return (other instanceof TxGenerator && this.getId()==other.getId());
|
return (other instanceof TxGenerator && this.getId()==other.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the events.
|
||||||
|
*
|
||||||
|
* @return the events
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public IEventList getEvents() {
|
||||||
|
if(events.size()==0) {
|
||||||
|
try {
|
||||||
|
List<byte[]> chunks = stream.getChunks();
|
||||||
|
int blockid = 0;
|
||||||
|
for (byte[] bs : chunks) {
|
||||||
|
loader.parseTx(stream, blockid, bs);
|
||||||
|
}
|
||||||
|
} catch (InputFormatException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return events;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Gets the begin attrs.
|
* Gets the begin attrs.
|
||||||
*
|
*
|
||||||
|
|
|
@ -10,9 +10,11 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package com.minres.scviewer.database.ftr;
|
package com.minres.scviewer.database.ftr;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.minres.scviewer.database.IEventList;
|
||||||
import com.minres.scviewer.database.IWaveform;
|
import com.minres.scviewer.database.IWaveform;
|
||||||
import com.minres.scviewer.database.InputFormatException;
|
import com.minres.scviewer.database.InputFormatException;
|
||||||
|
|
||||||
|
@ -69,4 +71,24 @@ class TxStream extends AbstractTxStream {
|
||||||
return chunks;
|
return chunks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the events.
|
||||||
|
*
|
||||||
|
* @return the events
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public IEventList getEvents() {
|
||||||
|
if(events.size()==0) {
|
||||||
|
try {
|
||||||
|
List<byte[]> chunks = getChunks();
|
||||||
|
int blockid = 0;
|
||||||
|
for (byte[] bs : chunks) {
|
||||||
|
loader.parseTx(this, blockid, bs);
|
||||||
|
}
|
||||||
|
} catch (InputFormatException e) {
|
||||||
|
} catch (IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return events;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.graphics.Color;
|
import org.eclipse.swt.graphics.Color;
|
||||||
import org.eclipse.swt.graphics.FontData;
|
import org.eclipse.swt.graphics.FontData;
|
||||||
import org.eclipse.swt.graphics.GC;
|
import org.eclipse.swt.graphics.GC;
|
||||||
import org.eclipse.swt.graphics.Point;
|
|
||||||
import org.eclipse.swt.graphics.Rectangle;
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
|
|
||||||
import com.minres.scviewer.database.ui.TrackEntry;
|
import com.minres.scviewer.database.ui.TrackEntry;
|
||||||
|
|
|
@ -18,7 +18,6 @@ import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
|
@ -21,7 +21,6 @@ import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.swt.widgets.Label;
|
import org.eclipse.swt.widgets.Label;
|
||||||
import org.eclipse.swt.widgets.Text;
|
import org.eclipse.swt.widgets.Text;
|
||||||
import org.eclipse.swt.layout.RowLayout;
|
|
||||||
|
|
||||||
public class TextInputDialog extends TitleAreaDialog {
|
public class TextInputDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package com.minres.scviewer.e4.application.parts;
|
package com.minres.scviewer.e4.application.parts;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import org.eclipse.core.runtime.preferences.DefaultScope;
|
import org.eclipse.core.runtime.preferences.DefaultScope;
|
||||||
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
||||||
import org.eclipse.jface.resource.StringConverter;
|
import org.eclipse.jface.resource.StringConverter;
|
||||||
|
|
|
@ -17,7 +17,6 @@ import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -33,7 +32,6 @@ import javax.annotation.PreDestroy;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
|
||||||
import org.eclipse.core.commands.Command;
|
|
||||||
import org.eclipse.core.commands.ParameterizedCommand;
|
import org.eclipse.core.commands.ParameterizedCommand;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,5 +1,5 @@
|
||||||
$date
|
$date
|
||||||
Mar 04, 2023 11:00:53
|
Mar 04, 2023 15:07:04
|
||||||
$end
|
$end
|
||||||
|
|
||||||
$version
|
$version
|
||||||
|
|
Binary file not shown.
|
@ -80,6 +80,7 @@ public class DatabaseServicesTest {
|
||||||
assertTrue(f.exists());
|
assertTrue(f.exists());
|
||||||
waveformDb.load(f);
|
waveformDb.load(f);
|
||||||
assertNotNull(waveformDb);
|
assertNotNull(waveformDb);
|
||||||
|
assertEquals(3400000000l, waveformDb.getMaxTime());
|
||||||
List<IWaveform> waveforms = waveformDb.getAllWaves();
|
List<IWaveform> waveforms = waveformDb.getAllWaves();
|
||||||
assertEquals(8, waveforms.size());
|
assertEquals(8, waveforms.size());
|
||||||
assertEquals(1, waveformDb.getChildNodes().size());
|
assertEquals(1, waveformDb.getChildNodes().size());
|
||||||
|
@ -120,6 +121,7 @@ public class DatabaseServicesTest {
|
||||||
assertTrue(f.exists());
|
assertTrue(f.exists());
|
||||||
waveformDb.load(f);
|
waveformDb.load(f);
|
||||||
assertNotNull(waveformDb);
|
assertNotNull(waveformDb);
|
||||||
|
assertEquals(3400000000l, waveformDb.getMaxTime());
|
||||||
List<IWaveform> waveforms = waveformDb.getAllWaves();
|
List<IWaveform> waveforms = waveformDb.getAllWaves();
|
||||||
assertEquals(8, waveforms.size());
|
assertEquals(8, waveforms.size());
|
||||||
assertEquals(1, waveformDb.getChildNodes().size());
|
assertEquals(1, waveformDb.getChildNodes().size());
|
||||||
|
@ -155,6 +157,7 @@ public class DatabaseServicesTest {
|
||||||
waveformDb.load(f);
|
waveformDb.load(f);
|
||||||
assertNotNull(waveformDb);
|
assertNotNull(waveformDb);
|
||||||
List<IWaveform> waveforms = waveformDb.getAllWaves();
|
List<IWaveform> waveforms = waveformDb.getAllWaves();
|
||||||
|
assertEquals(3400000000l, waveformDb.getMaxTime());
|
||||||
assertEquals(8, waveforms.size());
|
assertEquals(8, waveforms.size());
|
||||||
assertEquals(1, waveformDb.getChildNodes().size());
|
assertEquals(1, waveformDb.getChildNodes().size());
|
||||||
for(IWaveform w:waveforms) {
|
for(IWaveform w:waveforms) {
|
||||||
|
|
Loading…
Reference in New Issue