using System; using System.Diagnostics; using System.IO; using BCG.Utilities.General; namespace BCG { [DataStreamUserRespresentation("textWriter")] public class TextWriterStream : ViewStream, IWorker { #region constructor public TextWriterStream(ViewStream stream, string fileNamePrefix, int writeFreqSecs) : this(ViewStreamDatabase.instance, stream, fileNamePrefix, writeFreqSecs) { } public TextWriterStream(ViewStreamDatabase vsd, ViewStream stream, string fileNamePrefix, int writeFreqSecs) { myVsd = vsd; myStream = stream; myFileNamePrefix = fileNamePrefix; myWriteFreqSecs = writeFreqSecs; myNextWrite = DateTime.MinValue; myGotUpdate = false; mySchemaStr = null; if (!myFileNamePrefix.EndsWith("_")) { myFileNamePrefix += "_"; } } #endregion #region ViewStream protected override void myOnFirstSubscriber() { myStream.onChange += myStreamChange; myVsd.addWorker(this); } protected override void myOnLastSubscriber() { myVsd.removeWorker(this); myStream.onChange -= myStreamChange; } #endregion #region IWorker public void doWork() { if ((myNextWrite <= DateTime.Now && myGotUpdate)) { myGotUpdate = false; myNextWrite = DateTime.Now.AddSeconds(myWriteFreqSecs); myWrite(myStream.rows); } } #endregion private void myStreamChange(object o) { myGotUpdate = true; } #region helpers public void myWrite(IBlueRowCollection rows) { #region create schema str if (mySchemaStr == null) { myCreateSchemaStr(rows.schema); } #endregion // create file name string filename = String.Format("{0}{1}.txt", myFileNamePrefix, myDateTimeStr(DateTime.Now)); // open file StreamWriter writer = new StreamWriter(filename); // write schema str if (mySchemaStr != null) { writer.WriteLine(mySchemaStr); } foreach (IBlueRow row in rows) { #region write row str string rowStr = ""; foreach (string columnName in row.schema.columnNames) { if (rowStr != "") { rowStr += DELIM; } rowStr += row[columnName].ToString(); } writer.WriteLine(rowStr); #endregion } // close file writer.Close(); } public void myCreateSchemaStr(IBlueTableSchema schema) { mySchemaStr = ""; foreach (ColumnInfo columnInfo in schema.columnInfo) { if (mySchemaStr != "") { mySchemaStr += DELIM; } mySchemaStr += String.Format("{0}:{1}", columnInfo.colName, columnInfo.colType.ToString()); } } private string myDateTimeStr(DateTime dateTime) { return (String.Format("{0}{1}{2}{3}{4}{5}", dateTime.Year.ToString("D4"), dateTime.Month.ToString("D2"), dateTime.Day.ToString("D2"), dateTime.Hour.ToString("D2"), dateTime.Minute.ToString("D2"), dateTime.Second.ToString("D2"))); } #endregion public static readonly string DELIM = ", "; #region state private ViewStreamDatabase myVsd; private ViewStream myStream; private string myFileNamePrefix; private int myWriteFreqSecs; private DateTime myNextWrite; private bool myGotUpdate; private string mySchemaStr; #endregion } }