Exemple #1
0
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;
}