1 package com.daffodilwoods.daffodildb.server.datasystem.persistentsystem; 2 3 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.versioninfo.*; 4 import com.daffodilwoods.daffodildb.utils.*; 5 import com.daffodilwoods.daffodildb.utils.byteconverter.*; 6 import com.daffodilwoods.database.resource.*; 7 import com.daffodilwoods.daffodildb.server.datasystem.btree.*; 8 9 10 18 19 20 public class PartialVariableRecordCluster extends VariableRecordCluster{ 21 public PartialVariableRecordCluster(TableProperties tp,DatabaseProperties databaseProperties0,VersionHandler versionHandler0) throws DException { 22 super(tp,databaseProperties0,versionHandler0); 23 } 24 25 32 33 public Object [] partialRetrieve(short recordNumber) throws DException{ 34 byte[] clusterBytes = cluster.getBytes(); 35 short startPointer = cluster.getStartPointerOfRecord(recordNumber); 36 startPointer++; 37 byte isComplete = clusterBytes[startPointer++]; 38 int size = (recordNumber == cluster.actualRecordCount) ? (CCzufDpowfsufs.getShortValue(clusterBytes,0) - startPointer) 39 : ( cluster.getStartPointerOfRecord((short)(recordNumber +1) ) - startPointer ); 40 byte[] bytes = new byte[size]; 41 System.arraycopy(clusterBytes,startPointer,bytes,0,size); 42 return new Object [] {bytes,new byte[] {isComplete} } ; 43 } 44 45 59 60 public int[] insert(byte[] bytes, int startPosition, boolean isUpdate) throws DException { 61 int insertType = insertType(bytes,startPosition); 62 short add = getNextInsertableAddress(); 63 return insertType == NONE ? new int[]{FAILED,0} : partialInsertRecord(bytes,add,startPosition,isUpdate); 64 } 65 66 67 76 77 78 private int insertType(byte[] bytes, int startPosition) throws DException { 79 int recordSize = bytes.length + versionHandler.ACTIVE_DELETE + versionHandler.FULL_PARTIAL + versionHandler.LENGTH ; 80 int space = 0; 81 return startPosition > 0 ? PARTIALY : recordSize <= (space = cluster.freeSpace()) ? FULLY 82 : recordSize > databaseProperties.CLUSTERFREESPACE && space > MIN_VAR_RECORDLENGTH 83 ? PARTIALY : NONE; 84 } 85 86 87 99 100 private int[] partialInsertRecord(byte[] bytes,short insertAdd, int startPosition, boolean isUpdate) throws DException { 101 short currentPointer = insertAdd; 102 short recordSizePointer = (short)(databaseProperties.CLUSTERSIZE - versionHandler.NEWADDRESSLENGTH - cluster.actualRecordCount * versionHandler.LENGTH - versionHandler.LENGTH); 103 cluster.updateBytes(recordSizePointer,CCzufDpowfsufs.getBytes(currentPointer)); 104 cluster.addNewEntry(); cluster.updateColumnPositions(-1,currentPointer); byte[] clusterBytes = cluster.getBytes(); 107 cluster.updateByte(currentPointer++,startPosition == 0 ? isUpdate ? versionHandler.RETRIEVE : versionHandler.ACTIVE : versionHandler.DELETE); 108 109 short range = (short)(cluster.freeSpace() - versionHandler.LENGTH - 1 - 1 - 1); 110 int recordSize =bytes.length - startPosition; 111 short writtenSize = range < recordSize ? range : (short)recordSize; 112 cluster.updateByte(currentPointer++,range < recordSize ? versionHandler.PARTIALLY : versionHandler.COMPLETE); 113 cluster.updateBytes(bytes,startPosition,currentPointer,writtenSize); 114 currentPointer += writtenSize; 115 cluster.actualRecordCount++; 116 if(startPosition == 0) 117 cluster.activeRecordCount++; 118 cluster.updateClusterInformation(currentPointer); 119 int writtenBytes = writtenSize + startPosition; 120 return writtenBytes == bytes.length ? new int[]{SUCCESSFUL,0} : new int[]{PARTIAL,writtenBytes}; 121 } 122 123 131 132 public ClusterStatus partialDelete(short recordNumber) throws DException{ 133 byte [] clusterBytes = cluster.getBytes(); 134 short startPointer = cluster.getStartPointerOfRecord(recordNumber); 135 boolean isComplete = clusterBytes[startPointer + 1] == versionHandler.COMPLETE; 136 if(clusterBytes[startPointer] == versionHandler.ACTIVE) 137 cluster.activeRecordCount--; 138 cluster.updateByte(startPointer,versionHandler.DELETE); 139 boolean flag = recordNumber == cluster.actualRecordCount; 140 short insertableAddress = CCzufDpowfsufs.getShortValue(clusterBytes,0); 141 short oldRecordSize = (short)(( flag ? insertableAddress 142 : cluster.getStartPointerOfRecord((short)(recordNumber + 1))) - startPointer); 143 if(!flag){ 144 byte[] bytes = getClusterBytes((short)(recordNumber + 1),clusterBytes); 145 cluster.updateBytes(startPointer+1,bytes); 146 short s = recordNumber; 147 short recordSizePointer =(short)(databaseProperties.CLUSTERSIZE - versionHandler.NEWADDRESSLENGTH - s * versionHandler.LENGTH - versionHandler.LENGTH) ; 148 for(int len = cluster.getColumnPositions().length ; s < len ; s++ ){ 149 cluster.updateColumnPositions(s,(short)(cluster.getStartPointerOfRecord((short)(s + 1)) - oldRecordSize+1)); 150 cluster.updateBytes(recordSizePointer,CCzufDpowfsufs.getBytes(cluster.getColumnPositions()[s])); 151 recordSizePointer -= versionHandler.LENGTH; 152 } 153 } 154 cluster.updateClusterInformation((short)(insertableAddress - oldRecordSize+1)); 155 return new ClusterStatus(cluster,cluster.activeRecordCount,cluster.actualRecordCount,clusterBytes[versionHandler.CLUSTER_STARTPOINTER+1] != versionHandler.FULL,clusterBytes[cluster.getStartPointerOfRecord(cluster.actualRecordCount) + 1] != versionHandler.FULL,isComplete); 156 } 157 158 159 169 170 public int partialUpdate(short recordNumber, int startPosition, byte [] newBytes) throws DException{ 171 short currentPointer = cluster.getStartPointerOfRecord(recordNumber); 172 byte[] clusterBytes = cluster.getBytes(); 173 boolean flag = recordNumber == cluster.actualRecordCount; 174 int oldRecordSize = (flag ? CCzufDpowfsufs.getShortValue(clusterBytes,0) 175 : cluster.getStartPointerOfRecord((short)(recordNumber + 1))) - currentPointer; 176 short range = (short)(getRange() + oldRecordSize - versionHandler.ACTIVE_DELETE - versionHandler.FULL_PARTIAL ); 177 currentPointer++; 178 int recordSize = newBytes.length - startPosition; 179 short writtenSize = range < recordSize ? range : (short)recordSize; 180 if(startPosition == 0 && writtenSize == recordSize) 181 cluster.updateByte(currentPointer++,versionHandler.FULL); 182 else 183 cluster.updateByte(currentPointer++, range < recordSize ? versionHandler.PARTIALLY : versionHandler.COMPLETE ); 184 byte[] bytes = flag ? null : getClusterBytes((short)(recordNumber + 1),clusterBytes); 185 short pointer = bytes == null ? 0 : cluster.getStartPointerOfRecord((short)(recordNumber + 1)); 186 cluster.updateBytes(newBytes,startPosition,currentPointer,writtenSize); 187 currentPointer += writtenSize; 188 short changeInStartPositions = (short) (currentPointer - pointer); 189 if(!flag){ 190 cluster.updateBytes(currentPointer,bytes); 191 short s = recordNumber; 192 if(changeInStartPositions != 0){ 193 short recordSizePointer = (short)(databaseProperties.CLUSTERSIZE - versionHandler.NEWADDRESSLENGTH - s * versionHandler.LENGTH - versionHandler.LENGTH) ; 194 for(short len = (short)cluster.getColumnPositions().length ; s < len ; s++ ){ 195 cluster.updateColumnPositions(s,(short) (cluster.getStartPointerOfRecord((short)(s +1)) + changeInStartPositions)); 196 cluster.updateBytes(recordSizePointer,CCzufDpowfsufs.getBytes(cluster.getColumnPositions()[s])); 197 recordSizePointer -= versionHandler.LENGTH; 198 } 199 } 200 } 201 cluster.updateBytes(0,CCzufDpowfsufs.getBytes(pointer == 0 ? currentPointer : (short)(currentPointer + bytes.length))); 202 return writtenSize + startPosition; 203 } 204 209 210 public int getLength0fPartialRecord(short recordNumber) throws DException{ 211 return (recordNumber == cluster.actualRecordCount ? CCzufDpowfsufs.getShortValue(cluster.getBytes(), 0) 212 : cluster.getStartPointerOfRecord( (short) (recordNumber + 1))) - cluster.getStartPointerOfRecord(recordNumber); 213 214 } 215 216 237 238 public ClusterStatus delete(short recordNumber, boolean checkKeyValidity) throws DException{ 239 240 if(recordNumber > cluster.actualRecordCount) 241 throw new DException("DSE2007", new Object []{new Integer (recordNumber)}); 242 byte[] clusterBytes = cluster.getBytes(); 243 if(checkKeyValidity) 244 checkValidity1(recordNumber,clusterBytes); 245 246 short startPointer = cluster.getStartPointerOfRecord(recordNumber); 247 boolean curre = clusterBytes[startPointer+1] == versionHandler.PARTIALLY; 248 if (curre) 249 throw StaticExceptions.PARTIAL_RECORD_EXCEPTION ; 250 Object tk = null; 251 if(clusterBytes[startPointer] == versionHandler.UPDATE){ 252 tk = getNewLocation(recordNumber,startPointer,clusterBytes); 253 curre = true; 254 } 255 cluster.updateByte(startPointer,versionHandler.DELETE); 256 cluster.activeRecordCount--; 257 boolean flag = recordNumber == cluster.actualRecordCount; 258 short insertableAddress = CCzufDpowfsufs.getShortValue(clusterBytes,0); 259 short oldRecordSize = (short) ((flag ? insertableAddress : cluster.getStartPointerOfRecord((short)(recordNumber + 1))) - startPointer); 260 if(!flag){ 261 byte[] bytes = getClusterBytes( (short)(recordNumber + 1),clusterBytes ); 262 cluster.updateBytes(startPointer+1,bytes); 263 short changeInStartPointer = (short)(oldRecordSize - 1); 264 short s = (short)(recordNumber+1); 265 int recordSizePointer = databaseProperties.CLUSTERSIZE - versionHandler.NEWADDRESSLENGTH - s*versionHandler.LENGTH ; 266 if(cluster.getActualRecordCount() != cluster.getColumnPositions().length) 267 Thread.dumpStack(); 268 for(int len = cluster.getActualRecordCount() ; s <= len ; s++ ){ 269 short index = (short)(s-1); 270 short start = cluster.getStartPointerOfRecord(s); 271 short now = (short)(start - changeInStartPointer); 272 cluster.updateColumnPositions(index,now); 273 cluster.updateBytes(recordSizePointer,CCzufDpowfsufs.getBytes(now)); 274 recordSizePointer -= versionHandler.LENGTH; 275 } 276 } 277 cluster.updateClusterInformation((short)(insertableAddress - oldRecordSize + 1)); 278 if(curre){ 279 throw new DException("DSE2005",new Object []{tk}); 280 } 281 return new ClusterStatus(cluster,cluster.activeRecordCount,cluster.actualRecordCount,clusterBytes[versionHandler.CLUSTER_STARTPOINTER+1] != versionHandler.FULL,clusterBytes[cluster.getStartPointerOfRecord(cluster.actualRecordCount) + 1] != versionHandler.FULL,curre); 282 } 283 284 285 303 304 public void update(short recordNumber,byte[] newBytes) throws DException { 305 byte[] clusterBytes = cluster.getBytes(); 306 int freeSpace = getRange(); 307 short startPointer = cluster.getStartPointerOfRecord(recordNumber); 308 boolean flag = recordNumber == cluster.actualRecordCount; 309 short startOfNext = 0; 310 int oldRecordSize = (flag ? CCzufDpowfsufs.getShortValue(clusterBytes,0) 311 : (startOfNext = cluster.getStartPointerOfRecord( (short)(recordNumber+1)))) - startPointer; 312 if(clusterBytes[startPointer] == versionHandler.DELETE ) 313 throw new DException("DSE2003",new Object []{new Integer (recordNumber)}); 314 if(clusterBytes[startPointer] == versionHandler.UPDATE){ 315 Object tk = getNewLocation(recordNumber,startPointer,clusterBytes); 316 throw new DException("DSE2005",new Object []{tk}); 317 } 318 if(clusterBytes[startPointer+1] == versionHandler.PARTIALLY) 319 throw new DException("DSE2006",new Object [] {new Integer (oldRecordSize),new Integer ((int)freeSpace)} ); 320 if(newBytes.length + versionHandler.ACTIVE_DELETE + versionHandler.FULL_PARTIAL <= freeSpace + oldRecordSize){ 321 byte[] bytes = flag ? null : getClusterBytes((short)(recordNumber+1),clusterBytes); 322 short pointer = flag ? 0 : startOfNext; 323 short currentPointer = (short)(startPointer+2); 324 cluster.updateBytes(currentPointer,newBytes); 325 currentPointer += newBytes.length; 326 short changeInStartPositions = (short)(currentPointer - pointer); 327 if(!flag){ 328 cluster.updateBytes(currentPointer,bytes); 329 if(changeInStartPositions != 0){ 330 short s = recordNumber; 331 short recordSizePointer = (short) (databaseProperties.CLUSTERSIZE - 2 * versionHandler.LENGTH - s * versionHandler.LENGTH - versionHandler.LENGTH) ; 332 for(short len = (short)cluster.getColumnPositions().length ; s < len ; s++ ){ 333 cluster.updateColumnPositions(s,((short) (cluster.getStartPointerOfRecord((short)(s+1)) + changeInStartPositions))); 334 cluster.updateBytes(recordSizePointer,CCzufDpowfsufs.getBytes(cluster.getColumnPositions()[s])); 335 recordSizePointer -= versionHandler.LENGTH; 336 } 337 } 338 } 339 cluster.updateClusterInformation(pointer == 0 ? currentPointer :(short)(currentPointer + bytes.length)); 340 } 341 else 342 throw DatabaseConstants.RECORD_CANNOT_UPDATED; 343 } 344 345 346 361 362 363 public BufferRange retrieveBufferRange(short recordNumber) throws DException{ 364 byte[] clusterBytes = cluster.getBytes(); 365 short startPointer = cluster.getStartPointerOfRecord(recordNumber); 366 367 if(clusterBytes[startPointer] == versionHandler.DELETE ){ 368 throw StaticExceptions.RECORD_DELETED_EXCEPTION ; 369 } 370 if(clusterBytes[startPointer] == versionHandler.UPDATE){ 371 Object tk = getNewLocation(recordNumber,(short)(startPointer),clusterBytes); 372 throw new DException("DSE2005",new Object []{tk}); 373 } 374 startPointer++; 375 byte isComplete = clusterBytes[startPointer++]; 376 int size = (recordNumber == cluster.actualRecordCount) ? (CCzufDpowfsufs.getShortValue(clusterBytes,0) - startPointer) 377 : ( cluster.getStartPointerOfRecord((short)(recordNumber + 1)) - startPointer ); 378 byte[] recordBytes = new byte[size]; 379 System.arraycopy(clusterBytes, startPointer, recordBytes, 0, size); 380 BufferRange bufferRange = new BufferRange(recordBytes,0,size); 381 if( isComplete == versionHandler.PARTIALLY) 382 throw new DException("DSE2006",new Object []{bufferRange}); 383 return bufferRange ; 384 } 385 393 } 394 | Popular Tags |