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

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

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

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

Проблема с перебором документов в представлении

  • Автор темы Kronos
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kronos

Есть некоторое представление, в которое попадают 730 000 документов. С помощью java агента я пытаюсь их обработать, но проблема состоит в том, что агент перебирает далеко не все документы. Причем число обработанных документов всегда разное. Это может быть 7 тысяч, 20 тысяч, но почему то все документы он не перебирает. Вот код агента:

import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database db = agentContext.getCurrentDatabase();
View view = db.getView("MY_VIEW");
System.out.println(view.getEntryCount());
Document doc = view.getFirstDocument();
int cnt=0;
while (doc != null) {
cnt++;
doc = view.getNextDocument(doc);
}
System.out.println(cnt);
} catch(Exception e) {
e.printStackTrace();
}
}
}

Причем метод getEntryCount() выдает правильное число документов, но счетчик cnt фиксирует то, что были перебраны далеко не все документы. В представлении нет ни какой сортировки. Документы ни как не меняются. Подскажите в чем тут проблема?!
 
A

Azrael

А получить доки в коллекцию и перебирать по ней не пробовал? Ещё, возможно, поможет
view.setAutoUpdate(false), но не факт.
 
D

D!m@n

Уважаемый Kronos, насколько у Вас веские основания для использования именно Java-агента?..
Просто они же работают намного медленнее, чем агенты на LotusScript (не говоря уж о собаках и C/CPP API)...
 
F

Fossil Code

Вот, честно говоря, никогда не любил конструкцию вида while (doc != null), но уже не помню, почему. Может быть, из-за аналогичных проблем. Получив значение количества документов предпочитаю использовать цикл от 1 до cnt и функцию GetNthDocument.
 
K

Kronos

<!--QuoteBegin-Fossil Code+13:10:2007, 21:56 -->
<span class="vbquote">(Fossil Code @ 13:10:2007, 21:56 )</span><!--QuoteEBegin-->Вот, честно говоря, никогда не любил конструкцию вида while (doc != null), но уже не помню, почему. Может быть, из-за аналогичных проблем. Получив значение количества документов предпочитаю использовать цикл от 1 до cnt и функцию GetNthDocument.
[snapback]81669" rel="nofollow" target="_blank[/snapback]​
[/quote]

Пробовал. Вылетает с ошибкой nullPointerException. Кстати вполне логично. Условие выхода из цикла - эту пустой указатель (doc == null), соответственно извлечь от туда что то уже ошибка.

<!--QuoteBegin-D!m@n+13:10:2007, 21:22 -->
<span class="vbquote">(D!m@n @ 13:10:2007, 21:22 )</span><!--QuoteEBegin-->Уважаемый Kronos, насколько у Вас веские основания для использования именно Java-агента?..
Просто они же работают намного медленнее, чем агенты на LotusScript (не говоря уж о собаках и C/CPP API)...
[snapback]81666" rel="nofollow" target="_blank[/snapback]​
[/quote]

Не спорю, но lotusScript, извините, кривой. Начиная от синтаксиса, и заканчивая конструкциями. Простейшая конструкция обработки исключений в lotusScript это хороший геморрой, ну и т.д., но опрос то не в этом кому что нравится. Вопрос в том, почему не работает.
 
S

Sandr

попробуйте перед получением первого документа сделать view.refresh()
А ваще Azrael прав - получите коллекцию и работайте с ней...
 
K

Kronos

<!--QuoteBegin-Azrael+13:10:2007, 14:30 -->
<span class="vbquote">(Azrael @ 13:10:2007, 14:30 )</span><!--QuoteEBegin-->А получить доки в коллекцию и перебирать по ней не пробовал? Ещё, возможно, поможет
view.setAutoUpdate(false), но не факт.
[snapback]81627" rel="nofollow" target="_blank[/snapback]​
[/quote]

Идея была из в коллекцию запихать, но как это сделать я не знаю. Я не такой большой знаток java. Если вас не затруднит, напишите пожалуйста.

view.setAutoUpdate(false) - тоже не работает. :)

Еще были идея использовать методы FTSearch и getAllDocumentsByKey, но пока не пробовал. Дело в том, что самой БД документов несколько миллионов и считать их всех - очень долго, по этому и сделал это представление в которое попадают только нужные документы.


<!--QuoteBegin-Sandr+14:10:2007, 01:50 -->
<span class="vbquote">(Sandr @ 14:10:2007, 01:50 )</span><!--QuoteEBegin-->попробуйте перед получением первого документа сделать view.refresh()
А ваще Azrael прав - получите коллекцию и работайте с ней...
[snapback]81685" rel="nofollow" target="_blank[/snapback]​
[/quote]

Да я не против. Как из преставления получить коллекицю?!
 
30.05.2006
1 345
12
BIT
0
..Получив значение количества документов предпочитаю использовать цикл от 1 до cnt и функцию GetNthDocument.
Зря. Если покопаться в C API, обнаружишь, что в ядре домины есть такой объект "коллекция документов". Это не массив! Это хендл (аналогично как с базой или единичным док-том). Для него определены операции GetFirst и GetNext. А GetNth - нет. GetNth это просто функция типа
Код:
function GetNth(N) as document
set doc = GetFirst
for i=1 to N
set doc = GetNext(doc)
next
set GetNth = doc
end function
 
K

Kronos

<!--QuoteBegin-Constantin A Chervonenko+14:10:2007, 03:14 -->
<span class="vbquote">(Constantin A Chervonenko @ 14:10:2007, 03:14 )</span><!--QuoteEBegin-->Зря. Если покопаться в C API, обнаружишь, что в ядре домины есть такой объект "коллекция документов". Это не массив! Это хендл (аналогично как с базой или единичным док-том). Для него определены операции GetFirst и GetNext. А GetNth - нет. GetNth это просто функция типа
[snapback]81690" rel="nofollow" target="_blank[/snapback]​
[/quote]

Замечательно, но как быть с представлением и перебором документов?
 
A

Azrael

Для: Kronos
Попробуйте еще
Код:
view.setAutoUpdate(false);
view.refresh();
коллекцию можно получить, например, методом search()
Defined in
Database
Syntax
public DocumentCollection search(String formula)
throws NotesException
public DocumentCollection search(String formula, DateTime dt)
throws NotesException
public DocumentCollection search(String formula, DateTime dt, int max)
throws NotesException
Для: Fossil Code использовал одно время на LS функцию GetNthDocument в основном из-за того, что конструкция for - next более удобочитаемая, чем while - wend. В итоге столкнулся с проблемой, по всей видимости, deletion stub: на некоторых репликах сия функция возвращала непонятную ерунду, в результате дальнейший код (типа чтения значения полей) выдавал ошибку.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Использование GetNthDocument на больших коллекциях приводит к очень большим тормозам.
 
K

Kronos

<!--QuoteBegin-Azrael+14:10:2007, 11:19 -->
<span class="vbquote">(Azrael @ 14:10:2007, 11:19 )</span><!--QuoteEBegin-->Для: Kronos
Попробуйте еще
Код
view.setAutoUpdate(false);
view.refresh()
[snapback]81699" rel="nofollow" target="_blank[/snapback]​
[/quote]

Пробовал. Не помогает. Может быть кто ни будь напишет, как из представления получить коллекцию документов?
 
R

root

Для: Kronos

Код:
F1

import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = 
session.getAgentContext();
// (Your code goes here) 
Database db = agentContext.getCurrentDatabase();
View view = db.getView("By Category");
DocumentCollection dc =
view.getAllDocumentsByKey("Spanish leather", false);
dc.putAllInFolder("Boots");
} catch(Exception e) {
e.printStackTrace();
}
}
}

Код:
DocumentCollection dc = db.search
// вкачестве строки поиска фильтр view в данном случае MY_VIEW
("Subject = \"" + agent.getComment() + "\"");
либо через Entry
Код:
Set view = db.GetView("By Category")
Set vc = view.AllEntries
Set entry = vc.GetFirstEntry()
Set doc = entry.Document
 
M

Mihal

<!--QuoteBegin-Kronos+14:10:2007, 00:47 -->
<span class="vbquote">(Kronos @ 14:10:2007, 00:47 )</span><!--QuoteEBegin-->Не спорю, но lotusScript, извините, кривой. Начиная от синтаксиса, и заканчивая конструкциями. Простейшая конструкция обработки исключений в lotusScript это хороший геморрой, ну и т.д., но опрос то не в этом кому что нравится. Вопрос в том, почему не работает.
[snapback]81684" rel="nofollow" target="_blank[/snapback]​
[/quote]
LotusScript кривой. Java глючит. И шо делать?!
 
K

Kronos

<!--QuoteBegin-Mihal+14:10:2007, 22:36 -->
<span class="vbquote">(Mihal @ 14:10:2007, 22:36 )</span><!--QuoteEBegin-->LotusScript кривой. Java глючит. И шо делать?!
[snapback]81733" rel="nofollow" target="_blank[/snapback]​
[/quote]

Кстати 8ка лотуса написана на java. IBM уже давно делает упор на java, постеменно уходит от lotusScript.
 
M

Mihal

<!--QuoteBegin-Kronos+14:10:2007, 21:55 -->
<span class="vbquote">(Kronos @ 14:10:2007, 21:55 )</span><!--QuoteEBegin-->Кстати 8ка лотуса написана на java. IBM уже давно делает упор на java, постеменно уходит от lotusScript.
[snapback]81735" rel="nofollow" target="_blank[/snapback]​
[/quote]

8-ка на Java?! А Вы уверены?:(
 
V

v2v

<!--QuoteBegin-Mihal+15:10:2007, 16:37 -->
<span class="vbquote">(Mihal @ 15:10:2007, 16:37 )</span><!--QuoteEBegin-->8-ка на Java?! А Вы уверены?
[snapback]81820" rel="nofollow" target="_blank[/snapback]​
[/quote]
ну да:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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