byte* LZEncoder::getPage() { buffer=encoder->getPage(); if(buffer != NULL){ //startPos = encoder->getStartPos(); //numValsPerPage=encoder->getNumValsPerPage(); //valsize=encoder->getValSize(); bufferSize = encoder->getBufferSize(); }else{ return NULL; } memset(page, 0, PAGE_SIZE); if(lzo_init() != LZO_E_OK) throw UnexpectedException("LZEncoder: Error, lzo initialization error!"); lzo_byte *compressedData = (lzo_bytep) lzo_malloc(bufferSize + bufferSize / 64 + 16 + 3); //new byte[numValsPerPage*valsize + numValsPerPage*valsize / 64 + 16 + 3]; lzo_byte *wrkmem = (lzo_bytep) lzo_malloc(LZO1X_1_MEM_COMPRESS); int r = 0; r = lzo1x_1_compress((const unsigned char*)buffer, bufferSize, compressedData, &sizeCompressedData, wrkmem); if (r != LZO_E_OK) { throw new UnexpectedException("LZEncoder: compress error!"); } // Writing header for decoder to use *((int*) page)=sizeCompressedData; *((int*) (page+sizeof(int)))=bufferSize; //*((int*) (page+2*sizeof(int)))=startPos; //*((int*) (page+3*sizeof(int)))=valsize; if (sizeCompressedData>PAGE_SIZE-2*sizeof(int)) throw CodingException("LZEncoder: Error, compressed data larger than what we can fit on page"); memcpy(page+2*sizeof(int), compressedData, sizeCompressedData); delete[] compressedData; lzo_free(wrkmem); return page; }
byte* RLEGenericEncoder::getPage() { Log::writeToLog("RLEGenericEncoder", 0, "Called getPage()"); initPage(); if (block==NULL) { Log::writeToLog("RLEGenericEncoder", 2, "RLEGenericEncoder: got a NULL block, returning NULL"); return NULL; } while (block!=NULL && ((writer->getNumBytesWritten()+tripleSize)<=bfrSizeInBytes)) { RLETriple* triple=block->getTriple(); if (triple==NULL) { Log::writeToLog("RLEGenericEncoder", 3, "Error, got a block with a NULL triple"); throw CodingException("RLEGenericEncode: Error, block has a NULL triple"); } bool success=true; //Log::writeToLog("RLEGenericEncoder", 0, "Trying to write block value=",*(int*)triple->value->value); //success&=writer->writeBits(*(int*)triple->value->value, valueSize); success&=writer->writeString((char*)triple->value->value); //Log::writeToLog("RLEGenericEncoder", 0, "Trying to write start=",triple->startPos); //success&=writer->writeBits(triple->startPos, startPosSize); success&=writer->writeString((char*)&triple->startPos, sizeof(int)); //Log::writeToLog("RLEGenericEncoder", 0, "Trying to write reps=",triple->reps); //success&=writer->writeBits(triple->reps, repsSize); success&=writer->writeString((char*)&triple->reps, sizeof(int)); if (success) { *pageLengthPtr+=(tripleSize*8); Log::writeToLog("RLEGenericEncoder", 0, "Wrote Block"); block=(RLEBlock*) dataSrc->getNextValBlock(colIndex); } else { Log::writeToLog("RLEGenericEncoder", 0, "Failed in writing triple"); Log::writeToLog("RLEGenericEncoder", 0, "failed when numbyteswritten", writer->getNumBytesWritten()); throw new CodingException("RLEGenericEncoder: failed to write triple in RLEGenericEncoder"); } } //if ((writer->getNumBitsWritten()+tripleSize)>bfrSizeInBits) // success&=writer->writeBits(0,bfrSizeInBits - writer->getNumBitsWritten()); Log::writeToLog("RLEGenericEncoder", 1, "Returning page"); return buffer; }