newer pg module
[mirror/dsa-puppet.git] / 3rdparty / modules / postgresql / manifests / server / schema.pp
diff --git a/3rdparty/modules/postgresql/manifests/server/schema.pp b/3rdparty/modules/postgresql/manifests/server/schema.pp
new file mode 100644 (file)
index 0000000..f0e762e
--- /dev/null
@@ -0,0 +1,63 @@
+# = 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}\""]
+    }
+  }
+}