27 #include "../core/filesystem/FileSystem.h" 28 #include "../core/encoding/CharEncoding.h" 29 #include "../core/translator/Translator.h" 30 #include "../core/utils/Platform.h" 31 #include "../raster/Band.h" 32 #include "../raster/BandProperty.h" 42 #include <boost/filesystem.hpp> 47 : m_filePtr( nullptr )
84 const unsigned int maxNumberRAMBlocks,
85 const std::vector< unsigned int>& numbersOfBlocksX,
86 const std::vector< unsigned int>& numbersOfBlocksY,
87 const std::vector< unsigned int>& blocksSizesBytes,
88 const unsigned long int maxDiskFilesSize )
90 if( numbersOfBlocksX.size() == 0 )
return false;
91 if( numbersOfBlocksX.size() != numbersOfBlocksY.size() )
return false;
92 if( numbersOfBlocksY.size() != blocksSizesBytes.size() )
return false;
102 unsigned int maxNumbersOfBlocksX = 0;
103 unsigned int maxNumbersOfBlocksY = 0;
104 unsigned int totalRequiredBlocks = 0;
107 for(
unsigned int blockBIdx = 0 ; blockBIdx < numbersOfBlocksX.size() ;
110 if( blocksSizesBytes[ blockBIdx ] == 0 )
return false;
115 if( numbersOfBlocksX[ blockBIdx ] == 0 )
return false;
117 if( maxNumbersOfBlocksX < numbersOfBlocksX[ blockBIdx ] )
118 maxNumbersOfBlocksX = numbersOfBlocksX[ blockBIdx ];
120 if( numbersOfBlocksY[ blockBIdx ] == 0 )
return false;
122 if( maxNumbersOfBlocksY < numbersOfBlocksY[ blockBIdx ] )
123 maxNumbersOfBlocksY = numbersOfBlocksY[ blockBIdx ];
125 totalRequiredBlocks += ( numbersOfBlocksX[ blockBIdx ] *
126 numbersOfBlocksY[ blockBIdx ] );
134 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
140 for(
unsigned int blockBIdx = 0 ; blockBIdx < numbersOfBlocksX.size() ;
145 for(
unsigned int blockYIdx = 0 ; blockYIdx < numbersOfBlocksY[ blockBIdx ] ;
148 m_ramBlocksPointers[ blockBIdx ][ blockYIdx ].resize( numbersOfBlocksX[ blockBIdx ],
nullptr );
150 for(
unsigned int blockXIdx = 0 ; blockXIdx < numbersOfBlocksX[ blockBIdx ] ; ++blockXIdx )
159 newBlockHandler.get();
165 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D( blockBIdx,
166 blockYIdx, blockXIdx ) );
192 for(
unsigned int blockBIdx = 0 ; blockBIdx < numbersOfBlocksX.size() ;
197 for(
unsigned int blockYIdx = 0 ; blockYIdx < numbersOfBlocksY[ blockBIdx ] ;
236 unsigned int x,
unsigned int y )
263 assert( swapIndex.m_dim2Index <
m_activeDiskBlocksInfo[ swapIndex.m_dim0Index ][ swapIndex.m_dim1Index ].size() );
265 swapIndex.m_dim1Index ][ swapIndex.m_dim2Index ];
271 (
long)( inDiskInfo.
m_fileOff ), SEEK_SET ) )
286 (
long)( inDiskInfo.
m_fileOff ), SEEK_SET ) )
293 assert( swapIndex.m_dim2Index <
m_ramBlocksPointers[ swapIndex.m_dim0Index ][ swapIndex.m_dim1Index ].size() );
294 assert(
m_ramBlocksPointers[ swapIndex.m_dim0Index ][ swapIndex.m_dim1Index ][ swapIndex.m_dim2Index ] !=
nullptr );
295 if( 1 != fwrite( (
void*)
m_ramBlocksPointers[ swapIndex.m_dim0Index ][ swapIndex.m_dim1Index ][ swapIndex.m_dim2Index ],
310 m_ramBlocksPointers[ swapIndex.m_dim0Index ][ swapIndex.m_dim1Index ][ swapIndex.m_dim2Index ] =
nullptr;
312 swapIndex.m_dim0Index =
band;
313 swapIndex.m_dim1Index = y;
314 swapIndex.m_dim2Index = x;
316 outDiskInfo = inDiskInfo;
331 const unsigned int& expansionSize,
const unsigned int&
band,
332 std::vector< BlockIndex3D >& addedBlocksCoords )
337 addedBlocksCoords.clear();
343 const unsigned int numberOfBlocksX = (
unsigned int)
348 std::vector< BlockelementPtrT >( numberOfBlocksX,
nullptr ) );
352 std::vector< DiskBlockInfo >( numberOfBlocksX ) );
354 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
356 for(
unsigned int blockYIdx = 0 ; blockYIdx < expansionSize ; ++blockYIdx )
358 for(
unsigned int blockXIdx = 0 ; blockXIdx < numberOfBlocksX ; ++blockXIdx )
367 newBlockHandler.get();
373 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D( band, blockYIdx, blockXIdx ) );
376 addedBlocksCoords.push_back(
BlockIndex3D( band, blockYIdx, blockXIdx ) );
387 const unsigned int& expansionSize,
const unsigned int&
band,
388 std::vector< BlockIndex3D >& addedBlocksCoords )
393 addedBlocksCoords.clear();
397 const unsigned int numberOfBlocksX = (
unsigned int)
402 std::vector< BlockelementPtrT >( numberOfBlocksX,
nullptr ) );
406 std::vector< DiskBlockInfo >( numberOfBlocksX ) );
408 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
414 for(
size_t blockXIdx = 0 ; blockXIdx < numberOfBlocksX ; ++blockXIdx )
423 newBlockHandler.get();
425 m_swapFifo.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(band),
426 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
427 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
431 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(band),
432 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
433 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
436 addedBlocksCoords.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(band),
437 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
438 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
449 const unsigned int& expansionSize,
const unsigned int&
band,
450 std::vector< BlockIndex3D >& addedBlocksCoords )
455 addedBlocksCoords.clear();
461 const unsigned int numberOfBlocksY = (
unsigned int)
464 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
466 for(
unsigned int blockYIdx = 0 ; blockYIdx < numberOfBlocksY ; ++blockYIdx )
476 for(
unsigned int blockXIdx = 0 ; blockXIdx < expansionSize ; ++blockXIdx )
485 newBlockHandler.get();
491 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D( band, blockYIdx, blockXIdx ) );
494 addedBlocksCoords.push_back(
BlockIndex3D( band, blockYIdx, blockXIdx ) );
505 const unsigned int& expansionSize,
const unsigned int&
band,
506 std::vector< BlockIndex3D >& addedBlocksCoords )
511 addedBlocksCoords.clear();
515 const unsigned int numberOfBlocksY = (
unsigned int)
518 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
520 for(
unsigned int blockYIdx = 0 ; blockYIdx < numberOfBlocksY ; ++blockYIdx )
531 - expansionSize ; blockXIdx <
541 newBlockHandler.get();
543 m_swapFifo.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(band),
544 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
545 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
549 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(band),
550 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
551 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
554 addedBlocksCoords.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(band),
555 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
556 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
567 const unsigned int& expansionSize,
568 std::vector< BlockIndex3D >& addedBlocksCoords )
572 addedBlocksCoords.clear();
578 const unsigned int numberOfBlocksY = (
unsigned int)
580 const unsigned int numberOfBlocksX = (
unsigned int)
585 std::vector< std::vector< BlockelementPtrT > >( numberOfBlocksY ) );
589 std::vector< std::vector< DiskBlockInfo > >( numberOfBlocksY ) );
591 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
593 for(
unsigned int expansionIdx = 0 ; expansionIdx < expansionSize ;
596 for(
unsigned int blockYIdx = 0 ; blockYIdx < numberOfBlocksY ; ++blockYIdx )
601 for(
unsigned int blockXIdx = 0 ; blockXIdx < numberOfBlocksX ; ++blockXIdx )
610 newBlockHandler.get();
616 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D( expansionIdx, blockYIdx, blockXIdx ) );
619 addedBlocksCoords.push_back(
BlockIndex3D( expansionIdx, blockYIdx, blockXIdx ) );
631 std::vector< BlockIndex3D >& addedBlocksCoords )
635 addedBlocksCoords.clear();
639 const unsigned int numberOfBlocksY = (
unsigned int)
641 const unsigned int numberOfBlocksX = (
unsigned int)
646 std::vector< std::vector< BlockelementPtrT > >( numberOfBlocksY ) );
650 std::vector< std::vector< DiskBlockInfo > >( numberOfBlocksY ) );
652 std::vector< BlockIndex3D > diskBlocksToAllocateIndexes;
657 for(
unsigned int blockYIdx = 0 ; blockYIdx < numberOfBlocksY ; ++blockYIdx )
662 for(
unsigned int blockXIdx = 0 ; blockXIdx < numberOfBlocksX ; ++blockXIdx )
671 newBlockHandler.get();
673 m_swapFifo.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(expansionIdx),
674 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
675 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
679 diskBlocksToAllocateIndexes.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(expansionIdx),
680 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
681 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
684 addedBlocksCoords.push_back(
BlockIndex3D(static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(expansionIdx),
685 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockYIdx),
686 static_cast<te::mem::ExpansibleBandBlocksManager::BlockIndex3D::CoordDataType>(blockXIdx)));
698 const unsigned int blocksNumber,
699 std::vector< DiskBlockInfo >& diskBlocksInfos,
706 diskBlocksInfos.clear();
707 diskFilesHandler.clear();
711 unsigned int remainnigBlocksNumber = blocksNumber;
713 while( remainnigBlocksNumber )
715 const unsigned int fileBlocksNumber = std::min( maxBlocksPerFile, remainnigBlocksNumber );
716 const unsigned long int fileSizeBytes = ((
unsigned long int)fileBlocksNumber) *
722 newFileHandlerPtr->m_fullFileName ) )
726 diskFilesHandler.push_back( newFileHandlerPtr );
728 for(
unsigned int fileBlockIdx = 0 ; fileBlockIdx < fileBlocksNumber ;
732 diskBlocksInfos.back().m_filePtr = newFileHandlerPtr->m_filePtr;
733 diskBlocksInfos.back().m_fileOff = ((
unsigned long int)fileBlockIdx) *
734 ((
unsigned long int)m_maxBlockSizeBytes);
737 remainnigBlocksNumber -= fileBlocksNumber;
744 const std::vector< BlockIndex3D >& blocksIndxes )
746 if( ! blocksIndxes.empty() )
750 std::vector< DiskBlockInfo > newDiskBlocksInfos;
752 if (!
allocateDiskBlocks(static_cast<unsigned int>(blocksIndxes.size()), newDiskBlocksInfos,
753 newDiskFilesHandler ) )
755 assert( newDiskBlocksInfos.size() == blocksIndxes.size() );
758 newDiskFilesHandler.begin(), newDiskFilesHandler.end() );
760 unsigned int blocksIndxesIdx = 0;
761 while( blocksIndxesIdx < blocksIndxes.size() )
763 const BlockIndex3D& bIdx = blocksIndxes[ blocksIndxesIdx ];
770 assert( blocksIndxesIdx < newDiskBlocksInfos.size() );
772 bIdx.
m_dim2Index ] = newDiskBlocksInfos[ blocksIndxesIdx ];
784 FILE** fileptr, std::string& fullFileName )
const 788 bool returnValue =
true;
789 long seekoff = (long)size;
790 const boost::filesystem::path randShortFileNamePath(
791 "TerralibExpansibleBandBlocksManager_%%%%-%%%%-%%%%-%%%%" );
792 const unsigned char c =
'\0';
796 randShortFileNamePath).
string() );
798 if( fullFileName.empty() )
807 if( (*fileptr) ==
nullptr )
813 if( std::fseek( (*fileptr), seekoff, SEEK_SET ) != 0 )
815 std::fclose( (*fileptr) );
816 std::remove( fullFileName.c_str() );
821 if( 1 != std::fwrite( &c, 1, 1, (*fileptr) ) )
823 std::fclose( (*fileptr) );
824 std::remove( fullFileName.c_str() );
834 std::fclose( (*fileptr) );
837 std::remove( fullFileName.c_str() );
848 randShortFileNamePath).
string() );
850 if( fullFileName.empty() )
859 if( (*fileptr) ==
nullptr )
865 if( std::fseek( (*fileptr), seekoff, SEEK_SET ) != 0 )
867 std::fclose( (*fileptr) );
868 std::remove( fullFileName.c_str() );
873 if( 1 != std::fwrite( &c, 1, 1, (*fileptr) ) )
875 std::fclose( (*fileptr) );
876 std::remove( fullFileName.c_str() );
886 std::fclose( (*fileptr) );
889 std::remove( fullFileName.c_str() );
unsigned char * m_currSwapBlockPtr
A pointer to the current block where disk data swap will be done.
unsigned char * m_getBlockPointer_returnValue
RAMBlocksPointersContainerT m_ramBlocksPointers
3D Matrix of active RAM blocks pointers indexed in the form [band][blockYIndex][blockXIndex].
std::string m_fullFileName
bool addTopBands(const unsigned int &expansionSize, std::vector< BlockIndex3D > &addedBlocksCoords)
New bands will be added at the top of the raster (before the first band).
void shift3DCoords(ContainerType &inputContainer, const int &dim0Shift, const int &dim1Shift, const int &dim2Shift) const
Shift 3D coords.
std::list< OpenDiskFileHandlerPtrT > OpenDiskFilesHandlerT
Open dis files handler type.
Base exception class for plugin module.
An exception class for the TerraLib In-Memory Data Access driver.
bool addBottomBlocks(const unsigned int &expansionSize, const unsigned int &band, std::vector< BlockIndex3D > &addedBlocksCoords)
New blocks will be added at the bottom of the raster.
void * getBlockPointer(unsigned int band, unsigned int x, unsigned int y)
Returns a pointer to the required data block.
bool initialize(const unsigned int maxNumberRAMBlocks, const std::vector< unsigned int > &numbersOfBlocksX, const std::vector< unsigned int > &numbersOfBlocksY, const std::vector< unsigned int > &blocksSizesBytes, const unsigned long int maxDiskFilesSize)
Initialize this instance to an initial state.
ActiveDiskBlocksInfoT m_activeDiskBlocksInfo
3D Matrix of active disk block info indexed as [band][blockYIndex][blockXIndex].
#define TE_TR(message)
It marks a string in order to get translated.
static std::string fromUTF8(const std::string &src)
Convert a string in UTF-8 to the current locale encoding.
ExpansibleBandBlocksManager()
unsigned long int m_maxBlockSizeBytes
The maximum global used block size in bytes.
RAMBlocksHandlerT m_activeRAMBlocksHandler
The active RAM blocks handler.
void shiftDim03DCoords(ContainerType &inputContainer, const unsigned int dim0index, const int dim1Shift, const int dim2Shift) const
Shift coords given a fixed dimention 0 index.
bool addBottomBands(const unsigned int &expansionSize, std::vector< BlockIndex3D > &addedBlocksCoords)
New bands will be added at the bottom of the raster (after de the last band).
CoordDataType m_dim0Index
Block Z (band) index.
bool addRightBlocks(const unsigned int &expansionSize, const unsigned int &band, std::vector< BlockIndex3D > &addedBlocksCoords)
New blocks will be added at the right of the raster.
CoordDataType m_dim2Index
Block X index.
bool allocateAndActivateDiskBlocks(const std::vector< BlockIndex3D > &blocksIndxes)
Allocate and activate disk blocks.
static std::string uniquePath(const std::string &format="%%%%-%%%%-%%%%-%%%%")
Retrives an unique path generated by a given format.
unsigned long int m_maxDiskFilesSize
The maximum temporary disk file size (bytes).
RAM cached and tiled raster band blocks manager.
unsigned long int m_fileOff
SwapFifoT::size_type m_nextFIFOPositionOverSwapFifo
The next position where a block swap will occur over m_swapFifo;.
~ExpansibleBandBlocksManager()
BlockElementT * BlockelementPtrT
Block element pointer type.
bool createNewDiskFile(unsigned long int size, FILE **fileptr, std::string &fullFileName) const
Create a new disk file.
bool addTopBlocks(const unsigned int &expansionSize, const unsigned int &band, std::vector< BlockIndex3D > &addedBlocksCoords)
New blocks will be added at the top of the raster.
void initState()
Initialize this instance to an initial state.
boost::shared_array< BlockElementT > RAMBlockHandlerT
RAM Block handler type;.
bool allocateDiskBlocks(const unsigned int blocksNumber, std::vector< DiskBlockInfo > &diskBlocksInfos, OpenDiskFilesHandlerT &diskFilesHandler) const
Allocate disk blocks.
bool m_isInitialized
Is this instance initialized ?
OpenDiskFilesHandlerT m_diskFilesHandler
The disk files handler;.
unsigned int m_maxNumberRAMBlocks
The maximum number of RAM blocks;.
CoordDataType m_dim1Index
Block Y index.
void free()
Free all allocated internal resources and go back to the initial state.
static std::string tempDirectoryPath()
Retrives the temp directory in UTF-8.
bool addLeftBlocks(const unsigned int &expansionSize, const unsigned int &band, std::vector< BlockIndex3D > &addedBlocksCoords)
New blocks will be added at the left of the raster.
SwapFifoT m_swapFifo
Disk swapping FIFO.
unsigned char BlockElementT
Block element type.
RAMBlockHandlerT m_swapBlockHandler
An extra block for disk swap purposes.
TECOREEXPORT std::string GetUserDirectory()
Returns the system user home dir path.