From: Wolfgang M. M. <wol...@us...> - 2004-04-14 12:17:33
|
Update of /cvsroot/exist/eXist-1.0/src/org/dbxml/core/filer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20167/src/org/dbxml/core/filer Modified Files: BTree.java Paged.java Log Message: Improved page organization in dom.dbx to fix known XUpdate issues. Index: Paged.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/dbxml/core/filer/Paged.java,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** Paged.java 5 Apr 2004 11:19:28 -0000 1.22 --- Paged.java 14 Apr 2004 12:17:23 -0000 1.23 *************** *** 457,461 **** byte[] data = value.getData(); PageHeader hdr = page.getPageHeader(); - hdr.setRecordLen(value.getLength()); hdr.dataLen = fileHeader.workSize; if (data.length < hdr.dataLen) --- 457,460 ---- *************** *** 976,997 **** } ! public abstract class PageHeader { private int dataLen = 0; private boolean dirty = false; private long nextPage = -1; - private int recordLen = 0; private byte status = UNUSED; - /** Constructor for the PageHeader object */ public PageHeader() { } - /** - * Constructor for the PageHeader object - * - *@param dis Description of the Parameter - *@exception IOException Description of the Exception - */ public PageHeader(byte[] data, int offset) throws IOException { read(data, offset); --- 975,989 ---- } ! public static abstract class PageHeader { ! private int dataLen = 0; private boolean dirty = false; private long nextPage = -1; private byte status = UNUSED; public PageHeader() { } public PageHeader(byte[] data, int offset) throws IOException { read(data, offset); *************** *** 1017,1029 **** /** - * The length of the Record's value - * - *@return The recordLen value - */ - public final int getRecordLen() { - return recordLen; - } - - /** * The status of this page (UNUSED, RECORD, DELETED, etc...) * --- 1009,1012 ---- *************** *** 1043,1058 **** } - /** - * Description of the Method - * - *@param dis Description of the Parameter - *@exception IOException Description of the Exception - */ public int read(byte[] data, int offset) throws IOException { status = data[offset++]; dataLen = ByteConversion.byteToInt(data, offset); offset += 4; - recordLen = ByteConversion.byteToInt(data, offset); - offset += 4; nextPage = ByteConversion.byteToLong(data, offset); offset += 8; --- 1026,1033 ---- *************** *** 1070,1078 **** } - /** - * Sets the dirty attribute of the PageHeader object - * - *@param dirty The new dirty value - */ public final void setDirty(boolean dirty) { this.dirty = dirty; --- 1045,1048 ---- *************** *** 1090,1103 **** /** - * The length of the Record's value - * - *@param recordLen The new recordLen value - */ - public void setRecordLen(int recordLen) { - this.recordLen = recordLen; - dirty = true; - } - - /** * The status of this page (UNUSED, RECORD, DELETED, etc...) * --- 1060,1063 ---- *************** *** 1109,1124 **** } - /** - * Description of the Method - * - *@param dos Description of the Parameter - *@exception IOException Description of the Exception - */ public int write(byte[] data, int offset) throws IOException { data[offset++] = status; ByteConversion.intToByte(dataLen, data, offset); offset += 4; - ByteConversion.intToByte(recordLen, data, offset); - offset += 4; ByteConversion.longToByte(nextPage, data, offset); offset += 8; --- 1069,1076 ---- Index: BTree.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/dbxml/core/filer/BTree.java,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** BTree.java 5 Apr 2004 11:19:28 -0000 1.22 --- BTree.java 14 Apr 2004 12:17:23 -0000 1.23 *************** *** 51,57 **** */ import java.io.ByteArrayInputStream; - import java.io.ByteArrayOutputStream; import java.io.DataInputStream; - import java.io.DataOutputStream; import java.io.EOFException; import java.io.File; --- 51,55 ---- *************** *** 69,73 **** import org.exist.util.ByteConversion; import org.exist.util.VariableByteInputStream; - import org.exist.util.VariableByteOutputStream; /** --- 67,70 ---- *************** *** 116,125 **** } - public BTree(File file, short keyLen) { - this(); - setFile(file); - fileHeader.setKeyLen(keyLen); - } - public BTree(File file) { this(); --- 113,116 ---- *************** *** 450,457 **** */ private void adjustDataLen(Value value) { ! currentDataLen += 8; if(fileHeader.getFixedKeyLen() < 0) currentDataLen += 2; - currentDataLen += value.getLength(); } --- 441,449 ---- */ private void adjustDataLen(Value value) { ! if(currentDataLen < 0) ! recalculateDataLen(); ! currentDataLen += value.getLength() + 8; if(fileHeader.getFixedKeyLen() < 0) currentDataLen += 2; } *************** *** 556,602 **** } - public void __write() throws IOException { - VariableByteOutputStream os = - new VariableByteOutputStream(); - - // Write out the values - for (int i = 0; i < values.length; i++) { - if (fileHeader.getFixedKeyLen() < 0) - os.writeShort(values[i].getLength()); - values[i].streamTo(os); - } - - // write out the pointers - for (int i = 0; i < ptrs.length; i++) - os.writeLong(ptrs[i]); - - byte[] temp = os.toByteArray(); - writeValue(page, new Value(temp)); - - saved = true; - } - - public void _write() throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream((int) fileHeader.getWorkSize()); - DataOutputStream os = new DataOutputStream(bos); - - // Write out the Values - for (int i = 0; i < values.length; i++) { - if (fileHeader.getFixedKeyLen() < 0) - os.writeShort(values[i].getLength()); - values[i].streamTo(os); - } - - // Write out the pointers - for (int i = 0; i < ptrs.length; i++) - os.writeLong(ptrs[i]); - byte[] temp = bos.toByteArray(); - writeValue(page, new Value(temp)); - - //if (fileHeader.isDirty()) - // fileHeader.write(); - saved = true; - } - public void write() throws IOException { final byte[] temp = new byte[fileHeader.getWorkSize()]; --- 548,551 ---- *************** *** 610,613 **** --- 559,564 ---- } data = values[i].getData(); + if(p + data.length > temp.length) + throw new IOException("calculated: " + getDataLen() + "; required: " + (p + data.length)); System.arraycopy(data, 0, temp, p, data.length); p += data.length; *************** *** 675,680 **** long oldPtr = ptrs[idx]; ptrs[idx] = pointer; - - setValues(values); setPointers(ptrs); //write(); --- 626,629 ---- *************** *** 686,691 **** setValues(insertArrayValue(values, value, idx)); - adjustDataLen(value); setPointers(insertArrayLong(ptrs, pointer, idx)); if (getDataLen() > fileHeader.getWorkSize()) split(); --- 635,641 ---- setValues(insertArrayValue(values, value, idx)); setPointers(insertArrayLong(ptrs, pointer, idx)); + adjustDataLen(value); + //recalculateDataLen(); if (getDataLen() > fileHeader.getWorkSize()) split(); *************** *** 1264,1268 **** protected class BTreeFileHeader extends FileHeader { private long rootPage = 0; - private short keyLen = -1; private int nodePageCount = 0; private short fixedLen = -1; --- 1214,1217 ---- *************** *** 1295,1299 **** super.read(raf); rootPage = raf.readLong(); - keyLen = raf.readShort(); fixedLen = raf.readShort(); nodePageCount = raf.readInt(); --- 1244,1247 ---- *************** *** 1303,1307 **** super.write(raf); raf.writeLong(rootPage); - raf.writeShort(keyLen); raf.writeShort(fixedLen); raf.writeInt(nodePageCount); --- 1251,1254 ---- *************** *** 1327,1338 **** } - public short getKeyLen() { - return keyLen; - } - - public void setKeyLen(short keyLen) { - this.keyLen = keyLen; - } - public short getFixedKeyLen() { return fixedLen; --- 1274,1277 ---- *************** *** 1352,1356 **** } ! protected class BTreePageHeader extends PageHeader { private short valueCount = 0; --- 1291,1295 ---- } ! protected static class BTreePageHeader extends PageHeader { private short valueCount = 0; |