111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| function rti_get_next_id(byVal_table)
 | |
| 
 | |
| /*
 | |
|    ** Copyright (C) 2022 Revelation Software Inc. All Rights Reserved **
 | |
|    
 | |
|    This  program  is  proprietary and is not  to be used  by or  disclosed
 | |
|    to others, nor is it to be copied without written permission from
 | |
|    Revelation Technologies, Inc.
 | |
|    
 | |
|    Author   : RJC
 | |
|    Date     : 07 March 2022
 | |
|    Purpose  : Sequential Key processing
 | |
|    
 | |
|    Comments
 | |
|    ========
 | |
|    Get the next id, make sure it is not used, and update the counter
 | |
|      
 | |
| */
 | |
| 
 | |
| $insert logical
 | |
| Declare Function get_Status
 | |
| Declare Subroutine Set_status
 | |
| 
 | |
| EQU SK$ to "%SK%"
 | |
| 
 | |
| If Assigned(byval_table) Then table = byval_table Else table = ""
 | |
| if assigned(force_increment) else force_increment = ''
 | |
| if table = '' then
 | |
|      err = 'Table name is missing'
 | |
|      GoTo Error
 | |
| end
 | |
| 
 | |
| convert @lower.case to @upper.case in table
 | |
| next_id = ''
 | |
| err = ''
 | |
| 
 | |
| dict = 'DICT.':table
 | |
| 
 | |
| open table to f_table else
 | |
|      err = 'Unable to open ': table
 | |
|      GoTo Error
 | |
| end
 | |
| 
 | |
| open dict to f_Dict else
 | |
|      err = 'Unable to open dict for ': table
 | |
|      GoTo Error
 | |
| end
 | |
| 
 | |
| set_status(0)
 | |
| locked = false$
 | |
| started = time()
 | |
| timeout = 60
 | |
| loop
 | |
|      Lock f_dict,SK$ then
 | |
|           locked = true$
 | |
|      end else
 | |
|      end
 | |
| until locked or ( time()-started > timeout )
 | |
| repeat
 | |
| 
 | |
| if locked else
 | |
|      err = 'Unable to lock Primary Key counter for ' : quote(table)
 | |
|      GoTo Error
 | |
| end
 | |
| 
 | |
| Read next_id from f_Dict, SK$ else
 | |
|      * should message here
 | |
|      next_id = 1
 | |
|      Write next_id on f_dict, SK$ else
 | |
|           Unlock f_dict, SK$ Else Null
 | |
|           err = 'Unable to write ': dict : ' ': SK$
 | |
|           GoTo Error
 | |
|      end
 | |
| end
 | |
| 
 | |
| test_Id = next_id
 | |
| loop
 | |
|      exists = 0
 | |
|      lock f_table, test_id then
 | |
|           read test_rec from f_Table, test_id then
 | |
|                exists = 1
 | |
|           end
 | |
|           unlock f_table, test_id else null
 | |
|      end else
 | |
|           exists = 1
 | |
|      end
 | |
|      if exists then
 | |
|           test_id +=1
 | |
|      end
 | |
| while exists
 | |
| Repeat
 | |
| 
 | |
| write test_id+1 on f_dict, SK$ else
 | |
|      Unlock f_dict, SK$ Else Null
 | |
|      err = 'Unable to write ': dict : ' ': SK$
 | |
|      GoTo Error
 | |
| end
 | |
| 
 | |
| Unlock f_dict, SK$ else
 | |
|      err = 'Unable to Unlock ': dict : ' ': SK$
 | |
|      GoTo Error
 | |
| end
 | |
| 
 | |
| return test_id
 | |
| 
 | |
| 
 | |
| 
 | |
| Error:
 | |
| Set_Status(1,err)
 | |
| Return ''
 |