internal static LogRowData CreateData(Stream stream, LogRowIndex index) { byte[] buffer = new byte[index.RowLength + 2]; char[] chars = new char[index.RowLength]; if (stream.Position != index.RowStart) { stream.Seek(index.RowStart, SeekOrigin.Begin); } stream.Read(buffer, 0, index.RowLength); int length = buffer.IndexOf((byte)'\r', 0); if (length == -1) { length = buffer.IndexOf((byte)'\n', 0); } for (int i = 0; i < length; i++) { chars[i] = (char)buffer[i]; } index.GetValues(out int timeStampIndex, out int nameIndex, out int userIndex, out int cycleIndex, out int valueIndex); var itemId = new string(chars, nameIndex, index.NameLength); var timeStamp = LogRowDataFactory.ParseDate(chars, 0, LogRowIndex.TimeStampLength); var user = new string(chars, userIndex, index.UserLength); var cycleIndexValue = long.Parse(new string(chars, cycleIndex, index.CycleLength), NumberStyles.None); var value = new string(chars, valueIndex, length - valueIndex); return(new LogRowData(timeStamp, itemId, user, cycleIndexValue, value)); }
public IEnumerable <LogRowDataPoint> GetDataPoints(IEnumerable <LogRowIndex> indexes) { foreach (LogRowIndex logRowIndex in indexes) { if (!m_DataPointCache.TryGetValue(logRowIndex.RowStart, out var reference)) { LogRowDataPoint point = LogRowDataFactory.CreateDataPoint(m_PagedReader, logRowIndex); reference = new WeakReference(point); m_DataPointCache.Add(logRowIndex.RowStart, reference); } LogRowDataPoint dataPoint = reference.Target as LogRowDataPoint; //Reload data point if (dataPoint == null) { dataPoint = LogRowDataFactory.CreateDataPoint(m_PagedReader, logRowIndex); reference.Target = dataPoint; } yield return(dataPoint); } }
public IEnumerable <LogRowData> GetData(IEnumerable <LogRowIndex> indexes) { foreach (LogRowIndex logRowIndex in indexes) { WeakReference reference; if (!m_DataCache.TryGetValue(logRowIndex.RowStart, out reference)) { reference = new WeakReference(null); m_DataCache.Add(logRowIndex.RowStart, reference); } LogRowData data = reference.Target as LogRowData; //Reload data point if (data == null) { data = LogRowDataFactory.CreateData(m_Stream, logRowIndex); reference.Target = data; } yield return(data); } }
private void OnQueuedReadThreadExecute() { try { Trace.TraceInformation("QueuedReadThread started: {0}", m_DatabaseInstanceID); using (var stream = new BufferedStream(new FileStream(m_Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.RandomAccess), 1024 * 1024)) { //int handle; WaitHandle[] handles = new WaitHandle[] { m_Quit, m_Event }; var pagedReader = new PagedStreamReader(stream, 4096); while (WaitHandle.WaitAny(handles) == 1) // (handle = WaitHandle.WaitAny(handles)) == 0) { Thread.Sleep(200); //Wait to consolidate if more requests are coming in. QueuedReadRequest[] requests = null; lock (m_SyncObject) { if (m_Queue.Count > 0) { requests = m_Queue.ToArray(); m_Queue.Clear(); } else { m_Event.Reset(); } } if (requests == null) { continue; } LinkedList <LogRowIndex> indicesList = new LinkedList <LogRowIndex>(); Dictionary <LogRowIndex, List <RequestPoints> > indexToRequestPoints = new Dictionary <LogRowIndex, List <RequestPoints> >(); foreach (var readRequest in requests) { var indices = m_Indexes.GetItemRows(readRequest.ItemID, readRequest.StartIndex, readRequest.Count); var requestPoints = new RequestPoints(readRequest); foreach (var logRowIndex in indices) { if (!indexToRequestPoints.TryGetValue(logRowIndex, out var list)) { list = new List <RequestPoints>(); indexToRequestPoints.Add(logRowIndex, list); } list.Add(requestPoints); } indicesList.AddSorted(indices); } foreach (var logRowIndex in indicesList) { var point = LogRowDataFactory.CreateDataPoint(pagedReader, logRowIndex); var list = indexToRequestPoints[logRowIndex]; foreach (var rp in list) { if (rp.Add(point)) { rp.Send(m_DatabaseInstanceID); } } } foreach (var index in indexToRequestPoints) { index.Value.ForEach(points => points.Send(m_DatabaseInstanceID)); } } } Trace.TraceInformation("QueuedReadThread ended: {0}", m_DatabaseInstanceID); } catch (Exception ex) { m_Log.Fatal(ex.Message, ex); throw; } }