Truncated Document

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#1
В какой момент я словил эту хрень - не знаю
доки произвольные, сервер 8.5.3 (недавно с семерки поднял), клиент 7.0.4
на серваке появились такие доки (TRUNCATED), заметили случайно
локальная реплика содержит копии полные (я не заметил разницы)
причем пишет так (size) 37738 (bytes) + (truncated) в св-вах
из чего заключаю - никакие они не транкейтед (т.к. кол-во недогруженного не указано)
но интерфейсно этот док не полноценен (в режим редактирования не переходит), где и какой флаг покрутить - ума не приложу
доп. полей в нём не замечено
админских методов я не нашёл http://codeby.net/forum/threads/46309.html
осталось применить ч-нить из программных, но вот чё - не знаю
 

TIA

:-)
Lotus team
15.05.2009
790
3
#2
Скинуть флаг Trancated можно на Notes C API. Схема:

member = NOTE_FLAGS
NSFNoteGetInfo(
NOTEHANDLE note_handle,
WORD member,
void far *value_ptr);

noTruncated = value_ptr and not NOTE_FLAG_ABSTRACTED

NSFNoteSetInfo(
NOTEHANDLE note_handle,
WORD member,
noTruncated);
 
J

Jansar

#3
от кого-то слышал про это, возникает когда репликация идет по полям (Replication ettings - Advanced - Fields), получается документ не полностью реплицированный а только часть (truncated-урезанный)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#4
у мя ваще нет (да и не люблю эту фичу) селективной репликации
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#7
код получился такой
Код:
Function UnTruncate(db As NotesDatabase, doc As NotesDocument) As String
Dim dbHandle As Long
Dim status As Integer
Dim Path As String * 256
Dim NoteID As Long
Dim NoteHandle As Long
Dim NoteClass As Long

On Error Goto ErrH
' Set handles to NULL (to help in error handling)
dbHandle = 0
NoteID = Clng("&H" & doc.NoteID)

Call OSPathNetConstruct("", db.Server, db.FilePath, Path)
If Path = "" Goto ErrH

status = NSFDbOpen( Path, dbHandle)
If status <> 0 Goto ErrH

status = NSFNoteOpen(dbHandle, NoteID, 0&, NoteHandle)
If status <> 0 Goto ErrH

Const NOTE_FLAGS=7	
status=NSFNoteGetInfo(NoteHandle, NOTE_FLAGS, NoteClass)
If status <> 0 Goto ErrH
Print {NoteClass> &H} & Hex(NoteClass)

Dim noTruncated As Long
noTruncated = NoteClass And Not NOTE_FLAG_ABSTRACTED
Print {NOTE_FLAG_ABSTRACTED> &H} & Hex(NOTE_FLAG_ABSTRACTED)
Print {noTruncated> &H} & Hex(noTruncated)

status=NSFNoteSetInfo(NoteHandle, NOTE_FLAGS, noTruncated)
If status <> 0 Goto ErrH
status = NSFNoteUpdate(NoteHandle, 0) 
If (status <> 0) Goto ErrH

Quit:
If (NoteHandle <> 0) Then
Call NSFNoteClose(NoteHandle)
End If
If (dbHandle <> 0) Then
Call NSFDbClose(dbHandle)
End If
Exit Function
ErrH:
If Err Then
Print Cstr(Err), Error$
Resume Quit
Else
Print {status>} & Cstr(status)
End If
End Function
но пущать на боевых доках боязно
проверял на тесте..., снимает статус - да, но при каждом проходе увелич. кол-во байт
я не считаю это криминальным (возможно меняются служебные поля), но хотелось бы услышать тех кто с СиАПИ более знаком
значит и вопрос к TIA - исключая отсутствия обработки Сишных ошибок - это близко к правде (то что написано)?
 

TIA

:-)
Lotus team
15.05.2009
790
3
#8
На правду похож, но за последствия  не отвечаю :), т.к. причина появления Truncated не выяснена. Для чистоты надо бы подправить типы.
Dim noTruncated As INTEGER
Dim NoteClass As INTEGER

Код можно сильно сократить, если использовать недокументированный NotesDocument.Handle
Количество байт, на которое увеличивается документ, сопоставимо с увеличением $UpdatedBy и $Revisions?

Вспомнил один случай, когда появлялись truncated без ограниченной по размеру репликации. Если у документа есть НЕ-SUMMARY поля, а открыть документ в режиме получения только SUMMARY-полей, то после сохранения документа выставится trancated, т.е. NOTE_FLAG_ABSTRACTED. После сохранения у документа терялись НЕ_SUMMARY поля
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#9
TIA спасибо за поправки
а по ситуации - она мне неясна и инфы в тырнете мало (нашёл близких тока два варианта, ссылки вначале)
НО доки полные (нет отличия от "небитых")
единственно что заметил - на body (РТ поле) флаг SIGN SEAL (но это есть у тех, кот. небитые)
откуда он появляется - не знаю, в коде тупо Call rtitem.EmbedObject( EMBED_ATTACHMENT,"" , fname, fnam(0))
в св-вах поля тоже нет подписи, как и на форме - не взведён флаг

Добавлено: Dim NoteClass As INTEGER - это точно? я брал код из разных источников...
непример так
Declare Sub NSFNoteGetInfo Lib "nnotes.dll" _
Alias "NSFNoteGetInfo" ( _
ByVal note_handle as Long, _
ByVal note_member as Integer, _
value_ptr as Long)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#10
SIGN SEAL есть и установлен у некоторых (закономерности не могу выявить)
 

Мыш

Премиум
12.02.2008
1 097
10
#11
lmike, дык это, наверное, у формы в свойствах поля Body стоит "Подписывать..."? Может, часть док-тов по др. форме создавалась?
ЗЫ. Имею в виду - по одноименной форме, но в ней нет такого свойства у поля Body.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#12
Мыш ни у одной формы я не нашёл такой пымпочки (в дизайне)
 

TIA

:-)
Lotus team
15.05.2009
790
3
#13
> Dim NoteClass As INTEGER - это точно? я брал код из разных источников...
NSFNoteGetInfo используется для извлечения разной информации о документе. Какой именно указывается в параметре note_member.
Размерность данных, на которые указывает value_ptr зависит от note_member. Для флагов это Integer. Выдержка из референса по Notes C API:

The note flags WORD is one of the members of the note header data . The various bits of the note flags WORD identify different attributes of the note.

Сишный WORD имеет туже размерность, что нотусовый Integer - 2 б.

Поэтому декларировать надо:
Declare Sub NSFNoteGetInfo Lib "nnotes.dll" _
Alias "NSFNoteGetInfo" ( _
ByVal note_handle as Long, _
ByVal note_member as Integer, _
value as integer)

Т.к. value передатётся ByRef, в dll передастся указатель на value, что и требует сигнатура
 

Мыш

Премиум
12.02.2008
1 097
10
#15
lmike, вот это странно. Мож косячным клиентом каким-то доки создавались? Спецом проверил в 8.5.3 FP1 - если у Body галки "Подписывать" и "Шифровать" не стоят, то Body без всяких SEAL создается... "Field Flags" ваще пустое...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#16
вот и меня это обстоятельство высаживает
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#17
дополню...
декларе:
Код:
Public Const NOTE_FLAG_ABSTRACTED = &H0002

Declare Public Function NSFNoteSetInfo Lib APIModule Alias "NSFNoteSetInfo" _
(Byval nHandle As Long, Byval member As Integer, V As Any) As Integer

Declare Public Function NSFNoteGetInfo Lib APIModule Alias "NSFNoteGetInfo" _
(Byval hNote As Long, Byval member As Integer, V As Any ) As Integer
применение:
Код:
	Dim wks As New NotesUIWorkspace	
Dim ses As New NotesSession
Dim db As NotesDatabase
Set db=ses.CurrentDatabase

Dim doc As NotesDocument
Set doc=wks.CurrentDocument.Document
Dim uiview As NotesUIView
Set uiview=wks.CurrentView
If uiview Is Nothing Then 
If Not doc Is Nothing Then Call UnTruncate(db, doc)
Exit Sub
End If
Dim NDC As NotesDocumentCollection
Set NDC=uiview.Documents
Set doc=NDC.GetFirstDocument
Do While Not doc Is Nothing
Call UnTruncate(db, doc)
Set doc=NDC.GetNextDocument(doc)
Loop