/// <summary> /// Will return a list of all pages in the block /// </summary> /// <returns></returns> public List <TPSPage> getPages() { RandomAccess ra = RandomAccess.GetInstance(); List <TPSPage> pages = new List <TPSPage>(); ra.jumpAbs(_start); //jump to the start of the block try{ while (ra.position < _end) //while we have not fallen off the end of the file { TPSPage page = new TPSPage(); page.Process(); pages.Add(page); //pages always start on the position % 100 = 0 //So let's jump forward to find the next start if ((ra.position & 0xFF) != 0x00) { ra.jumpAbs((ra.position & 0xFFFFFF00L) + 0x0100); } //we can find the next page because the address of the page will be in the data int addr = 0; if (!ra.isAtEnd()) { do { addr = ra.leLong(); ra.jumpRelative(-4); //backup 4 bytes if (addr != ra.position) { ra.jumpRelative(0x0100); } }while ((addr != ra.position) && !ra.isAtEnd()); } } }catch (Exception ex) { ; } return(pages); }
/// <summary> /// Will read the next TPSRecord. /// True or false depending if there is another one in the queue /// </summary> /// <returns></returns> public bool Read() { //if there is anything on our temporary stack, just send the first one back to the user and remove it from thelist if (_returnDataStack.Count > 0) { _currentRow = _returnDataStack[0]; _returnDataStack.RemoveAt(0); return(true); } //read page after page until either there are no more pages or we have something on our stack to return while (_tpsPages.Count > 0 && _returnDataStack.Count < 1) { TPSPage page = _tpsPages[0]; _tpsPages.RemoveAt(0); //pop the page off the stack List <TPSRecord> pageRecords = page.GetRecords(); foreach (TPSRecord record in pageRecords) { //go through each record to see if we need it if (record.RecordType == TPSRecord.TYPE_DATA) { //Check if this record belongs to a table that we are searchin for //Notice that we need to generate the table ID before we can check //This part is normally in the TableDataRecord file, but we want to know before //parsing the whole record in the name of efficiency byte[] recordTableIDBA = new byte[4]; if (record.RecordData.Length < 4) { continue; } //Get the tableID ( it is backwards ) recordTableIDBA[0] = record.RecordData[3]; recordTableIDBA[1] = record.RecordData[2]; recordTableIDBA[2] = record.RecordData[1]; recordTableIDBA[3] = record.RecordData[0]; int recordTableID = BitConverter.ToInt32(recordTableIDBA, 0); if (_schema.TableID == recordTableID) { //Generate the record Record.TableDataRecord tdr = new Record.TableDataRecord(record, _schema); Dictionary <string, string> newRow = new Dictionary <string, string>(); for (int i = 0; i < tdr.TableDataRow.Table.Columns.Count; i++) { newRow.Add(tdr.TableDataRow.Table.Columns[i].ColumnName, tdr.TableDataRow[tdr.TableDataRow.Table.Columns[i].ColumnName].ToString()); } _returnDataStack.Add(newRow); } } } } //Now send back a record. If not, we're out and send false if (_returnDataStack.Count > 0) { _currentRow = _returnDataStack[0]; _returnDataStack.RemoveAt(0); return(true); } else { return(false); } return(false); }