Count Documents\soft-deleted\stubs In Databses

Тема в разделе "Lotus - Программирование", создана пользователем rinsk, 30 май 2014.

  1. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    Приветствую!
    Ищется готовый код для быстрого получения кол-ва documents\soft-deleted\stubs для монитора расползания кол-ва документов в разных репликах\кластере.
    db.AllDocuments.Count возвращает все док-ты в базе вместе с soft-deleted. Перебор в цикле doc.IsDeleted не вариант.
    есть в C API NSFDbGetModifiedNoteTable и известная процедура получения stubs (http://codeby.net/lofiversion/index.php?t30155.html). через NOTE_CLASS_ХХХ = &H7FFF идет перебор всех note и анализ If RRV < 0 Then для поиска стабов. не понятно как получит в этом цикле soft-deleted док и есть ли более быстрый вариант?
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Поковырялся тут...
    Для Soft-Deleted (RRV<0) дает такой же как для Stubs.
    #define RRV_DELETED 0x80000000L /* indicates a deleted note */
    Для документа doc (NoteID = 00009AD6), который удален(stub в том числе) Hex(RRV) вернет: 80009AD6. Если его (RRV < 0) конечно.

    Для Soft-Deleted можно сделать отдельную вьюху, её тип: Shared, contains deleted documents
    К этой вьюхе можно обращаться как к обычной, получить коллекцию Entry.

    Может быть есть возможность получать флаги документа
    ScanEz для нормального документа пишет: 0x900
    Для Soft-deleted: 0x100
    Вот только не понятно, как она их получается, через NSFNoteGetInfo, что для обычного документа, что для Soft-Deleted, возвращается 256, для stub вернет 0.

    Для обычных документов можно сделать вьюху (ByUNID) или как-то так и возвращать количество Entry.

    Так что думаю через такие вьюхи можно получить точное количество SD-документов и обычных документов, а стабы посчитать CAPI.
     
  3. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    Да - примерно об этой проблеме я и говорил...
    вьюшки - эт крайний случай - базы разные и очень большие 2-3 мл.док и под 50gb.
     
  4. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    а чем Вам они не нравятся? Накладные расходы - только построение индекса, и то "круто" только первый раз. Разве 3 дополнительные вьюшки зарубят всё Ваше быстродействие?
     
  5. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    Все - не зарубят. но уменьшат существенно, поскольку кол-во вьюшек в базах увеличится на 1\3). Не стоит вдаваться в вопросы идеологии - интересуют варианты на LS\API.
     
  6. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    ну посмотрите например здесь From IBM
    P.S.
    по поводу быстродействия.
    в таких простых случаях, всё-же, проще проверить, чем гадать и изобретать велосипед (может оно всё и "яйца выеденного не стоит")
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    alexas1 если предел 64Гб будет достигнут (из-за индексов) проблемы только увеличатся
     
  8. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    это так. Но rinsk вроде не говорил, что это одна база такая большая. Их, вроде, несколько.
    А если и одна, то её надо её рубить (по крайней мере планировать это) - проблемы рано или поздно возникнут.
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Можно каждый документ проверять по:
    STATUS LNPUBLIC NSFNoteOpenByUNID( DBHANDLE hDB, UNID far *pUNID, WORD flags, NOTEHANDLE far *rethNote);

    Пример вызова и деклорации:

    'Нужна структура и флаг
    Код (LotusScript):
    Type UNID
    Fil(1) As Long
    doc(1) As Long
    End Type
    Const OPEN_EXPAND = &H0004

    strNoteID = doc.UniversalID
    NoteID.Fil(1) = Clng( "&H" & Left(strNoteID, 8))
    NoteID.Fil(0) = Clng( "&H" & Mid(strNoteID, 9, 8))
    NoteID.doc(1) = Clng( "&H" & Mid(strNoteID, 17, 8))
    NoteID.doc(0) = Clng( "&H" & Right(strNoteID, 8))

    'Вызов
    rc = W32_NSFNoteOpenByUNID (hDb, NoteID, OPEN_EXPAND, hNote)
    Для удаленного (soft / не soft) возвращается 549, для нормального 0, для стаба вернул 17412, так же 17412 он вернул к документу закрытому по Readers :)
    еще есть:
    Код (LotusScript):
    rs = NSFNoteOpenSoftDelete(hDb,hNote,0,rethNote)
    Возвращает в rethNote указатель на удаленную запись, а сама функция код, аналогичный NSFNoteOpenByUNID
     
  10. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    ок - спсб за подсказку - тут то же проверяют док по этой ф-цци. Только надо еще из нoты вернуть unid - что бы не брать его из doc - эт затратная задача...
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    rinsk
    для NSFNoteOpenSoftDelete нужен только хэнд базы, хэндл ноты (NoteID даже подойдет), unid не нужен
     
  12. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    С точки зрения сервера наличие дополнительных (технических) вьюх, не связанных с бизнес-логикой приложения - дополнительная нагрузка. Что хотелось бы избежать.
    Рубить\не рубить - эт другая задача:)
     
  13. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
    Вот что в итоге получилось:
    Код (LotusScript):
    Sub GetCountsDocByStatus(db As NotesDatabase,Stubs,Deleted,Doccount)
    Dim ever As Currency, last As Currency
    Dim hT As Long, RRV As Long, hDB As Long,rc As Integer,hNote As Long,np As string
    Stubs=0
    Deleted=0
    Doccount=0
    TimeConstant 2, ever
    np = Space(1024)
    OSPathNetConstruct 0, db.Server, db.FilePath, np
    NSFDbOpen np, hDB
    NSFDbGetModifiedNoteTable hDB, &H0001, ever, last, hT
    done = (IDScan(hT, True, RRV) = 0)
    While Not done
    If RRV < 0 Then 'stubs
    Stubs = Stubs + 1
    Else ' это норм док! If NSFNoteOpen(hdb, RRV, 0, hNote)=0 Then
    'NSFNoteClose hNote
    DocCount=DocCount+1
    End If
    done = (IDScan(hT, False, RRV) = 0)
    Wend
    IDDestroyTable hT
    NSFDbClose hDB
    Deleted=db.Alldocuments.count-DocCount
    End Sub
    При помощи NSFDbGetModifiedNoteTable все равно идет цикл по всем нотам, по этому там же можно считать и кол-во нормальных документов.
    И оказалось в число "Нормальных" при &H0001 НЕ входят soft-deleted.
    как то так...
     
Загрузка...
Похожие Темы - Count Documentssoft deletedstubs
  1. ToxaRat
    Ответов:
    7
    Просмотров:
    282
  2. Akupaka
    Ответов:
    20
    Просмотров:
    7.813
  3. sanch
    Ответов:
    6
    Просмотров:
    3.352

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