Unified databases so that signals and transactions can be loaded into

same database
This commit is contained in:
2015-01-10 00:23:46 +01:00
parent 9553fbff8c
commit dc861722c4
52 changed files with 703 additions and 478 deletions

View File

@ -1,31 +0,0 @@
package com.minres.scviewer.database.text
import java.io.FileInputStream;
import com.minres.scviewer.database.IWaveformDb
import com.minres.scviewer.database.IWaveformDbFactory;
class TextDbFactory implements IWaveformDbFactory {
byte[] x = "scv_tr_stream".bytes
@Override
public IWaveformDb createDatabase(File file) {
try {
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[x.size()];
def read = fis.read(buffer, 0, x.size());
fis.close();
if(read==x.size())
for(int i=0; i<x.size(); i++)
if(buffer[i]!=x[i]) return null;
def db = new TextDb();
db.load(file)
return db
} catch (Exception e) {
e.printStackTrace()
}
return null;
}
}

View File

@ -22,28 +22,27 @@ import com.minres.scviewer.database.DataType;
import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.ITxAttributeType;
import com.minres.scviewer.database.ITxAttribute;
import com.minres.scviewer.database.IWaveform
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.ITxGenerator;
import com.minres.scviewer.database.IHierNode;
import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.IWaveformDbLoader;
import com.minres.scviewer.database.InputFormatException;
import com.minres.scviewer.database.EventTime
import com.minres.scviewer.database.RelationType
public class TextDb extends HierNode implements IWaveformDb{
public class TextDbLoader implements IWaveformDbLoader{
private EventTime maxTime;
IWaveformDb db;
def streams = []
def relationTypes=[:]
public TextDb() {
super("TextDb");
}
public String getFullName() {
return getName();
public TextDbLoader() {
}
@Override
@ -51,16 +50,9 @@ public class TextDb extends HierNode implements IWaveformDb{
return maxTime;
}
public ITxStream getStreamByName(String name){
streams.find{ITxStream stream-> stream.fullName == name }
}
public List<ITxStream> getAllWaves() {
return new LinkedList<ITxStream>(streams);
}
public List<IHierNode> getChildNodes() {
return childs.sort{it.name};
@Override
public List<IWaveform> getAllWaves() {
return new LinkedList<IWaveform>(streams);
}
public Map<Long, ITxGenerator> getGeneratorsById() {
@ -69,14 +61,20 @@ public class TextDb extends HierNode implements IWaveformDb{
return res;
}
void clear(){
streams = []
maxTime=new EventTime(0, "ns")
}
void load(File file) throws InputFormatException {
this.name = file.name;
static final byte[] x = "scv_tr_stream".bytes
@Override
boolean load(IWaveformDb db, File file) throws Exception {
this.db=db
FileInputStream fis = new FileInputStream(file)
byte[] buffer = new byte[x.size()]
def readCnt = fis.read(buffer, 0, x.size())
fis.close()
if(readCnt==x.size())
for(int i=0; i<x.size(); i++)
if(buffer[i]!=x[i]) return false
parseInput(file)
return true
}
private def parseInput(File input){
@ -96,7 +94,7 @@ public class TextDb extends HierNode implements IWaveformDb{
case "end_attribute":
if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) {
def id = Integer.parseInt(matcher[0][1])
def stream = new TxStream(id, this, matcher[0][2], matcher[0][3])
def stream = new TxStream(db, id, matcher[0][2], matcher[0][3])
streams<<stream
streamsById[id]=stream
} else if ((matcher = line =~ /^scv_tr_generator\s+\(ID\s+(\d+),\s+name\s+"([^"]+)",\s+scv_tr_stream\s+(\d+),$/)) {
@ -117,7 +115,7 @@ public class TextDb extends HierNode implements IWaveformDb{
case "tx_begin"://matcher = line =~ /^tx_begin\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/
def id = Integer.parseInt(tokens[1])
TxGenerator gen=generatorsById[Integer.parseInt(tokens[2])]
transaction = new Tx(id, gen.stream, gen, new EventTime(Integer.parseInt(tokens[3]), tokens[4]))
transaction = new Tx(id, gen.stream, gen, new EventTime(Integer.parseInt(tokens[3]), EventTime.Unit.fromString(tokens[4])))
gen.transactions << transaction
transactionsById[id]= transaction
gen.begin_attrs_idx=0;
@ -128,7 +126,7 @@ public class TextDb extends HierNode implements IWaveformDb{
def id = Integer.parseInt(tokens[1])
transaction = transactionsById[id]
assert Integer.parseInt(tokens[2])==transaction.generator.id
transaction.endTime = new EventTime(Integer.parseInt(tokens[3]), tokens[4])
transaction.endTime = new EventTime(Integer.parseInt(tokens[3]), EventTime.Unit.fromString(tokens[4]))
transaction.generator.end_attrs_idx=0;
maxTime = maxTime>transaction.endTime?maxTime:transaction.endTime
endTransaction=true
@ -158,38 +156,6 @@ public class TextDb extends HierNode implements IWaveformDb{
}
}
addHierarchyNodes()
}
def addHierarchyNodes(){
streams.each{ TxStream stream->
def hier = stream.fullName.split(/\./)
IHierNode node = this
hier.each { name ->
def n1 = node.childNodes.find{it.name == name}
if(name == hier[-1]){ //leaf
if(n1!=null) {
if(n1 instanceof HierNode){
node.childNodes.remove(n1)
stream.childNodes.addAll(n1.childNodes)
} else {
throw new InputFormatException()
}
}
stream.name=name
node.childNodes<<stream
node=stream
} else { // intermediate
if(n1 != null) {
node=n1
} else {
HierNode newNode = new HierNode(name)
node.childNodes<<newNode
node=newNode
}
}
}
}
}
}

View File

@ -15,6 +15,7 @@ import java.util.List;
import java.util.Map;
import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb
import com.minres.scviewer.database.ITxGenerator
import com.minres.scviewer.database.IHierNode
@ -25,7 +26,7 @@ class TxStream extends HierNode implements ITxStream {
Long id;
TextDb database
IWaveformDb database
String fullName;
@ -35,7 +36,7 @@ class TxStream extends HierNode implements ITxStream {
private TreeSet<Tx> allTransactions;
TxStream(int id, TextDb db, String name, String kind){
TxStream(IWaveformDb db, int id, String name, String kind){
super(name)
this.id=id
this.database=db