2020-11-23 08:22:17 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Odyssey.
|
|
|
|
*
|
|
|
|
* Scalable PostgreSQL connection pooler.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <kiwi.h>
|
2020-11-25 10:17:15 +00:00
|
|
|
#include <machinarium.h>
|
2020-11-23 08:22:17 +00:00
|
|
|
#include <odyssey.h>
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
int od_compression_frontend_setup(od_client_t *client,
|
|
|
|
od_config_listen_t *config,
|
|
|
|
od_logger_t *logger)
|
2020-11-23 08:22:17 +00:00
|
|
|
{
|
|
|
|
kiwi_var_t *compression_var =
|
2020-12-28 10:43:31 +00:00
|
|
|
kiwi_vars_get(&client->vars, KIWI_VAR_COMPRESSION);
|
2020-11-23 08:22:17 +00:00
|
|
|
|
|
|
|
if (compression_var == NULL) {
|
2020-11-23 11:55:42 +00:00
|
|
|
/* if there is no compression variable in startup packet,
|
|
|
|
* skip compression initialization */
|
2020-11-23 08:22:17 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *client_compression_algorithms = compression_var->value;
|
2020-12-28 10:43:31 +00:00
|
|
|
char compression_algorithm = MM_ZPQ_NO_COMPRESSION;
|
2020-11-23 08:22:17 +00:00
|
|
|
|
2020-11-23 11:55:42 +00:00
|
|
|
/* if compression support is enabled, choose the compression algorithm */
|
|
|
|
if (config->compression) {
|
2020-12-28 10:43:31 +00:00
|
|
|
compression_algorithm = machine_compression_choose_alg(
|
|
|
|
client_compression_algorithms);
|
2020-11-23 11:55:42 +00:00
|
|
|
}
|
2020-11-23 08:22:17 +00:00
|
|
|
|
|
|
|
machine_msg_t *msg =
|
2020-12-28 10:43:31 +00:00
|
|
|
kiwi_be_write_compression_ack(NULL, compression_algorithm);
|
2020-11-23 08:22:17 +00:00
|
|
|
|
|
|
|
if (msg == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
int rc = od_write(&client->io, msg);
|
|
|
|
if (rc == -1) {
|
2020-12-28 10:43:31 +00:00
|
|
|
od_error(logger, "compression", client, NULL, "write error: %s",
|
|
|
|
od_io_error(&client->io));
|
2020-11-23 08:22:17 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2020-11-23 11:55:42 +00:00
|
|
|
if (compression_algorithm == MM_ZPQ_NO_COMPRESSION) {
|
|
|
|
/* do not perform the compression initialization
|
|
|
|
* if failed to choose any compression algorithm */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-11-23 08:22:17 +00:00
|
|
|
/* initialize compression */
|
|
|
|
rc = machine_set_compression(client->io.io, compression_algorithm);
|
|
|
|
if (rc == -1) {
|
2020-12-28 10:43:31 +00:00
|
|
|
od_debug(logger, "compression", client, NULL,
|
|
|
|
"failed to initialize compression w/ algorithm %c",
|
|
|
|
compression_algorithm);
|
2020-11-23 08:22:17 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|