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

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

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

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

Может ли Db.search вернуть Nothing?

  • Автор темы Omh
  • Дата начала
O

Omh

Камрады, добрый день!

Возник вопрос на засыпку (сформулирован в сабже).
Я всегда считал, что даже в самом худшем случае db.Search возвращает коллекцию с count = 0.
Но ходят байки, что всё-таки db.Search может вернуть Nothing :angry:

Я сам лично сталкивался с тем, что doc.Responses возвращает Nothing, но что бы db.Search - никогда.
Прошу подтвердить или опровергнуть!

Спасибо!
 
O

Omh

Один вариант нашёл сам.
Но я не знаю, кем надо быть что бы так писать :angry:
Код:
Dim Dc As NotesDocumentCollection
On Error Resume Next
Set Dc = Db.Search({@SOME_FAKE_FORMULA}, Nothing, 0)
On Error Goto ErrDone

Вот тут Dc будет Nothing (т.к. только задефайнена).
Но повторюсь, не знаю, кем надо быть что бы так писать :angry:
 
A

Azrael

Для: Omh
:angry: Не пугай так... много где использую код set coll = db.Search...

Индусы - народ интересный, взять хотябы периодически всплывающие дискуссии на тему функции coll.getNthDocument. Знающие люди пишут, что там внутри всё основано на тех же функциях coll.getNextDocument... Тем не менее, когда одно время использовал (из-за ИМХО, бОльшей красоты и наглядности конструкции for-next), получал на некоторых репликах функцией coll.getNthDocument непонятный результат, даже не nothing, а вообще какую-то ерунду, и соответственно, вопли пользователей, о том, что "все глючит" (ессно, запарывалось в дальнейшем коде на получении / установке полей документа)
 
O

Omh

Да я и сам много где юзаю.
И всегда проверяю сразу на Dc.Count.
А тут мне говорят, что если Search возвращает Nothing, то это в пределах нормы :angry:

А вот Doc.Responses теперь всегда проверяю на Nothing.
Ибо были прецеденты.
 
A

Azrael

<!--QuoteBegin-Omh+17:10:2007, 13:28 -->
<span class="vbquote">(Omh @ 17:10:2007, 13:28 )</span><!--QuoteEBegin-->Один вариант нашёл сам.
Но я не знаю, кем надо быть что бы так писать
[snapback]82084" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ну если какие скобки неправильные или с кавычками касяк, вроде как сообщение об ошибке выплевывается :angry: . Если конечно только On Error Resume Next выше есть, а ниже попытка, например, получения первого документа из коллекции...

<!--QuoteBegin-Omh+17:10:2007, 13:34 -->
<span class="vbquote">(Omh @ 17:10:2007, 13:34 )</span><!--QuoteEBegin-->И всегда проверяю сразу на Dc.Count.
[snapback]82088" rel="nofollow" target="_blank[/snapback]​
[/quote]

сам также делаю :angry:
 
M

Mihal

<!--QuoteBegin-Azrael+17:10:2007, 11:29 -->
<span class="vbquote">(Azrael @ 17:10:2007, 11:29 )</span><!--QuoteEBegin-->Индусы - народ интересный, взять хотябы периодически всплывающие дискуссии на тему функции coll.getNthDocument. Знающие люди пишут, что там внутри всё основано на тех же функциях coll.getNextDocument... Тем не менее, когда одно время использовал (из-за ИМХО, бОльшей красоты и наглядности конструкции for-next), получал на некоторых репликах функцией coll.getNthDocument непонятный результат, даже не nothing, а вообще какую-то ерунду, и соответственно, вопли пользователей, о том, что "все глючит" (ессно, запарывалось в дальнейшем коде на получении / установке полей документа)
[snapback]82085" rel="nofollow" target="_blank[/snapback]​
[/quote]

То что получалось называется "огрызки". Документы-призраки. Проверяется с помощью IsValid :angry:. И индусы тут не при чём. Тут "при чём", скорее, репликации.

По поводу Search. Дык, а кто мешает проверить сначала на IsNothing?
<!--QuoteBegin-Azrael+17:10:2007, 11:29 -->
<span class="vbquote">(Azrael @ 17:10:2007, 11:29 )</span><!--QuoteEBegin-->бОльшей красоты и наглядности конструкции for-next
[snapback]82085" rel="nofollow" target="_blank[/snapback]​
[/quote]
Протестую! Конструкция
Set doc=doccol.GetFirstDOcument
while Not doc is Nothing
.....
Set doc=doccol.GetNextDocument(doc)
wend
прекрасна и естественна!:angry: Вы когда пачку бумаг перебираете, то тоже перебираете пока до конца не дойдёте, а не считаете кол-во обработаных бумажек и сравниваете их к общим количеством, между прочим! Кстати, если doccol.count=0, то нафиг не надо проверять это условие. Посто не попадёт в цикл - и дело с концом.
 
O

Omh

<!--QuoteBegin-Mihal+17:10:2007, 11:46 -->
<span class="vbquote">(Mihal @ 17:10:2007, 11:46 )</span><!--QuoteEBegin-->Дык, а кто мешает проверить сначала на IsNothing?
[snapback]82093" rel="nofollow" target="_blank[/snapback]​
[/quote]
Так в том-то и проблема, что есть уверенность, что Dc после search'a никогда не будет Nothing'ом.
Вот я и спрашиваю реальные случаи, которые могли бы пошатнуть эту уверненость.
 
A

Azrael

<!--QuoteBegin-Mihal+17:10:2007, 13:46 -->
<span class="vbquote">(Mihal @ 17:10:2007, 13:46 )</span><!--QuoteEBegin-->Документы-призраки. Проверяется с помощью IsValid
[snapback]82093" rel="nofollow" target="_blank[/snapback]​
[/quote]

Следуя Вашей логике, в пачке бумаг есть документы-призраки, которые нельзя достать простым перебором while - wend, но могут получиться при попытке, например достать 3-ий документ из пачки :D без индийских опиумных палочек тут никак :D

IsValid и добавил везде, после чего отказался от getNthDocument :D
, то, как правило, выводится сообщение пользователю :p , а то и дальнейший код после цикла может не только не иметь смысла, но и приводить к ошибкам при отсутствии доп. проверок.
 
M

Mihal

<!--QuoteBegin-Azrael+17:10:2007, 11:54 -->
<span class="vbquote">(Azrael @ 17:10:2007, 11:54 )</span><!--QuoteEBegin-->Следуя Вашей логике, в пачке бумаг есть документы-призраки, которые нельзя достать простым перебором while - wend, но могут получиться при попытке, например достать 3-ий документ из пачки без индийских опиумных палочек тут никак
[snapback]82096" rel="nofollow" target="_blank[/snapback]​
[/quote]
Не понял? Я привёл пример по поводу for-next и while. Только для этого. И не более. Типа, аналогия для конкретной конструкции. Причём не только для LotusScript, а ваааще.

<!--QuoteBegin-Azrael+17:10:2007, 11:54 -->
<span class="vbquote">(Azrael @ 17:10:2007, 11:54 )</span><!--QuoteEBegin-->, то, как правило, выводится сообщение пользователю , а то и дальнейший код после цикла может не только не иметь смысла, но и приводить к ошибкам при отсутствии доп. проверок.
[snapback]82096" rel="nofollow" target="_blank[/snapback]​
[/quote]

Как правило такие вещи оформляются в виде отдельных функций, которая чё-нить возвращают. Дабы немножко разграничить интерфейс (сообщения-запросы, например) и, собственно, исполнение. Получили данные с помощью запроса - запихнули в функцию - получили ответ - обработали ответ с выводом окошек усяких.

<!--QuoteBegin-Omh+17:10:2007, 11:52 -->
<span class="vbquote">(Omh @ 17:10:2007, 11:52 )</span><!--QuoteEBegin-->Так в том-то и проблема, что есть уверенность, что Dc после search'a никогда не будет Nothing'ом.
Вот я и спрашиваю реальные случаи, которые могли бы пошатнуть эту уверненость.
[snapback]82095" rel="nofollow" target="_blank[/snapback]​
[/quote]
А не проще добавить проверку на Nothing и забыть об этой паранойи навечно :D .
 
A

Azrael

Для: Mihal
Это всё ИМХО, конечно, но при больших объёмах программного кода отслеживать конструкции пошагового цикла всё же проще, хотя и против while-wend ничего не имею. Но вот получение "призраков" getNthDocument меня в своё время нехило напрягло.

<!--QuoteBegin-Mihal+17:10:2007, 14:54 -->
<span class="vbquote">(Mihal @ 17:10:2007, 14:54 )</span><!--QuoteEBegin-->Как правило такие вещи оформляются в виде отдельных функций, которая чё-нить возвращают. Дабы немножко разграничить интерфейс (сообщения-запросы, например) и, собственно, исполнение. Получили данные с помощью запроса - запихнули в функцию - получили ответ - обработали ответ с выводом окошек усяких.
[snapback]82109" rel="nofollow" target="_blank[/snapback]​
[/quote]
не спорю, просто такое не всегда оправдано.
<!--QuoteBegin-Mihal+17:10:2007, 14:54 -->
<span class="vbquote">(Mihal @ 17:10:2007, 14:54 )</span><!--QuoteEBegin-->А не проще добавить проверку на Nothing и забыть об этой паранойи навечно .
[snapback]82109" rel="nofollow" target="_blank[/snapback]​
[/quote]

всего лишь перебрать полностью много километров кода...
 
M

Mihal

<!--QuoteBegin-Azrael+17:10:2007, 13:27 -->
<span class="vbquote">(Azrael @ 17:10:2007, 13:27 )</span><!--QuoteEBegin-->не спорю, просто такое не всегда оправдано.
[snapback]82118" rel="nofollow" target="_blank[/snapback]​
[/quote]
Как по мне, то всегда:D. В ентом деле лучше перебдеть чем недобдеть:D. Сам себя зачастую заставляю, правда... Это как с OnError. Вроде и не всегда надо, но если сразу не добавишь - то не добавишь никогда. А как будет расти код и куда - фиг угадаешь.

<!--QuoteBegin-Azrael+17:10:2007, 13:27 -->
<span class="vbquote">(Azrael @ 17:10:2007, 13:27 )</span><!--QuoteEBegin-->всего лишь перебрать полностью много километров кода...
[snapback]82118" rel="nofollow" target="_blank[/snapback]​
[/quote]
Прям весь код их одних db.Search состоит.:D А поиск для чего?

Можно написать свою функцию с теми же параметрами, что и в Search. С возвратом коллекции документов. В ней вычислять на Nothing и возвращать пустую коллекцию. И подменить одно на другое.
 
D

Dikobraz Grey

Один вариант нашёл сам.
Но я не знаю, кем надо быть что бы так писать :)
Код:
Dim Dc As NotesDocumentCollection
On Error Resume Next
Set Dc = Db.Search({@SOME_FAKE_FORMULA}, Nothing, 0)
On Error Goto ErrDone

Кстати, это один из способов вернуть пустую коллекцию. Ни разу не видел, чтобы этот код вернул Nothing. По крайней мере на 6-ке и 7-ке.
 
O

Omh

@SOME_FAKE_FORMULA - в моём случае навалидная формула.
Т.е. Search вылетает с ошибкой, но проходит по On Error Resume Next и Dc остаётся Nothing'ом
 
D

Dikobraz Grey

Тогда да)<br>Просто я воспринял @SOME_FAKE_FORMULA не как неправильную собаку, а как собаку, которая ничего не возвращает
 
O

Omh

Ну a пустую коллекцию получаю 2-мя способами:
Set Dc = db.GetProfileDocColeection("FAKE_KEY")
или
Set Dc = db.Search({@False}, Nothing, 0)

Надо бы проверить, что быстрее...
 
Мы в соцсетях:

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