egorius: (Default)

Развлекался тут с Advanced Queueing и нашел чудесную окаменелость.

Dequeue Options

navigation
The navigation attribute specifies the position of the dequeued message. If FIRST_MESSAGE is specified, then the first available message matching the search criteria is dequeued. If NEXT_MESSAGE is specified, then the next available message matching the search criteria is dequeued (the default).

Проявляется это, например, если пытаться выбирать сообщения из очереди, прикидываясь разными подписчиками:

ORA-25242: cannot change subscriber name from SUBSCRIBER1 to SUBSCRIBER2 without FIRST_MESSAGE option
*Cause:    An attempt was made to change the subscriber name while using the
           NEXT_MESSAGE or NEXT_TRANSACTION option for dequeuing.
*Action:   To use a subscriber name that is different from the previous
           dequeue call, reset the dequeuing position by using the
           FIRST_MESSAGE navigation option.

Ведь что получается? В недрах реляционки сидит, особо не скрываясь, пережиток навигационных баз данных и заставляет нас думать в терминах FIND FIRST, FIND NEXT!

Будь я постарше, мог бы испытать примерно то же, что испытал однажды, сохраняя файл на КПК. А так просто в тихом шоке.

пощупать исходный код )
egorius: (Default)

У Йона Бентли прочитал однажды про поиск методом половинного деления: Большинство программистов полагают, что про приведенному выше описанию можно легко написать код. Они ошибаются. Не верите — отложите на время книгу и напишите сами. Попробуйте. Отложил, написал, работает. Ну ладно.

Сейчас вот ширим ряды, собеседую разработчиков. Дай, думаю, подкину задачку, посмотрим. И что же? Пока 2:0 в пользу Бентли. Ладно бы кандидаты написали не вполне корректно, я бы простил. Но они просто ничего не написали! Вот задумайтесь: профессиональные разработчики с многолетним стажем не смогли внятно записать на бумаге школьный алгоритм на своем любимом языке программирования. Не укладывается это в моей бедной голове.

Индусы, говорите? Ха.

egorius: (Default)

По аналогии с эстетикой грязных апрошей надо бы ввести термин эстетика индусского кода. Достаточно сдуть пыль с пятисот строк кода, чтобы пред нами предстал прекрасный образец, радующий глаз археолога:

...
/*  Stubbed out Functionality - Bug 3819086
...
*/
...
/*Bug 3611598  - Following cursor added */
...
 /* The following two procedures are added for bug#1831045 */
...
/* Start- Added for fixing bug 2343741 */
...
/* End _-Added for fixing bug 2343741 */
...
-- Code for bug 3136539 starts 
...
    -- Start - Added for fixing bug#4491454
    ...
    -- End - added for fixing bug#4491454
...
-- Code for bug 3136539 ends
/* Code addition for bug 3134205 starts */
...
/* Code addition for bug 3134205 ends */
...
       --bug3136539 starts
       ...
       --bug3136539 ends
...       
       --bug3136539 starts
       ...
       --bug3136539 ends
...
      --bug3136539 starts
      ...
      --bug3136539 ends
...
--  Start Bug 1308727  STATUS MODEL changes
    ...
         --bug3136539 starts
         ...
         --bug3136539 ends
    ...
--  End Bug 1308727  STATUS MODEL changes
...
         /* Commented for Bug 3134205 
         ...
               -- Bug # 558234 Starts here ...
               ...
               ...
               -- Bug # 558234 Ends here ...
         ...
         */
...
/* Stubbed Out Auto Initiate Demand On Project Approval Functionality
-- Bug 3611598 Starts here 
...
End of Commenting for Bug 3819086*/
-- Bug # 558242 Starts here (Added :project.mode condition only) ...
...
-- Bug # 558242 End here ...
...
/* Bug 2371402 - Reworking the changes done for bug 2198156. It was incorrect. 
The update_wf_status should be called before starting the workflow and not after */
-- Un commneted the below code for bug 2371402
--commenting the below code for bug2198156
...
/* code addition for bug 2198156 starts */
...
/* code addition for bug 2198156 ends */
...
              --bug3136539 starts
              ...
              --bug3136539 ends
...
/* Bug 2371402 -- REworking the changes done for bug2198156 */
/* code addition for bug 2198156 starts */
...
/* code addition for bug 2198156 ends */
...
/* Fix for bug2206292 */
...
  /* code addition for bug 2270701 starts */
...
/*Code addition starts for the bug 2773394*/
...
/*Code addition for bug 2773394 ends here */
...
  /* code addition for bug 2270701 starts */
  /* commented the below update for bug 2270701 */
      /*
      ...
      */
...
  /* code addition for bug 2270701 starts */
...
  /* code addition for bug 2270701 ends */
  /* commented the below update for bug 2270701 */
      /*
      ...
      */
...
/* End of Fix for bug2206292 */
...
         --bug3136539 starts
         ...
         --bug3136539 ends
...
            /* Code Addition for bug 3134205 starts */
            ...
            /* Code Addition for bug 3134205 ends */
...
 /* The following line has been added for bug 2544041 */
 ...
  --bug3136539 starts
  ...
  --bug3136539 ends
  /* Code addition for bug 3134205 starts */
  ...
  /* Code addition for bug 3134205 ends */
...

Неуловимо напоминает Рукопись, найденную_в.

egorius: (Default)

Коллега-археолог — хороший человек — поделился находкой, раскопанной им в дебрях трассировки 10046. Не могу не предать гласности сей шедевр:

--
-- bless_next_init-
--
--   Only a few Oracle FND developers will ever call this routine.
--   Because it is so rare that anyone would ever call this
--   routine, we aren't going to document it so as not to
--   confuse people.  All you need to know is that calling this
--   routine incorrectly can easily cause showstopper problems
--   even for code outside your product.  So just don't call it
--   unless you have been told to do so by an Oracle FND
--   development manager.
--
--   in argument:
--      permission_code- if you have permission to call this
--                       you will have been given a unique code
--                       that only you are allowed to pass to
--                       confirm that your call is permitted.
--
--   see the internal oracle document for more details:
--   http://www-apps.us.oracle.com/atg/plans/r115x/contextintegrity.txt
--
procedure bless_next_init(permission_code in varchar2);

egorius: (Default)

Когда постоянно находишься в определённой среде, трудно представить, что извне всё может быть совсем по-другому. Например, вопрос «медь или алюминий» ставит электрика в ступор: «я ж говорю, ПУНП»,— отвечает он, недоумевая. Так что бывает полезно на время оставить свой уютный уголок и посмотреть, что происходит за его пределами.

В своё время я любил понаезжать на братьев-индусов, упорно делая вид, что уж наши-то всяко лучше. Чтобы развеять этот миф, оказалось достаточно поработать на проекте, где рулят товарищи® не из нашей конторы™.

На самом деле, меня не так просто сподвигнуть на пост. Когда в отчете встречается «расчитанная аммортизация», я лишь ухмыляюсь. Когда я вижу файлы «файл_v1», «файл_v2», «файл_v3» и т. д., заботливо сложенные в систему контроля версий, я грустно улыбаюсь. Когда я читаю в дизайне «программа реализовывает возможность осуществить операцию списания», я тяжело вздыхаю.

Но когда в программе попадается такая функция, тут уж извините:

open c;
fetch c into l;
if c%found then
  return 1;
else
  return 0;
end if;
close c;

Злой я, да?..

egorius: (Default)

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

Но пока он работает, напрягая десяток процессоров и одному Ораклу известно сколько дисков, всё-таки напишу. Вот, из моего любимого пакета:

begin
  select fnd_logins_s.nextval
    into loginid
    from dual;
exception
  when no_data_found then
    raise dual_no_rows;
  when too_many_rows then
    raise dual_too_many_rows;
  when others then
    raise;
end;
egorius: (thought)

К очередным археологическим изысканиям меня побудило желание сделать нечто не совсем тривиальное, о чём в документации не пишут. Это обычно приводит к необходимости брать лопату и идти копать исходный код. Вот и на этот раз…

function XXX(
  ...
  argument1   IN varchar2 default CHR(0),
  argument2   IN varchar2 default CHR(0),
  argument3   IN varchar2 default CHR(0),
  ...
  ...
  ...
  argument99  IN varchar2 default CHR(0),
  argument100 IN varchar2 default CHR(0)
)
return number is
  ...
begin
  ...
  if (argument1 = CHR(0)) then goto end_args; end if;
  nargs := 1;
  argtxt := argtxt||argument1;
  if (argument2 = CHR(0)) then goto end_args; end if;
  nargs := 2;
  argtxt := argtxt|| ', '||argument2;
  if (argument3 = CHR(0)) then goto end_args; end if;
  nargs := 3;
  argtxt := argtxt|| ', '||argument3;
  ...
  ...
  ...
  if (argument99 = CHR(0)) then goto end_args; end if;
  nargs := 99;
  argtxt := argtxt||', '||argument99;
  if (argument100 = CHR(0)) then goto end_args; end if;
  nargs := 100;
  argtxt := argtxt||', '||argument100;
  <<end_args>>
  ...
end;

Ну а с другой стороны, чего ждать от исходника, авторы которого Ram Bhoopalam и H Pelimuhandiram?..

egorius: (Default)

Из разговора с Оракловой поддержкой:

Я:
Is there a document in which Mass Copy is described in detail? I searched through FAUG and Metalink but I didn’t find where it is stated that «Oracle will not allow any adjustments after partial retirement in the same period.»

Поддержка:
The document I had is in hard copy and if you want I can fax it to you. Just give me your fax number.

Сижу вот, глупо хихикаю. Хоть новый тэг заводи, «братья-индусы»…

egorius: (Default)

Нет, други мои, не удержусь. Вот вам проверка из предыдущего поста. Такую красоту нельзя прятать, любуйтесь все:

<script language='javascript'>
  function validatePhone_contactPhoneNumber(oSrc){
    // if number is greater than 10 digits,
    // allow any digits, dashes and '+' at the beginning,
    // must have at least one dash.
    // this is what we are using for intl entry.

    var regx = new RegExp(/^\d+$/);
    var ndigitCount = 0;
    var strValue = document.all.contactPhoneNumber.value;
    var valueWithSpacesRemoved = '';
    // make sure all characters are either digits, dashes, periods, or '+'
    for (var i = 0;  i < strValue.length;  i++) {
      if (regx.test(strValue.charAt(i))) {
        ndigitCount++;
        continue;
      }
      if (strValue.charAt(i) == '-') {
        continue;
      }
      if (strValue.charAt(i) == ' ') {
        continue;
      }
      if (strValue.charAt(i) == '.') {
        continue;
      }
      return false;
    }
    //must have at least 4 digits
    if(ndigitCount < 2){
      return false;
    }

    return true;
  }
</script>

Предлагаю конкурс — кто найдёт больше несоответствий кода и комментариев…

Profile

egorius: (Default)
egorius

September 2017

M T W T F S S
     123
45678 910
1112131415 1617
18 19 202122 23 24
252627282930 

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 26th, 2017 07:24 am
Powered by Dreamwidth Studios