diff options
Diffstat (limited to 'src/include/pgmagic.h')
| -rw-r--r-- | src/include/pgmagic.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/include/pgmagic.h b/src/include/pgmagic.h new file mode 100644 index 00000000000..456804618c2 --- /dev/null +++ b/src/include/pgmagic.h @@ -0,0 +1,73 @@ +/*------------------------------------------------------------------------- + * + * 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 */ |
