Commit cc1ed40d authored by Robert Haas's avatar Robert Haas

Object access hook framework, with post-creation hook.

After a SQL object is created, we provide an opportunity for security
or logging plugins to get control; for example, a security label provider
could use this to assign an initial security label to newly created
objects.  The basic infrastructure is (hopefully) reusable for other types
of events that might require similar treatment.

KaiGai Kohei, with minor adjustments.
parent d3c12654
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "catalog/index.h" #include "catalog/index.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_attrdef.h" #include "catalog/pg_attrdef.h"
#include "catalog/pg_constraint.h" #include "catalog/pg_constraint.h"
#include "catalog/pg_inherits.h" #include "catalog/pg_inherits.h"
...@@ -1188,6 +1189,9 @@ heap_create_with_catalog(const char *relname, ...@@ -1188,6 +1189,9 @@ heap_create_with_catalog(const char *relname,
} }
} }
/* Post creation hook for new relation */
InvokeObjectAccessHook(OAT_POST_CREATE, RelationRelationId, relid, 0);
/* /*
* Store any supplied constraints and defaults. * Store any supplied constraints and defaults.
* *
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "access/heapam.h" #include "access/heapam.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_constraint.h" #include "catalog/pg_constraint.h"
#include "catalog/pg_operator.h" #include "catalog/pg_operator.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
...@@ -360,6 +361,9 @@ CreateConstraintEntry(const char *constraintName, ...@@ -360,6 +361,9 @@ CreateConstraintEntry(const char *constraintName,
DEPENDENCY_NORMAL); DEPENDENCY_NORMAL);
} }
/* Post creation hook for new constraint */
InvokeObjectAccessHook(OAT_POST_CREATE, ConstraintRelationId, conOid, 0);
return conOid; return conOid;
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "access/sysattr.h" #include "access/sysattr.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_conversion.h" #include "catalog/pg_conversion.h"
#include "catalog/pg_conversion_fn.h" #include "catalog/pg_conversion_fn.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
...@@ -131,6 +132,10 @@ ConversionCreate(const char *conname, Oid connamespace, ...@@ -131,6 +132,10 @@ ConversionCreate(const char *conname, Oid connamespace,
recordDependencyOnOwner(ConversionRelationId, HeapTupleGetOid(tup), recordDependencyOnOwner(ConversionRelationId, HeapTupleGetOid(tup),
conowner); conowner);
/* Post creation hook for new conversion */
InvokeObjectAccessHook(OAT_POST_CREATE,
ConversionRelationId, HeapTupleGetOid(tup), 0);
heap_freetuple(tup); heap_freetuple(tup);
heap_close(rel, RowExclusiveLock); heap_close(rel, RowExclusiveLock);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "access/heapam.h" #include "access/heapam.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/rel.h" #include "utils/rel.h"
...@@ -75,5 +76,8 @@ NamespaceCreate(const char *nspName, Oid ownerId) ...@@ -75,5 +76,8 @@ NamespaceCreate(const char *nspName, Oid ownerId)
/* Record dependency on owner */ /* Record dependency on owner */
recordDependencyOnOwner(NamespaceRelationId, nspoid, ownerId); recordDependencyOnOwner(NamespaceRelationId, nspoid, ownerId);
/* Post creation hook for new schema */
InvokeObjectAccessHook(OAT_POST_CREATE, NamespaceRelationId, nspoid, 0);
return nspoid; return nspoid;
} }
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "catalog/pg_operator.h" #include "catalog/pg_operator.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
...@@ -273,6 +274,10 @@ OperatorShellMake(const char *operatorName, ...@@ -273,6 +274,10 @@ OperatorShellMake(const char *operatorName,
heap_freetuple(tup); heap_freetuple(tup);
/* Post creation hook for new shell operator */
InvokeObjectAccessHook(OAT_POST_CREATE,
OperatorRelationId, operatorObjectId, 0);
/* /*
* Make sure the tuple is visible for subsequent lookups/updates. * Make sure the tuple is visible for subsequent lookups/updates.
*/ */
...@@ -539,6 +544,10 @@ OperatorCreate(const char *operatorName, ...@@ -539,6 +544,10 @@ OperatorCreate(const char *operatorName,
/* Add dependencies for the entry */ /* Add dependencies for the entry */
makeOperatorDependencies(tup); makeOperatorDependencies(tup);
/* Post creation hook for new operator */
InvokeObjectAccessHook(OAT_POST_CREATE,
OperatorRelationId, operatorObjectId, 0);
heap_close(pg_operator_desc, RowExclusiveLock); heap_close(pg_operator_desc, RowExclusiveLock);
/* /*
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "access/xact.h" #include "access/xact.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_language.h" #include "catalog/pg_language.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
...@@ -616,6 +617,9 @@ ProcedureCreate(const char *procedureName, ...@@ -616,6 +617,9 @@ ProcedureCreate(const char *procedureName,
heap_freetuple(tup); heap_freetuple(tup);
/* Post creation hook for new function */
InvokeObjectAccessHook(OAT_POST_CREATE, ProcedureRelationId, retval, 0);
heap_close(rel, RowExclusiveLock); heap_close(rel, RowExclusiveLock);
/* Verify function body */ /* Verify function body */
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "access/xact.h" #include "access/xact.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
...@@ -155,6 +156,9 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId) ...@@ -155,6 +156,9 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
NULL, NULL,
false); false);
/* Post creation hook for new shell type */
InvokeObjectAccessHook(OAT_POST_CREATE, TypeRelationId, typoid, 0);
/* /*
* clean up and return the type-oid * clean up and return the type-oid
*/ */
...@@ -455,6 +459,9 @@ TypeCreate(Oid newTypeOid, ...@@ -455,6 +459,9 @@ TypeCreate(Oid newTypeOid,
NULL), NULL),
rebuildDeps); rebuildDeps);
/* Post creation hook for new type */
InvokeObjectAccessHook(OAT_POST_CREATE, TypeRelationId, typeObjectId, 0);
/* /*
* finish up * finish up
*/ */
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_authid.h" #include "catalog/pg_authid.h"
#include "catalog/pg_database.h" #include "catalog/pg_database.h"
#include "catalog/pg_db_role_setting.h" #include "catalog/pg_db_role_setting.h"
...@@ -572,6 +573,9 @@ createdb(const CreatedbStmt *stmt) ...@@ -572,6 +573,9 @@ createdb(const CreatedbStmt *stmt)
/* Create pg_shdepend entries for objects within database */ /* Create pg_shdepend entries for objects within database */
copyTemplateDependencies(src_dboid, dboid); copyTemplateDependencies(src_dboid, dboid);
/* Post creation hook for new database */
InvokeObjectAccessHook(OAT_POST_CREATE, DatabaseRelationId, dboid, 0);
/* /*
* Force a checkpoint before starting the copy. This will force dirty * Force a checkpoint before starting the copy. This will force dirty
* buffers out to disk, to ensure source database is up-to-date on disk * buffers out to disk, to ensure source database is up-to-date on disk
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_foreign_data_wrapper.h" #include "catalog/pg_foreign_data_wrapper.h"
#include "catalog/pg_foreign_server.h" #include "catalog/pg_foreign_server.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
...@@ -415,6 +416,10 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt) ...@@ -415,6 +416,10 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt)
recordDependencyOnOwner(ForeignDataWrapperRelationId, fdwId, ownerId); recordDependencyOnOwner(ForeignDataWrapperRelationId, fdwId, ownerId);
/* Post creation hook for new foreign data wrapper */
InvokeObjectAccessHook(OAT_POST_CREATE,
ForeignDataWrapperRelationId, fdwId, 0);
heap_close(rel, NoLock); heap_close(rel, NoLock);
} }
...@@ -696,6 +701,9 @@ CreateForeignServer(CreateForeignServerStmt *stmt) ...@@ -696,6 +701,9 @@ CreateForeignServer(CreateForeignServerStmt *stmt)
recordDependencyOnOwner(ForeignServerRelationId, srvId, ownerId); recordDependencyOnOwner(ForeignServerRelationId, srvId, ownerId);
/* Post creation hook for new foreign server */
InvokeObjectAccessHook(OAT_POST_CREATE, ForeignServerRelationId, srvId, 0);
heap_close(rel, NoLock); heap_close(rel, NoLock);
} }
...@@ -967,6 +975,9 @@ CreateUserMapping(CreateUserMappingStmt *stmt) ...@@ -967,6 +975,9 @@ CreateUserMapping(CreateUserMappingStmt *stmt)
/* Record the mapped user dependency */ /* Record the mapped user dependency */
recordDependencyOnOwner(UserMappingRelationId, umId, useId); recordDependencyOnOwner(UserMappingRelationId, umId, useId);
/* Post creation hook for new user mapping */
InvokeObjectAccessHook(OAT_POST_CREATE, UserMappingRelationId, umId, 0);
heap_close(rel, NoLock); heap_close(rel, NoLock);
} }
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "access/sysattr.h" #include "access/sysattr.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_aggregate.h" #include "catalog/pg_aggregate.h"
#include "catalog/pg_cast.h" #include "catalog/pg_cast.h"
#include "catalog/pg_language.h" #include "catalog/pg_language.h"
...@@ -1761,6 +1762,10 @@ CreateCast(CreateCastStmt *stmt) ...@@ -1761,6 +1762,10 @@ CreateCast(CreateCastStmt *stmt)
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL); recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
} }
/* Post creation hook for new cast */
InvokeObjectAccessHook(OAT_POST_CREATE,
CastRelationId, myself.objectId, 0);
heap_freetuple(tuple); heap_freetuple(tuple);
heap_close(relation, RowExclusiveLock); heap_close(relation, RowExclusiveLock);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "access/sysattr.h" #include "access/sysattr.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_amop.h" #include "catalog/pg_amop.h"
#include "catalog/pg_amproc.h" #include "catalog/pg_amproc.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
...@@ -307,6 +308,10 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid) ...@@ -307,6 +308,10 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid)
/* dependency on owner */ /* dependency on owner */
recordDependencyOnOwner(OperatorFamilyRelationId, opfamilyoid, GetUserId()); recordDependencyOnOwner(OperatorFamilyRelationId, opfamilyoid, GetUserId());
/* Post creation hook for new operator family */
InvokeObjectAccessHook(OAT_POST_CREATE,
OperatorFamilyRelationId, opfamilyoid, 0);
heap_close(rel, RowExclusiveLock); heap_close(rel, RowExclusiveLock);
return opfamilyoid; return opfamilyoid;
...@@ -703,6 +708,10 @@ DefineOpClass(CreateOpClassStmt *stmt) ...@@ -703,6 +708,10 @@ DefineOpClass(CreateOpClassStmt *stmt)
/* dependency on owner */ /* dependency on owner */
recordDependencyOnOwner(OperatorClassRelationId, opclassoid, GetUserId()); recordDependencyOnOwner(OperatorClassRelationId, opclassoid, GetUserId());
/* Post creation hook for new operator class */
InvokeObjectAccessHook(OAT_POST_CREATE,
OperatorClassRelationId, opclassoid, 0);
heap_close(rel, RowExclusiveLock); heap_close(rel, RowExclusiveLock);
} }
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "access/heapam.h" #include "access/heapam.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_language.h" #include "catalog/pg_language.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "catalog/pg_pltemplate.h" #include "catalog/pg_pltemplate.h"
...@@ -425,6 +426,10 @@ create_proc_lang(const char *languageName, bool replace, ...@@ -425,6 +426,10 @@ create_proc_lang(const char *languageName, bool replace,
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL); recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
} }
/* Post creation hook for new procedural language */
InvokeObjectAccessHook(OAT_POST_CREATE,
LanguageRelationId, myself.objectId, 0);
heap_close(rel, RowExclusiveLock); heap_close(rel, RowExclusiveLock);
} }
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "catalog/index.h" #include "catalog/index.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_constraint.h" #include "catalog/pg_constraint.h"
#include "catalog/pg_depend.h" #include "catalog/pg_depend.h"
#include "catalog/pg_inherits.h" #include "catalog/pg_inherits.h"
...@@ -4080,6 +4081,10 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel, ...@@ -4080,6 +4081,10 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
heap_freetuple(reltup); heap_freetuple(reltup);
/* Post creation hook for new attribute */
InvokeObjectAccessHook(OAT_POST_CREATE,
RelationRelationId, myrelid, newattnum);
heap_close(pgclass, RowExclusiveLock); heap_close(pgclass, RowExclusiveLock);
/* Make the attribute's catalog entry visible */ /* Make the attribute's catalog entry visible */
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_tablespace.h" #include "catalog/pg_tablespace.h"
#include "commands/comment.h" #include "commands/comment.h"
#include "commands/defrem.h" #include "commands/defrem.h"
...@@ -333,6 +334,10 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) ...@@ -333,6 +334,10 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
/* Record dependency on owner */ /* Record dependency on owner */
recordDependencyOnOwner(TableSpaceRelationId, tablespaceoid, ownerId); recordDependencyOnOwner(TableSpaceRelationId, tablespaceoid, ownerId);
/* Post creation hook for new tablespace */
InvokeObjectAccessHook(OAT_POST_CREATE,
TableSpaceRelationId, tablespaceoid, 0);
create_tablespace_directories(location, tablespaceoid); create_tablespace_directories(location, tablespaceoid);
/* Record the filesystem change in XLOG */ /* Record the filesystem change in XLOG */
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_constraint.h" #include "catalog/pg_constraint.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
#include "catalog/pg_trigger.h" #include "catalog/pg_trigger.h"
...@@ -735,6 +736,10 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString, ...@@ -735,6 +736,10 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
recordDependencyOnExpr(&myself, whenClause, whenRtable, recordDependencyOnExpr(&myself, whenClause, whenRtable,
DEPENDENCY_NORMAL); DEPENDENCY_NORMAL);
/* Post creation hook for new trigger */
InvokeObjectAccessHook(OAT_POST_CREATE,
TriggerRelationId, trigoid, 0);
/* Keep lock on target rel until end of xact */ /* Keep lock on target rel until end of xact */
heap_close(rel, NoLock); heap_close(rel, NoLock);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "catalog/pg_proc.h" #include "catalog/pg_proc.h"
#include "catalog/pg_ts_config.h" #include "catalog/pg_ts_config.h"
...@@ -263,6 +264,9 @@ DefineTSParser(List *names, List *parameters) ...@@ -263,6 +264,9 @@ DefineTSParser(List *names, List *parameters)
makeParserDependencies(tup); makeParserDependencies(tup);
/* Post creation hook for new text search parser */
InvokeObjectAccessHook(OAT_POST_CREATE, TSParserRelationId, prsOid, 0);
heap_freetuple(tup); heap_freetuple(tup);
heap_close(prsRel, RowExclusiveLock); heap_close(prsRel, RowExclusiveLock);
...@@ -563,6 +567,10 @@ DefineTSDictionary(List *names, List *parameters) ...@@ -563,6 +567,10 @@ DefineTSDictionary(List *names, List *parameters)
makeDictionaryDependencies(tup); makeDictionaryDependencies(tup);
/* Post creation hook for new text search dictionary */
InvokeObjectAccessHook(OAT_POST_CREATE,
TSDictionaryRelationId, dictOid, 0);
heap_freetuple(tup); heap_freetuple(tup);
heap_close(dictRel, RowExclusiveLock); heap_close(dictRel, RowExclusiveLock);
...@@ -1050,6 +1058,9 @@ DefineTSTemplate(List *names, List *parameters) ...@@ -1050,6 +1058,9 @@ DefineTSTemplate(List *names, List *parameters)
makeTSTemplateDependencies(tup); makeTSTemplateDependencies(tup);
/* Post creation hook for new text search template */
InvokeObjectAccessHook(OAT_POST_CREATE, TSTemplateRelationId, dictOid, 0);
heap_freetuple(tup); heap_freetuple(tup);
heap_close(tmplRel, RowExclusiveLock); heap_close(tmplRel, RowExclusiveLock);
...@@ -1440,6 +1451,9 @@ DefineTSConfiguration(List *names, List *parameters) ...@@ -1440,6 +1451,9 @@ DefineTSConfiguration(List *names, List *parameters)
makeConfigurationDependencies(tup, false, mapRel); makeConfigurationDependencies(tup, false, mapRel);
/* Post creation hook for new text search configuration */
InvokeObjectAccessHook(OAT_POST_CREATE, TSConfigRelationId, cfgOid, 0);
heap_freetuple(tup); heap_freetuple(tup);
if (mapRel) if (mapRel)
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "access/xact.h" #include "access/xact.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_auth_members.h" #include "catalog/pg_auth_members.h"
#include "catalog/pg_authid.h" #include "catalog/pg_authid.h"
#include "catalog/pg_database.h" #include "catalog/pg_database.h"
...@@ -402,6 +403,9 @@ CreateRole(CreateRoleStmt *stmt) ...@@ -402,6 +403,9 @@ CreateRole(CreateRoleStmt *stmt)
rolemembers, roleNamesToIds(rolemembers), rolemembers, roleNamesToIds(rolemembers),
GetUserId(), false); GetUserId(), false);
/* Post creation hook for new role */
InvokeObjectAccessHook(OAT_POST_CREATE, AuthIdRelationId, roleid, 0);
/* /*
* Close pg_authid, but keep lock till commit. * Close pg_authid, but keep lock till commit.
*/ */
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/namespace.h" #include "catalog/namespace.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_rewrite.h" #include "catalog/pg_rewrite.h"
#include "catalog/storage.h" #include "catalog/storage.h"
#include "miscadmin.h" #include "miscadmin.h"
...@@ -177,6 +178,10 @@ InsertRule(char *rulname, ...@@ -177,6 +178,10 @@ InsertRule(char *rulname,
DEPENDENCY_NORMAL); DEPENDENCY_NORMAL);
} }
/* Post creation hook for new rule */
InvokeObjectAccessHook(OAT_POST_CREATE,
RewriteRelationId, rewriteObjectId, 0);
heap_close(pg_rewrite_desc, RowExclusiveLock); heap_close(pg_rewrite_desc, RowExclusiveLock);
return rewriteObjectId; return rewriteObjectId;
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/dependency.h" #include "catalog/dependency.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h"
#include "catalog/pg_largeobject.h" #include "catalog/pg_largeobject.h"
#include "catalog/pg_largeobject_metadata.h" #include "catalog/pg_largeobject_metadata.h"
#include "commands/comment.h" #include "commands/comment.h"
...@@ -218,6 +219,10 @@ inv_create(Oid lobjId) ...@@ -218,6 +219,10 @@ inv_create(Oid lobjId)
recordDependencyOnOwner(LargeObjectRelationId, recordDependencyOnOwner(LargeObjectRelationId,
lobjId_new, GetUserId()); lobjId_new, GetUserId());
/* Post creation hook for new large object */
InvokeObjectAccessHook(OAT_POST_CREATE,
LargeObjectRelationId, lobjId_new, 0);
/* /*
* Advance command counter to make new tuple visible to later operations. * Advance command counter to make new tuple visible to later operations.
*/ */
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "catalog/objectaccess.h"
#include "libpq/pqcomm.h" #include "libpq/pqcomm.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "storage/backendid.h" #include "storage/backendid.h"
...@@ -117,3 +118,9 @@ int VacuumCostBalance = 0; /* working state for vacuum */ ...@@ -117,3 +118,9 @@ int VacuumCostBalance = 0; /* working state for vacuum */
bool VacuumCostActive = false; bool VacuumCostActive = false;
int GinFuzzySearchLimit = 0; int GinFuzzySearchLimit = 0;
/*
* Hook on object accesses. This is intended as infrastructure for security
* and logging plugins.
*/
PGDLLIMPORT object_access_hook_type object_access_hook = NULL;
/*
* objectaccess.h
*
* Object access hooks.
*
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*/
#ifndef OBJECTACCESS_H
#define OBJECTACCESS_H
/*
* Object access hooks are intended to be called just before or just after
* performing certain actions on a SQL object. This is intended as
* infrastructure for security or logging pluggins.
*
* OAT_POST_CREATE should be invoked just after the the object is created.
* Typically, this is done after inserting the primary catalog records and
* associated dependencies.
*
* Other types may be added in the future.
*/
typedef enum ObjectAccessType
{
OAT_POST_CREATE,
} ObjectAccessType;
/*
* Hook, and a macro to invoke it.
*/
typedef void (*object_access_hook_type)(ObjectAccessType access,
Oid classId,
Oid objectId,
int subId);
extern PGDLLIMPORT object_access_hook_type object_access_hook;
#define InvokeObjectAccessHook(access,classId,objectId,subId) \
do { \
if (object_access_hook) \
(*object_access_hook)((access),(classId),(objectId),(subId)); \
} while(0)
#endif /* OBJECTACCESS_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment