diff --git a/Cargo.lock b/Cargo.lock index f12a2511..c939d7e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -214,9 +214,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "getrandom", @@ -578,9 +578,9 @@ checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" [[package]] name = "cargo-platform" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" dependencies = [ "serde", ] @@ -1820,13 +1820,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ "hermit-abi", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2110,9 +2110,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap2" @@ -3474,9 +3474,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "similar" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aeaf503862c419d66959f5d7ca015337d864e9c49485d771b732e2a20453597" +checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" [[package]] name = "simplecss" @@ -3982,15 +3982,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/docs/src/env-vars.md b/docs/src/env-vars.md index 9df5cffa..0c9ef753 100644 --- a/docs/src/env-vars.md +++ b/docs/src/env-vars.md @@ -2,10 +2,10 @@ You can also configure Martin using environment variables, but only if the configuration file is not used. See [configuration section](config-file.md) on how to use environment variables with config files. See also [SSL configuration](pg-connections.md#postgresql-ssl-connections) section below. -| Environment var
Config File key | Example | Description | -|------------------------------------------|--------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `DATABASE_URL`
`connection_string` | `postgresql://postgres@localhost/db` | Postgres database connection | -| `DEFAULT_SRID`
`default_srid` | `4326` | If a PostgreSQL table has a geometry column with SRID=0, use this value instead | -| `PGSSLCERT`
`ssl_cert` | `./postgresql.crt` | A file with a client SSL certificate. [docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLCERT) | -| `PGSSLKEY`
`ssl_key` | `./postgresql.key` | A file with the key for the client SSL certificate. [docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLKEY) | -| `PGSSLROOTCERT`
`ssl_root_cert` | `./root.crt` | A file with trusted root certificate(s). The file should contain a sequence of PEM-formatted CA certificates. [docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLROOTCERT)
This env var used to be called `CA_ROOT_FILE`, but support for it will be removed soon. | +| Environment var
Config File key | Example | Description | +|------------------------------------------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `DATABASE_URL`
`connection_string` | `postgresql://postgres@localhost/db` | Postgres database connection | +| `DEFAULT_SRID`
`default_srid` | `4326` | If a PostgreSQL table has a geometry column with SRID=0, use this value instead | +| `PGSSLCERT`
`ssl_cert` | `./postgresql.crt` | A file with a client SSL certificate. [docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLCERT) | +| `PGSSLKEY`
`ssl_key` | `./postgresql.key` | A file with the key for the client SSL certificate. [docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLKEY) | +| `PGSSLROOTCERT`
`ssl_root_cert` | `./root.crt` | A file with trusted root certificate(s). The file should contain a sequence of PEM-formatted CA certificates. [docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLROOTCERT) | diff --git a/martin/src/args/pg.rs b/martin/src/args/pg.rs index 7f29960c..a0da3a00 100644 --- a/martin/src/args/pg.rs +++ b/martin/src/args/pg.rs @@ -105,7 +105,6 @@ impl PgArgs { } for v in &[ - "CA_ROOT_FILE", "DANGER_ACCEPT_INVALID_CERTS", "DATABASE_URL", "DEFAULT_SRID", @@ -167,13 +166,6 @@ impl PgArgs { if result.ssl_root_cert.is_none() { result.ssl_root_cert = Self::parse_env_var(env, "PGSSLROOTCERT", "root certificate(s)"); } - if result.ssl_root_cert.is_none() { - result.ssl_root_cert = Self::parse_env_var( - env, - "CA_ROOT_FILE", - "root certificate(s). This setting is obsolete, please use PGSSLROOTCERT instead", - ); - } result } @@ -255,7 +247,7 @@ mod tests { ("DATABASE_URL", os("postgres://localhost:5432")), ("DEFAULT_SRID", os("10")), ("DANGER_ACCEPT_INVALID_CERTS", os("1")), - ("CA_ROOT_FILE", os("file")), + ("PGSSLROOTCERT", os("file")), ] .into_iter() .collect(), diff --git a/martin/src/args/root.rs b/martin/src/args/root.rs index 51896400..2fc83c2d 100644 --- a/martin/src/args/root.rs +++ b/martin/src/args/root.rs @@ -65,14 +65,11 @@ impl Args { pub fn merge_into_config<'a>( self, config: &mut Config, - env: &impl Env<'a>, + #[allow(unused_variables)] env: &impl Env<'a>, ) -> MartinResult<()> { if self.meta.watch { warn!("The --watch flag is no longer supported, and will be ignored"); } - if env.has_unused_var("WATCH_MODE") { - warn!("The WATCH_MODE env variable is no longer supported, and will be ignored"); - } if self.meta.config.is_some() && !self.meta.connection.is_empty() { return Err(ConfigAndConnectionsError(self.meta.connection)); } @@ -138,19 +135,17 @@ pub fn parse_file_args( ) -> FileConfigEnum { use crate::args::State::{Ignore, Share, Take}; - let paths = cli_strings.process(|s| match PathBuf::try_from(s) { - Ok(v) => { - if allow_url && is_url(s, extension) { - Take(v) - } else if v.is_dir() { - Share(v) - } else if v.is_file() && v.extension().map_or(false, |e| e == extension) { - Take(v) - } else { - Ignore - } + let paths = cli_strings.process(|s| { + let path = PathBuf::from(s); + if allow_url && is_url(s, extension) { + Take(path) + } else if path.is_dir() { + Share(path) + } else if path.is_file() && path.extension().map_or(false, |e| e == extension) { + Take(path) + } else { + Ignore } - Err(_) => Ignore, }); FileConfigEnum::new(paths) diff --git a/mbtiles/src/validation.rs b/mbtiles/src/validation.rs index 34ce483a..9680a980 100644 --- a/mbtiles/src/validation.rs +++ b/mbtiles/src/validation.rs @@ -456,6 +456,41 @@ LIMIT 1;" } } +/// Compute the hash of the combined tiles in the mbtiles file tiles table/view. +/// This should work on all mbtiles files perf `MBTiles` specification. +pub async fn calc_agg_tiles_hash(conn: &mut T) -> MbtResult +where + for<'e> &'e mut T: SqliteExecutor<'e>, +{ + debug!("Calculating agg_tiles_hash"); + let query = query( + // The md5_concat func will return NULL if there are no rows in the tiles table. + // For our use case, we will treat it as an empty string, and hash that. + // `tile_data` values must be stored as a blob per MBTiles spec + // `md5` functions will fail if the value is not text/blob/null + // + // Note that ORDER BY controls the output ordering, which is important for the hash value, + // and having it at the top level would not order values properly. + // See https://sqlite.org/forum/forumpost/228bb96e12a746ce + " +SELECT coalesce( + (SELECT md5_concat_hex( + cast(zoom_level AS text), + cast(tile_column AS text), + cast(tile_row AS text), + tile_data + ) + OVER (ORDER BY zoom_level, tile_column, tile_row ROWS + BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) + FROM tiles + LIMIT 1), + md5_hex('') +); +", + ); + Ok(query.fetch_one(conn).await?.get::(0)) +} + #[cfg(test)] pub(crate) mod tests { use super::*; @@ -499,38 +534,3 @@ pub(crate) mod tests { Ok(()) } } - -/// Compute the hash of the combined tiles in the mbtiles file tiles table/view. -/// This should work on all mbtiles files perf `MBTiles` specification. -pub async fn calc_agg_tiles_hash(conn: &mut T) -> MbtResult -where - for<'e> &'e mut T: SqliteExecutor<'e>, -{ - debug!("Calculating agg_tiles_hash"); - let query = query( - // The md5_concat func will return NULL if there are no rows in the tiles table. - // For our use case, we will treat it as an empty string, and hash that. - // `tile_data` values must be stored as a blob per MBTiles spec - // `md5` functions will fail if the value is not text/blob/null - // - // Note that ORDER BY controls the output ordering, which is important for the hash value, - // and having it at the top level would not order values properly. - // See https://sqlite.org/forum/forumpost/228bb96e12a746ce - " -SELECT coalesce( - (SELECT md5_concat_hex( - cast(zoom_level AS text), - cast(tile_column AS text), - cast(tile_row AS text), - tile_data - ) - OVER (ORDER BY zoom_level, tile_column, tile_row ROWS - BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - FROM tiles - LIMIT 1), - md5_hex('') -); -", - ); - Ok(query.fetch_one(conn).await?.get::(0)) -}