March 3, 2010

Некоторые полезные функции

Выводит NOTICE с указанным текстом в лог. Используется для мониторинга активности, отслеживания прогресса миграции, и т.д., в общем не в процедурах, где вызовы типа RAISE NOTICE не возможны.

CREATE OR REPLACE FUNCTION raise_notice(text)
RETURNS void AS
$BODY$
BEGIN
RAISE NOTICE '%', $1;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 1;


Если необходимо, например, отличать нормальную обработку от миграционной, можно использовать следующие функции для установки различных флагов. Флаги действуют в рамках сессии.

CREATE OR REPLACE FUNCTION set_flag(i_name text, i_value text)
RETURNS text AS
$BODY$
GD[i_name] = i_value
return GD[i_name]
$BODY$
LANGUAGE 'plpythonu' VOLATILE
COST 10;


CREATE OR REPLACE FUNCTION get_flag(i_name text)
RETURNS text AS
$BODY$
return (i_name in GD) and GD[i_name] or None
$BODY$
LANGUAGE 'plpythonu' VOLATILE
COST 10;


Функция, возвращающая текущий load average сервера БД. Можно использовать, например, для регулировки интенсивности запросов в служебных скриптах, т.е. когда нагрузка большая, то делать запросы менее интенсивно.

CREATE OR REPLACE FUNCTION get_current_la()
RETURNS double precision AS
$BODY$
# Returns current LA or NULL if something wrong
try:
import os

try:
la = float(os.popen('uptime').read().split('load average: ')[1].split(', ')[0])
except:
la = None

return la
except Exception, e:
import traceback
plpy.info(traceback.format_exc())

$BODY$
LANGUAGE 'plpythonu' VOLATILE STRICT SECURITY DEFINER
COST 1;

No comments:

Post a Comment