aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-02-13 13:38:05 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2011-02-13 22:54:43 -0500
commite693e97d754ed6812ea115170afeae4bf8797d3f (patch)
treec504e4f71d734f8825f0cff505bdb83bc6dbc1cc
parent27d5d7ab10086d833e3df251951cf63c392b8bca (diff)
downloadpostgresql-e693e97d754ed6812ea115170afeae4bf8797d3f.tar.gz
postgresql-e693e97d754ed6812ea115170afeae4bf8797d3f.zip
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.
-rw-r--r--doc/src/sgml/extend.sgml31
-rw-r--r--src/backend/commands/extension.c18
2 files changed, 41 insertions, 8 deletions
diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml
index 50924a78f0e..6dc42e4ea1b 100644
--- a/doc/src/sgml/extend.sgml
+++ b/doc/src/sgml/extend.sgml
@@ -427,23 +427,38 @@
</varlistentry>
<varlistentry>
- <term><varname>requires</varname> (<type>string</type>)</term>
+ <term><varname>encoding</varname> (<type>string</type>)</term>
<listitem>
<para>
- A list of names of extensions that this extension depends on,
- for example <literal>requires = 'foo, bar'</literal>. Those
- extensions must be installed before this one can be installed.
+ The character set encoding used by the script file(s). This should
+ be specified if the script files contain any non-ASCII characters.
+ Otherwise the files will be assumed to be in the database encoding.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term><varname>encoding</varname> (<type>string</type>)</term>
+ <term><varname>module_pathname</varname> (<type>string</type>)</term>
<listitem>
<para>
- The character set encoding used by the script file(s). This should
- be specified if the script files contain any non-ASCII characters.
- Otherwise the files will be assumed to be in the database encoding.
+ The value of this parameter will be substituted for each occurrence
+ of <literal>MODULE_PATHNAME</> in the script file(s). If it is not
+ set, no substitution is made. Typically, this is set to
+ <literal>$libdir/<replaceable>shared_library_name</></literal> and
+ then <literal>MODULE_PATHNAME</> is used in <command>CREATE
+ FUNCTION</> commands for C-language functions, so that the script
+ files do not need to hard-wire the name of the shared library.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>requires</varname> (<type>string</type>)</term>
+ <listitem>
+ <para>
+ A list of names of extensions that this extension depends on,
+ for example <literal>requires = 'foo, bar'</literal>. Those
+ extensions must be installed before this one can be installed.
</para>
</listitem>
</varlistentry>
diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 0661303fea3..92edcbc3cf2 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);