@imqueue/pg-cache
Version:
PostgreSQL managed cache on Redis for @imqueue-based service methods
76 lines (69 loc) • 2.35 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.PG_CACHE_TRIGGER = exports.PG_CACHE_DEBUG = exports.DEFAULT_CACHE_TTL = void 0;
exports.setInfo = setInfo;
exports.setError = setError;
exports.fetchError = fetchError;
exports.initError = initError;
exports.DEFAULT_CACHE_TTL = 86400000; // 24 hrs in milliseconds
exports.PG_CACHE_DEBUG = !!+(process.env.PG_CACHE_DEBUG || 0);
exports.PG_CACHE_TRIGGER = `CREATE FUNCTION post_change_notify_trigger()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
rec RECORD;
payload TEXT;
payload_items TEXT[];
column_names TEXT[];
column_name TEXT;
column_value TEXT;
channel CHARACTER VARYING(255);
BEGIN
channel := TG_TABLE_NAME;
CASE TG_OP
WHEN 'INSERT', 'UPDATE' THEN rec := NEW;
WHEN 'DELETE' THEN rec := OLD;
ELSE RAISE EXCEPTION 'NOTIFY: Invalid operation "%"!',
TG_OP;
END CASE;
SELECT array_agg("c"."column_name"::TEXT)
INTO column_names
FROM "information_schema"."columns" AS "c"
WHERE "c"."table_name" = TG_TABLE_NAME;
FOREACH column_name IN ARRAY column_names
LOOP
EXECUTE FORMAT('SELECT $1.%I::TEXT', column_name)
INTO column_value
USING rec;
payload_items := ARRAY_CAT(
payload_items,
ARRAY [column_name, column_value]
);
END LOOP;
payload := json_build_object(
'timestamp', CURRENT_TIMESTAMP,
'operation', TG_OP,
'schema', TG_TABLE_SCHEMA,
'table', TG_TABLE_NAME,
'record', TO_JSON(JSON_OBJECT(payload_items))
);
PERFORM PG_NOTIFY(channel, payload);
RETURN rec;
END;
$$;
`;
function setInfo(logger, res, key, decorator) {
exports.PG_CACHE_DEBUG && logger.info(`PgCache:${decorator.name}: cache key '${key}' saved!`);
return res;
}
function setError(logger, err, key, decorator) {
logger.warn(`PgCache:${decorator.name}: saving cache key '${key}' error:`, err);
}
function fetchError(logger, err, key, decorator) {
logger.warn(`PgCache:${decorator.name}: fetching cache key '${key}' error:`, err);
}
function initError(logger, className, methodName, decorator) {
logger.warn(`PgCache:${decorator.name}: cache is not initialized on ${className}, called in ${methodName}`);
}
//# sourceMappingURL=env.js.map
;