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

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 26 авг 2010.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Всем привет,
    штатный локер меня несколько пугает своей сложностью. Мне необходимы функции:
    document_lock - заблокировать документ пользователем
    document_unlock - разблокировать документ пользователем
    document_isLocked - проверить, заблокирован ли кем-нибудь документ

    Вот, что получилось (писал 1+ год назад, не очень все логично)
    Код (LotusScript):
    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
    Код (LotusScript):
    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
    Код (LotusScript):
    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 возвращает пустоту. Почему / что делать?
     
  2. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Я бы посоветовал глянуть на Domino Document Locking Class 1.1, особенно на то, как организованы методы Lock и Unlock.
    Вообще в этом классе, как по моему, много лишнего, но есть пара интересных вещей.. Короче он тянет хотя бы на четыре с минусом, и в основном даже будет работать.
    Если бы я писал с нуля, то начинал бы с него, - поотрубал бы лишнее, а потом допиливал до желаемого результата.
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    VladSh
    Посмотрел. Очень не понравилась реализация класса... В методе HasLock так же не учитывается тот косяк, о котором я говорил выше
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    fedotxxl
    Не учитывается (а кто обещал?) :what?: Разве так сложно отловить ошибку и допилить нужную логику? Половина ваших траблов от несогласия того, что master lock server д.б. на текущем сервере, чтобы обеспечить гарантированный доступ к нему...

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

Поделиться этой страницей