package org.yamcs.yarch.streamsql;
import org.yamcs.yarch.InputStream;
import org.yamcs.yarch.TupleDefinition;
import org.yamcs.yarch.YarchDatabase;
import org.yamcs.yarch.YarchException;
import org.yamcs.yarch.streamsql.ExecutionContext;
import org.yamcs.yarch.streamsql.GenericStreamSqlException;
import org.yamcs.yarch.streamsql.StreamAlreadyExistsException;
import org.yamcs.yarch.streamsql.StreamSqlException;
import org.yamcs.yarch.streamsql.StreamSqlResult;
import org.yamcs.yarch.streamsql.StreamSqlStatement;
public class CreateInputStreamStatement extends StreamSqlStatement {
TupleDefinition definition;
String streamName;
public CreateInputStreamStatement(String name, TupleDefinition definition) {
this.definition=definition;
this.streamName=name;
}
@Override
public StreamSqlResult execute(ExecutionContext c) throws StreamSqlException {
YarchDatabase dict=YarchDatabase.getInstance(c.getDbName());
synchronized(dict) {
InputStream stream=null;
if(dict.streamOrTableExists(streamName)) {
throw new StreamAlreadyExistsException(streamName);
}
try {
stream=new InputStream(dict, streamName, definition);
dict.addStream(stream);
stream.start();
return new StreamSqlResult("port",stream.getPort());
} catch (YarchException e) {
if(stream!=null) stream.close();
throw new GenericStreamSqlException("Cannot create input stream: "+e.getMessage());
}
}
}
}