146 lines
3.9 KiB
C#
146 lines
3.9 KiB
C#
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 +=new ChangeDelegate(myStreamChange);
|
|
myVsd.addWorker(this);
|
|
}
|
|
|
|
protected override void myOnLastSubscriber()
|
|
{
|
|
myVsd.removeWorker(this);
|
|
myStream.onChange -= new ChangeDelegate(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
|
|
}
|
|
}
|