From e32e6c0b06d7b33489037fb66e13e3ccde11733c Mon Sep 17 00:00:00 2001 From: rstanciu Date: Mon, 14 Aug 2023 18:58:18 -0700 Subject: [PATCH] add apply_diff for all MbtTypes --- martin-mbtiles/src/tile_copier.rs | 133 +++++++++++------- tests/expected/auto/catalog_auto.json | 6 + tests/expected/generated_config.yaml | 1 + .../files/geography-class-jpg-diff.mbtiles | Bin 0 -> 52736 bytes .../geography-class-jpg-modified.mbtiles | Bin 489472 -> 489472 bytes 5 files changed, 89 insertions(+), 51 deletions(-) create mode 100644 tests/fixtures/files/geography-class-jpg-diff.mbtiles diff --git a/martin-mbtiles/src/tile_copier.rs b/martin-mbtiles/src/tile_copier.rs index c0188a10e..892cd13b1 100644 --- a/martin-mbtiles/src/tile_copier.rs +++ b/martin-mbtiles/src/tile_copier.rs @@ -428,7 +428,6 @@ async fn open_and_detect_type(mbtiles: &Mbtiles) -> MbtResult { mbtiles.detect_type(&mut conn).await } -// TODO: allow for applying to different types pub async fn apply_mbtiles_diff( src_file: PathBuf, diff_file: PathBuf, @@ -438,38 +437,44 @@ pub async fn apply_mbtiles_diff( let opt = SqliteConnectOptions::new().filename(src_mbtiles.filepath()); let mut conn = SqliteConnection::connect_with(&opt).await?; - let src_type = src_mbtiles.detect_type(&mut conn).await?; - - if src_type != Flat { - return Err(MbtError::IncorrectDataFormat( - src_mbtiles.filepath().to_string(), - Flat, - src_type, - )); - } - - open_and_detect_type(&diff_mbtiles).await?; - - let path = diff_mbtiles.filepath(); - query!("ATTACH DATABASE ? AS diffDb", path) - .execute(&mut conn) - .await?; - - query( - " - DELETE FROM tiles - WHERE (zoom_level, tile_column, tile_row) IN - (SELECT zoom_level, tile_column, tile_row FROM diffDb.tiles WHERE tile_data ISNULL);", - ) - .execute(&mut conn) - .await?; - - query( - "INSERT OR REPLACE INTO tiles (zoom_level, tile_column, tile_row, tile_data) - SELECT * FROM diffDb.tiles WHERE tile_data NOTNULL;", - ) - .execute(&mut conn) - .await?; + let src_mbttype = src_mbtiles.detect_type(&mut conn).await?; + let diff_mbttype = open_and_detect_type(&diff_mbtiles).await?; + + let rusqlite_conn = RusqliteConnection::open(Path::new(&src_mbtiles.filepath()))?; + register_sha256_function(&rusqlite_conn)?; + rusqlite_conn.execute("ATTACH DATABASE ? AS diffDb", [diff_mbtiles.filepath()])?; + + let select_from = if src_mbttype == Flat { + "SELECT * FROM diffDb.tiles " + } else { + match diff_mbttype { + Flat => "SELECT *, hex(sha256(tile_data)) as hash FROM diffDb.tiles ", + FlatHashed => "SELECT zoom_level, tile_column, tile_row, tile_data, tile_hash AS hash FROM diffDb.hashed_tiles", + Normalized => "SELECT zoom_level, tile_column, tile_row, tile_data, map.tile_id AS hash FROM diffDb.map LEFT JOIN diffDb.images ON diffDb.map.tile_id=diffDb.images.tile_id" + } + }.to_string(); + + let (insert_sql, main_table) = match src_mbttype { + Flat => (vec![format!( + "INSERT OR REPLACE INTO tiles (zoom_level, tile_column, tile_row, tile_data) {select_from}" + )], "tiles".to_string()), + FlatHashed => (vec![format!( + "INSERT OR REPLACE INTO hashed_tiles {select_from}" + )], "hashed_tiles".to_string()), + Normalized => (vec![format!("INSERT OR REPLACE INTO map (zoom_level, tile_column, tile_row, tile_id) SELECT zoom_level, tile_column, tile_row, hash as tile_id FROM ({select_from})"), format!( + "INSERT OR REPLACE INTO images SELECT tile_data, hash FROM ({select_from})" + )], "map".to_string()) + }; + + for statement in insert_sql { + rusqlite_conn.execute(&format!("{statement} WHERE tile_data NOTNULL"), ())?; + } + + rusqlite_conn.execute( + &format!( + "DELETE FROM {main_table} WHERE (zoom_level, tile_column, tile_row) IN (SELECT zoom_level, tile_column, tile_row FROM ({select_from} WHERE tile_data ISNULL));" + ),() + )?; Ok(conn) } @@ -657,23 +662,19 @@ mod tests { 3 ); - assert_eq!( - get_one::( - &mut dst_conn, - "SELECT tile_data FROM tiles WHERE zoom_level=2 AND tile_row=2 AND tile_column=2;" - ) - .await, - 2 - ); + assert!(get_one::>( + &mut dst_conn, + "SELECT * FROM tiles WHERE zoom_level=2 AND tile_row=2 AND tile_column=2;" + ) + .await + .is_some()); - assert_eq!( - get_one::( - &mut dst_conn, - "SELECT tile_data FROM tiles WHERE zoom_level=1 AND tile_row=1 AND tile_column=1;" - ) - .await, - "4" - ); + assert!(get_one::>( + &mut dst_conn, + "SELECT * FROM tiles WHERE zoom_level=1 AND tile_row=1 AND tile_column=1;" + ) + .await + .is_some()); assert!(get_one::>( &mut dst_conn, @@ -805,10 +806,10 @@ mod tests { } #[actix_rt::test] - async fn apply_diff_file() { + async fn apply_flat_diff_file() { // Copy the src file to an in-memory DB let src_file = PathBuf::from("../tests/fixtures/files/world_cities.mbtiles"); - let src = PathBuf::from("file::memory:?cache=shared"); + let src = PathBuf::from("file:apply_flat_diff_file_mem_db?mode=memory&cache=shared"); let _src_conn = copy_mbtiles_file(TileCopierOptions::new(src_file.clone(), src.clone())) .await @@ -833,4 +834,34 @@ mod tests { .is_none() ); } + + #[actix_rt::test] + async fn apply_normalized_diff_file() { + // Copy the src file to an in-memory DB + let src_file = PathBuf::from("../tests/fixtures/files/geography-class-jpg.mbtiles"); + let src = PathBuf::from("file:apply_normalized_diff_file_mem_db?mode=memory&cache=shared"); + + let _src_conn = copy_mbtiles_file(TileCopierOptions::new(src_file.clone(), src.clone())) + .await + .unwrap(); + + // Apply diff to the src data in in-memory DB + let diff_file = PathBuf::from("../tests/fixtures/files/geography-class-jpg-diff.mbtiles"); + let mut src_conn = apply_mbtiles_diff(src, diff_file).await.unwrap(); + + // Verify the data is the same as the file the diff was generated from + let path = "../tests/fixtures/files/geography-class-jpg-modified.mbtiles"; + query!("ATTACH DATABASE ? AS otherDb", path) + .execute(&mut src_conn) + .await + .unwrap(); + + assert!( + query("SELECT * FROM tiles EXCEPT SELECT * FROM otherDb.tiles;") + .fetch_optional(&mut src_conn) + .await + .unwrap() + .is_none() + ); + } } diff --git a/tests/expected/auto/catalog_auto.json b/tests/expected/auto/catalog_auto.json index ae42af75c..ae3d99d46 100644 --- a/tests/expected/auto/catalog_auto.json +++ b/tests/expected/auto/catalog_auto.json @@ -80,6 +80,12 @@ "name": "Geography Class", "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. " }, + { + "id": "geography-class-jpg-diff", + "content_type": "image/jpeg", + "name": "Geography Class", + "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. " + }, { "id": "geography-class-jpg-modified", "content_type": "image/jpeg", diff --git a/tests/expected/generated_config.yaml b/tests/expected/generated_config.yaml index 136d529a7..cb8db509d 100644 --- a/tests/expected/generated_config.yaml +++ b/tests/expected/generated_config.yaml @@ -175,6 +175,7 @@ mbtiles: paths: tests/fixtures/files sources: geography-class-jpg: tests/fixtures/files/geography-class-jpg.mbtiles + geography-class-jpg-diff: tests/fixtures/files/geography-class-jpg-diff.mbtiles geography-class-jpg-modified: tests/fixtures/files/geography-class-jpg-modified.mbtiles geography-class-png: tests/fixtures/files/geography-class-png.mbtiles geography-class-png-no-bounds: tests/fixtures/files/geography-class-png-no-bounds.mbtiles diff --git a/tests/fixtures/files/geography-class-jpg-diff.mbtiles b/tests/fixtures/files/geography-class-jpg-diff.mbtiles new file mode 100644 index 0000000000000000000000000000000000000000..ab3e1b19bef2e54f78b9c6c5353185b272ec425b GIT binary patch literal 52736 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/files/geography-class-jpg-modified.mbtiles b/tests/fixtures/files/geography-class-jpg-modified.mbtiles index 819473235d50a5c24a3ae0f4f27dd478ff3e8004..5a4540f2e389c51192c716e8fdcab59232245269 100644 GIT binary patch delta 649 zcmV;40(Sj?@Ew5g9grIh9smFV-T(jryZ`_I6_F@60UohnrUML300K<|a04g;-~yPl zF$g;X3rPV60RaI`O#%V}lfVZvlfXO;2u1}42?+^JO_OmqAd>-IAd}z*+W|sy z1LXtW1J$z;5W@or2n7KF0SN*E0<+#9Boq#}00aX_00Z0uk^^l6NV5<$rvn54001SE zpaviX1tSAZ36sDFAc8oCI01$@0){vPhBySaI0XWve*t+b#j(uVZ0_v_-!>_sc%3&4 zsoKC2rw0r&rw0V!)o&bl&d0#IGT+{YkjXMzK?;xzvbWt`$AugcN#Fo}gnDjf+Dh!( zVS!LcE6<_vABp@$e#28ow|W(FR&Kx_ul0e}4(w^EQstT4eqBk-rwE!3nDs|+wu z2>dDa?;auwD58)B6j4A06j49{=~1;&@dt?X{{RfxEzY4ol9D)zHB~IqIRx!h9Fu@a z^Z=8939e;+C#3MtEIu99C5|DxcGwqs^O6CVBO6Xb1tW}sL(^7VVL9mtx9F~R4c?<7 zvIx94;|%}+0eH4#1_1$+KnRJqie(0N0=8@h0)Pep000006qjJ!1xy4000GdK&TR%n jx18(-Xiv8UNCOuFw;MhOxB-{2X9g(*0005Jra%Wcwl?V+ delta 422 zcmW;IyGtWc6bA5n?wNaLvL;Rhi$#eKNTGHc1P27M5(~q&HoI&iC@5Hok5!|q_Ue}SNtN=Tt#kwOtH6k$Ise$CG$-1Xq6$narMh-I zdZ_*6#}UU1iYK{4S9O7(!!M4nodF}USS*_js=anwp1!r^t8zoV`Lf-Us1qR~*VS5Q zGDU~tF25+vPspSTe&eSw*?7nC-xdmnQQYU^XR+c}il4d0_gvwtupxQQpJE0