--- /dev/null
+# = Type: postgresql::server::schema
+#
+# Create a new schema. See README.md for more details.
+#
+# == Requires:
+#
+# The database must exist and the PostgreSQL user should have enough privileges
+#
+# == Sample Usage:
+#
+# postgresql::server::schema {'private':
+# db => 'template1',
+# }
+#
+define postgresql::server::schema(
+ $db = $postgresql::server::default_database,
+ $owner = undef,
+ $schema = $title,
+ $connect_settings = $postgresql::server::default_connect_settings,
+) {
+ $user = $postgresql::server::user
+ $group = $postgresql::server::group
+ $psql_path = $postgresql::server::psql_path
+ $version = $postgresql::server::_version
+ $module_workdir = $postgresql::server::module_workdir
+
+ Postgresql::Server::Db <| dbname == $db |> -> Postgresql::Server::Schema[$name]
+
+ # If the connection settings do not contain a port, then use the local server port
+ if $connect_settings != undef and has_key( $connect_settings, 'PGPORT') {
+ $port = undef
+ } else {
+ $port = $postgresql::server::port
+ }
+
+ Postgresql_psql {
+ db => $db,
+ psql_user => $user,
+ psql_group => $group,
+ psql_path => $psql_path,
+ port => $port,
+ cwd => $module_workdir,
+ connect_settings => $connect_settings,
+ }
+
+ postgresql_psql { "${db}: CREATE SCHEMA \"${schema}\"":
+ command => "CREATE SCHEMA \"${schema}\"",
+ unless => "SELECT 1 FROM pg_namespace WHERE nspname = '${schema}'",
+ require => Class['postgresql::server'],
+ }
+
+ if $owner {
+ postgresql_psql { "${db}: ALTER SCHEMA \"${schema}\" OWNER TO \"${owner}\"":
+ command => "ALTER SCHEMA \"${schema}\" OWNER TO ${owner}",
+ unless => "SELECT 1 FROM pg_namespace JOIN pg_roles rol ON nspowner = rol.oid WHERE nspname = '${schema}' AND rolname = '${owner}'",
+ require => Postgresql_psql["${db}: CREATE SCHEMA \"${schema}\""],
+ }
+
+ if defined(Postgresql::Server::Role[$owner]) {
+ Postgresql::Server::Role[$owner]->Postgresql_psql["${db}: ALTER SCHEMA \"${schema}\" OWNER TO \"${owner}\""]
+ }
+ }
+}