*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.154 2006/03/05 15:58:46 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.158 2006/08/16 04:32:48 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#endif
#include "catalog/pg_authid.h"
-#include "libpq/libpq-be.h"
#include "miscadmin.h"
#include "postmaster/autovacuum.h"
#include "storage/fd.h"
#include "storage/procarray.h"
#include "utils/builtins.h"
#include "utils/guc.h"
-#include "utils/lsyscache.h"
#include "utils/syscache.h"
*-------------------------------------------------------------------------
*/
-typedef void (*func_ptr) ();
+/*
+ * GUC variables: lists of library names to be preloaded at postmaster
+ * start and at backend start
+ */
+char *shared_preload_libraries_string = NULL;
+char *local_preload_libraries_string = NULL;
/*
- * process any libraries that should be preloaded and
- * optionally pre-initialized
+ * load the shared libraries listed in 'libraries'
+ *
+ * 'gucname': name of GUC variable, for error reports
+ * 'restricted': if true, force libraries to be in $libdir/plugins/
*/
-void
-process_preload_libraries(char *preload_libraries_string)
+static void
+load_libraries(const char *libraries, const char *gucname, bool restricted)
{
char *rawstring;
List *elemlist;
ListCell *l;
- if (preload_libraries_string == NULL)
- return;
+ if (libraries == NULL || libraries[0] == '\0')
+ return; /* nothing to do */
/* Need a modifiable copy of string */
- rawstring = pstrdup(preload_libraries_string);
+ rawstring = pstrdup(libraries);
/* Parse string into list of identifiers */
if (!SplitIdentifierString(rawstring, ',', &elemlist))
list_free(elemlist);
ereport(LOG,
(errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("invalid list syntax for parameter \"preload_libraries\"")));
+ errmsg("invalid list syntax in parameter \"%s\"",
+ gucname)));
return;
}
foreach(l, elemlist)
{
char *tok = (char *) lfirst(l);
- char *sep = strstr(tok, ":");
- char *filename = NULL;
- char *funcname = NULL;
- func_ptr initfunc;
-
- if (sep)
- {
- /*
- * a colon separator implies there is an initialization function
- * that we need to run in addition to loading the library
- */
- size_t filename_len = sep - tok;
- size_t funcname_len = strlen(tok) - filename_len - 1;
-
- filename = (char *) palloc(filename_len + 1);
- memcpy(filename, tok, filename_len);
- filename[filename_len] = '\0';
-
- funcname = (char *) palloc(funcname_len + 1);
- strcpy(funcname, sep + 1);
- }
- else
- {
- /*
- * no separator -- just load the library
- */
- filename = pstrdup(tok);
- funcname = NULL;
- }
+ char *filename;
+ filename = pstrdup(tok);
canonicalize_path(filename);
- initfunc = (func_ptr) load_external_function(filename, funcname,
- true, NULL);
- if (initfunc)
- (*initfunc) ();
-
- if (funcname)
- ereport(LOG,
- (errmsg("preloaded library \"%s\" with initialization function \"%s\"",
- filename, funcname)));
- else
- ereport(LOG,
- (errmsg("preloaded library \"%s\"",
- filename)));
+ /* If restricting, insert $libdir/plugins if not mentioned already */
+ if (restricted && first_dir_separator(filename) == NULL)
+ {
+ char *expanded;
+ expanded = palloc(strlen("$libdir/plugins/") + strlen(filename) + 1);
+ strcpy(expanded, "$libdir/plugins/");
+ strcat(expanded, filename);
+ pfree(filename);
+ filename = expanded;
+ }
+ load_file(filename, restricted);
+ ereport(LOG,
+ (errmsg("loaded library \"%s\"", filename)));
pfree(filename);
- if (funcname)
- pfree(funcname);
}
pfree(rawstring);
list_free(elemlist);
}
+
+/*
+ * process any libraries that should be preloaded at postmaster start
+ */
+void
+process_shared_preload_libraries(void)
+{
+ load_libraries(shared_preload_libraries_string,
+ "shared_preload_libraries",
+ false);
+}
+
+/*
+ * process any libraries that should be preloaded at backend start
+ */
+void
+process_local_preload_libraries(void)
+{
+ load_libraries(local_preload_libraries_string,
+ "local_preload_libraries",
+ true);
+}