From: Wolfgang M. M. <wol...@us...> - 2004-08-11 12:47:11
|
Update of /cvsroot/exist/eXist-1.0/src/org/exist/storage/store In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18056/src/org/exist/storage/store Modified Files: ItemId.java StorageAddress.java DOMFile.java BFile.java Log Message: Some more smaller refactorings in the storage backend. Index: DOMFile.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/DOMFile.java,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** DOMFile.java 3 Aug 2004 16:45:46 -0000 1.46 --- DOMFile.java 11 Aug 2004 12:47:01 -0000 1.47 *************** *** 1310,1320 **** if (value.length < l) { // value is smaller than before ! System.out.println(value.length + " < " + l + ": " + new String(value)); ! System.out.println(rec.page.page.getPageInfo() + "; offset = " ! + rec.offset + "; data-len = " ! + rec.page.getPageHeader().getDataLength() ! + "; previous-page = " ! + rec.page.getPageHeader().getPrevDataPage()); ! throw new RuntimeException("shrinked"); } else if (value.length > l) { throw new IllegalStateException("value too long: expected: " --- 1310,1314 ---- if (value.length < l) { // value is smaller than before ! throw new IllegalStateException("shrinked"); } else if (value.length > l) { throw new IllegalStateException("value too long: expected: " *************** *** 1451,1496 **** int pos; short currentId, vlen; ! int dlen; ! outerLoop: while (pageNr > -1) { page = getCurrentPage(pageNr); dataCache.add(page); ! dlen = page.getPageHeader().getDataLength(); ! for (pos = 0; pos < dlen;) { ! currentId = ByteConversion.byteToShort(page.data, pos); ! if (ItemId.isLink(currentId)) { ! if (ItemId.getId(currentId) == targetId) { ! if(!skipLinks) ! return new RecordPos(pos + 2, page, currentId); ! long forwardLink = ByteConversion.byteToLong(page.data, ! pos + 2); ! // load the link page ! pageNr = StorageAddress.pageFromPointer(forwardLink); ! targetId = StorageAddress.tidFromPointer(forwardLink); ! // LOG.debug("following link on " + StorageAddress.pageFromPointer(forwardLink) + ! // " to page " ! // + pageNr ! // + "; tid=" ! // + targetId); ! continue outerLoop; ! } else { ! pos += 10; ! } ! } else if (ItemId.getId(currentId) == targetId) ! return new RecordPos(pos + 2, page, currentId); ! else { ! vlen = ByteConversion.byteToShort(page.data, pos + 2); ! if (ItemId.isRelocated(currentId)) { ! pos += vlen == OVERFLOW ? 20 : vlen + 12; ! } else ! pos += vlen == OVERFLOW ? 12 : vlen + 4; ! } ! } ! pageNr = page.getPageHeader().getNextDataPage(); ! if (pageNr == page.getPageNum()) { ! LOG.debug("circular link to next page on " + pageNr); ! return null; ! } ! LOG.debug( owner.toString() + ": tid " --- 1445,1460 ---- int pos; short currentId, vlen; ! RecordPos rec; while (pageNr > -1) { page = getCurrentPage(pageNr); dataCache.add(page); ! rec = page.findRecord(targetId); ! if(rec == null) { ! pageNr = page.getPageHeader().getNextDataPage(); ! if (pageNr == page.getPageNum()) { ! LOG.debug("circular link to next page on " + pageNr); ! return null; ! } ! LOG.debug( owner.toString() + ": tid " *************** *** 1500,1503 **** --- 1464,1483 ---- + ". Loading " + pageNr + "; contents: " + debugPageContents(page)); + } else if(rec.isLink) { + if(!skipLinks) + return rec; + long forwardLink = ByteConversion.byteToLong(page.data, + rec.offset); + // load the link page + pageNr = StorageAddress.pageFromPointer(forwardLink); + targetId = StorageAddress.tidFromPointer(forwardLink); + LOG.debug("following link on " + StorageAddress.pageFromPointer(forwardLink) + + " to page " + + pageNr + + "; tid=" + + targetId); + } else { + return rec; + } } return null; *************** *** 1661,1680 **** protected final class DOMPage implements Cacheable { byte[] data; ! int len = 0; ! Page page; ! int refCount = 0; - int timestamp = 0; ! boolean saved = true; ! boolean invalidated = false; public DOMPage() { page = createNewPage(); // LOG.debug("Created new page: " + page.getPageNum()); data = new byte[fileHeader.getWorkSize()]; --- 1641,1667 ---- protected final class DOMPage implements Cacheable { + // the raw working data (without page header) of this page byte[] data; ! ! // the current size of the used data int len = 0; ! ! // the low-level page Page page; ! DOMFilePageHeader ph; ! ! // fields required by Cacheable int refCount = 0; int timestamp = 0; ! ! // has the page been saved or is it dirty? boolean saved = true; ! ! // set to true if the page has been removed from the cache boolean invalidated = false; public DOMPage() { page = createNewPage(); + ph = (DOMFilePageHeader)page.getPageHeader(); // LOG.debug("Created new page: " + page.getPageNum()); data = new byte[fileHeader.getWorkSize()]; *************** *** 1697,1700 **** --- 1684,1716 ---- } + public RecordPos findRecord(short targetId) { + final int dlen = ph.getDataLength(); + short currentId; + short vlen; + RecordPos rec = null; + for (int pos = 0; pos < dlen;) { + currentId = ByteConversion.byteToShort(data, pos); + if (ItemId.isLink(currentId)) { + if (ItemId.matches(currentId, targetId)) { + rec = new RecordPos(pos + 2, this, currentId); + rec.isLink = true; + break; + } else { + pos += 10; + } + } else if (ItemId.matches(currentId, targetId)) { + rec = new RecordPos(pos + 2, this, currentId); + break; + } else { + vlen = ByteConversion.byteToShort(data, pos + 2); + if (ItemId.isRelocated(currentId)) { + pos += vlen == OVERFLOW ? 20 : vlen + 12; + } else + pos += vlen == OVERFLOW ? 12 : vlen + 4; + } + } + return rec; + } + /* * (non-Javadoc) *************** *** 1752,1756 **** public DOMFilePageHeader getPageHeader() { ! return (DOMFilePageHeader) page.getPageHeader(); } --- 1768,1772 ---- public DOMFilePageHeader getPageHeader() { ! return ph; } *************** *** 1771,1775 **** try { data = page.read(); ! DOMFilePageHeader ph = (DOMFilePageHeader) page.getPageHeader(); len = ph.getDataLength(); if (data.length == 0) { --- 1787,1791 ---- try { data = page.read(); ! ph = (DOMFilePageHeader) page.getPageHeader(); len = ph.getDataLength(); if (data.length == 0) { *************** *** 1785,1793 **** saved = true; } ! public void write() { if (page == null) return; try { - DOMFilePageHeader ph = (DOMFilePageHeader) page.getPageHeader(); if (!ph.isDirty()) return; ph.setDataLength(len); --- 1801,1808 ---- saved = true; } ! public void write() { if (page == null) return; try { if (!ph.isDirty()) return; ph.setDataLength(len); *************** *** 1995,2003 **** protected final static class RecordPos { int offset = -1; - - DOMPage page = null; - short tid = 0; public RecordPos(int offset, DOMPage page, short tid) { --- 2010,2017 ---- protected final static class RecordPos { + DOMPage page = null; int offset = -1; short tid = 0; + boolean isLink = false; public RecordPos(int offset, DOMPage page, short tid) { Index: StorageAddress.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/StorageAddress.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** StorageAddress.java 3 May 2004 13:08:45 -0000 1.4 --- StorageAddress.java 11 Aug 2004 12:47:01 -0000 1.5 *************** *** 12,16 **** */ public class StorageAddress { ! /** * Create virtual address from page number and offset (tid) --- 12,16 ---- */ public class StorageAddress { ! /** * Create virtual address from page number and offset (tid) Index: BFile.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/BFile.java,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** BFile.java 10 Aug 2004 20:27:17 -0000 1.29 --- BFile.java 11 Aug 2004 12:47:01 -0000 1.30 *************** *** 1772,1778 **** --- 1772,1785 ---- private final class SinglePage extends DataPage { + // the raw working data of this page (without page header) byte[] data = null; + + // the low-level page Page page; + + // the page header BFilePageHeader ph; + + // table mapping record ids (tids) to offsets short[] offsets = null; *************** *** 1826,1830 **** private void readOffsets() throws IOException { - // Arrays.fill(offsets, -1); final int dlen = ph.getDataLength(); for(short pos = 0; pos < dlen; ) { --- 1833,1836 ---- Index: ItemId.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/ItemId.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ItemId.java 10 Aug 2004 20:27:17 -0000 1.3 --- ItemId.java 11 Aug 2004 12:47:01 -0000 1.4 *************** *** 27,30 **** --- 27,31 ---- * in the dom.dbx persistent DOM store. * + * @see org.exist.storage.store.DOMFile * @author wolf */ *************** *** 40,43 **** --- 41,48 ---- } + public final static boolean matches(short id, short targetId) { + return ((short)(id & ID_MASK)) == targetId; + } + public final static short setIsRelocated(short id) { return (short)(id | RELOCATED_MASK); |