Программное Обновление Элементов Дизайна Бд

proteam

Well-known member
02.03.2012
144
1
#1
Всем привет. Стоит задача, сделать программное обновление шаблона. В интернете натолкнулся на такой вот
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Function ReplaceDesign(SourceServer As String, SourcePath As String, TargetServer As String, TargetPath As String) As Boolean
On Error GoTo eh
Dim ui As Long 
Dim Session As New NotesSession
'Dim workspace As New NotesUIWorkspace

Dim Sourcedb As New NotesDatabase(SourceServer,SourcePath)
Dim Targetdb As New NotesDatabase(TargetServer,TargetPath)

Call Logger.log(0, "Удаление элементов дизайна у текущей БД...")
'Delete elements from the Target Database 
'Ignore Elements having "Prohibit design...." property or Master Template Defined
Dim TargetNoteCol As NotesNoteCollection 
Set TargetNoteCol = Targetdb.CreateNoteCollection(True)

'Select All Design Elements
'Deselct Admin Notes 
Call TargetNoteCol.SelectAllAdminNotes(False)
'Deselect Document Notes
Call targetNoteCol.SelectAllDataNotes(False)
'Deselect Icon Note
TargetNoteCol.SelectIcon = False
'Deselect Help-About and Help Using Notes which has different mechanism for checking "Prohibit design....."
TargetNoteCol.SelectHelpAbout = False
TargetNoteCol.SelectHelpIndex = False
TargetNoteCol.SelectHelpUsing = False


'Loop Thru All Design Notes and Check -- 'Ignore Elements having "Prohibit design...." property or Master Template Defined
Call TargetNoteCol.BuildCollection 
Dim DesignDoc As NotesDocument 
Dim ID As String 
Dim NextID As String 
Dim i As Long
ID = TargetNoteCol.GetFirstNoteId
For i = 1 To TargetNoteCol.Count 
NextID = TargetNoteCol.GetNextNoteId(ID)
Set DesignDoc = TargetDB.GetDocumentByID(ID)
If (Not(DesignDoc.HasItem("$Class"))) And InStr(DesignDoc.~$Flags(0),"P") =0 Then
'Print "Removing " + DesignDoc.~$Title(0) 
Call DesignDoc.RemovePermanently(True)
End If
nxtID:
ID= NextID
Next

'Check for Help About and Help Using 

Dim IsHelpAbout As Boolean 
Dim IsHelpUsing As Boolean 
IsHelpAbout = False
IsHelpUsing = False
Call TargetNoteCol.SelectAllNotes(False)
Call TargetNoteCol.ClearCollection
TargetNoteCol.SelectHelpAbout = True
Call TargetNoteCol.BuildCollection 
If TargetNoteCol.Count <> 0 Then
ID = TargetNoteCol.GetFirstNoteId
Set DesignDoc = TargetDB.GetDocumentByID(ID)
If InStr(DesignDoc.~$Flags(0),"R") <> 0 Then
'Print "Removing Help-About Document"
'Call DesignDoc.Remove(True)
Call DesignDoc.RemovePermanently(True)
IsHelpAbout = True
End If
End If
Call TargetNoteCol.SelectAllNotes(False)
Call TargetNoteCol.ClearCollection
TargetNoteCol.SelectHelpUsing = True
Call TargetNoteCol.BuildCollection 
If TargetNoteCol.Count <> 0 Then
ID = TargetNoteCol.GetFirstNoteId
Set DesignDoc = TargetDB.GetDocumentByID(ID)
If InStr(DesignDoc.~$Flags(0),"R") <> 0 Then
'Print "Removing Help-Using Document"
'Call DesignDoc.Remove(True)
Call DesignDoc.RemovePermanently(True)
IsHelpUsing = True
End If
End If

'Set More Fields Options
Call TargetDb.SetOption(54,True)

Call Logger.log(0, "Копируем дизайн...")

'Copy All the Design Elements from SourceDB to Target DB except Help About and Help Using
Dim SourceNoteCol As NotesNoteCollection 
Set SourceNoteCol = Sourcedb.CreateNoteCollection(True)
'Deselct Admin Notes 
Call SourceNoteCol.SelectAllAdminNotes(False)
'Deselect Document Notes
Call SourceNoteCol.SelectAllDataNotes(False)
'Deselect Icon Note
SourceNoteCol.SelectIcon = False
'Deselect Help-About and Help Using Notes which has different mechanism for checking "Prohibit design....."

If IsHelpAbout = False Then
SourceNoteCol.SelectHelpAbout = False
End If
If IsHelpUsing = False Then
SourceNoteCol.SelectHelpUsing = False
End If

'Loop Thru All Design Notes and Check -- 'Ignore Elements having "Prohibit design...." property or Master Template Defined
Call SourceNoteCol.BuildCollection 
ID = SourceNoteCol.GetFirstNoteId
For i = 1 To SourceNoteCol.Count 
NextID = SourceNoteCol.GetNextNoteId(ID)
Set DesignDoc = SourceDB.GetDocumentByID(ID)

Call DesignDoc.CopyToDatabase(TargetDB)		
'Print "Copying...." + DesignDoc.~$Title(0) 
nxtID1:
ID= NextID
Next


'Add All the roles from Source DB to Target DB
Dim TargetACl As NotesACL 
Dim SourceACL As NotesACL 
Set TargetACL = TargetDb.ACL 
Set SourceACL = SourceDB.ACL 
Dim TargetRoles As Variant 
Dim SourceRoles As Variant 
TargetRoles = TargetACL.Roles 
SourceRoles = SourceACL.Roles 
If IsArray(SourceRoles) Then
Dim RolesToBeAdded As Variant 
RolesToBeAdded = ArrayUnique((ArrayReplace(SourceRoles,TargetRoles,"")))
ForAll DummyRole In RolesToBeAdded
If FullTrim(DummyRole) <> "" Then
TargetACL.AddRole(StrLeft(StrRight(DummyRole,"["),"]"))
End If
End ForAll
TargetACL.Save
End If

ReplaceDesign = True

Call Sourcedb.Remove()
Delete Targetdb
ex:
Exit Function 
eh:Call Logger.log(Err, CStr(Error)+" in "+Cstr(GetThreadInfo(1))+" on line "+Cstr(Erl))

Resume ex
End Function
Но лотус такая штука, в первый раз агент все хорошо обновил, во второй - тоже, запускаю в 3 раз: логируется что все успешно, но открываешь базу данных и видишь кривой дизайн, дубликаты некоторых элементов дизайна в общем небольшой хауз.

Может быть кто нибудь знает, как лучше и для лотуса безошибочно сделать программное обновление элементов дизайна БД?
 

hosm

* so what *
18.05.2009
2 442
6
#5
>мне нужно кросплатформенное решение(
ну так скачайте доку по NotesAPI, напишите нужные декларации и select case Notessession.Platform.
 

proteam

Well-known member
02.03.2012
144
1
#6
>мне нужно кросплатформенное решение(
ну так скачайте доку по NotesAPI, напишите нужные декларации и select case Notessession.Platform.
Задекларировал для AIX, запустил и .... сервер рухнул. Ниже привожу код. Может кто сталкивался?

Код:
Declare Private Function AIX_NSFDbOpen Lib "libnotes_r.a" Alias "NSFDbOpen" (ByVal PathName As LMBCS String, hDB As Long) As Integer
Declare Private Function AIX_NSFDbClose Lib "libnotes_r.a" Alias "NSFDbClose" (ByVal hDB As Long) As Integer
'обновление
Declare Private Function AIX_DesignRefresh Lib "libnotes_r.a" Alias "DesignRefresh" (ByVal ServerName As LMBCS String, ByVal hDB As Long, ByVal dwFlags As Long, ByVal abortCheck As Long, ByVal messageProc As Long) As Integer
'замена дизайна из шаблона
Declare Function AIX_DesignReplace Lib "libnotes_r.a" Alias "DesignReplace" (ByVal ht As Long, ByVal hDB As Long, ByVal dw1 As Long, ByVal dw2 As Long, ByVal dw3 As Long, ByVal dw4 As Long) As Integer
Код:
Sub Initialize
Dim s As New NotesSession

Call ReplaceDesign(s.Currentdatabase.server+"!!"+"attach/inbox.ntf", s.Currentdatabase.server+"!!"+"inbox.nsf")
End Sub
Sub Terminate

End Sub

Function ReplaceDesign(ByVal templateDB As String, ByVal targetDB As String) As Boolean 
On Error GoTo eh
Dim status As Integer
Dim htemplate As Long
Dim htarget As Long
Dim tDB As NotesDatabase

Print "открытие БД шаблона" 
status = AIX_NSFDbOpen(templateDB, htemplate)
If status<>0 Then
Print "Не удалось открыть шаблон " & templateDB & " - Error Code " & CStr(status)
GoTo ex 
End If
Print "открытие текущей БД" 	
status = AIX_NSFDbOpen(targetDB, htarget)
If status<>0 Then
Print "Не удалось открыть БД " & targetDB & " - Error Code " & CStr(status)			
Call AIX_NSFDbClose(htemplate)
GoTo ex
End If

Call AIX_DesignReplace(htemplate, htarget, 1, 0, 0, 0) 

Call AIX_NSFDbClose(htemplate)

Call AIX_NSFDbClose(htarget)


ReplaceDesign = True

ex:

Exit Function
eh:
Print Error+" on line "+CStr(Erl)
Resume ex
End Function
 

proteam

Well-known member
02.03.2012
144
1
#7
PS. Посмотрел NotesAPI. DesignRefresh такая функция там есть, а вот DesignReplace не обнаружил. Хотя в примере (http://codeby.net/forum/threads/33068.html) эта функция задеклирирована и для винды все работает прекрасно, может тут какие то траблы лотуса(
 

savl

Lotus team
28.10.2011
2 136
105
#8
А у тебя AIX... А файлика "libnotes.so" там нет? Не знаком с данной осью.
DesignReplace недокументированная функция, корректность ее работы под вопросом...
Можно использовать DesignRefresh предварительно изменив каждый элемент дизайна в шаблоне источнике.
Выход всегда есть.
 

Мыш

Премиум
12.02.2008
1 097
10
#9
Хммм... Вообще говоря, у меня и через NoteCollection все неплохо работает (как в 1-м посте написано). Дебажить агента не пробовали? Мож база открыта в Дизайнере на момент обновления?
 

proteam

Well-known member
02.03.2012
144
1
#10
Хммм... Вообще говоря, у меня и через NoteCollection все неплохо работает (как в 1-м посте написано). Дебажить агента не пробовали?
Работало, но тут получилось следующее, первый запуск отлично, второй запуск отлично, на третий или 4 раз выходит кривой шаблон. Я запускал подряд, проверял как он реагирует. А сейчас вообще молодец, сначала удаляет все элементы дизайна, потом пытается вставить и выходит ошибка Данный документ уже используется, хотя я БД тока выгрузил и ее никто кроме этого агента не использует - как итог бд вообще без дизайна осталась, что заставило меня задуматься над стабильностью этого способа. Пока забросил первый способ, переключился на второй через DesignReplace

DesignRefresh вроде требует настроеный мастер шаблонов?
 

savl

Lotus team
28.10.2011
2 136
105
#11
Да, по идее, на 4 закладке свойств БД указать.
А почему сервер рухнул узнать не получилось? В логах что-то есть?
Типы параметров и разрядность может не совпадают?

Forinstance, the HANDLEdatatype has different lengths
on different platforms:
• 32 bitslong in Windowsand OS/400.
• 16 bitslong on AIX, Macintosh, etc.
Попробуй заменить Long на Integer, может и глупость, но с разрядностью наверняка проблемы.
 

proteam

Well-known member
02.03.2012
144
1
#12
Да, по идее, на 4 закладке свойств БД указать.
А почему сервер рухнул узнать не получилось? В логах что-то есть?
Типы параметров и разрядность может не совпадают?


Попробуй заменить Long на Integer, может и глупость, но с разрядностью наверняка проблемы.
Спасибо. Попробую и отпишусь

Не помогло. Может я что то не понял, я у всех 4 параметров сменил тип на Integer

Сменил у последних двух как советовали в другой теме, тоже не помогло( Жаль не могу найти AIX 32 bit
 

savl

Lotus team
28.10.2011
2 136
105
#13
По идеи надо только для Handle сменить:
Код:
ByVal ht As Integer, ByVal hDB As Integer
А в целом забавно... Lotus кроссплатформенное существо, а видно не везде...
 

Мыш

Премиум
12.02.2008
1 097
10
#14
Lotus Notes/Domino 8.5.2 Fix Pack 2 Fix List:
"...SPR# PCHE7S9VAB (LO40738) - Fixed a Domino Crash issue within the C API call DesignRefresh called from LotusScript causes panic on 64-bit Domino server..."
 

proteam

Well-known member
02.03.2012
144
1
#15
По идеи надо только для Handle сменить:
Код:
ByVal ht As Integer, ByVal hDB As Integer
А в целом забавно... Lotus кроссплатформенное существо, а видно не везде...
Снова не помогло

Добавлено:
Lotus Notes/Domino 8.5.2 Fix Pack 2 Fix List:
"...SPR# PCHE7S9VAB (LO40738) - Fixed a Domino Crash issue within the C API call DesignRefresh called from LotusScript causes panic on 64-bit Domino server..."
Лотус Доминов на Windows 64bit не упал... Значит все таки с платформой какие то траблы.. Аикс уже давно мне не нравится, на нем иногда агенты, запускаемые по расписанию не видят классы подключаемые через библиотеки.
 

hosm

* so what *
18.05.2009
2 442
6
#16
savl :) посмотри декларации - http://www-12.lotus.com/ldd/doc/tools/c/8....e0?OpenDocument
DamirUrazov Не твой ли случай заявлен для 8.5 (конкретную версию ты вроде не указал, так что гадаем) - http://www-01.ibm.com/support/docview.wss?uid=swg1LO52803
помечено как дубликат ошибки, закрытой в 852 fp2 и 853:
SPR# PCHE7S9VAB (LO40738) - Fixed a Domino Crash issue within the C API call DesignRefresh called from LotusScript causes panic on 64-bit Domino server. ( http://www-10.lotus.com/ldd/fixlist.nsf/Pu...DE?OpenDocument )
 

proteam

Well-known member
02.03.2012
144
1
#17
savl :) посмотри декларации - http://www-12.lotus.com/ldd/doc/tools/c/8....e0?OpenDocument
DamirUrazov Не твой ли случай заявлен для 8.5 (конкретную версию ты вроде не указал, так что гадаем) - http://www-01.ibm.com/support/docview.wss?uid=swg1LO52803
помечено как дубликат ошибки, закрытой в 852 fp2 и 853:
SPR# PCHE7S9VAB (LO40738) - Fixed a Domino Crash issue within the C API call DesignRefresh called from LotusScript causes panic on 64-bit Domino server. ( http://www-10.lotus.com/ldd/fixlist.nsf/Pu...DE?OpenDocument )
Да, у меня Domino 8.5 FP1(

Спасибо. Очень помогли
 

proteam

Well-known member
02.03.2012
144
1
#18
Попробовал на Lotus Domino 8.5.3 FP3 на том же сервере, теперь вообще отвалилась функция NSFDbOpen(( выдает 2055 ошибку при открытии БД, запуск локально агента прекрасно обновил БД.

Решил делать по 1 способу, через NoteCollection. И снова чудеса лотуса. Стали появлятся дубликаты. И тут я увидел следующее. Кто нибудь сталкивался с таким косяком:

NotesNoteCollection видит не все элементы дизайна. Прохобиты не стоят, скрытые от него элементы дизайна ничем не отличаются от тех что видны. Еще есть специальная утилита от TeamStudio, Configurator называется, он также не видит эти элементы для анализа. Сделал сделующие, создал дубликат элемента дизайна что не виден для NotesNoteCollection, он его увидел, а оригинал так и не увидел. Пересохранение не помогает.
 

Мыш

Премиум
12.02.2008
1 097
10
#19
DamirUrazov, у Вас же есть шаблон (из которого копируете дизайн)? Создайте на его основе новую базу и попробуйте работать с ней. Полей типа Readers в элементах дизайна точно нет? И, кстати, "невидимые" элементы работают-то нормально? Т.е., виды открываются, формы сохраняются? Я к тому, что, возможно, Лотус уже и не считает их дизайном :)
 

proteam

Well-known member
02.03.2012
144
1
#20
DamirUrazov, у Вас же есть шаблон (из которого копируете дизайн)? Создайте на его основе новую базу и попробуйте работать с ней. Полей типа Readers в элементах дизайна точно нет? И, кстати, "невидимые" элементы работают-то нормально? Т.е., виды открываются, формы сохраняются? Я к тому, что, возможно, Лотус уже и не считает их дизайном :)
Да, иначе бы давно били тревогу. Все работает нормально. Снимаешь шаблон (если его смотреть конфигуратором от ТимСтудио тоже не видит эти элементы дизайна), накатывает на другую базу уже все ок, и Конфигуратор видит и NotesNoteCollection. Полей Read-Write Access нету