From: Wolfgang M. M. <wol...@us...> - 2004-04-23 13:08:24
|
Update of /cvsroot/exist/eXist-1.0/src/org/exist/storage/store In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2156/src/org/exist/storage/store Modified Files: BFile.java NodeIterator.java DOMFile.java Log Message: A large number of XUpdate bugs has been fixed. Index: DOMFile.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/DOMFile.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** DOMFile.java 14 Apr 2004 12:17:22 -0000 1.21 --- DOMFile.java 23 Apr 2004 13:07:45 -0000 1.22 *************** *** 29,32 **** --- 29,33 ---- import java.util.Iterator; import java.util.LinkedList; + import org.dbxml.core.DBException; import org.dbxml.core.data.Value; *************** *** 330,335 **** --- 331,338 ---- // still not enough free space: create a new page DOMPage newPage = new DOMPage(); + LOG.debug("creating additional page: " + newPage.getPageNum()); newPage.getPageHeader().setNextDataPage( rec.page.getPageHeader().getNextDataPage()); + newPage.getPageHeader().setPrevDataPage(rec.page.getPageNum()); rec.page.getPageHeader().setNextDataPage( newPage.getPageNum()); *************** *** 353,356 **** --- 356,360 ---- newPage.getPageHeader().setNextDataPage( rec.page.getPageHeader().getNextDataPage()); + newPage.getPageHeader().setPrevDataPage(rec.page.getPageNum()); rec.page.getPageHeader().setNextDataPage(newPage.getPageNum()); rec.page.setDirty(true); *************** *** 429,432 **** --- 433,437 ---- DOMPage newPage = new DOMPage(); newPage.getPageHeader().setNextTID((short)(rec.page.getPageHeader().getNextTID() - 1)); + newPage.getPageHeader().setPrevDataPage(nextSplitPage.getPageNum()); LOG.debug("creating new split page: " + newPage.getPageNum()); nextSplitPage.getPageHeader().setNextDataPage(newPage.getPageNum()); *************** *** 435,438 **** --- 440,444 ---- nextSplitPage.setDirty(true); dataCache.add(nextSplitPage); + dataCache.add(newPage); nextSplitPage = newPage; splitRecordCount = 0; *************** *** 491,494 **** --- 497,501 ---- DOMPage newPage = new DOMPage(); newPage.getPageHeader().setNextTID((short)(rec.page.getPageHeader().getNextTID() - 1)); + newPage.getPageHeader().setPrevDataPage(rec.page.getPageNum()); LOG.debug("creating new: " + newPage.getPageNum()); long np = rec.page.getPageHeader().getNextDataPage(); *************** *** 498,502 **** rec.page.setDirty(true); dataCache.add(rec.page); ! newPage.getPageHeader().setPrevDataPage(rec.page.getPageNum()); newPage.getPageHeader().setNextDataPage(np); rec.page = newPage; --- 505,509 ---- rec.page.setDirty(true); dataCache.add(rec.page); ! dataCache.add(newPage); newPage.getPageHeader().setNextDataPage(np); rec.page = newPage; *************** *** 565,568 **** --- 572,597 ---- } + private void printPageContents(DOMPage page) { + System.out.print("Page " + page.getPageNum() + ": "); + short count = 0; + short currentId, vlen; + int dlen = page.getPageHeader().getDataLength(); + for (int pos = 0; pos < dlen; count++) { + currentId = ByteConversion.byteToShort(page.data, pos); + System.out.print(currentId + " "); + if (ItemId.isLink(currentId)) { + pos += 10; + } 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; + } + } + System.out.println(); + LOG.debug("page " + page.getPageNum() + " has " + count + " records."); + } + public boolean close() throws DBException { flush(); *************** *** 640,649 **** for (long gid = firstChildId; gid < lastChildId; gid++) { NodeImpl child = (NodeImpl) iter.next(); if (gid == target) { return ((NodeIterator) iter).currentAddress(); } child.setGID(gid); ! if (node.hasChildNodes() ! && (p = findNode(child, target, iter)) != 0) return p; } } --- 669,680 ---- for (long gid = firstChildId; gid < lastChildId; gid++) { NodeImpl child = (NodeImpl) iter.next(); + if(child == null) + LOG.warn("Next node missing. gid = " + gid + "; last = " + lastChildId + + "; parent= " + node.getNodeName() + "; count = " + node.getChildCount()); if (gid == target) { return ((NodeIterator) iter).currentAddress(); } child.setGID(gid); ! if ((p= findNode(child, target, iter)) != 0) return p; } } *************** *** 698,702 **** id = XMLUtil.getParentId(doc, id); if (id < 1) { ! LOG.debug(node.gid + " not found."); throw new BTreeException("node " + node.gid + " not found."); } --- 729,733 ---- id = XMLUtil.getParentId(doc, id); if (id < 1) { ! LOG.warn(node.gid + " not found."); throw new BTreeException("node " + node.gid + " not found."); } *************** *** 965,971 **** private void removeLink(long p) { RecordPos rec = findRecord(p, false); - // LOG.debug("removing link from " + rec.page.getPageNum()); DOMFilePageHeader ph = rec.page.getPageHeader(); ! System.arraycopy(rec.page.data, rec.offset + 8, rec.page.data, rec.offset - 2, 10); rec.page.len = rec.page.len - 10; ph.setDataLength(rec.page.len); --- 996,1003 ---- private void removeLink(long p) { RecordPos rec = findRecord(p, false); DOMFilePageHeader ph = rec.page.getPageHeader(); ! // TODO: 10 is wrong ! int end = rec.offset + 8; ! System.arraycopy(rec.page.data, rec.offset + 8, rec.page.data, rec.offset - 2, rec.page.len - end); rec.page.len = rec.page.len - 10; ph.setDataLength(rec.page.len); *************** *** 973,981 **** ph.decRecordCount(); // LOG.debug("size = " + ph.getRecordCount()); ! if (ph.getRecordCount() == 0) { removePage(rec.page); rec.page = null; ! } else dataCache.add(rec.page); } --- 1005,1016 ---- ph.decRecordCount(); // LOG.debug("size = " + ph.getRecordCount()); ! if (rec.page.len == 0) { ! LOG.debug("freeing page " + rec.page.getPageNum()); removePage(rec.page); rec.page = null; ! } else { dataCache.add(rec.page); + //printPageContents(rec.page); + } } *************** *** 993,996 **** --- 1028,1034 ---- short l = ByteConversion.byteToShort(rec.page.data, rec.offset); rec.offset += 2; + if(ItemId.isLink(rec.tid)) { + throw new RuntimeException("Cannot remove link ..."); + } if(ItemId.isRelocated(rec.tid)) { long backLink = ByteConversion.byteToLong(rec.page.data, rec.offset); *************** *** 1023,1027 **** rec.page.setDirty(true); ph.decRecordCount(); ! if (ph.getRecordCount() == 0) { removePage(rec.page); rec.page = null; --- 1061,1065 ---- rec.page.setDirty(true); ph.decRecordCount(); ! if (rec.page.len == 0) { removePage(rec.page); rec.page = null; *************** *** 1054,1058 **** dataCache.remove(page); DOMFilePageHeader ph = page.getPageHeader(); ! if (ph.getNextDataPage() > -1) { DOMPage next = getCurrentPage(ph.getNextDataPage()); --- 1092,1096 ---- dataCache.remove(page); DOMFilePageHeader ph = page.getPageHeader(); ! LOG.debug("---------------------------\nFreeing page: " + page.getPageNum()); if (ph.getNextDataPage() > -1) { DOMPage next = getCurrentPage(ph.getNextDataPage()); *************** *** 1062,1067 **** --- 1100,1107 ---- } + LOG.debug("previous = " + ph.getPrevDataPage()); if(ph.getPrevDataPage() > -1) { DOMPage prev = getCurrentPage(ph.getPrevDataPage()); + LOG.debug("previous = " + prev.getPageNum()); prev.getPageHeader().setNextDataPage(ph.getNextDataPage()); prev.setDirty(true); *************** *** 1165,1168 **** --- 1205,1211 ---- RecordPos rec = findRecord(p); short l = ByteConversion.byteToShort(rec.page.data, rec.offset); + rec.offset += 2; + if(ItemId.isRelocated(rec.tid)) + rec.offset += 8; if (value.length < l) { // value is smaller than before *************** *** 1179,1183 **** } else { // value length unchanged ! System.arraycopy(value, 0, rec.page.data, rec.offset + 2, value.length); } --- 1222,1226 ---- } else { // value length unchanged ! System.arraycopy(value, 0, rec.page.data, rec.offset, value.length); } *************** *** 1217,1230 **** private void getNodeValue(ByteArrayOutputStream os, RecordPos rec, boolean firstCall) { ! if (rec.offset > rec.page.getPageHeader().getDataLength()) { ! final long nextPage = rec.page.getPageHeader().getNextDataPage(); ! if (nextPage < 0) { ! LOG.warn("bad link to next page"); ! return; ! } ! rec.page = getCurrentPage(nextPage); ! dataCache.add(rec.page); ! rec.offset = 2; ! } short len = ByteConversion.byteToShort(rec.page.data, rec.offset); rec.offset += 2; --- 1260,1281 ---- private void getNodeValue(ByteArrayOutputStream os, RecordPos rec, boolean firstCall) { ! boolean foundNext = false; ! do { ! if (rec.offset > rec.page.getPageHeader().getDataLength()) { ! final long nextPage = rec.page.getPageHeader().getNextDataPage(); ! if (nextPage < 0) { ! LOG.warn("bad link to next page"); ! return; ! } ! rec.page = getCurrentPage(nextPage); ! dataCache.add(rec.page); ! rec.offset = 2; ! } ! rec.tid = ByteConversion.byteToShort(rec.page.data, rec.offset - 2); ! if(ItemId.isLink(rec.tid)) { ! rec.offset += 10; ! } else ! foundNext = true; ! } while(!foundNext); short len = ByteConversion.byteToShort(rec.page.data, rec.offset); rec.offset += 2; *************** *** 1232,1250 **** rec.offset += 8; byte[] data = rec.page.data; ! int offset = rec.offset; if (len == OVERFLOW) { ! final long op = ByteConversion.byteToLong(rec.page.data, rec.offset); data = getOverflowValue(op); len = (short) data.length; ! offset = 0; } ! final short type = Signatures.getType(data[offset]); switch (type) { case Node.ELEMENT_NODE: ! final int children = ByteConversion.byteToInt(data, offset + 1); ! final byte attrSizeType = (byte) ((data[offset] & 0x0C) >> 0x2); final short attributes = (short) Signatures.read(attrSizeType, ! data, offset + 5); rec.offset += len + 2; for (int i = 0; i < children; i++) { --- 1283,1302 ---- rec.offset += 8; byte[] data = rec.page.data; ! int readOffset = rec.offset; if (len == OVERFLOW) { ! final long op = ByteConversion.byteToLong(data, rec.offset); data = getOverflowValue(op); len = (short) data.length; ! readOffset = 0; ! rec.offset += 8; } ! final short type = Signatures.getType(data[readOffset]); switch (type) { case Node.ELEMENT_NODE: ! final int children = ByteConversion.byteToInt(data, readOffset + 1); ! final byte attrSizeType = (byte) ((data[readOffset] & 0x0C) >> 0x2); final short attributes = (short) Signatures.read(attrSizeType, ! data, readOffset + 5); rec.offset += len + 2; for (int i = 0; i < children; i++) { *************** *** 1255,1259 **** return; case Node.TEXT_NODE: ! os.write(data, offset + 1, len - 1); break; case Node.ATTRIBUTE_NODE: --- 1307,1311 ---- return; case Node.TEXT_NODE: ! os.write(data, readOffset + 1, len - 1); break; case Node.ATTRIBUTE_NODE: *************** *** 1261,1274 **** // if this is the first call to the method if (firstCall) { ! final byte idSizeType = (byte) (data[offset] & 0x3); ! final boolean hasNamespace = (data[offset] & 0x10) == 0x10; int next = Signatures.getLength(idSizeType) + 1; if (hasNamespace) { next += 2; // skip namespace id final short prefixLen = ByteConversion.byteToShort(data, ! offset + next); next += prefixLen + 2; // skip prefix } ! os.write(rec.page.data, offset + next, len - next); } break; --- 1313,1326 ---- // if this is the first call to the method if (firstCall) { ! final byte idSizeType = (byte) (data[readOffset] & 0x3); ! final boolean hasNamespace = (data[readOffset] & 0x10) == 0x10; int next = Signatures.getLength(idSizeType) + 1; if (hasNamespace) { next += 2; // skip namespace id final short prefixLen = ByteConversion.byteToShort(data, ! readOffset + next); next += prefixLen + 2; // skip prefix } ! os.write(rec.page.data, readOffset + next, len - next); } break; Index: NodeIterator.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/NodeIterator.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** NodeIterator.java 14 Apr 2004 12:17:22 -0000 1.5 --- NodeIterator.java 23 Apr 2004 13:07:45 -0000 1.6 *************** *** 117,121 **** long nextPage = ph.getNextDataPage(); if (nextPage < 0) { ! LOG.debug("bad link to next " + p.page.getPageInfo()); return null; } --- 117,122 ---- long nextPage = ph.getNextDataPage(); if (nextPage < 0) { ! LOG.debug("bad link to next " + p.page.getPageInfo() + "; previous: " + ! ph.getPrevDataPage()); return null; } *************** *** 127,137 **** // extract the tid lastTID = ByteConversion.byteToShort(p.data, offset); - if(ItemId.getId(lastTID) < 0) - LOG.debug("tid < 0: " + lastTID + " at "+ p.page.getPageInfo()); offset += 2; // check if this is just a link to a relocated node if(ItemId.isLink(lastTID)) { // skip this offset += 8; continue; } --- 128,139 ---- // extract the tid lastTID = ByteConversion.byteToShort(p.data, offset); offset += 2; // check if this is just a link to a relocated node if(ItemId.isLink(lastTID)) { // skip this + long link = ByteConversion.byteToLong(p.data, offset); offset += 8; + //System.out.println("skipping link on p " + page + " -> " + + // StorageAddress.pageFromPointer(link)); continue; } *************** *** 159,162 **** --- 161,165 ---- ); nextNode.setOwnerDocument(doc); + // System.out.println("Next: " + nextNode.getNodeName() + " [" + page + "]"); } while(nextNode == null); } Index: BFile.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/storage/store/BFile.java,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** BFile.java 14 Apr 2004 12:17:22 -0000 1.17 --- BFile.java 23 Apr 2004 13:07:45 -0000 1.18 *************** *** 929,943 **** public void write(java.io.RandomAccessFile raf) throws IOException { // does the free-space list fit into the file header? if (freeList.size() > MAX_FREE_LIST_LEN) { LOG.debug("removing " + (freeList.size() - MAX_FREE_LIST_LEN) + " free pages."); // no: remove some smaller entries to make it fit ! for (int i = 0; i < freeList.size() - MAX_FREE_LIST_LEN; i++) ! freeList.removeFirst(); } super.write(raf); raf.writeLong(lastDataPage); ! raf.writeInt(freeList.size()); FreeSpace freeSpace; ! for (Iterator i = freeList.iterator(); i.hasNext();) { freeSpace = (FreeSpace) i.next(); raf.writeLong(freeSpace.getPage()); --- 929,950 ---- public void write(java.io.RandomAccessFile raf) throws IOException { // does the free-space list fit into the file header? + int skip = 0; if (freeList.size() > MAX_FREE_LIST_LEN) { LOG.debug("removing " + (freeList.size() - MAX_FREE_LIST_LEN) + " free pages."); // no: remove some smaller entries to make it fit ! skip = freeList.size() - MAX_FREE_LIST_LEN; ! // for (int i = 0; i < freeList.size() - MAX_FREE_LIST_LEN; i++) ! // freeList.removeFirst(); } super.write(raf); raf.writeLong(lastDataPage); ! raf.writeInt(freeList.size() - skip); FreeSpace freeSpace; ! Iterator i = freeList.iterator(); ! // skip ! for(int j = 0; j < skip && i.hasNext(); j++) { ! i.next(); ! } ! while (i.hasNext()) { freeSpace = (FreeSpace) i.next(); raf.writeLong(freeSpace.getPage()); |