diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile index df6da1f0d337d7ce84dc1c88247d0d8cd7558952..c4d3f3c1dcc11a5d3fa87297b60199b5b082d16e 100644 --- a/src/backend/catalog/Makefile +++ b/src/backend/catalog/Makefile @@ -11,7 +11,8 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global OBJS = catalog.o dependency.o heap.o index.o indexing.o namespace.o aclchk.o \ - objectaddress.o pg_aggregate.o pg_collation.o pg_constraint.o pg_conversion.o \ + objectaccess.o objectaddress.o pg_aggregate.o pg_collation.o \ + pg_constraint.o pg_conversion.o \ pg_depend.o pg_enum.o pg_inherits.o pg_largeobject.o pg_namespace.o \ pg_operator.o pg_proc.o pg_range.o pg_db_role_setting.o pg_shdepend.o \ pg_type.o storage.o toasting.o diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 32f05bbabb0fda54ab85f413b99e336c265f39ed..7b8e0246339d4053074d34edb13ea250f1a8d5e1 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -997,14 +997,8 @@ deleteOneObject(const ObjectAddress *object, Relation *depRel, int flags) HeapTuple tup; /* DROP hook of the objects being removed */ - if (object_access_hook) - { - ObjectAccessDrop drop_arg; - - drop_arg.dropflags = flags; - InvokeObjectAccessHook(OAT_DROP, object->classId, object->objectId, - object->objectSubId, &drop_arg); - } + InvokeObjectDropHookArg(object->classId, object->objectId, + object->objectSubId, flags); /* * Close depRel if we are doing a drop concurrently. The object deletion diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 0ecfc78ed044092701df41de37ed6c30f3f1d133..04a927dd0c6f15917c5d38d30392a547bcd886c7 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -1293,15 +1293,7 @@ heap_create_with_catalog(const char *relname, } /* Post creation hook for new relation */ - if (object_access_hook) - { - ObjectAccessPostCreate post_create_args; - - memset(&post_create_args, 0, sizeof(ObjectAccessPostCreate)); - post_create_args.is_internal = is_internal; - (*object_access_hook)(OAT_POST_CREATE, RelationRelationId, - relid, 0, &post_create_args); - } + InvokeObjectPostCreateHookArg(RelationRelationId, relid, 0, is_internal); /* * Store any supplied constraints and defaults. diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 9b339292e4966b50d89dcef4ef8d2c37167f1e7f..33a18030b797797df7b1f2f30706b8ab2ab42886 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -1028,15 +1028,8 @@ index_create(Relation heapRelation, } /* Post creation hook for new index */ - if (object_access_hook) - { - ObjectAccessPostCreate post_create_args; - - memset(&post_create_args, 0, sizeof(ObjectAccessPostCreate)); - post_create_args.is_internal = is_internal; - (*object_access_hook)(OAT_POST_CREATE, RelationRelationId, - indexRelationId, 0, &post_create_args); - } + InvokeObjectPostCreateHookArg(RelationRelationId, + indexRelationId, 0, is_internal); /* * Advance the command counter so that we can see the newly-entered diff --git a/src/backend/catalog/objectaccess.c b/src/backend/catalog/objectaccess.c new file mode 100644 index 0000000000000000000000000000000000000000..09f9db5aaf83f2c0b61c7df6e3ad2ce3dca67d24 --- /dev/null +++ b/src/backend/catalog/objectaccess.c @@ -0,0 +1,63 @@ +/* ------------------------------------------------------------------------- + * + * objectaccess.c + * functions for object_access_hook on various events + * + * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/objectaccess.h" + +/* + * Hook on object accesses. This is intended as infrastructure for security + * and logging plugins. + */ +object_access_hook_type object_access_hook = NULL; + +/* + * RunObjectPostCreateHook + * + * It is entrypoint of OAT_POST_CREATE event + */ +void +RunObjectPostCreateHook(Oid classId, Oid objectId, int subId, + bool is_internal) +{ + ObjectAccessPostCreate pc_arg; + + /* caller should check, but just in case... */ + Assert(object_access_hook != NULL); + + memset(&pc_arg, 0, sizeof(ObjectAccessPostCreate)); + pc_arg.is_internal = is_internal; + + (*object_access_hook)(OAT_POST_CREATE, + classId, objectId, subId, + (void *) &pc_arg); +} + +/* + * RunObjectDropHook + * + * It is entrypoint of OAT_DROP event + */ +void +RunObjectDropHook(Oid classId, Oid objectId, int subId, + int dropflags) +{ + ObjectAccessDrop drop_arg; + + /* caller should check, but just in case... */ + Assert(object_access_hook != NULL); + + memset(&drop_arg, 0, sizeof(ObjectAccessDrop)); + drop_arg.dropflags = dropflags; + + (*object_access_hook)(OAT_DROP, + classId, objectId, subId, + (void *) &drop_arg); +} diff --git a/src/backend/catalog/pg_collation.c b/src/backend/catalog/pg_collation.c index 46d6e27d2dee806f31a94c435c6c77448667cfe4..dd0050267f193d098d5b5f3a1a2eb1eab0edfa28 100644 --- a/src/backend/catalog/pg_collation.c +++ b/src/backend/catalog/pg_collation.c @@ -136,8 +136,7 @@ CollationCreate(const char *collname, Oid collnamespace, recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new collation */ - InvokeObjectAccessHook(OAT_POST_CREATE, - CollationRelationId, oid, 0, NULL); + InvokeObjectPostCreateHook(CollationRelationId, oid, 0); heap_freetuple(tup); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index 7179fa93922ee6ffc712daf0d42a408aaadd9aef..547c7ee00c623e160e708c39105ba539c6efcdbf 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -367,8 +367,7 @@ CreateConstraintEntry(const char *constraintName, } /* Post creation hook for new constraint */ - InvokeObjectAccessHook(OAT_POST_CREATE, - ConstraintRelationId, conOid, 0, NULL); + InvokeObjectPostCreateHook(ConstraintRelationId, conOid, 0); return conOid; } diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c index 75eafd447d7ee90aece614adf8b88bde3253d628..45d8e628085ca0ebd850d07741334ae67069c95d 100644 --- a/src/backend/catalog/pg_conversion.c +++ b/src/backend/catalog/pg_conversion.c @@ -136,8 +136,7 @@ ConversionCreate(const char *conname, Oid connamespace, recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new conversion */ - InvokeObjectAccessHook(OAT_POST_CREATE, ConversionRelationId, - HeapTupleGetOid(tup), 0, NULL); + InvokeObjectPostCreateHook(ConversionRelationId, HeapTupleGetOid(tup), 0); heap_freetuple(tup); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c index 2948c64d455b3ead20873ab430b5c178a3e37688..8be0558511e06e4042d97b349bcd49091f6bed3f 100644 --- a/src/backend/catalog/pg_namespace.c +++ b/src/backend/catalog/pg_namespace.c @@ -96,8 +96,7 @@ NamespaceCreate(const char *nspName, Oid ownerId, bool isTemp) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new schema */ - InvokeObjectAccessHook(OAT_POST_CREATE, - NamespaceRelationId, nspoid, 0, NULL); + InvokeObjectPostCreateHook(NamespaceRelationId, nspoid, 0); return nspoid; } diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 7a9148850e7d7c5c33fad796aa3c9636cb290ca1..f8d6bb0e34b72ce8357ef2b78b250f7ee666cc68 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -275,8 +275,7 @@ OperatorShellMake(const char *operatorName, heap_freetuple(tup); /* Post creation hook for new shell operator */ - InvokeObjectAccessHook(OAT_POST_CREATE, - OperatorRelationId, operatorObjectId, 0, NULL); + InvokeObjectPostCreateHook(OperatorRelationId, operatorObjectId, 0); /* * Make sure the tuple is visible for subsequent lookups/updates. @@ -544,8 +543,7 @@ OperatorCreate(const char *operatorName, makeOperatorDependencies(tup); /* Post creation hook for new operator */ - InvokeObjectAccessHook(OAT_POST_CREATE, - OperatorRelationId, operatorObjectId, 0, NULL); + InvokeObjectPostCreateHook(OperatorRelationId, operatorObjectId, 0); heap_close(pg_operator_desc, RowExclusiveLock); diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index 3570240bf66a9184b5b80f76976df5eed0b36a42..0b70adc479531dbd0d0b8f3aced86bfc7ccf897e 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -661,8 +661,7 @@ ProcedureCreate(const char *procedureName, heap_freetuple(tup); /* Post creation hook for new function */ - InvokeObjectAccessHook(OAT_POST_CREATE, - ProcedureRelationId, retval, 0, NULL); + InvokeObjectPostCreateHook(ProcedureRelationId, retval, 0); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 591714f175b5ffcb078ddcf500a50055ea44c235..b044400d993af128fb0a73e546b3e4bc68dbf692 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -163,8 +163,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId) false); /* Post creation hook for new shell type */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TypeRelationId, typoid, 0, NULL); + InvokeObjectPostCreateHook(TypeRelationId, typoid, 0); /* * clean up and return the type-oid @@ -476,8 +475,7 @@ TypeCreate(Oid newTypeOid, rebuildDeps); /* Post creation hook for new type */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TypeRelationId, typeObjectId, 0, NULL); + InvokeObjectPostCreateHook(TypeRelationId, typeObjectId, 0); /* * finish up diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index e25108192ef198bb2ad2d523132402b3cece54d0..d34a102ee61a2f7f204cb0636941d6639bf2f6c1 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -29,6 +29,7 @@ #include "catalog/pg_aggregate.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" +#include "commands/alter.h" #include "commands/defrem.h" #include "miscadmin.h" #include "parser/parse_func.h" diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 5b06af24a6cfbea7538da47b50db13dac3a39e88..76ef23a1f44ade7f3bbc12162808f048c80546de 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -524,8 +524,7 @@ createdb(const CreatedbStmt *stmt) copyTemplateDependencies(src_dboid, dboid); /* Post creation hook for new database */ - InvokeObjectAccessHook(OAT_POST_CREATE, - DatabaseRelationId, dboid, 0, NULL); + InvokeObjectPostCreateHook(DatabaseRelationId, dboid, 0); /* * Force a checkpoint before starting the copy. This will force dirty @@ -816,14 +815,7 @@ dropdb(const char *dbname, bool missing_ok) dbname); /* DROP hook for the database being removed */ - if (object_access_hook) - { - ObjectAccessDrop drop_arg; - - memset(&drop_arg, 0, sizeof(ObjectAccessDrop)); - InvokeObjectAccessHook(OAT_DROP, - DatabaseRelationId, db_id, 0, &drop_arg); - } + InvokeObjectDropHook(DatabaseRelationId, db_id, 0); /* * Disallow dropping a DB that is marked istemplate. This is just to diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 596178fbda76db5957c15d3b6b1229a840dc5204..2c3b6bf1dfaf68954c296cf58c666bda536a0180 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -310,8 +310,7 @@ insert_event_trigger_tuple(char *trigname, char *eventname, Oid evtOwner, recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL); /* Post creation hook for new operator family */ - InvokeObjectAccessHook(OAT_POST_CREATE, - EventTriggerRelationId, trigoid, 0, NULL); + InvokeObjectPostCreateHook(EventTriggerRelationId, trigoid, 0); /* Close pg_event_trigger. */ heap_close(tgrel, RowExclusiveLock); diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index c02101f95d4bbee214ce4ce7975c77215f555d6c..6b7cb5bc84237a1962e8cb2248c99f3a81af5291 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -1562,8 +1562,7 @@ InsertExtensionTuple(const char *extName, Oid extOwner, recordDependencyOn(&myself, &otherext, DEPENDENCY_NORMAL); } /* Post creation hook for new extension */ - InvokeObjectAccessHook(OAT_POST_CREATE, - ExtensionRelationId, extensionOid, 0, NULL); + InvokeObjectPostCreateHook(ExtensionRelationId, extensionOid, 0); return extensionOid; } diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c index 7700e91c821e185aaaca275b71014be733df9f89..83cdf9e3c51e90154198547394645ef419177aeb 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -599,8 +599,7 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new foreign data wrapper */ - InvokeObjectAccessHook(OAT_POST_CREATE, - ForeignDataWrapperRelationId, fdwId, 0, NULL); + InvokeObjectPostCreateHook(ForeignDataWrapperRelationId, fdwId, 0); heap_close(rel, RowExclusiveLock); @@ -900,8 +899,7 @@ CreateForeignServer(CreateForeignServerStmt *stmt) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new foreign server */ - InvokeObjectAccessHook(OAT_POST_CREATE, - ForeignServerRelationId, srvId, 0, NULL); + InvokeObjectPostCreateHook(ForeignServerRelationId, srvId, 0); heap_close(rel, RowExclusiveLock); @@ -1145,8 +1143,7 @@ CreateUserMapping(CreateUserMappingStmt *stmt) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new user mapping */ - InvokeObjectAccessHook(OAT_POST_CREATE, - UserMappingRelationId, umId, 0, NULL); + InvokeObjectPostCreateHook(UserMappingRelationId, umId, 0); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 7b912332febf503080fee061560a0059e57d4b06..fda379a75df3b995ec3cf8d48f621e0d315d5209 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -1558,8 +1558,7 @@ CreateCast(CreateCastStmt *stmt) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new cast */ - InvokeObjectAccessHook(OAT_POST_CREATE, - CastRelationId, castid, 0, NULL); + InvokeObjectPostCreateHook(CastRelationId, castid, 0); heap_freetuple(tuple); diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 95b9a738fed73bb37d860dcd8b7c6c8e70edc44c..e9563fbfab4bda3af3b44296572b144785fddeb5 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -309,8 +309,7 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new operator family */ - InvokeObjectAccessHook(OAT_POST_CREATE, - OperatorFamilyRelationId, opfamilyoid, 0, NULL); + InvokeObjectPostCreateHook(OperatorFamilyRelationId, opfamilyoid, 0); heap_close(rel, RowExclusiveLock); @@ -710,8 +709,7 @@ DefineOpClass(CreateOpClassStmt *stmt) recordDependencyOnCurrentExtension(&myself, false); /* Post creation hook for new operator class */ - InvokeObjectAccessHook(OAT_POST_CREATE, - OperatorClassRelationId, opclassoid, 0, NULL); + InvokeObjectPostCreateHook(OperatorClassRelationId, opclassoid, 0); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index e6c6d4e5e92fb598f01d503c516c733a11867338..1c98c3226d037096e458390c20eee8ee7d5e02d6 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -429,8 +429,7 @@ create_proc_lang(const char *languageName, bool replace, } /* Post creation hook for new procedural language */ - InvokeObjectAccessHook(OAT_POST_CREATE, - LanguageRelationId, myself.objectId, 0, NULL); + InvokeObjectPostCreateHook(LanguageRelationId, myself.objectId, 0); heap_close(rel, RowExclusiveLock); diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 2a55e02577902ae83ec4ac2654b3d1a8bbcf16f8..47b6233a80d39204a51d45bf5b76b675dc0167f1 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -4514,8 +4514,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, heap_freetuple(reltup); /* Post creation hook for new attribute */ - InvokeObjectAccessHook(OAT_POST_CREATE, - RelationRelationId, myrelid, newattnum, NULL); + InvokeObjectPostCreateHook(RelationRelationId, myrelid, newattnum); heap_close(pgclass, RowExclusiveLock); diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 7cad0cc969d5f9e41564f9f6cbba885e7b701138..dfcc829b85fb04d33b957450fed4c1ab1ac127bf 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -331,8 +331,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) recordDependencyOnOwner(TableSpaceRelationId, tablespaceoid, ownerId); /* Post creation hook for new tablespace */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TableSpaceRelationId, tablespaceoid, 0, NULL); + InvokeObjectPostCreateHook(TableSpaceRelationId, tablespaceoid, 0); create_tablespace_directories(location, tablespaceoid); @@ -439,14 +438,7 @@ DropTableSpace(DropTableSpaceStmt *stmt) tablespacename); /* DROP hook for the tablespace being removed */ - if (object_access_hook) - { - ObjectAccessDrop drop_arg; - - memset(&drop_arg, 0, sizeof(ObjectAccessDrop)); - InvokeObjectAccessHook(OAT_DROP, TableSpaceRelationId, - tablespaceoid, 0, &drop_arg); - } + InvokeObjectDropHook(TableSpaceRelationId, tablespaceoid, 0); /* * Remove the pg_tablespace tuple (this will roll back if we fail below) diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index c0322b7becbffbce62ba935a764a83f1e3b96206..f79cef508c13987c32a3133d87e5c9f750648904 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -742,8 +742,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString, DEPENDENCY_NORMAL); /* Post creation hook for new trigger */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TriggerRelationId, trigoid, 0, NULL); + InvokeObjectPostCreateHook(TriggerRelationId, trigoid, 0); /* Keep lock on target rel until end of xact */ heap_close(rel, NoLock); diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c index 95377ac492d5dcf656c62818dac10646d1118d48..821fdc6b31e60f918fe333b93f0a672663404e22 100644 --- a/src/backend/commands/tsearchcmds.c +++ b/src/backend/commands/tsearchcmds.c @@ -272,8 +272,7 @@ DefineTSParser(List *names, List *parameters) makeParserDependencies(tup); /* Post creation hook for new text search parser */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TSParserRelationId, prsOid, 0, NULL); + InvokeObjectPostCreateHook(TSParserRelationId, prsOid, 0); heap_freetuple(tup); @@ -479,8 +478,7 @@ DefineTSDictionary(List *names, List *parameters) makeDictionaryDependencies(tup); /* Post creation hook for new text search dictionary */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TSDictionaryRelationId, dictOid, 0, NULL); + InvokeObjectPostCreateHook(TSDictionaryRelationId, dictOid, 0); heap_freetuple(tup); @@ -796,8 +794,7 @@ DefineTSTemplate(List *names, List *parameters) makeTSTemplateDependencies(tup); /* Post creation hook for new text search template */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TSTemplateRelationId, tmplOid, 0, NULL); + InvokeObjectPostCreateHook(TSTemplateRelationId, tmplOid, 0); heap_freetuple(tup); @@ -1092,8 +1089,7 @@ DefineTSConfiguration(List *names, List *parameters) makeConfigurationDependencies(tup, false, mapRel); /* Post creation hook for new text search configuration */ - InvokeObjectAccessHook(OAT_POST_CREATE, - TSConfigRelationId, cfgOid, 0, NULL); + InvokeObjectPostCreateHook(TSConfigRelationId, cfgOid, 0); heap_freetuple(tup); diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 5edb59af36b68950da7266cfa683152e106be429..9302416375583ac62d41651f4f150ff85376b64e 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -426,8 +426,7 @@ CreateRole(CreateRoleStmt *stmt) GetUserId(), false); /* Post creation hook for new role */ - InvokeObjectAccessHook(OAT_POST_CREATE, - AuthIdRelationId, roleid, 0, NULL); + InvokeObjectPostCreateHook(AuthIdRelationId, roleid, 0); /* * Close pg_authid, but keep lock till commit. @@ -968,14 +967,7 @@ DropRole(DropRoleStmt *stmt) errmsg("must be superuser to drop superusers"))); /* DROP hook for the role being removed */ - if (object_access_hook) - { - ObjectAccessDrop drop_arg; - - memset(&drop_arg, 0, sizeof(ObjectAccessDrop)); - InvokeObjectAccessHook(OAT_DROP, - AuthIdRelationId, roleid, 0, &drop_arg); - } + InvokeObjectDropHook(AuthIdRelationId, roleid, 0); /* * Lock the role, so nobody can add dependencies to her while we drop diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 896326615753f2344b466eb180080174ddeda31d..0e265db15c5a307058d7ecdc4999f1f4e60acbe8 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -182,8 +182,7 @@ InsertRule(char *rulname, } /* Post creation hook for new rule */ - InvokeObjectAccessHook(OAT_POST_CREATE, - RewriteRelationId, rewriteObjectId, 0, NULL); + InvokeObjectPostCreateHook(RewriteRelationId, rewriteObjectId, 0); heap_close(pg_rewrite_desc, RowExclusiveLock); diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c index 9e4377d5631728d0b4f2e688cd87b79d686921d5..b98110cd99879187d0f84dc108c0f94e30d571f5 100644 --- a/src/backend/storage/large_object/inv_api.c +++ b/src/backend/storage/large_object/inv_api.c @@ -218,8 +218,7 @@ inv_create(Oid lobjId) lobjId_new, GetUserId()); /* Post creation hook for new large object */ - InvokeObjectAccessHook(OAT_POST_CREATE, - LargeObjectRelationId, lobjId_new, 0, NULL); + InvokeObjectPostCreateHook(LargeObjectRelationId, lobjId_new, 0); /* * Advance command counter to make new tuple visible to later operations. diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index f1f8b177f35af3d5d42c73a60be6ce6c85a2f845..9f51929191d5b23d12e13068843117a988df3436 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -18,7 +18,6 @@ */ #include "postgres.h" -#include "catalog/objectaccess.h" #include "libpq/pqcomm.h" #include "miscadmin.h" #include "storage/backendid.h" @@ -126,9 +125,3 @@ int VacuumCostBalance = 0; /* working state for vacuum */ bool VacuumCostActive = false; int GinFuzzySearchLimit = 0; - -/* - * Hook on object accesses. This is intended as infrastructure for security - * and logging plugins. - */ -object_access_hook_type object_access_hook = NULL; diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h index 67c8c1b5e3f8820842c831e07a93a80387180c8d..b9bb1bcd2f5efa2ebd291bbcfd1b9bca69d2254a 100644 --- a/src/include/catalog/objectaccess.h +++ b/src/include/catalog/objectaccess.h @@ -28,6 +28,7 @@ typedef enum ObjectAccessType { OAT_POST_CREATE, OAT_DROP, + OAT_POST_ALTER, } ObjectAccessType; /* @@ -66,11 +67,27 @@ typedef void (*object_access_hook_type) (ObjectAccessType access, extern PGDLLIMPORT object_access_hook_type object_access_hook; -#define InvokeObjectAccessHook(access,classId,objectId,subId,arg) \ +extern void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId, + bool is_internal); +extern void RunObjectDropHook(Oid classId, Oid objectId, int subId, + int dropflags); + +#define InvokeObjectPostCreateHook(classId,objectId,subId) \ + InvokeObjectPostCreateHookArg((classId),(objectId),(subId),false) +#define InvokeObjectPostCreateHookArg(classId,objectId,subId,is_internal) \ + do { \ + if (object_access_hook) \ + RunObjectPostCreateHook((classId),(objectId),(subId), \ + (is_internal)); \ + } while(0) + +#define InvokeObjectDropHook(classId,objectId,subId) \ + InvokeObjectDropHookArg((classId),(objectId),(subId),0) +#define InvokeObjectDropHookArg(classId,objectId,subId,dropflags) \ do { \ if (object_access_hook) \ - (*object_access_hook)((access),(classId), \ - (objectId),(subId),(arg)); \ + RunObjectDropHook((classId),(objectId),(subId), \ + (dropflags)); \ } while(0) #endif /* OBJECTACCESS_H */