From e693e97d754ed6812ea115170afeae4bf8797d3f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 13 Feb 2011 13:38:05 -0500 Subject: [PATCH] Support replacing MODULE_PATHNAME during extension script file execution. This avoids the need to find a way to make PGXS' .sql.in-to-.sql rule insert the right thing. We'll just deprecate use of that hack for extensions. --- doc/src/sgml/extend.sgml | 37 ++++++++++++++++++++++---------- src/backend/commands/extension.c | 18 ++++++++++++++++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index 50924a78f0..6dc42e4ea1 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -426,17 +426,6 @@ - - requires (string) - - - A list of names of extensions that this extension depends on, - for example requires = 'foo, bar'. Those - extensions must be installed before this one can be installed. - - - - encoding (string) @@ -448,6 +437,32 @@ + + module_pathname (string) + + + The value of this parameter will be substituted for each occurrence + of MODULE_PATHNAME in the script file(s). If it is not + set, no substitution is made. Typically, this is set to + $libdir/shared_library_name and + then MODULE_PATHNAME is used in CREATE + FUNCTION commands for C-language functions, so that the script + files do not need to hard-wire the name of the shared library. + + + + + + requires (string) + + + A list of names of extensions that this extension depends on, + for example requires = 'foo, bar'. Those + extensions must be installed before this one can be installed. + + + + relocatable (boolean) diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 0661303fea..92edcbc3cf 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -65,6 +65,7 @@ typedef struct ExtensionControlFile char *name; /* name of the extension */ char *directory; /* directory for script files */ char *default_version; /* default install target version, if any */ + char *module_pathname; /* string to substitute for MODULE_PATHNAME */ char *comment; /* comment, if any */ char *schema; /* target schema (allowed if !relocatable) */ bool relocatable; /* is ALTER EXTENSION SET SCHEMA supported? */ @@ -493,6 +494,10 @@ parse_extension_control_file(ExtensionControlFile *control, control->default_version = pstrdup(item->value); } + else if (strcmp(item->name, "module_pathname") == 0) + { + control->module_pathname = pstrdup(item->value); + } else if (strcmp(item->name, "comment") == 0) { control->comment = pstrdup(item->value); @@ -836,7 +841,20 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, CStringGetTextDatum(sql), CStringGetTextDatum("@extschema@"), CStringGetTextDatum(qSchemaName)))); + } + /* + * If module_pathname was set in the control file, substitute its + * value for occurrences of MODULE_PATHNAME. + */ + if (control->module_pathname) + { + sql = text_to_cstring( + DatumGetTextPP( + DirectFunctionCall3(replace_text, + CStringGetTextDatum(sql), + CStringGetTextDatum("MODULE_PATHNAME"), + CStringGetTextDatum(control->module_pathname)))); } execute_sql_string(sql, filename);