rewritesupport.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 93 行

C
93
字号
/*------------------------------------------------------------------------- * * rewriteSupport.c * * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.56 2003/08/04 02:40:03 momjian Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/heapam.h"#include "catalog/catname.h"#include "catalog/indexing.h"#include "rewrite/rewriteSupport.h"#include "utils/inval.h"#include "utils/syscache.h"/* * Is there a rule by the given name? */boolIsDefinedRewriteRule(Oid owningRel, const char *ruleName){	return SearchSysCacheExists(RULERELNAME,								ObjectIdGetDatum(owningRel),								PointerGetDatum(ruleName),								0, 0);}/* * SetRelationRuleStatus *		Set the value of the relation's relhasrules field in pg_class; *		if the relation is becoming a view, also adjust its relkind. * * NOTE: caller must be holding an appropriate lock on the relation. * * NOTE: an important side-effect of this operation is that an SI invalidation * message is sent out to all backends --- including me --- causing relcache * entries to be flushed or updated with the new set of rules for the table. * This must happen even if we find that no change is needed in the pg_class * row. */voidSetRelationRuleStatus(Oid relationId, bool relHasRules,					  bool relIsBecomingView){	Relation	relationRelation;	HeapTuple	tuple;	Form_pg_class classForm;	/*	 * Find the tuple to update in pg_class, using syscache for the	 * lookup.	 */	relationRelation = heap_openr(RelationRelationName, RowExclusiveLock);	tuple = SearchSysCacheCopy(RELOID,							   ObjectIdGetDatum(relationId),							   0, 0, 0);	if (!HeapTupleIsValid(tuple))		elog(ERROR, "cache lookup failed for relation %u", relationId);	classForm = (Form_pg_class) GETSTRUCT(tuple);	if (classForm->relhasrules != relHasRules ||		(relIsBecomingView && classForm->relkind != RELKIND_VIEW))	{		/* Do the update */		classForm->relhasrules = relHasRules;		if (relIsBecomingView)			classForm->relkind = RELKIND_VIEW;		simple_heap_update(relationRelation, &tuple->t_self, tuple);		/* Keep the catalog indexes up to date */		CatalogUpdateIndexes(relationRelation, tuple);	}	else	{		/* no need to change tuple, but force relcache rebuild anyway */		CacheInvalidateRelcache(relationId);	}	heap_freetuple(tuple);	heap_close(relationRelation, RowExclusiveLock);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?