package org.yamcs.archive; import static org.yamcs.alarms.AlarmServer.ALARM_TUPLE_DEFINITION; import java.util.List; import org.yamcs.ConfigurationException; import org.yamcs.StreamConfig; import org.yamcs.StreamConfig.StandardStreamType; import org.yamcs.StreamConfig.StreamConfigEntry; import org.yamcs.yarch.Stream; import org.yamcs.yarch.YarchDatabase; import org.yamcs.yarch.streamsql.ParseException; import org.yamcs.yarch.streamsql.StreamSqlException; import com.google.common.util.concurrent.AbstractService; /** * Records alarms. * Uses a 'simple' upsert_append solution for now. */ public class AlarmRecorder extends AbstractService { public static final String TABLE_NAME = "alarms"; public AlarmRecorder(String yamcsInstance) throws ConfigurationException, StreamSqlException, ParseException { YarchDatabase ydb = YarchDatabase.getInstance(yamcsInstance); String cols = ALARM_TUPLE_DEFINITION.getStringDefinition1(); if (ydb.getTable(TABLE_NAME) == null) { String query="create table "+TABLE_NAME+"("+cols+", primary key(triggerTime, parameter, seqNum)) table_format=compressed"; ydb.execute(query); } StreamConfig sc = StreamConfig.getInstance(yamcsInstance); List<StreamConfigEntry> sceList = sc.getEntries(StandardStreamType.alarm); for(StreamConfigEntry sce : sceList){ Stream inputStream = ydb.getStream(sce.getName()); if (inputStream == null) { throw new ConfigurationException("Cannot find stream '" + sce.getName() + "'"); } ydb.execute("upsert_append into " + TABLE_NAME + " select * from " + sce.getName()); } } @Override protected void doStart() { notifyStarted(); } @Override protected void doStop() { notifyStopped(); } }