Правильная работа со штатным локером

fedotxxl

Well-known member
09.11.2005
614
0
#1
Всем привет,
штатный локер меня несколько пугает своей сложностью. Мне необходимы функции:
document_lock - заблокировать документ пользователем
document_unlock - разблокировать документ пользователем
document_isLocked - проверить, заблокирован ли кем-нибудь документ

Вот, что получилось (писал 1+ год назад, не очень все логично)
Код:
Function document_lock(nd As NotesDocument, user As String, result As Boolean, ea As errorAnswer) As Boolean
On Error Goto errLab
On Error 4595 Goto err4595

'Логируем для отладки падений сервера
Call logEventSession("", SEVERITY_MEDIUM, Nothing)

'Выставляем параметры по-умолчанию
If ea Is Nothing Then Set ea = New errorAnswer
result = False

'По-умолчанию считаем, что функция выполнена успешно
document_lock = True

'Пытаемся заблокировать документ
result = nd.Lock(user)

'Если заблокировать не удалось, то выходим, сохраняя ошибку
If Not result Then
Call document_loadLockHolders(nd, ea)
Exit Function
End If

Exit Function

err4595:

'Документ заблокирован кем-то другим
result = False
Call document_loadLockHolders(nd, ea)
Exit Function


errLab:
'Обрабатываем возникшую в системе ошибку
Call LogErrorEx("", SEVERITY_MEDIUM, nd)
document_lock = False
Exit Function
End Function
Код:
Function document_unlock(nd As NotesDocument, user As String, result As Boolean, ea As errorAnswer) As Boolean
On Error Goto errLab

'Логируем для отладки падений сервера
Call logEventSession("", SEVERITY_MEDIUM, Nothing)

'Выставляем параметры по-умолчанию
If ea Is Nothing Then Set ea = New errorAnswer
result = False

'По-умолчанию считаем, что функция выполнена успешно
document_unlock = True

Dim LockHolders As Variant

lockHolders = nd.LockHolders
lockHolders = Fulltrim(Arrayreplace(lockHolders, user, ""))

'Проверяем, есть ли кто ещё
If (Ubound(lockHolders) <> 0) Or (lockHolders(0) <> "") Then
'Документ заблокирован за кем-то другим
Call document_loadLockHolders(nd, ea)
Exit Function
End If

'Разблокируем документ, возвращаем результат
Call nd.UnLock
result = True
Exit Function

'Обрабатываем возникшую в системе ошибку
errLab:
Call LogErrorEx("", SEVERITY_MEDIUM, nd)
document_unlock = False
Exit Function
End Function
Код:
Function document_isLocked(nd As NotesDocument, result As Boolean, ea As errorAnswer) As Boolean
On Error Goto errLab

'Логируем для отладки падений сервера
Call logEventSession("", SEVERITY_MEDIUM, Nothing)

'Проверяем условия блокировки
If Not nd.ParentDatabase.IsDocumentLockingEnabled Then Exit Function

'Выставляем параметры по-умолчанию
If ea Is Nothing Then Set ea = New errorAnswer
result = False

'По-умолчанию считаем, что функция выполнена успешно
document_isLocked = True

'Проверяем наличие заблокированных пользователей
If (Ubound(nd.LockHolders) <> 0) Or (nd.LockHolders(0) <> "") Then
'Документ заблокирован
result = True
Call document_loadLockHolders(nd, ea)
Exit Function
End If

Exit Function

'Обрабатываем возникшую в системе ошибку
errLab:
Call LogErrorEx("", SEVERITY_MEDIUM, nd)
document_isLocked = False
Exit Function
End Function
1. Может у кого есть предложения по улучшению?
2. Заблокированность я проверяю при помощи nd.LockHolders. Только что встретил ситуацию - документ заблокирован (поле $Writers заполнено), nd.LockHolders возвращает пустоту. Почему / что делать?
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#2
Я бы посоветовал глянуть на Domino Document Locking Class 1.1, особенно на то, как организованы методы Lock и Unlock.
Вообще в этом классе, как по моему, много лишнего, но есть пара интересных вещей.. Короче он тянет хотя бы на четыре с минусом, и в основном даже будет работать.
Если бы я писал с нуля, то начинал бы с него, - поотрубал бы лишнее, а потом допиливал до желаемого результата.
 

fedotxxl

Well-known member
09.11.2005
614
0
#3
VladSh
Посмотрел. Очень не понравилась реализация класса... В методе HasLock так же не учитывается тот косяк, о котором я говорил выше
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#4
fedotxxl
Не учитывается (а кто обещал?) :what?: Разве так сложно отловить ошибку и допилить нужную логику? Половина ваших траблов от несогласия того, что master lock server д.б. на текущем сервере, чтобы обеспечить гарантированный доступ к нему...

Мне тоже реализация не нравится, но там, в целом, подход правильный (разделяется FE от BE) и хоть какие-то необходимые начальные проверки есть.