services: postgresql: Use Guile datatypes.

* gnu/services/databases.scm (postgresql-config-file-compiler): Support Guile
datatypes in the "extra-config" field.
* gnu/tests/databases.scm (%postgresql-os): Test it.
* doc/guix.texi (Database Services): Document it.
This commit is contained in:
Mathieu Othacehe 2021-01-18 10:25:18 +01:00
parent ff0ff69315
commit a38d0b0137
No known key found for this signature in database
GPG key ID: 8354763531769CA6
3 changed files with 41 additions and 21 deletions

View file

@ -19410,12 +19410,12 @@ local all all trust
host all all 127.0.0.1/32 md5
host all all ::1/128 md5"))
(extra-config
'(("session_preload_libraries" "'auto_explain'")
("random_page_cost" "2")
("auto_explain.log_min_duration" "'100ms'")
("work_mem" "'500MB'")
("logging_collector" "on")
("log_directory" "'/var/log/postgresql'")))))))
'(("session_preload_libraries" "auto_explain")
("random_page_cost" 2)
("auto_explain.log_min_duration" "100 ms")
("work_mem" "500 MB")
("logging_collector" #t)
("log_directory" "/var/log/postgresql")))))))
@end lisp
@table @asis
@ -19435,6 +19435,12 @@ List of additional keys and values to include in the PostgreSQL config
file. Each entry in the list should be a list where the first element
is the key, and the remaining elements are the values.
The values can be numbers, booleans or strings and will be mapped to
PostgreSQL parameters types @code{Boolean}, @code{String},
@code{Numeric}, @code{Numeric with Unit} and @code{Enumerated} described
@uref{https://www.postgresql.org/docs/current/config-setting.html,
here}.
@end table
@end deftp

View file

@ -115,22 +115,28 @@ (define-gexp-compiler (postgresql-config-file-compiler
(match file
(($ <postgresql-config-file> log-destination hba-file
ident-file extra-config)
(define (single-quote string)
(if string
(list "'" string "'")
'()))
;; See: https://www.postgresql.org/docs/current/config-setting.html.
(define (format-value value)
(cond
((boolean? value)
(list (if value "on" "off")))
((number? value)
(list (number->string value)))
(else
(list "'" value "'"))))
(define contents
(append-map
(match-lambda
((key) '())
((key . #f) '())
((key values ...) `(,key " = " ,@values "\n")))
(define contents
(append-map
(match-lambda
((key) '())
((key . #f) '())
((key values ...)
`(,key " = " ,@(append-map format-value values) "\n")))
`(("log_destination" ,@(single-quote log-destination))
("hba_file" ,@(single-quote hba-file))
("ident_file" ,@(single-quote ident-file))
,@extra-config)))
`(("log_destination" ,log-destination)
("hba_file" ,hba-file)
("ident_file" ,ident-file)
,@extra-config)))
(gexp->derivation
"postgresql.conf"

View file

@ -218,7 +218,15 @@ (define %postgresql-os
(simple-operating-system
(service postgresql-service-type
(postgresql-configuration
(postgresql postgresql-10)))))
(postgresql postgresql-10)
(config-file
(postgresql-config-file
(extra-config
'(("session_preload_libraries" "auto_explain")
("random_page_cost" 2)
("auto_explain.log_min_duration" "100 ms")
("work_mem" "500 MB")
("debug_print_plan" #t)))))))))
(define (run-postgresql-test)
"Run tests in %POSTGRESQL-OS."