Count Documents\soft-deleted\stubs In Databses

  • Автор темы Автор темы rinsk
  • Дата начала Дата начала

rinsk

Lotus Team
12.11.2009
1 151
126
Приветствую!
Ищется готовый код для быстрого получения кол-ва documents\soft-deleted\stubs для монитора расползания кол-ва документов в разных репликах\кластере.
db.AllDocuments.Count возвращает все док-ты в базе вместе с soft-deleted. Перебор в цикле doc.IsDeleted не вариант.
есть в C API NSFDbGetModifiedNoteTable и известная процедура получения stubs (https://codeby.net/lofiversion/index.php?t30155.html). через NOTE_CLASS_ХХХ = &H7FFF идет перебор всех note и анализ If RRV < 0 Then для поиска стабов. не понятно как получит в этом цикле soft-deleted док и есть ли более быстрый вариант?
 
Поковырялся тут...
Для 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.
 
Поковырялся тут...
Для 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.
 
а чем Вам они не нравятся? Накладные расходы - только построение индекса, и то "круто" только первый раз. Разве 3 дополнительные вьюшки зарубят всё Ваше быстродействие?

Все - не зарубят. но уменьшат существенно, поскольку кол-во вьюшек в базах увеличится на 1\3). Не стоит вдаваться в вопросы идеологии - интересуют варианты на LS\API.
 
Не стоит вдаваться в вопросы идеологии - интересуют варианты на LS\API
ну посмотрите например здесь
P.S.
по поводу быстродействия.
в таких простых случаях, всё-же, проще проверить, чем гадать и изобретать велосипед (может оно всё и "яйца выеденного не стоит")
 
alexas1 если предел 64Гб будет достигнут (из-за индексов) проблемы только увеличатся
 
alexas1 если предел 64Гб будет достигнут (из-за индексов) проблемы только увеличатся
это так. Но rinsk вроде не говорил, что это одна база такая большая. Их, вроде, несколько.
А если и одна, то её надо её рубить (по крайней мере планировать это) - проблемы рано или поздно возникнут.
 
Можно каждый документ проверять по:
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
 
Можно каждый документ проверять по:
STATUS LNPUBLIC NSFNoteOpenByUNID( DBHANDLE hDB, UNID far *pUNID, WORD flags, NOTEHANDLE far *rethNote);

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

ок - спсб за подсказку - то же проверяют док по этой ф-цци. Только надо еще из нoты вернуть unid - что бы не брать его из doc - эт затратная задача...
 
rinsk
для NSFNoteOpenSoftDelete нужен только хэнд базы, хэндл ноты (NoteID даже подойдет), unid не нужен
 
это так. Но rinsk вроде не говорил, что это одна база такая большая. Их, вроде, несколько.
А если и одна, то её надо её рубить (по крайней мере планировать это) - проблемы рано или поздно возникнут.
С точки зрения сервера наличие дополнительных (технических) вьюх, не связанных с бизнес-логикой приложения - дополнительная нагрузка. Что хотелось бы избежать.
Рубить\не рубить - эт другая задача:)
 
Вот что в итоге получилось:
Код:
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.
как то так...
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab