|
|
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Возникла необходимость распарсить боди пакетов (есть очень много процедур, сотни, которые нужно обернуть в примитивное логирование и добавить однотипную секцию отлова ошибок) Сперва хотел написать сам, но последнее время стараюсь не плодить велосипедов :) В самом примитивном варианте исполнения задачи, который пока превалирует, мне нужно взять исходник пакета из all_source, определеить в нем все подпрограммы, для каждой подпрограммы определить строчку с основным BEGIN'ом (вложенные подпрограммы нужно скипать) и строчку с подходящим ему END'ом. После BEGIN'а я вставлю логирующую строку, содержащую в качестве входных данных имя функции и некоторые переменные,взятые из контекста. Сигнатура логирующей функции будет одинакова во всех случаях. Так же намереваюсь поступить и с EXCEPTION секцией. Проблема -- я пока не умею определять первый BEGIN и последний END. Может кто-то уже писал подобные парсеры, поделитесь? PL/SQL девелопер как-то это делает, собирался было плагин к нему написать, но в списке поддерживаемых расширениями методов не нашел ничего подходящего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 13:37 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Так же вполне подойдет какой-нибудь код, который может убрать из исходника все комментарии, заменив их пробелами и пустыми строками, например. Дальше я BEGIN'ы и END'ы и сам посчитаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 13:43 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Во избежание сразу хочу уточнить, что парсер хочу на Pl/sql =) JAVA парсеры знаю, если с Pl/sql'ым не выйдет воспользуюсь ими ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 14:06 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Вот так вот возьмешь и сотрешь все комментарии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 14:13 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunТак же вполне подойдет какой-нибудь код, который может убрать из исходника все комментарии, заменив их пробелами и пустыми строками, например. Дальше я BEGIN'ы и END'ы и сам посчитаюголь на выдумки хитра Тебе за это еще кто-то деньги платит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 14:28 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Товарищи, а с чего вы решили, что версию без комментариев я потом апплаить буду. Она нужна только для того, чтобы корректно посчитать BEGIN'ы и END'ы. Для определения номеров строк, если хотите. А зная номера строк можно и с изначальным исходником с комментариями работать. Взять самый тупой вариант развития событий за авторский и побежать строчить ответ -- сильно =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 16:47 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopaksufunТак же вполне подойдет какой-нибудь код, который может убрать из исходника все комментарии, заменив их пробелами и пустыми строками, например. Дальше я BEGIN'ы и END'ы и сам посчитаюголь на выдумки хитра Тебе за это еще кто-то деньги платит? Платят и довольно неплохие) Вероятно потому, что апплаить версию без комментариев мне в голову не приходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 16:49 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunТоварищи, а с чего вы решили, что версию без комментариев я потом апплаить буду. Она нужна только для того, чтобы корректно посчитать BEGIN'ы и END'ы. Для определения номеров строк, если хотите. А зная номера строк можно и с изначальным исходником с комментариями работать. Взять самый тупой вариант развития событий за авторский и побежать строчить ответ -- сильно =)Я не берусь говорить за всех касательно того кто что подумал. Но твой подход действительно исключительно тупой независимо от обработки коментариев. Держи, пили 19621564 . Люди с такими бестолковыми инициативами более вредны чем те, кто ничего не делает. Надеюсь ты хоть выводы сделаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 17:04 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopaksufunТоварищи, а с чего вы решили, что версию без комментариев я потом апплаить буду. Она нужна только для того, чтобы корректно посчитать BEGIN'ы и END'ы. Для определения номеров строк, если хотите. А зная номера строк можно и с изначальным исходником с комментариями работать. Взять самый тупой вариант развития событий за авторский и побежать строчить ответ -- сильно =)Я не берусь говорить за всех касательно того кто что подумал. Но твой подход действительно исключительно тупой независимо от обработки коментариев. Держи, пили 19621564 . Люди с такими бестолковыми инициативами более вредны чем те, кто ничего не делает. Надеюсь ты хоть выводы сделаешь. Это конечно классно, что ты умеешь прикладывать ссылки на известные пакеты стандартной поставки, но если приложишь любой работающий пример, как при помощи pl/scope распарсить вот эту функции Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. на выходе номера строк BEGIN'а (строка 11) и END'а (строка 15) корневой функции. Распарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:12 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunРаспарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол. Зря ты так, вряд ли после этого у кого-то возникнет желание тебе помогать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:15 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunА пока ты просто балабол.это было грубо неодобряэ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:16 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunРаспарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол. Воспользовался удобным интерфейсом. Глупая попытка взять на "слабо" при полном нежелании что-либо сделать самостоятельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:20 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunРаспарсишь -- я признаю, что я говноед, а ты гуру. А пока ты просто балабол. нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:27 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Просто я очень не одобряю подход кидания ссылками без пояснения и переход на личности. Все такие крутые, что 2 минуты времени на простой пример не уделить, что же вы тогда на форуме пишите вообще? С такими только их же средствами и можно. Я цивилизованно спросил совета, в ответ получил вопросы, платят ли мне за работу. Налицо провокация. И разумеется про pl/scope я в курсе, ссылка, которую он предоставил идет из топика с совсем иной проблемой. Там человек хочет определить имя функции в стектрейсе, в целом это можно реализовать на pl/scope, т.к. он отображает call строки, а в стектрейсе они и есть. Но по pl/scope нельзя понять, находишься ли ты в теле (основные BEGIN END) функции или нет. Этот пакет создан в помощь разработчикам IDE, чтобы им удобнее было сигнатуры и зависимости отслеживать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:30 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunЭтот пакет создан в помощь разработчикам IDE, чтобы им удобнее было сигнатуры и зависимости отслеживать aksufunPL/SQL девелопер как-то это делает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:33 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunДоброго времени суток. ... есть очень много процедур, сотни, ... Сотни - это не много, 3-4 часа, максимум один рабочий день если вручную. Больше будешь разрабатывать парсер Как вариант lite автоматизации, (пишется за 5-10 минут): пробежаться снизу вверх по USER_SOURCE и после слов procedure или function поиск первого END; Вставить стандартный блок exception после него Скомпилить пакеты, и поправить пакеты с ошибкой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:34 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Если у вас тут культ обожания некоторых пользователей, несмотря на их явное провокационное поведение, то это комьюнити очень прогнило. Давно тут не был. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:34 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufun, А еще тут не любят задиристых новичков, которые считают, что им тут кто-то что-то должен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:36 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Vadim LejninaksufunДоброго времени суток. ... есть очень много процедур, сотни, ... Сотни - это не много, 3-4 часа, максимум один рабочий день если вручную. Больше будешь разрабатывать парсер Как вариант lite автоматизации, (пишется за 5-10 минут): пробежаться снизу вверх по USER_SOURCE и после слов procedure или function поиск первого END; Вставить стандартный блок exception после него Скомпилить пакеты, и поправить пакеты с ошибкой К сожалению этот подход не сработает, т.к. бывают вложенные процедуры. Ручной подход не рассматриваю, так как мне всегда не везет в таких делах. Если сделаю копипастом, то 100% что-то потом не заработает и нужно будет опять переделывать и опять руками. Вообще я уже написал, 3-4 часа где-то ушло с перерывами. Есть много допущений, конечно, т.к. никаких синтаксических деревьев я не строю, а просто анализирую исходный текст, да еще и с предположениями о его форматировании. Например на примере с 2 функциями записанными в одну строчку мой код либо входит в бесконечный цикл, либо не видит вторую функцию. Но я таких экземпляров за всю свою жизнь ни разу не видел. Тащу исходник из all_source, иду по строкам, если в строке определение функции, то вхожу в подсчет BEGIN-END'ов. Если вместо бегина внутри вижу опять функцию, то рекурсивный вход. Когда выйдем из всех рекурсий то все вложенные функции пройдены. Так дохожу до настоящего BEGIN от тела функции, потом считаю begin-end'ы, всё. Работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:42 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunЕсли у вас тут культ обожания некоторых пользователей, несмотря на их явное провокационное поведение, то это комьюнити очень прогнило. Давно тут не был.Тебе же говорят, напрасно ты так. И откуда столько ненависти? Будь выше этого. Не ведись на провокации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:43 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
NETClient, Господь с вами, конечно не должны. Вот прямо со всей мочи не должны, настолько, что можете вообще н и ч е г о не делать, представляете? Даже провокационных постов с не относящимися к вопросу ссылками не писать. Но хамство я тоже терпеть не стану, с какой стати? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:45 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
--Eugene--aksufunЕсли у вас тут культ обожания некоторых пользователей, несмотря на их явное провокационное поведение, то это комьюнити очень прогнило. Давно тут не был.Тебе же говорят, напрасно ты так. И откуда столько ненависти? Будь выше этого. Не ведись на провокации. Спасибо, учту. Тема более не актуальна, так как задачу я сам решил. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:45 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
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. Это ты уже сможешь допилить или дальше разжевывать? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Была сделана попытка намекнуть, чтоб ты не занимался херней. Но пациент оказался излишне самолюбив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:47 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, >> Это ты уже сможешь допилить или дальше разжевывать? признайся, ты просто прикалываешься. Даже взяв тот пример, что ты приложил: данные из *_identifiers кончаются на строке пакета #5, а именно на последнем объявлении входного параметра вложенной процедуры. Дальше в процедуре нигде ничего не объявляется и не вызывается и, внезапно, больше нам pl/scope ничего не скажет. В воздухе висит вопрос -- как же эта информация поможет нам узнать ид строки, после которой надлежит воткнуть логирование? Ведь именно такова была изначальная постановка задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:57 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
Твоя задача в общем случае решается достаточно трудоемко. Надо учесть и не споткнуться о такие выражения, как case ... end, case ... end case, if ... end if. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:07 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_paint, к счастью END после которого не идет иных символов кроме пробела и перевода строки + ; только от BEGIN'а, так что это достаточно легко обходится. Большей проблемой для меня стало то, что по коду может быть раскидано куча комментариев, их структура может быть не валидна (многострочники) и в этих комментариях тоже могут быть BEGIN'ы и END'ы и их учитывать в подсчете не надо. По счастью в том коде, для которого я эту утилиту написал, нет BEGIN'ов и END'ов в комментариях, так что я пока отложил борьбу с комментами) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:11 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
И даже алиасы такие дать можно. Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:11 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunВ воздухе висит вопрос -- как же эта информация поможет нам узнать ид строки, после которой надлежит воткнуть логирование? Ведь именно такова была изначальная постановка задачи.Гибче надо мыслить, гибче. Что если пытаться логирование "воткнуть" не после, а перед end. End ищется непосредественно перед каждой хранимкой нужного уровня вложенности или с конца файла. Да, после end может быть имя объекта. Так и знал, что не допилишь. :) dbms_paintТвоя задача в общем случае решается достаточно трудоемко. Надо учесть и не споткнуться о такие выражения, как case ... end, case ... end case, if ... end if.Любая попытка изобретать парсеро-велосипеды в общем случае обречена на провал. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:15 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_coreldraw, вот на sql выражениях с алиасами аля " select 0 begin from dual " у меня всё ломается, факт. Но такого, к счастью, нет. Тут уже я не знаю как легко это обойти, нужно парсить до уровня команд, а там и до AST недалеко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:16 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, как можно воткнуть логирование "после" end'a ? там уже процедура кончилась :) А почему мне нужно втыкать именно после первого BEGIN'а тела функции -- так это потому, что в некоторых местах имеем IN/OUT параметры, которые хотелось бы поймать на начало выполнения функции, до их модификации. В целом нет никакой разницы идти ли с конца или с начала, если применять метод подсчета бегинов-эндов. Что так, что так наткнешься на вложенные функции и как-то нужно их пропустить. Ты так и не показал, для чего с таким упорством кидался в меня pl/scope'ом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:22 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
В общем случае я могу поступить с DML выражениями точно так же как с комментариями -- превратить их в пустое место равноценного объема на период подсчета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:25 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufunк счастью END после которого не идет иных символов кроме пробела и перевода строки + ; только от BEGIN'а, так что это достаточно легко обходится. Не уверен, что правильно понял посыл, но ты ошибаешься Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:27 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufun, Я вроде как сказал изначально, что затея бредовая. Потом было указано как получить список процедур (любого или верхнего уровня) - pl scope. Зная где начинанается каждая из них, при определенных условностях достаточно просто найти конец предыдущей и вставить перед ним логирование. Я изначально подумал, что цель вставить логирование в блок exception, но видимо все еще замысловатее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:34 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
n0rd1c.c0ld, согласен, здесь я ошибся. забыл про end <label>; у меня таких мест нет, иначе бы попадало всё, но если бы были, то проблема бы решилась в пару if'ов end case | end loop | end if, что там еще есть... Вообще если бы я решал общую задачу парсинга любого, даже самого извращенного исходника, то я бы не взялся за написание парсера, конечно. Проще и быстрее прикрутить через JAVA Calls что-то типа https://github.com/porcelli/plsql-parser ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:37 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, с первого поста >> После BEGIN'а я вставлю логирующую строку, содержащую в качестве входных данных имя функции и некоторые переменные,взятые из контекста. >> после BEGIN'а до конца не читай @ проблему не понимай @ ответ набирай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:39 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, надеюсь, что ты работаешь в твоем идеальном розовом мире, где ничего "эдакого" писать не надо и не хочется, иначе ж обплеваться можно)) Где проблемы решаются просто мыслью о том, что "где-то там был какой-то пакет который вроде бы умеет это" и где не нужно проверять идеи до конца) лишь бы не оказалось, что энциклопедические знания подвели и пакет задачу не решает, да? неловко может получиться. а мне и так хорошо) была проблема, появилась идея, идея была оппробирована и реализована, задача была выполнена в полном объеме, быстрее, чем копипастить и много надежнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 19:56 |
|
||
|
Парсинг pl/sql
|
|||
|---|---|---|---|
|
#18+
aksufundbms_photoshop, надеюсь, что ты работаешь в твоем идеальном розовом мире, где ничего "эдакого" писать не надо и не хочется, иначе ж обплеваться можно)) Где проблемы решаются просто мыслью о том, что "где-то там был какой-то пакет который вроде бы умеет это" и где не нужно проверять идеи до конца) лишь бы не оказалось, что энциклопедические знания подвели и пакет задачу не решает, да? неловко может получиться. а мне и так хорошо) была проблема, появилась идея, идея была оппробирована и реализована, задача была выполнена в полном объеме, быстрее, чем копипастить и много надежнее.Я предпочитаю все формализировать и минимизировать человеческий фактор. Во-первых когда я писал на PL/SQL, то было строгое правило что каждая программная единица заканчивается end <name>;. Во-вторых были правила к оформлению коментариев и входных параметров. В-третьих весь код форматировался автоматически с едиными настройками бьютифаера/форматтера и т.д. При соблюдении процесса, если код не прошел review он дальше не идет. Всегда остается простантсво для ошибки, но праивльная организация разработки на первом месте, технические костыли только усугубят ситуацию. Возвращаясь к твоей проблеме, при соблюдении стандартов проблема решается тривиально, в общем случае не решается вообще. pl scope позволяет разбить на единицы и автоматизировать процесс при заданных ограничениях, но лучше один раз автоматиазированно отформатировать и потом пройтись ручками + следовать стандарту оформления кода. Можно же пытаться изобретать бесполезные велосипеды. Ты, к сожалению, так верных выводов и не сделал. Хотя если зп платят по числу строк кода, то тебя, конечно можно понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 20:36 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1886886]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 496ms |

| 0 / 0 |
