пятница, 15 апреля 2016 г.

Быстрый доступ к коду функций при работе в PgAdmin

Когда я анализирую код  в редакторе PgAdmin, часто возникает потребность в просмотре кода какой-либо функции.
Вижу например, вызов функции и мне хочется детально посмотреть, что она делает. В продвинутых редакторах кода, таких как PHPStorm (естесственно для PHP, а не sql)  достаточно кликнуть по наименованию функции и можно будет посмотреть код этой функции в отдельной вкладке.

PgAdmin, к сожалению, такими возможностями не обладает. Раньше, для просмотра кода функции мне приходилось искать  соответствующий файл среди своих исходников в git-репозитории. Если файл не находился по наименованию - приходилось выполнять полнотекстовый поиск с помощью Far. Однако с добавлением удобнейшего запроса в макросы PgAdmin уже не приходится осуществлять такой поиск.

Указанный ниже запрос выдает следующие столбцы:
  • sql_text - команда вызова функции (если понадобится вызвать функцию со своими аргументами)
  • Schema - схема, где находится функция
  • Name - наименование функции
  • Result data type - результирующий тип данных функции
  • Argument data types - входные переменные для функции
  • Function text - полный код функции 
  • Argument data types without defaults - входные аргументы функции без значений по-умолчанию
  • Type - тип функции (agg - агрегатная, window - оконная функция, trigger - триггерная функция, normal - обычная функция)
SELECT
'select ' || n.nspname || '.' || p.proname || 
'(' || pg_catalog.pg_get_function_arguments(p.oid) || ') for update;'
 as sql_text,
n.nspname as "Schema",
  p.proname as "Name",
  pg_catalog.pg_get_function_result(p.oid) as 
"Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) as 
"Argument data types",
  pg_get_functiondef(p.oid) as "Function text",
  pg_get_function_identity_arguments(p.oid) as 
"Argument data types without defaults",
 CASE
  WHEN p.proisagg THEN 'agg'
  WHEN p.proiswindow THEN 'window'
  WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype 
THEN 'trigger'
  ELSE 'normal'
 END as "Type"
FROM pg_catalog.pg_proc p
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE
(p.proname ilike '%' || trim('$SELECTION$') || '%') ORDER BY 1, 2, 4;
Пример работы функции:
После введения данного макроса стало намного проще анализировать код. 
Не нужно искать в исходниках или в дереве PgAdmin текст функции - проще вспомнить ее примерное наименование, написать его, выделить и выполнить макрос.
В появившейся таблице в поле function text достаточно будет скопировать текст и вставить в отдельное окно редактора, чтобы произвести анализ. 
Работа над проектом из-за этого макроса значительно ускорилась.







Каталог блогов Blogolist