Exemplo n.º 1
0
        public ReaderResultSet GetRecordSet(string readerId, int nextIndex, bool inproc, OperationContext context)
        {
            ReaderResultSet      readerChunk      = null;
            IRecordSet           partialRecordSet = null;
            ReaderResultSet      reader           = null;
            RecordRow            row      = null;
            CacheEntry           entry    = null;
            CompressedValueEntry cmpEntry = null;
            int size = 0;

            try
            {
                if (!string.IsNullOrEmpty(readerId))
                {
                    if (_readers.ContainsKey(readerId))
                    {
                        reader = _readers[readerId];
                    }
                }
                if (reader != null)
                {
                    if (nextIndex != 0 && reader.RecordSet.SubsetInfo.LastAccessedRowID == nextIndex)
                    {
                        reader.RecordSet.RemoveRows(reader.RecordSet.SubsetInfo.StartIndex, nextIndex - reader.RecordSet.SubsetInfo.StartIndex);
                    }

                    if (reader.RecordSet.RowCount > 0)
                    {
                        readerChunk      = new ReaderResultSet();
                        partialRecordSet = new RecordSet(reader.RecordSet.GetColumnMetaData());
                        int chunkSize = reader.ChunkSize;
                        reader.RecordSet.SubsetInfo.StartIndex = nextIndex;

                        int nextRowID = nextIndex;
                        while (size <= chunkSize)
                        {
                            row = reader.RecordSet.GetRow(nextRowID++);
                            if (row == null)
                            {
                                break;
                            }
                            row = row.Clone() as RecordRow;
                            if (reader.GetData && !reader.IsGrouped)
                            {
                                entry = _context.CacheImpl.Get(row.GetColumnValue(QueryKeyWords.KeyColumn), context);
                                if (entry != null)
                                {
                                    if (inproc)
                                    {
                                        row.SetColumnValue(QueryKeyWords.ValueColumn, entry.Value);
                                    }
                                    else
                                    {
                                        cmpEntry       = new CompressedValueEntry();
                                        cmpEntry.Value = entry.Value;
                                        if (cmpEntry.Value is CallbackEntry)
                                        {
                                            cmpEntry.Value = ((CallbackEntry)cmpEntry.Value).Value;
                                        }

                                        cmpEntry.Flag = ((CacheEntry)entry).Flag;
                                        row.SetColumnValue(QueryKeyWords.ValueColumn, cmpEntry);
                                    }
                                    size += entry.Size;
                                }


                                if (entry != null)
                                {
                                    partialRecordSet.AddRow(row);
                                    size += row.GetSize();
                                }
                            }
                            else
                            {
                                partialRecordSet.AddRow(row);
                                size += row.GetSize();
                            }
                        }

                        //Value column has been filled if getData is true
                        if (reader.GetData && !reader.IsGrouped)
                        {
                            reader.RecordSet.GetColumnMetaData()[QueryKeyWords.ValueColumn].IsFilled = true;
                        }

                        reader.RecordSet.SubsetInfo.LastAccessedRowID += partialRecordSet.RowCount;
                        readerChunk.RecordSet = partialRecordSet;
                        readerChunk.NextIndex = reader.RecordSet.SubsetInfo.LastAccessedRowID;
                        if (!inproc && _context.Render != null)
                        {
                            readerChunk.NodeAddress = _context.Render.IPAddress.ToString();                                    //server address
                        }
                        readerChunk.OrderByArguments = reader.OrderByArguments;
                        readerChunk.IsGrouped        = reader.IsGrouped;
                        readerChunk.ReaderID         = reader.ReaderID;
                    }
                    else
                    {
                        DisposeReader(reader.ReaderID);
                    }
                }

                return(readerChunk);
            }
            catch (Exception ex)
            {
                if (ex is InvalidReaderException)
                {
                    DisposeReader(reader.ReaderID);
                }
                throw;
            }
        }