• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

DXL: Почему не срабатывает NotesDXLImporter?

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

blackswanny

хочу экспортировать и импортировать обратно документы с помщью dxl Exporter и dxl Importer. Экспорт проходит нормально, для связи документов в их XML-именах указываю самого документа и UNID его родителя , при этом прохожу по дереву документа рекурсивно вверх, если у текущего документа есть еще родитель, и так пока не упираюсь в верхний уровень документов, создаю их, а потом в обратном направлении их потомков. При обратном механизме для каждой XML пытаюсь сначала опять пройти по пути вверх, чтобы создать сначала документы самого верхнего уровня, потом их потомков, потом потомков их потомков и т.д. Я так сделал, чтобы избежать ошибки при попытке Импортером создать документ, у которого еще нет родителя. А вообще я не знаю толком , как работает этот DXL Importer, документация у меня плохая, иногда не содержит всех полей и методов, которые у него есть. В общем в итоге при попытке создания документа 3 уровня мой скрипт ищет документ 2 уровня, потом 1 уровня, и найдя его , пытается его импортировать, зная имя входного файла, однако выскакивает ошибка DXL Importer operation failed, описание которой не нашел. Сделал скрин лога, также прикрепляю пример XML-файлов, код ниже
Код:
Sub Initialize
Const XML_INIT_DIR = "E:\Lotus\" 
Dim Sess As New NotesSession
Dim Stream As NotesStream
Dim Importer As NotesDXLImporter
Dim ThisDb As NotesDatabase
Dim DocArray As Variant
Dim workspace As New NotesUIWorkspace
Dim NoteIDArray() As String
Dim IDSize As Long
On Error Goto ErrorReturn
Set ThisDb = Sess.CurrentDatabase
Set Importer = Sess.CreateDxlImporter
Set Stream = Sess.CreateStream
Call Importer.SetOutput (ThisDb)
Importer.ACLImportOption = DXLIMPORTOPTION_IGNORE
Importer.DocumentImportOption = DXLIMPORTOPTION_CREATE
Importer.ReplaceDBProperties = False
Importer.ReplicaRequiredForReplaceOrUpdate = False
DocArray = workspace.OpenFileDialog(True , "Выберите файлы для восстановления","xml", XML_INIT_DIR)
If Not (Isempty(DocArray)) Then
IDSize = 0
Forall OneDoc In DocArray
Call ImportFileFromXML(Cstr(OneDoc),ThisDb, Stream, Importer,NoteIDArray, IDSize)
End Forall
Else
Msgbox "Файлы не выбраны"
End If
Exit Sub
ErrorReturn:
Msgbox "Произошла ошибка: " & Error$
Exit Sub
End Sub
Код:
Sub ImportFileFromXML(OneDoc As String,ThisDb As NotesDatabase, Stream As NotesStream, Importer As NotesDXLImporter, NoteIDArray() As String, IDSize As Long)	
Dim FileString As Variant
Dim FileString1 As Variant
Dim DirPath As String
Dim FileName As String
Dim NoteID As String
Dim FlagID As Boolean
On Error Goto ErrorReturn
FileString = Split(OneDoc,"_")
If (FileString(3)<>FileString(4)) And (FileString(4)<>"") Then
FlagID=False
Forall IDn In NoteIDArray
If IDn = FileString(4) Then
FlagID=True
End If
End Forall
If Not FlagID Then
DirPath = Strleftback(OneDoc,"\")+"\*.*"
FileName = Strleftback(DirPath,"\")+"\"+Dir(DirPath)
Do While FileName <>""

If FileName<> OneDoc Then
FileString1 = Split(FileName,"_")
If Ubound(FileString1)=5 Then
If FileString1(3) = FileString(4) Then
Msgbox "Файл " +OneDoc+ " ссылается на " +FileName
Call ImportFileFromXML(FileName,ThisDb, Stream , Importer,NoteIDArray, IDSize)			
End If
End If
End If
FileName = Strleftback(DirPath,"\")+"\"+Dir()
Loop
End If
End If

Msgbox "Creating "+OneDoc
If Not Stream.Open(OneDoc) Then
Messagebox "Cannot open file",, OneDoc
Exit Sub
End If
Call Importer.SetInput (Stream)
'	Call Importer.Process
Call Importer.Import(Stream, Thisdb)
Call Stream.Close
IDSize = IDSize+1
Redim Preserve NoteIDArray(IDSize)
NoteIDArray(IDSize-1) = FileString(3)
Exit Sub
ErrorReturn:
Msgbox "Произошла ошибка: " + Importer.Log 
Msgbox "Произошла ошибка: " + Error$
Exit Sub	
End Sub
 

Вложения

  • 1.JPG
    1.JPG
    72,2 КБ · Просмотры: 624
  • XML_C22576FB003A26D0_Note_06AD4E1D3ABCC4DCC22576FA0036D8E2_BA7CDB64A9AF5D27C22576FA0036CEEB_.xml
    1,7 КБ · Просмотры: 315
  • XML_C22576FB003A26D0_Note_BA7CDB64A9AF5D27C22576FA0036CEEB_82544FE3E88A6467C22576F9004A19AC_.xml
    3,4 КБ · Просмотры: 318
  • XML_C22576FB003A26D0_Note_82544FE3E88A6467C22576F9004A19AC__.xml
    14,7 КБ · Просмотры: 310

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
сходу ничего не понял ;), ругацо на xml...
и что? мобуть стринги экспортированы в одной платформе, а импортятся в другой.... (версия нотусов, ОС...)
не понятно - зачем нужна последовательность, если все доки надо втянуть?
кодировка может отличаться (в процессах импорта и экспорта) UTF-8 и CP1251 - несовместимо
 
B

blackswanny

сходу ничего не понял ;), ругацо на xml...
и что? мобуть стринги экспортированы в одной платформе, а импортятся в другой.... (версия нотусов, ОС...)
не понятно - зачем нужна последовательность, если все доки надо втянуть?
кодировка может отличаться (в процессах импорта и экспорта) UTF-8 и CP1251 - несовместимо
не все доки надо втянуть, выбираю файл xml-документа, по нему надо создать в базе этот документ и всех его парентов, даже если они уже существуют. Всё происходит на одной машине, в одной среде, делаю экспорт и сразу же делаю импорт. Как кодировку выставлять?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
если принудительно не ставить - выгрузит в 1251 - это точно!
выставляется в NotesStream - при Open , читаем хелп дизайнера
если доки существуют - нужно опциями рулить (импортера - хэлп дизайнера), иначе получите с другим унидом
 
B

blackswanny

если принудительно не ставить - выгрузит в 1251 - это точно!
выставляется в NotesStream - при Open , читаем хелп дизайнера
если доки существуют - нужно опциями рулить (импортера - хэлп дизайнера), иначе получите с другим унидом
Я выставил Importer.DocumentImportOption = DXLIMPORTOPTION_CREATE для принудительного создания документа, если даже есть старый, и он делает его копию с новым унидом. Если это делать с документом при существующем родителе в базе, то он создается копией и крепится к родителю вместе со старым. Если создавать родителя, то он создается новым, однако выскакивает эта ошибка. Может это из-за того, что родитель ссылается на потомка, которого нет в базе?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
ошибка форматирования ХМЛ, и она наводит на мысль о кодировке!
надо учитывать, что кодировка ХМЛ для не англицких языков д.б. UTF-8 (а не усечённые варианты аля МСпердулятора №1251)
 
B

blackswanny

ошибка форматирования ХМЛ, и она наводит на мысль о кодировке!
надо учитывать, что кодировка ХМЛ для не англицких языков д.б. UTF-8 (а не усечённые варианты аля МСпердулятора №1251)
поставил кодировку, теперь ошибки нет, но и не так работает. Если создаваемый документ не имеет потомков, создается копия, или он является потомком уже существующего, то создается копия и крепится как потомок к существующему. Но если сделать попытку создания документа, родитель которого был удален из базы, то ничего не происходит, ошибок нет, но документ не создается, видимо, потому что не может найти своего родителя. Как такую проблему обойти? Можно ли при импорте присваивать новые UNID и ParentUNID ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
яж об этом сразу и говорил...
юнид новый и так присваивается..., а вот поле $REF с пом. XSLT изменить в ходе импорта (в цепочку вставить - см. хелп)

др. словами - алгоритм, кот. вы пытаетесь сделать - изначально "ущербен"...
документ-"потомок" создаётся в базе, но во вьюшке стоит галка про иерархию доков, потому его и "не видно"
цель ваших действий мне не ясна...
не проще ли поменять юнид существующего дока - если он не имеет потомков, либо ваще его заменить (либо сдеать копию и заменить)
 
30.05.2006
1 345
12
BIT
0
Дошли руки (нашлась задача) до DXL.
Экспортирую док-т в поток, парсю его SAXParser-ом, пытаюсь импортировать обратно.
Импортёр говорит Ok, но док-т не обновляется :-(

Нет-ли каких подводных камней при импорте док-та их XML?
Да, версия клиента - 6.5.5
 
30.05.2006
1 345
12
BIT
0
м.б. notesDXLImporter.DocumentImportOption ?
Эт я заметил! Попробовал DXLIMPORTOPTION_REPLACE_ELSE_IGNORE и DXLIMPORTOPTION_REPLACE_ELSE_CREATE.
Однохренственно...

А вот всяки свойства "created", "modified" etc импорту не противоречат? Я пробовал кое-что выкусить - не помогает
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
нужно Serialize делать иначе изменения не отразятся (для DOM)
а SAX - этож в поток, пайплайн делается?

если всё не "налету", то посмотреть - может он новый док создаёт...
ну и там - ошибки (посмотреть их)
 
A

Akupaka

нужно Serialize делать иначе изменения не отразятся
Где, в LS? О.о

Constantin A Chervonenko ,
опробуйте убить из импортируемого дока данные об униде. Права на создание и изменение конкретного документа есть (доступ к базе, к документу)?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
а что смущает?
Walks the DOM document tree and streams the resulting XML to the DOM parser's output object, provided one was specified.
Defined in
NotesDOMParser
Syntax
Call notesDOMParser.Serialize( )
See Also
Using XML with LotusScript

Добавлено:
опробуйте убить из импортируемого дока данные об униде
это какие - ведь надо обновить док...
 
A

Akupaka

Не могу ответить, не знаю )) просто переспросил.
это какие - ведь надо обновить док
Для проверки сработает ли импорт вообще.
А разве импортер сработал бы без ошибки, если бы ему пустой поток передали бы?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
я не помню режимов его работы...
куда ошибки пишет - надо хэлп смореть
 
30.05.2006
1 345
12
BIT
0
нужно Serialize делать иначе изменения не отразятся (для DOM)
а SAX - этож в поток, пайплайн делается?
Будет пайп, а пока - для отладки - во временное файлО пишу/читаю
если всё не "налету", то посмотреть - может он новый док создаёт...
ну и там - ошибки (посмотреть их)
Эт понятно. Ошибки в importer.Log смотрю. Пока преобразование не отладил, они там были. Теперь: ошибок нет, но и док-та нет


Добавлено:
опробуйте убить из импортируемого дока данные об униде. Права на создание и изменение конкретного документа есть (доступ к базе, к документу)?
Прав - выше крыши.
UNID - жалко. Док-т надо именно обновить. Для этого (судя по help) требуется совпадение replicaid и unid. Разве только для отладки?
А noteid и sequence я выкусил
 
30.05.2006
1 345
12
BIT
0
Ха! С опцией DXLIMPORTOPTION_REPLACE_ELSE_CREATE оно-таки создаёт новые док-ты - совсем с другим UNID-ом.

For purposes of replacement, two documents match if:
The replica ID of the output database matches the replica ID of the incoming DXL.
The universal IDs of the two documents match.

Разумеется, эти IDы я не трогал. Тем не менее, железяка считает, что оно NOT match :)
М.б. какая-то фигня, типа разделители ( : ) в replicaid-е?
 
T

turumbay

Ха! С опцией DXLIMPORTOPTION_REPLACE_ELSE_CREATE оно-таки создаёт новые док-ты - совсем с другим UNID-ом.
Может ей мешает док in-memory? Если разбить код на два куска(две кнопки): первый выгружает, изменяет и сохраняет на диск. второй - только импортирует файл.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
вот какую-то инфу трогать низя в ДХЛ (удалять), может она и пропала?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!