Count Documents\soft-deleted\stubs In Databses

rinsk

Lotus team
12.11.2009
900
44
#1
Приветствую!
Ищется готовый код для быстрого получения кол-ва 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 док и есть ли более быстрый вариант?
 

savl

Lotus team
28.10.2011
2 131
102
#2
Поковырялся тут...
Для 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.
 

rinsk

Lotus team
12.11.2009
900
44
#3
Поковырялся тут...
Для 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.
Да - примерно об этой проблеме я и говорил...
вьюшки - эт крайний случай - базы разные и очень большие 2-3 мл.док и под 50gb.
 

rinsk

Lotus team
12.11.2009
900
44
#5
а чем Вам они не нравятся? Накладные расходы - только построение индекса, и то "круто" только первый раз. Разве 3 дополнительные вьюшки зарубят всё Ваше быстродействие?
Все - не зарубят. но уменьшат существенно, поскольку кол-во вьюшек в базах увеличится на 1\3). Не стоит вдаваться в вопросы идеологии - интересуют варианты на LS\API.
 

alexas1

Lotus team
10.04.2014
723
144
#6
Не стоит вдаваться в вопросы идеологии - интересуют варианты на LS\API
ну посмотрите например здесь From IBM
P.S.
по поводу быстродействия.
в таких простых случаях, всё-же, проще проверить, чем гадать и изобретать велосипед (может оно всё и "яйца выеденного не стоит")
 

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#7
alexas1 если предел 64Гб будет достигнут (из-за индексов) проблемы только увеличатся
 

alexas1

Lotus team
10.04.2014
723
144
#8
alexas1 если предел 64Гб будет достигнут (из-за индексов) проблемы только увеличатся
это так. Но rinsk вроде не говорил, что это одна база такая большая. Их, вроде, несколько.
А если и одна, то её надо её рубить (по крайней мере планировать это) - проблемы рано или поздно возникнут.
 

savl

Lotus team
28.10.2011
2 131
102
#9
Можно каждый документ проверять по:
STATUS LNPUBLIC NSFNoteOpenByUNID( DBHANDLE hDB, UNID far *pUNID, WORD flags, NOTEHANDLE far *rethNote);

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

'Нужна структура и флаг
Код:
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 :)
еще есть:
Код:
rs = NSFNoteOpenSoftDelete(hDb,hNote,0,rethNote)
Возвращает в rethNote указатель на удаленную запись, а сама функция код, аналогичный NSFNoteOpenByUNID
 

rinsk

Lotus team
12.11.2009
900
44
#10
Можно каждый документ проверять по:
STATUS LNPUBLIC NSFNoteOpenByUNID( DBHANDLE hDB, UNID far *pUNID, WORD flags, NOTEHANDLE far *rethNote);

еще есть:
Код:
rs = NSFNoteOpenSoftDelete(hDb,hNote,0,rethNote)
Возвращает в rethNote указатель на удаленную запись, а сама функция код, аналогичный NSFNoteOpenByUNID
ок - спсб за подсказку - тут то же проверяют док по этой ф-цци. Только надо еще из нoты вернуть unid - что бы не брать его из doc - эт затратная задача...
 

savl

Lotus team
28.10.2011
2 131
102
#11
rinsk
для NSFNoteOpenSoftDelete нужен только хэнд базы, хэндл ноты (NoteID даже подойдет), unid не нужен
 

rinsk

Lotus team
12.11.2009
900
44
#12
это так. Но rinsk вроде не говорил, что это одна база такая большая. Их, вроде, несколько.
А если и одна, то её надо её рубить (по крайней мере планировать это) - проблемы рано или поздно возникнут.
С точки зрения сервера наличие дополнительных (технических) вьюх, не связанных с бизнес-логикой приложения - дополнительная нагрузка. Что хотелось бы избежать.
Рубить\не рубить - эт другая задача:)
 

rinsk

Lotus team
12.11.2009
900
44
#13
Вот что в итоге получилось:
Код:
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.
как то так...