sqlite_compressions/
bsdiffraw.rs1use std::io::Cursor;
2
3use rusqlite::Error::UserFunctionError;
4
5use crate::common_diff::{register_differ, Differ};
6use crate::rusqlite::{Connection, Result};
7
8pub fn register_bsdiffraw_functions(conn: &Connection) -> Result<()> {
32 register_differ::<BsdiffRawDiffer>(conn)
33}
34
35pub struct BsdiffRawDiffer;
36
37impl Differ for BsdiffRawDiffer {
38 fn diff_name() -> &'static str {
39 "bsdiffraw"
40 }
41
42 fn patch_name() -> &'static str {
43 "bspatchraw"
44 }
45
46 fn diff(source: &[u8], target: &[u8]) -> Result<Vec<u8>> {
47 let mut patch = Vec::new();
48 bsdiff::diff(source, target, &mut patch).map_err(|e| UserFunctionError(e.into()))?;
49 Ok(patch)
50 }
51
52 fn patch(source: &[u8], patch: &[u8]) -> Result<Vec<u8>> {
53 let mut target = Vec::new();
54 bsdiff::patch(source, &mut Cursor::new(patch), &mut target)
55 .map_err(|e| UserFunctionError(e.into()))?;
56 Ok(target)
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63
64 #[test]
65 fn test_diff() {
66 let source = b"abc013479zz";
67 let target = b"abc23456789zzf";
68 let patch = BsdiffRawDiffer::diff(source, target).unwrap();
69 let expected = b"\x03\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x33\x34\x35\x36\x37\x38\x39\x7A\x7A\x66";
70 assert_eq!(patch, expected);
71 }
72
73 #[test]
74 fn test_patch() {
75 let source = b"abc013479zz";
76 let patch = b"\x03\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x33\x34\x35\x36\x37\x38\x39\x7A\x7A\x66";
77 let target = BsdiffRawDiffer::patch(source, patch).unwrap();
78 let expected = b"abc23456789zzf";
79 assert_eq!(target, expected);
80 }
81}