This module provides the high level functions that are re-exported
by Database.Postgres.Temp. Additionally it includes some
identifiers that are used for testing but are not exported.
Handle for holding temporary resources, the postgres process handle
and postgres connection information. The DB also includes the
final plan used to start initdb, createdb and
postgres.
Make the data directory permanent. Useful for debugging.
If you are using with or withConfig this function will
not modify the DB that is passed for cleanup. You will
need to setup your own bracket like
The default configuration. This will create a database called "postgres"
via initdb (it's default behavior).
It will create a temporary directory for the data and a temporary directory
for a unix socket and listen on 127.0.0.1 and ::1 on a random port.
Additionally it will use the following "postgresql.conf"
which is optimized for performance.
shared_buffers = 12MB
fsync = off
synchronous_commit = off
full_page_writes = off
log_min_messages = PANIC
log_min_error_statement = PANIC
log_statement = none
client_min_messages = ERROR
commit_delay = 100000
wal_level = minimal
archive_mode = off
max_wal_senders = 0
defaultConfig also passes the --no-sync flag to initdb.
If you would like to customize this behavior you can start with the
defaultConfig and overwrite fields or combine a defaultConfig with another Config
using <> (mappend).
Alternatively you can eschew defaultConfig altogether, however
your postgres might start and run faster if you use
defaultConfig.
The defaultConfig redirects all output to /dev/null. See
verboseConfig for a version that logs more output.
To append additional lines to "postgresql.conf" file create a
custom Config like the following.
Only stop the postgres process but leave any temporary resources.
Useful for testing backup strategies when used in conjunction with
restart or withRestart.
Only stop the postgres process but leave any temporary resources.
In contrast to stopPostgres this function makes sure postgres
has time to properly write files to the data directory.
Attempt to create a Config from a Options. Useful if you
want to create a database
owned by a specific user you will also login with
with a specific name (i.e. not the default name, "postgres")
among other use cases. Changing the connectionOptions field of
Config does not achieve these results and you are likely to see
unexpected behaviour if you try to.
Some operatoring system versions support flags for cp that allow
"copy on write" which is about 2x faster. defaultCacheConfig
attempts to determine if the cp on the path supports copy on write
and sets this to True if it does.
Exception safe method for taking a file system level copy of the database cluster.
Snapshots are useful if you would like to start every test from a migrated database
and the migration process is more time consuming then copying the additional data.
If the file path does not exist the initial config is used to start a postgres
instance. After which the action is applied, the data directory is cached
and postgres is shutdown.
cacheActionmappends a config to copy the cached data directory
on startup onto the initial config and returns it. In other words:
initialConfig <> configFromCachePath
cacheAction can be used to create a snapshot of migrated database and not
remigrate as long as the migration does not change. See withSnapshot for
a ephemeral version of taking snapshots.
You can nest calls to cacheAction and safe to call it from several threads.
However cacheAction uses locks internal to prevent multiple threads from
stomping on each other.
If one makes a nested call and accidently uses the same cache directory
in both calls the calls will deadlock. If this occurs on the same thread
RTS will throw an exception. However do not rely on this and just be
careful to not reuse the same cache path when nesting calls.
There is no good reuse the cache path when nesting so one is unlikely to
run into this.