Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг pl/sql / 25 сообщений из 39, страница 1 из 2
05.12.2016, 13:37
    #39360440
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Доброго времени суток.

Возникла необходимость распарсить боди пакетов (есть очень много процедур, сотни, которые нужно обернуть в примитивное логирование и добавить однотипную секцию отлова ошибок)
Сперва хотел написать сам, но последнее время стараюсь не плодить велосипедов :)

В самом примитивном варианте исполнения задачи, который пока превалирует, мне нужно взять исходник пакета из all_source, определеить в нем все подпрограммы, для каждой подпрограммы определить строчку с основным BEGIN'ом (вложенные подпрограммы нужно скипать) и строчку с подходящим ему END'ом.
После BEGIN'а я вставлю логирующую строку, содержащую в качестве входных данных имя функции и некоторые переменные,взятые из контекста. Сигнатура логирующей функции будет одинакова во всех случаях. Так же намереваюсь поступить и с EXCEPTION секцией.

Проблема -- я пока не умею определять первый BEGIN и последний END. Может кто-то уже писал подобные парсеры, поделитесь?
PL/SQL девелопер как-то это делает, собирался было плагин к нему написать, но в списке поддерживаемых расширениями методов не нашел ничего подходящего.
...
Рейтинг: 0 / 0
05.12.2016, 13:43
    #39360448
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Так же вполне подойдет какой-нибудь код, который может убрать из исходника все комментарии, заменив их пробелами и пустыми строками, например. Дальше я BEGIN'ы и END'ы и сам посчитаю
...
Рейтинг: 0 / 0
05.12.2016, 14:06
    #39360478
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Во избежание сразу хочу уточнить, что парсер хочу на Pl/sql =)
JAVA парсеры знаю, если с Pl/sql'ым не выйдет воспользуюсь ими
...
Рейтинг: 0 / 0
05.12.2016, 14:13
    #39360485
NETClient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Вот так вот возьмешь и сотрешь все комментарии?
...
Рейтинг: 0 / 0
05.12.2016, 14:28
    #39360506
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunТак же вполне подойдет какой-нибудь код, который может убрать из исходника все комментарии, заменив их пробелами и пустыми строками, например. Дальше я BEGIN'ы и END'ы и сам посчитаюголь на выдумки хитра

Тебе за это еще кто-то деньги платит?
...
Рейтинг: 0 / 0
05.12.2016, 16:47
    #39360670
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Товарищи, а с чего вы решили, что версию без комментариев я потом апплаить буду. Она нужна только для того, чтобы корректно посчитать BEGIN'ы и END'ы. Для определения номеров строк, если хотите. А зная номера строк можно и с изначальным исходником с комментариями работать.

Взять самый тупой вариант развития событий за авторский и побежать строчить ответ -- сильно =)
...
Рейтинг: 0 / 0
05.12.2016, 16:49
    #39360673
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
dbms_photoshopaksufunТак же вполне подойдет какой-нибудь код, который может убрать из исходника все комментарии, заменив их пробелами и пустыми строками, например. Дальше я BEGIN'ы и END'ы и сам посчитаюголь на выдумки хитра

Тебе за это еще кто-то деньги платит?
Платят и довольно неплохие) Вероятно потому, что апплаить версию без комментариев мне в голову не приходит.
...
Рейтинг: 0 / 0
05.12.2016, 17:04
    #39360695
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunТоварищи, а с чего вы решили, что версию без комментариев я потом апплаить буду. Она нужна только для того, чтобы корректно посчитать BEGIN'ы и END'ы. Для определения номеров строк, если хотите. А зная номера строк можно и с изначальным исходником с комментариями работать.

Взять самый тупой вариант развития событий за авторский и побежать строчить ответ -- сильно =)Я не берусь говорить за всех касательно того кто что подумал.
Но твой подход действительно исключительно тупой независимо от обработки коментариев.

Держи, пили 19621564 .

Люди с такими бестолковыми инициативами более вредны чем те, кто ничего не делает.
Надеюсь ты хоть выводы сделаешь.
...
Рейтинг: 0 / 0
05.12.2016, 18:12
    #39360764
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
dbms_photoshopaksufunТоварищи, а с чего вы решили, что версию без комментариев я потом апплаить буду. Она нужна только для того, чтобы корректно посчитать BEGIN'ы и END'ы. Для определения номеров строк, если хотите. А зная номера строк можно и с изначальным исходником с комментариями работать.

Взять самый тупой вариант развития событий за авторский и побежать строчить ответ -- сильно =)Я не берусь говорить за всех касательно того кто что подумал.
Но твой подход действительно исключительно тупой независимо от обработки коментариев.

Держи, пили 19621564 .

Люди с такими бестолковыми инициативами более вредны чем те, кто ничего не делает.
Надеюсь ты хоть выводы сделаешь.

Это конечно классно, что ты умеешь прикладывать ссылки на известные пакеты стандартной поставки, но если приложишь любой работающий пример, как при помощи pl/scope распарсить вот эту функции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure proc
is
   procedure subproc
      (a number)
   is
   begin
      begin
         null;
      end;
   end;
begin
   begin
      null;
   end ;
end;


на выходе номера строк BEGIN'а (строка 11) и END'а (строка 15) корневой функции.
Распарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол.
...
Рейтинг: 0 / 0
05.12.2016, 18:15
    #39360768
NETClient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunРаспарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол.
Зря ты так, вряд ли после этого у кого-то возникнет желание тебе помогать.
...
Рейтинг: 0 / 0
05.12.2016, 18:16
    #39360769
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunА пока ты просто балабол.это было грубо
неодобряэ
...
Рейтинг: 0 / 0
05.12.2016, 18:20
    #39360774
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunРаспарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол.

Воспользовался удобным интерфейсом.
Глупая попытка взять на "слабо" при полном нежелании что-либо сделать самостоятельно.
...
Рейтинг: 0 / 0
05.12.2016, 18:27
    #39360781
Lary Denis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunРаспарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол.


нет.
...
Рейтинг: 0 / 0
05.12.2016, 18:30
    #39360785
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Просто я очень не одобряю подход кидания ссылками без пояснения и переход на личности. Все такие крутые, что 2 минуты времени на простой пример не уделить, что же вы тогда на форуме пишите вообще? С такими только их же средствами и можно.

Я цивилизованно спросил совета, в ответ получил вопросы, платят ли мне за работу. Налицо провокация.
И разумеется про pl/scope я в курсе, ссылка, которую он предоставил идет из топика с совсем иной проблемой. Там человек хочет определить имя функции в стектрейсе, в целом это можно реализовать на pl/scope, т.к. он отображает call строки, а в стектрейсе они и есть.

Но по pl/scope нельзя понять, находишься ли ты в теле (основные BEGIN END) функции или нет. Этот пакет создан в помощь разработчикам IDE, чтобы им удобнее было сигнатуры и зависимости отслеживать.
...
Рейтинг: 0 / 0
05.12.2016, 18:33
    #39360789
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunЭтот пакет создан в помощь разработчикам IDE, чтобы им удобнее было сигнатуры и зависимости отслеживать
aksufunPL/SQL девелопер как-то это делает
...
Рейтинг: 0 / 0
05.12.2016, 18:34
    #39360790
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunДоброго времени суток.
...
есть очень много процедур, сотни,
...

Сотни - это не много, 3-4 часа, максимум один рабочий день если вручную.
Больше будешь разрабатывать парсер

Как вариант lite автоматизации, (пишется за 5-10 минут):
пробежаться снизу вверх по USER_SOURCE и после слов procedure или function
поиск первого END;
Вставить стандартный блок exception после него
Скомпилить пакеты, и поправить пакеты с ошибкой
...
Рейтинг: 0 / 0
05.12.2016, 18:34
    #39360791
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Если у вас тут культ обожания некоторых пользователей, несмотря на их явное провокационное поведение, то это комьюнити очень прогнило. Давно тут не был.
...
Рейтинг: 0 / 0
05.12.2016, 18:36
    #39360793
NETClient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufun,

А еще тут не любят задиристых новичков, которые считают, что им тут кто-то что-то должен.
...
Рейтинг: 0 / 0
05.12.2016, 18:42
    #39360800
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Vadim LejninaksufunДоброго времени суток.
...
есть очень много процедур, сотни,
...

Сотни - это не много, 3-4 часа, максимум один рабочий день если вручную.
Больше будешь разрабатывать парсер

Как вариант lite автоматизации, (пишется за 5-10 минут):
пробежаться снизу вверх по USER_SOURCE и после слов procedure или function
поиск первого END;
Вставить стандартный блок exception после него
Скомпилить пакеты, и поправить пакеты с ошибкой

К сожалению этот подход не сработает, т.к. бывают вложенные процедуры.
Ручной подход не рассматриваю, так как мне всегда не везет в таких делах. Если сделаю копипастом, то 100% что-то потом не заработает и нужно будет опять переделывать и опять руками.

Вообще я уже написал, 3-4 часа где-то ушло с перерывами. Есть много допущений, конечно, т.к. никаких синтаксических деревьев я не строю, а просто анализирую исходный текст, да еще и с предположениями о его форматировании.
Например на примере с 2 функциями записанными в одну строчку мой код либо входит в бесконечный цикл, либо не видит вторую функцию. Но я таких экземпляров за всю свою жизнь ни разу не видел.

Тащу исходник из all_source, иду по строкам, если в строке определение функции, то вхожу в подсчет BEGIN-END'ов. Если вместо бегина внутри вижу опять функцию, то рекурсивный вход. Когда выйдем из всех рекурсий то все вложенные функции пройдены. Так дохожу до настоящего BEGIN от тела функции, потом считаю begin-end'ы, всё.

Работает
...
Рейтинг: 0 / 0
05.12.2016, 18:43
    #39360802
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunЕсли у вас тут культ обожания некоторых пользователей, несмотря на их явное провокационное поведение, то это комьюнити очень прогнило. Давно тут не был.Тебе же говорят, напрасно ты так.
И откуда столько ненависти?
Будь выше этого. Не ведись на провокации.
...
Рейтинг: 0 / 0
05.12.2016, 18:45
    #39360804
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
NETClient,

Господь с вами, конечно не должны. Вот прямо со всей мочи не должны, настолько, что можете вообще н и ч е г о не делать, представляете? Даже провокационных постов с не относящимися к вопросу ссылками не писать.
Но хамство я тоже терпеть не стану, с какой стати?
...
Рейтинг: 0 / 0
05.12.2016, 18:45
    #39360805
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
--Eugene--aksufunЕсли у вас тут культ обожания некоторых пользователей, несмотря на их явное провокационное поведение, то это комьюнити очень прогнило. Давно тут не был.Тебе же говорят, напрасно ты так.
И откуда столько ненависти?
Будь выше этого. Не ведись на провокации.

Спасибо, учту.
Тема более не актуальна, так как задачу я сам решил. Спасибо.
...
Рейтинг: 0 / 0
05.12.2016, 18:47
    #39360809
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
aksufunПросто я очень не одобряю подход кидания ссылками без пояснения и переход на личности.Говноед, я критиковал исключительно твой подход. Твоя личность не очень меня беспокоит как и мнение обо мне.
Умение пользоваться поиском и читать документацию это минимальное требование для любого разработчика, про гурость речь не идет.
Я делал допущение, что ты в состоянии перейти по ссылке на доку и осилить абзац текста с конкретным примером. Но, увы, я тут ошибся.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create or replace package pkg as
  procedure proc;
end;
/
create or replace package body pkg as
  procedure proc
  is
     procedure subproc
        (a number)
     is
     begin
        begin
           null;
        end;
     end;
  begin
     begin
        null;
     end ;
  end;
end;
/
alter session set plscope_settings='identifiers:all';
alter package pkg compile;

Это ты уже сможешь допилить или дальше разжевывать?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select lpad(' ', level * 5, ' ') || name name,
       line,
       col,
       type,
       usage
  from (select *
          from user_identifiers
         where (object_name, object_type) = (('PKG', 'PACKAGE BODY')))
start with usage_context_id = 0
connect by prior usage_id = usage_context_id;

NAME                                 LINE        COL TYPE               USAGE
------------------------------ ---------- ---------- ------------------ -----------
     PKG                                1         14 PACKAGE            DEFINITION
          PROC                          2         13 PROCEDURE          DEFINITION
               SUBPROC                  4         16 PROCEDURE          DECLARATION
                    SUBPROC             4         16 PROCEDURE          DEFINITION
                         A              5         10 FORMAL IN          DECLARATION

Была сделана попытка намекнуть, чтоб ты не занимался херней. Но пациент оказался излишне самолюбив.
...
Рейтинг: 0 / 0
05.12.2016, 18:57
    #39360818
aksufun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
dbms_photoshop,

>> Это ты уже сможешь допилить или дальше разжевывать?
признайся, ты просто прикалываешься.

Даже взяв тот пример, что ты приложил: данные из *_identifiers кончаются на строке пакета #5, а именно на последнем объявлении входного параметра вложенной процедуры. Дальше в процедуре нигде ничего не объявляется и не вызывается и, внезапно, больше нам pl/scope ничего не скажет.
В воздухе висит вопрос -- как же эта информация поможет нам узнать ид строки, после которой надлежит воткнуть логирование? Ведь именно такова была изначальная постановка задачи.
...
Рейтинг: 0 / 0
05.12.2016, 19:07
    #39360820
dbms_paint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг pl/sql
Твоя задача в общем случае решается достаточно трудоемко. Надо учесть и не споткнуться о такие выражения, как case ... end, case ... end case, if ... end if.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг pl/sql / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]