Extended examples: lock functions

This set of examples demonstrates using the Lock functions to assist in accumulating web site "hits" (counting the number of visits to a web site). The first example demonstrates what happens if several people hit the same web site simultaneously: the users will read the exact same number and the increment will be off.

Example 1:

Sub Initialize
	Dim Sess As New NotesSession
	Dim Doc As NotesDocument
	Dim Count As NotesItem
	
	Set Doc = Sess.SavedData
	
	Set count = Doc.GetFirstItem("WebHits")
	If count Is Nothing Then
		Set count = New NotesItem(Doc, "WebHits", 0)
	End If
	
	count.Values = count.Values(0) + 1
	
	Call Doc.Save(True,False)
End Sub

The second example demonstrates how CodeLock can avoid the problem presented in Example 1. You create and make sure you have a secure lock before you read and make changes to the count, and when you are done, you release the lock.

Example 2:

Sub Initialize
	Dim Sess As New NotesSession
	Dim Doc As NotesDocument
	Dim Count As NotesItem
	Dim Status As Integer
	Dim LockID As Integer
	Dim others As Integer
	
	'  Creating a Lock ID or getting the Lock ID 
	'  For the event of "WebSiteHits"
	LockID = Createlock("WebSiteHits")
	
	'  Infinite loop that can only be exited
	'  when this agent has a successfull
	'  lock.  An unsuccessfull lock means
	'  that this agent is presently being
	'  run by someone else.
	Do While True
		If Codelock(LockID) Then
			Exit Do		'  We finally have a lock, exiting Loop
		End If
	Loop
		
	Set Doc = Sess.SavedData
	
	Set count = Doc.GetFirstItem("WebHits")
	If count Is Nothing Then
		Set count = New NotesItem(Doc, "WebHits", 0)
	End If
	
	count.Values = count.Values(0) + 1
	
	Call Doc.Save(True,False)
	
	'  Once completed, release and
	'  destroy this lock so another
	'  run of this agent can continue.
	Status = CodeUnlock(LockID)
	Status = DestroyLock(LockID)
	
End Sub