diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/fmgr.h | 71 | ||||
-rw-r--r-- | src/include/pgmagic.h | 73 |
2 files changed, 65 insertions, 79 deletions
diff --git a/src/include/fmgr.h b/src/include/fmgr.h index 0d6e72594d2..a0749a5fa6b 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/fmgr.h,v 1.43 2006/04/04 19:35:37 tgl Exp $ + * $PostgreSQL: pgsql/src/include/fmgr.h,v 1.44 2006/05/30 21:21:30 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -293,7 +293,7 @@ typedef struct } Pg_finfo_record; /* Expected signature of an info function */ -typedef Pg_finfo_record *(*PGFInfoFunction) (void); +typedef const Pg_finfo_record *(*PGFInfoFunction) (void); /* * Macro to build an info function associated with the given function name. @@ -301,17 +301,76 @@ typedef Pg_finfo_record *(*PGFInfoFunction) (void); * doesn't hurt to add DLLIMPORT in case they don't. */ #define PG_FUNCTION_INFO_V1(funcname) \ -extern DLLIMPORT Pg_finfo_record * CppConcat(pg_finfo_,funcname) (void); \ -Pg_finfo_record * \ +extern DLLIMPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \ +const Pg_finfo_record * \ CppConcat(pg_finfo_,funcname) (void) \ { \ - static Pg_finfo_record my_finfo = { 1 }; \ + static const Pg_finfo_record my_finfo = { 1 }; \ return &my_finfo; \ } \ extern int no_such_variable /*------------------------------------------------------------------------- + * Support for verifying backend compatibility of loaded modules + * + * If a loaded module includes the macro call + * PG_MODULE_MAGIC; + * (put this in only one source file), then we can check for obvious + * incompatibility, such as being compiled for a different major PostgreSQL + * version. + * + * To compile with versions of PostgreSQL that do not support this, + * you may put an #ifdef/#endif test around it. + * + * The specific items included in the magic block are intended to be ones that + * are custom-configurable and especially likely to break dynamically loaded + * modules if they were compiled with other values. Also, the length field + * can be used to detect definition changes. + *------------------------------------------------------------------------- + */ + +/* Definition of the magic block structure */ +typedef struct +{ + int len; /* sizeof(this struct) */ + int version; /* PostgreSQL major version */ + int funcmaxargs; /* FUNC_MAX_ARGS */ + int indexmaxkeys; /* INDEX_MAX_KEYS */ + int namedatalen; /* NAMEDATALEN */ +} Pg_magic_struct; + +/* The actual data block contents */ +#define PG_MODULE_MAGIC_DATA \ +{ \ + sizeof(Pg_magic_struct), \ + PG_VERSION_NUM / 100, \ + FUNC_MAX_ARGS, \ + INDEX_MAX_KEYS, \ + NAMEDATALEN \ +} + +/* + * Declare the module magic function. It needs to be a function as the dlsym + * in the backend is only guaranteed to work on functions, not data + */ +typedef const Pg_magic_struct *(*PGModuleMagicFunction) (void); + +#define PG_MAGIC_FUNCTION_NAME Pg_magic_func +#define PG_MAGIC_FUNCTION_NAME_STRING "Pg_magic_func" + +#define PG_MODULE_MAGIC \ +extern DLLIMPORT const Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \ +const Pg_magic_struct * \ +PG_MAGIC_FUNCTION_NAME(void) \ +{ \ + static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \ + return &Pg_magic_data; \ +} \ +extern int no_such_variable + + +/*------------------------------------------------------------------------- * Support routines and macros for callers of fmgr-compatible functions *------------------------------------------------------------------------- */ @@ -414,7 +473,7 @@ extern bytea *OidSendFunctionCall(Oid functionId, Datum val); /* * Routines in fmgr.c */ -extern Pg_finfo_record *fetch_finfo_record(void *filehandle, char *funcname); +extern const Pg_finfo_record *fetch_finfo_record(void *filehandle, char *funcname); extern void clear_external_function_hash(void *filehandle); extern Oid fmgr_internal_function(const char *proname); extern Oid get_fn_expr_rettype(FmgrInfo *flinfo); diff --git a/src/include/pgmagic.h b/src/include/pgmagic.h deleted file mode 100644 index 456804618c2..00000000000 --- a/src/include/pgmagic.h +++ /dev/null @@ -1,73 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pgmagic.h - * Defines a magic block that can mark a module in a way so show that - * it is compatible with the server it is being loaded into. - * - * This file is intended to be included into modules that wish to load - * themselves into the backend. All they need to do is include this header - * into one of the source files and include the line: - * - * PG_MODULE_MAGIC; - * - * The trailing semi-colon is optional. To work with versions of PostgreSQL - * that do not support this, you may put an #ifdef/endif block around it. - * - * Note, there is space available, particularly in the bitfield part. If it - * turns out that a change has happened within a major release that would - * require all modules to be recompiled, just setting one unused bit there - * will do the trick. - * - * Originally written by Martijn van Oosterhout <kleptog@svana.org> - * - * $PostgreSQL: pgsql/src/include/pgmagic.h,v 1.1 2006/05/30 14:09:32 momjian Exp $ - * - *------------------------------------------------------------------------- - */ - -#ifndef PGMAGIC_H -#define PGMAGIC_H - -#include "c.h" - -/* The main structure in which the magic is stored. the length field is used - * to detect major changes */ - -typedef struct { - int len; - int version; - int magic; -} Pg_magic_struct; - -/* Declare the module magic function. It needs to be a function as the dlsym - * in the backend is only guarenteed to work on functions, not data */ - -typedef Pg_magic_struct *(*PGModuleMagicFunction) (void); - -#define PG_MAGIC_FUNCTION_NAME Pg_magic_func -#define PG_MAGIC_FUNCTION_NAME_STRING "Pg_magic_func" - -#define PG_MODULE_MAGIC \ -extern DLLIMPORT Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \ -Pg_magic_struct * \ -PG_MAGIC_FUNCTION_NAME(void) \ -{ \ - static Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \ - return &Pg_magic_data; \ -} - - /* Common user adjustable constants */ -#define PG_MODULE_MAGIC_CONST \ - ((INDEX_MAX_KEYS << 0) + \ - (FUNC_MAX_ARGS << 8) + \ - (NAMEDATALEN << 16)) - -/* Finally, the actual data block */ -#define PG_MODULE_MAGIC_DATA \ -{ \ - sizeof(Pg_magic_struct), \ - PG_VERSION_NUM / 100, /* Major version of postgres */ \ - PG_MODULE_MAGIC_CONST, /* Constants users can configure */ \ -} - -#endif /* PGMAGIC_H */ |