ну пока писал, одну проблемы поборол. Остался вопрос, а можно как-то, при импорте дизайне через DXL указать явно, что реплейсить весь дизайн, т.е. если в старом есть форма "form1" а в новом её нет, то, чтоб, после импорта, форма "form1" удалилась?
Dim importer As NotesDXLImporter
Set importer = session.CreateDXLImporter(stream, dbCopy)
importer.ReplicaRequiredForReplaceOrUpdate = False
importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_CREATE
Call importer.Process
Call dbCopy.Sign(DBSIGN_DOC_ALL , false)
хотел малой кровью... хочется из LS всё сделать. А там начинается, копия базы "отпускает код" (т.е. не отловить конец), для больших баз используйте sleep.А чем не устраивает программный replace через C API?
хотел малой кровью... хочется из LS всё сделать. А там начинается, копия базы "отпускает код" (т.е. не отловить конец), для больших баз используйте sleep.
Или, блин, я что-то не так делаю.
Какие есть способы?
мне нужно:
1) взять дизайн, сохранить его
2) на "месте", забэкапить дизайн (с сохранением)
3) накатить новый дизайн (из п.1)
в последнем пункте, ещё, поиграться с ACL, позапускать агентов и т.п.
вот сижу и думаю...
Declare Sub OSGetDataDir Lib "nnotes.dll" Alias "OSGetDataDirectory" (ByVal DataDir As String)
Declare Private Function W32_NSFDbOpen Lib "nnotes" Alias "NSFDbOpen" (ByVal PathName As LMBCS String,hDB As Long) As Integer
Declare Private Function W32_NSFDbClose Lib "nnotes" Alias "NSFDbClose" (ByVal hDB As Long) As Integer
Declare Function W32_DesignReplace Lib "nnotes" 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
Declare Public Function OSLoadString Lib "nnotes.dll" Alias "OSLoadString" _
(ByVal hModule&, ByVal StringCode%, ByVal retBuffer As LMBCS String, BufferLength%) As Integer
Declare Sub OSPathNetConstruct Lib "nnotes.dll" ( ByVal portName As Integer, ByVal ServerName As String, ByVal FileName As String, ByVal retPathName As String)
Function DBT_ReplaceDesign(Dest As NotesDatabase,Source As NotesDatabase) As Boolean
On Error GoTo handler
Const FuncName = {Function "ReplaceDesign"}
Dim ErrStr As String
Dim status As Integer
Dim htemplate As Long
Dim htarget As Long
Dim SourceStr As String
Dim DestStr As String
DBT_ReplaceDesign = False
SourceStr = Space(1024)
Call OSPathNetConstruct(0, Source.Server, Source.FilePath, SourceStr)
If SourceStr = "" GoTo endh
SourceStr = FullTrim(SourceStr)
DestStr = Space(1024)
Call OSPathNetConstruct(0, Dest.Server, Dest.FilePath, DestStr)
If DestStr = "" GoTo endh
DestStr = FullTrim(DestStr)
status = W32_NSFDbOpen(SourceStr, htemplate)
If status <> 0 Then Error Err,"Не удалось открыть шаблон " & SourceStr & " - Error Code " & getLNerror(status)
status = W32_NSFDbOpen(DestStr, htarget)
If status <> 0 Then
Call W32_NSFDbClose(htemplate)
Error Err, "Не удалось открыть БД " & DestStr & " - Error Code " & getLNerror(status)
End If
Call W32_DesignReplace(htemplate, htarget, 1, 0, 0, 0)
Call W32_NSFDbClose(htemplate)
Call W32_NSFDbClose(htarget)
DBT_ReplaceDesign = True
GoTo endh
handler:
ErrStr = libName & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
If htemplate <> 0 Then Call W32_NSFDbClose(htemplate)
If htarget <> 0 Then Call W32_NSFDbClose(htarget)
Error Err, ErrStr
endh:
End Function
fPath = StrLeftBack(db.Filepath,".")
If InStr(fPath, {\}) Then fPath = StrRightBack(fPath,{\})
Set templateDb = db.Createcopy("",fPath & ".ntf")
Call templateDb.Grantaccess(ses.Username, 6)
ConCmd = {Tell AMGR RUN "} & DestDb.Filepath & {" '} & agentName & {'}
Call ses.Sendconsolecommand(DestDb.Server, ConCmd)
Убить текущую сессию и база "отпускается"копия базы "отпускает код"
данный момент я не пробовал, я имею в виду, от db.Createcopy я отказался, увидев в хелпаре... так... не понял... значит какой-то другой метод был, там явно говорилось о том, что "копия дело затяжное, и переход на следующую строчку кода, не значит что копия сделана, используйте sleep".. блин...Убить текущую сессию и база "отпускается"
Нет... тут другая фишка.. Посылаем команду на Amgr, а он уже сам этого агента стартует, как освободится."агент через консоль", отпускает сразу, или после того как агент завершиться?
если не AIX, то есть вариант. Эта C API подходит для Win, Mac и Lin. Объява только другая.а вот с реплейсом задница... почти все серваки под линухом
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
вот, точно, оттуда... там даже красненьким выделено...CreateFromTemplate - копирует по идее полностью, про этот метод наверное читали. Там да, там долго...
Declare Function AIX_DesignReplace Lib "libnotes_r.a" Alias "DesignReplace"...
Declare Function Lin_DesignReplace Lib "libnotes.so" Alias "DesignReplace" ...
notes_document.~$item
Не понял этой строки)notes_document.~$item
Пока нет, я, пока, на локалке тренеруюсь. Но функции зауниверсалил на W32 и Лялих. Придёт время на серваке проверю.Ну как либы подхватились?
оно самое. Не знал как такое делать, всё геты и реплейсы.savl скорее всего это про доступ к "служебным" полям, в расширенном синтаксисе
Да, доки about, help.Иконка и много чего полезного при APIReplaceDesign не переползает
по иконкам\етс. делалась такая ф-ция:...
ПО иконкам, абаут и т.п. Сделал по другому. Сделал, всётаки, если базы нет, то создавать из темплейта (подкладываю подготовленный "бланк" под сервак, и с него создаю, создаётся нормально, а там, иконки и т.п. уже подправленны на рефреш. Далее, да, можно тягать по noteID (если делать тупо, создать пустую базу (скриптом), то никаких иконок там нет, и на попытку выдернуть иконку по noteID и поменять её параметры... ну понятно.. самое забавное, что если на базу созданную с нуля, накатить дизайн, и потом попробовать добраться до иконки, опять болт!!! похоже по дефаулту, даже в нулевой базе, на иконке стоит запрет рефреша, и из-за этого, "накатом", она не создаётся....))
...
Function ReplaceDesign(TemplDB As NotesDatabase, TargetDB As NotesDatabase) As Integer
'''''''''''''''''''''''''''''''''''''
Const NOTE_CLASS_ICON_DEFAULT = &H8010 '*** icon default note
Const NOTE_CLASS_DESIGN_DEFAULT = &H8020 '*** icon default note _DEFAULT = &H8010 '*** icon default note
Const NOTE_CLASS= &H0003
Dim hNote As Long
Dim PathName As String * 256
Dim TargetPathName As String * 256
Dim retflag As Integer
''''''''''''''''''''''''''''''''''''''
Dim htemplate As Long
Dim htarget As Long
''''''''''''''''''''''''''''''''''''''
Dim DBDocPropTempl As NotesDocument
Dim DBDocPropTarget As NotesDocument
''''''''''''''''''''''''''''''''''''''
Call W32_OSPathNetConstruct("", TemplDB.Server, TemplDB.FilePath, PathName)
Call W32_OSPathNetConstruct("",TargetDB.Server, TargetDB.FilePath,TargetPathName)
Call W32_NSFDbOpen(PathName, htemplate)
If htemplate=0 Then Exit Function
Call W32_NSFDbOpen(TargetPathName, htarget)
If htarget=0 Then Exit Function
If TargetDB.GetDocumentByID("FFFF0020") Is Nothing Then
RetFlag = W32_NSFNoteCreate(htarget,hNote)
Call W32_NSFNoteSetInfo( hNote, NOTE_CLASS, NOTE_CLASS_DESIGN_DEFAULT)
RetFlag = W32_NSFNoteUpdate( hNote,0)
Call W32_NSFNoteClose( hNote)
End If
If TargetDB.GetDocumentByID("FFFF0010") Is Nothing Then
RetFlag = W32_NSFNoteCreate(htarget,hNote)
Call W32_NSFNoteSetInfo( hNote, NOTE_CLASS, NOTE_CLASS_ICON_DEFAULT)
RetFlag = W32_NSFNoteUpdate( hNote,0)
Call W32_NSFNoteClose( hNote)
End If
Call W32_DesignReplace(htemplate, htarget, 1, 1, 0, 0)
Call W32_NSFDbClose(htemplate)
Call W32_NSFDbClose(htarget)
' Заменили дизайн, переписываем документ со свойствами базы
Set DBDocPropTempl = TemplDB.GetDocumentByID("FFFF0010")
Set DBDocPropTarget = TargetDB.GetDocumentByID("FFFF0010")
Call DBDocPropTempl.CopyAllItems(DBDocPropTarget,True)
Call DBDocPropTarget.Save(True, False)
End Function
Я тоже через админпроцесс делаю, подпись серваком.Косячёк с подписыванием базы. Стандартным способом не получается, пришлось админским процессом (есть способ через C API подписать сервером, и ожидать подписи?)
Думаю это не поможет... АП стартует не сразу, у нас подпись занимает до 3х минут на самой большой базе.(кстати, есть способ как-то проверить, что база полностью подписалась?