Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
		
							parent
							
								
									4e7ced6adb
								
							
						
					
					
						commit
						56d3b022b6
					
				
							
								
								
									
										114
									
								
								js/sql/C/vdbefifo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								js/sql/C/vdbefifo.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | ||||||
|  | /*
 | ||||||
|  | ** 2005 June 16 | ||||||
|  | ** | ||||||
|  | ** The author disclaims copyright to this source code.  In place of | ||||||
|  | ** a legal notice, here is a blessing: | ||||||
|  | ** | ||||||
|  | **    May you do good and not evil. | ||||||
|  | **    May you find forgiveness for yourself and forgive others. | ||||||
|  | **    May you share freely, never taking more than you give. | ||||||
|  | ** | ||||||
|  | ************************************************************************* | ||||||
|  | ** This file implements a FIFO queue of rowids used for processing | ||||||
|  | ** UPDATE and DELETE statements. | ||||||
|  | */ | ||||||
|  | #include "sqliteInt.h" | ||||||
|  | #include "vdbeInt.h" | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | ** Allocate a new FifoPage and return a pointer to it.  Return NULL if | ||||||
|  | ** we run out of memory.  Leave space on the page for nEntry entries. | ||||||
|  | */ | ||||||
|  | static FifoPage *allocatePage(int nEntry){ | ||||||
|  |   FifoPage *pPage; | ||||||
|  |   if( nEntry>32767 ){ | ||||||
|  |     nEntry = 32767; | ||||||
|  |   } | ||||||
|  |   pPage = sqliteMallocRaw( sizeof(FifoPage) + sizeof(i64)*(nEntry-1) ); | ||||||
|  |   if( pPage ){ | ||||||
|  |     pPage->nSlot = nEntry; | ||||||
|  |     pPage->iWrite = 0; | ||||||
|  |     pPage->iRead = 0; | ||||||
|  |     pPage->pNext = 0; | ||||||
|  |   } | ||||||
|  |   return pPage; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | ** Initialize a Fifo structure. | ||||||
|  | */ | ||||||
|  | void sqlite3VdbeFifoInit(Fifo *pFifo){ | ||||||
|  |   memset(pFifo, 0, sizeof(*pFifo)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | ** Push a single 64-bit integer value into the Fifo.  Return SQLITE_OK | ||||||
|  | ** normally.   SQLITE_NOMEM is returned if we are unable to allocate | ||||||
|  | ** memory. | ||||||
|  | */ | ||||||
|  | int sqlite3VdbeFifoPush(Fifo *pFifo, i64 val){ | ||||||
|  |   FifoPage *pPage; | ||||||
|  |   pPage = pFifo->pLast; | ||||||
|  |   if( pPage==0 ){ | ||||||
|  |     pPage = pFifo->pLast = pFifo->pFirst = allocatePage(20); | ||||||
|  |     if( pPage==0 ){ | ||||||
|  |       return SQLITE_NOMEM; | ||||||
|  |     } | ||||||
|  |   }else if( pPage->iWrite>=pPage->nSlot ){ | ||||||
|  |     pPage->pNext = allocatePage(pFifo->nEntry); | ||||||
|  |     if( pPage->pNext==0 ){ | ||||||
|  |       return SQLITE_NOMEM; | ||||||
|  |     } | ||||||
|  |     pPage = pFifo->pLast = pPage->pNext; | ||||||
|  |   } | ||||||
|  |   pPage->aSlot[pPage->iWrite++] = val; | ||||||
|  |   pFifo->nEntry++; | ||||||
|  |   return SQLITE_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | ** Extract a single 64-bit integer value from the Fifo.  The integer | ||||||
|  | ** extracted is the one least recently inserted.  If the Fifo is empty | ||||||
|  | ** return SQLITE_DONE. | ||||||
|  | */ | ||||||
|  | int sqlite3VdbeFifoPop(Fifo *pFifo, i64 *pVal){ | ||||||
|  |   FifoPage *pPage; | ||||||
|  |   if( pFifo->nEntry==0 ){ | ||||||
|  |     return SQLITE_DONE; | ||||||
|  |   } | ||||||
|  |   assert( pFifo->nEntry>0 ); | ||||||
|  |   pPage = pFifo->pFirst; | ||||||
|  |   assert( pPage!=0 ); | ||||||
|  |   assert( pPage->iWrite>pPage->iRead ); | ||||||
|  |   assert( pPage->iWrite<=pPage->nSlot ); | ||||||
|  |   assert( pPage->iRead<pPage->nSlot ); | ||||||
|  |   assert( pPage->iRead>=0 ); | ||||||
|  |   *pVal = pPage->aSlot[pPage->iRead++]; | ||||||
|  |   pFifo->nEntry--; | ||||||
|  |   if( pPage->iRead>=pPage->iWrite ){ | ||||||
|  |     pFifo->pFirst = pPage->pNext; | ||||||
|  |     sqliteFree(pPage); | ||||||
|  |     if( pFifo->nEntry==0 ){ | ||||||
|  |       assert( pFifo->pLast==pPage ); | ||||||
|  |       pFifo->pLast = 0; | ||||||
|  |     }else{ | ||||||
|  |       assert( pFifo->pFirst!=0 ); | ||||||
|  |     } | ||||||
|  |   }else{ | ||||||
|  |     assert( pFifo->nEntry>0 ); | ||||||
|  |   } | ||||||
|  |   return SQLITE_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | ** Delete all information from a Fifo object.   Free all memory held | ||||||
|  | ** by the Fifo. | ||||||
|  | */ | ||||||
|  | void sqlite3VdbeFifoClear(Fifo *pFifo){ | ||||||
|  |   FifoPage *pPage, *pNextPage; | ||||||
|  |   for(pPage=pFifo->pFirst; pPage; pPage=pNextPage){ | ||||||
|  |     pNextPage = pPage->pNext; | ||||||
|  |     sqliteFree(pPage); | ||||||
|  |   } | ||||||
|  |   sqlite3VdbeFifoInit(pFifo); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user