diff --git a/.github/labeler.yml b/.github/labeler.yml index 6120190c6..1c27bd8da 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -96,6 +96,14 @@ vector: - changed-files: - any-glob-to-any-file: "core/vector/*" +turso-serverless: + - changed-files: + - any-glob-to-any-file: 'packages/turso-serverless' + +turso-sync: + - changed-files: + - any-glob-to-any-file: 'packages/turso-sync' + antithesis: - changed-files: - any-glob-to-any-file: diff --git a/Cargo.lock b/Cargo.lock index 2731e58e9..5c9feb314 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,21 +13,21 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.12" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -115,9 +115,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -130,44 +130,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", - "once_cell_polyfill", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "antithesis_sdk" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dafc0460f582169b1414074fd82bedbda60456fb4df0a78dc7fef1306e732ea3" +checksum = "201eba73b76341631014baf9c0018e703af204a1e0f15d7664d8a0947f6be74d" dependencies = [ "libc", "libloading", @@ -199,9 +199,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert_cmd" -version = "2.0.17" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" +checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" dependencies = [ "anstyle", "bstr", @@ -221,15 +221,15 @@ checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", @@ -272,18 +272,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] [[package]] name = "blake3" -version = "1.8.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" dependencies = [ "arrayref", "arrayvec", @@ -303,9 +303,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.0" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", "regex-automata 0.4.9", @@ -330,15 +330,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "byteorder" @@ -360,9 +360,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.30" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -377,9 +377,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" @@ -395,9 +395,9 @@ checksum = "18758054972164c3264f7c8386f5fc6da6114cb46b619fd365d4e3b2dc3ae487" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", @@ -437,9 +437,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" dependencies = [ "clap_builder", "clap_derive", @@ -447,9 +447,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" dependencies = [ "anstream", "anstyle", @@ -471,36 +471,36 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clipboard-win" -version = "5.4.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" dependencies = [ "error-code", ] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -520,7 +520,7 @@ checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" dependencies = [ "crossterm", "unicode-segmentation", - "unicode-width 0.2.1", + "unicode-width 0.2.0", ] [[package]] @@ -577,7 +577,7 @@ dependencies = [ "assert_cmd", "env_logger 0.10.2", "log", - "rand 0.9.2", + "rand 0.9.0", "rand_chacha 0.9.0", "rexpect", "rusqlite", @@ -586,7 +586,7 @@ dependencies = [ "tracing", "tracing-subscriber", "turso_core", - "zerocopy", + "zerocopy 0.8.26", ] [[package]] @@ -600,9 +600,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -646,9 +646,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] @@ -694,7 +694,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "crossterm_winapi", "parking_lot", "rustix 0.38.44", @@ -712,9 +712,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -749,9 +749,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" +checksum = "a4735f265ba6a1188052ca32d461028a7d1125868be18e287e756019da7607b5" dependencies = [ "ctor-proc-macro", "dtor", @@ -759,17 +759,17 @@ dependencies = [ [[package]] name = "ctor-proc-macro" -version = "0.0.6" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" +checksum = "4f211af61d8efdd104f96e57adf5e426ba1bc3ed7a4ead616e15e5881fd79c4d" [[package]] name = "ctrlc" -version = "3.4.7" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" dependencies = [ - "nix 0.30.1", + "nix 0.29.0", "windows-sys 0.59.0", ] @@ -794,7 +794,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.100", ] [[package]] @@ -805,7 +805,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -829,9 +829,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" [[package]] name = "debugid" @@ -850,14 +850,14 @@ checksum = "51aac4c99b2e6775164b412ea33ae8441b2fde2dbf05a20bc0052a63d08c475b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "deranged" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -917,7 +917,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.0", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -928,7 +928,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -954,9 +954,9 @@ checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" [[package]] name = "dyn-clone" -version = "1.0.20" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "either" @@ -995,9 +995,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697" dependencies = [ "anstream", "anstyle", @@ -1023,7 +1023,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1034,19 +1034,19 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] name = "error-code" -version = "3.3.2" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "fallible-iterator" @@ -1073,7 +1073,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 1.0.8", + "rustix 1.0.7", + "windows-sys 0.59.0", +] + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", "windows-sys 0.59.0", ] @@ -1091,9 +1103,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -1138,7 +1150,7 @@ dependencies = [ "md-5", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1227,7 +1239,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1278,20 +1290,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", @@ -1307,11 +1319,11 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" -version = "0.20.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +checksum = "5220b8ba44c68a9a7f7a7659e864dd73692e417ef0211bea133c7b74e031eeb9" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "libc", "libgit2-sys", "log", @@ -1326,9 +1338,9 @@ checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "half" -version = "2.6.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" dependencies = [ "cfg-if", "crunchy", @@ -1342,9 +1354,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -1357,7 +1369,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.2", ] [[package]] @@ -1368,9 +1380,15 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hermit-abi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" [[package]] name = "hex" @@ -1395,9 +1413,9 @@ checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "b2fd658b06e56721792c5df4475705b6cda790e9298d19d2f8af083457bcd127" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1419,22 +1437,21 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", @@ -1444,10 +1461,30 @@ dependencies = [ ] [[package]] -name = "icu_normalizer" -version = "2.0.0" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", @@ -1455,54 +1492,67 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", + "utf16_iter", + "utf8_iter", + "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] name = "icu_properties" -version = "2.0.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", - "icu_locale_core", + "icu_locid_transform", "icu_properties_data", "icu_provider", - "potential_utf", - "zerotrie", + "tinystr", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", - "icu_locale_core", + "icu_locid", + "icu_provider_macros", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", - "zerotrie", "zerovec", ] +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1522,9 +1572,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", @@ -1543,12 +1593,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.15.2", "serde", ] @@ -1565,7 +1615,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash", - "indexmap 2.10.0", + "indexmap 2.8.0", "is-terminal", "itoa", "log", @@ -1582,7 +1632,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "inotify-sys", "libc", ] @@ -1598,11 +1648,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "3c2f96dfbc20c12b9b4f12eef60472d8c29b9c3f29463570dcb47e4a48551168" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "cfg-if", "libc", ] @@ -1619,7 +1669,7 @@ version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi", + "hermit-abi 0.5.0", "libc", "windows-sys 0.59.0", ] @@ -1671,9 +1721,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.15" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +checksum = "c102670231191d07d37a35af3eb77f1f0dbf7a71be51a962dcd57ea607be7260" dependencies = [ "jiff-static", "log", @@ -1684,13 +1734,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.15" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "4cdde31a9d349f1b1f51a0b3714a5940ac022976f4b49485fc04be052b183b4c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1717,11 +1767,10 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "getrandom 0.3.3", "libc", ] @@ -1746,9 +1795,9 @@ dependencies = [ [[package]] name = "kqueue" -version = "1.1.1" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" dependencies = [ "kqueue-sys", "libc", @@ -1772,15 +1821,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libgit2-sys" -version = "0.18.2+1.9.1" +version = "0.18.1+1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +checksum = "e1dcb20f84ffcdd825c7a311ae347cce604a6f084a767dec4a4929829645290e" dependencies = [ "cc", "libc", @@ -1790,25 +1839,25 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-targets 0.52.6", ] [[package]] name = "libm" -version = "0.2.15" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" -version = "0.1.43" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88cd67e9de251c1781dbe2f641a1a3ad66eaae831b8a2c38fbdc5ddae16d4d" +checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4" dependencies = [ "cc", "libc", @@ -1816,12 +1865,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.8" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "libc", + "redox_syscall", ] [[package]] @@ -1942,7 +1992,7 @@ dependencies = [ name = "limbo_sqlite3" version = "0.1.3" dependencies = [ - "env_logger 0.11.8", + "env_logger 0.11.7", "libc", "tempfile", "tracing", @@ -1966,22 +2016,22 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linkme" -version = "0.3.33" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b1703c00b2a6a70738920544aa51652532cacddfec2e162d2e29eae01e665c" +checksum = "22d227772b5999ddc0690e733f734f95ca05387e329c4084fe65678c51198ffe" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.33" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d55ca5d5a14363da83bf3c33874b8feaa34653e760d5216d7ef9829c88001a" +checksum = "71a98813fa0073a317ed6a8055dcd4722a49d9b862af828ee68449adb799b6be" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1992,21 +2042,21 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" -version = "0.8.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2024,7 +2074,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.2", ] [[package]] @@ -2054,15 +2104,15 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.7" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -2113,37 +2163,37 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "mimalloc" -version = "0.1.47" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1791cbe101e95af5764f06f20f6760521f7158f69dbf9d6baf941ee1bf6bc40" +checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af" dependencies = [ "libmimalloc-sys", ] [[package]] name = "miniz_oxide" -version = "0.8.9" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -2152,7 +2202,7 @@ version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afaf586c21f260e9dc327ae3585fc6efcbb24a416d5151da38bbd35a1f2663c8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "ctor", "napi-build", "napi-sys", @@ -2177,7 +2227,7 @@ dependencies = [ "napi-derive-backend", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -2190,7 +2240,7 @@ dependencies = [ "proc-macro2", "quote", "semver", - "syn", + "syn 2.0.100", ] [[package]] @@ -2224,23 +2274,22 @@ dependencies = [ [[package]] name = "nix" -version = "0.29.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "cfg-if", - "cfg_aliases", "libc", ] [[package]] name = "nix" -version = "0.30.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -2254,11 +2303,12 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "notify" -version = "8.1.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3163f59cd3fa0e9ef8c32f242966a7b9994fd7378366099593e0e73077cd8c97" +checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", + "filetime", "fsevent-sys", "inotify", "kqueue", @@ -2267,7 +2317,7 @@ dependencies = [ "mio", "notify-types", "walkdir", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -2327,7 +2377,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi", + "hermit-abi 0.5.0", "libc", ] @@ -2346,19 +2396,13 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - [[package]] name = "onig" version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "libc", "once_cell", "onig_sys", @@ -2405,15 +2449,15 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "4.2.2" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" +checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2421,9 +2465,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", @@ -2464,13 +2508,13 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.4" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" +checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" dependencies = [ "base64", - "indexmap 2.10.0", - "quick-xml 0.38.0", + "indexmap 2.8.0", + "quick-xml 0.32.0", "serde", "time", ] @@ -2505,23 +2549,24 @@ dependencies = [ [[package]] name = "polling" -version = "3.9.0" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 0.38.44", + "tracing", + "windows-sys 0.59.0", ] [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "portable-atomic-util" @@ -2532,15 +2577,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -2549,9 +2585,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "pprof" -version = "0.14.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afad4d4df7b31280028245f152d5a575083e2abb822d05736f5e47653e77689f" +checksum = "ebbe2f8898beba44815fdc9e5a4ae9c929e21c5dc29b0c774a15555f7f58d6d0" dependencies = [ "aligned-vec", "backtrace", @@ -2563,8 +2599,8 @@ dependencies = [ "log", "nix 0.26.4", "once_cell", + "parking_lot", "smallvec", - "spin", "symbolic-demangle", "tempfile", "thiserror 1.0.69", @@ -2576,7 +2612,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy", + "zerocopy 0.8.26", ] [[package]] @@ -2625,14 +2661,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -2650,9 +2686,9 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5203598f366b11a02b13aa20cab591229ff0a89fd121a308a5df751d5fc9219" +checksum = "17da310086b068fbdcefbba30aeb3721d5bb9af8db4987d6735b2183ca567229" dependencies = [ "anyhow", "cfg-if", @@ -2669,9 +2705,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99636d423fa2ca130fa5acde3059308006d46f98caac629418e53f7ebb1e9999" +checksum = "e27165889bd793000a098bb966adc4300c312497ea25cf7a690a9f0ac5aa5fc1" dependencies = [ "once_cell", "target-lexicon", @@ -2679,9 +2715,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f9cf92ba9c409279bc3305b5409d90db2d2c22392d443a87df3a1adad59e33" +checksum = "05280526e1dbf6b420062f3ef228b78c0c54ba94e157f5cb724a609d0f2faabc" dependencies = [ "libc", "pyo3-build-config", @@ -2689,27 +2725,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b999cb1a6ce21f9a6b147dcf1be9ffedf02e0043aec74dc390f3007047cecd9" +checksum = "5c3ce5686aa4d3f63359a5100c62a127c9f15e8398e5fdeb5deef1fed5cd5f44" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "pyo3-macros-backend" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ece1c7e1012745607d5cf0bcb2874769f0f7cb34c4cde03b9358eb9ef911a" +checksum = "f4cf6faa0cbfb0ed08e89beb8103ae9724eb4750e3a78084ba4017cbe94f3855" dependencies = [ "heck", "proc-macro2", "pyo3-build-config", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -2723,9 +2759,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" dependencies = [ "memchr", ] @@ -2741,13 +2777,13 @@ dependencies = [ [[package]] name = "quickcheck_macros" -version = "1.1.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71ee38b42f8459a88d3362be6f9b841ad2d5421844f61eb1c59c11bff3ac14a" +checksum = "b22a693222d716a9587786f37ac3f6b4faedb5b80c23914e7303ff5a1d8016e9" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2761,9 +2797,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.3.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] name = "radix_trie" @@ -2788,12 +2824,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "zerocopy 0.8.26", ] [[package]] @@ -2822,7 +2859,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", ] [[package]] @@ -2831,7 +2868,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.2", ] [[package]] @@ -2856,11 +2893,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", ] [[package]] @@ -2869,7 +2906,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -2880,7 +2917,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", "libredox", "thiserror 2.0.12", ] @@ -2937,22 +2974,22 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "rexpect" -version = "0.6.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1bcd4ac488e9d2d726d147031cceff5cff6425011ff1914049739770fa4726" +checksum = "c020234fb542618dc3e3d43724e9d93f87e1db74040a76a8c4e830220fb9b20d" dependencies = [ "comma", - "nix 0.30.1", + "nix 0.27.1", "regex", "tempfile", - "thiserror 2.0.12", + "thiserror 1.0.69", ] [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] @@ -2965,7 +3002,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.15", "libc", "untrusted", "windows-sys 0.52.0", @@ -2996,7 +3033,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn", + "syn 2.0.100", "unicode-ident", ] @@ -3006,7 +3043,7 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37e34486da88d8e051c7c0e23c3f15fd806ea8546260aa2fec247e97242ec143" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -3016,9 +3053,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3051,7 +3088,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -3060,22 +3097,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.9.3", + "windows-sys 0.59.0", ] [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "rustyline" @@ -3083,7 +3120,7 @@ version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ee1e066dc922e513bda599c6ccb5f3bb2b0ea5870a579448f2622993f0a9a2f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "cfg-if", "clipboard-win", "fd-lock", @@ -3095,20 +3132,20 @@ dependencies = [ "radix_trie", "rustyline-derive", "unicode-segmentation", - "unicode-width 0.2.1", + "unicode-width 0.2.0", "utf8parse", "windows-sys 0.59.0", ] [[package]] name = "rustyline-derive" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d66de233f908aebf9cc30ac75ef9103185b4b715c6f2fb7a626aa5e5ede53ab" +checksum = "327e9d075f6df7e25fbf594f1be7ef55cf0d567a6cb5112eeccbbd51ceb48e0d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3148,7 +3185,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 2.0.100", ] [[package]] @@ -3180,7 +3217,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3191,14 +3228,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -3208,9 +3245,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.9" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3232,18 +3269,21 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" @@ -3263,18 +3303,9 @@ dependencies = [ [[package]] name = "sorted-vec" -version = "0.8.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40f1aa8c0f688ae6d6ffd5e9e351d635acc176dfad05816494b321be7e01007" - -[[package]] -name = "spin" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" -dependencies = [ - "lock_api", -] +checksum = "d372029cb5195f9ab4e4b9aef550787dce78b124fcaee8d82519925defcd6f0d" [[package]] name = "sqlparser_bench" @@ -3322,7 +3353,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.100", ] [[package]] @@ -3348,9 +3379,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "symbolic-common" -version = "12.16.0" +version = "12.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c5199e46f23c77c611aa2a383b2f72721dfee4fb2bf85979eea1e0f26ba6e35" +checksum = "66135c8273581acaab470356f808a1c74a707fe7ec24728af019d7247e089e71" dependencies = [ "debugid", "memmap2", @@ -3360,9 +3391,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.16.0" +version = "12.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3c03956e32254f74e461a330b9522a2689686d80481708fb2014780d8d3959" +checksum = "42bcacd080282a72e795864660b148392af7babd75691d5ae9a3b77e29c98c77" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -3371,9 +3402,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -3382,13 +3424,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3425,9 +3467,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.2", "once_cell", - "rustix 1.0.8", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -3446,7 +3488,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" dependencies = [ - "rustix 1.0.8", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -3458,24 +3500,24 @@ checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "test-log" -version = "0.2.18" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e33b98a582ea0be1168eba097538ee8dd4bbe0f2b01b22ac92ea30054e5be7b" +checksum = "e7f46083d221181166e5b6f6b1e5f1d499f3a76888826e6cb1d057554157cd0f" dependencies = [ - "env_logger 0.11.8", + "env_logger 0.11.7", "test-log-macros", "tracing-subscriber", ] [[package]] name = "test-log-macros" -version = "0.2.18" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" +checksum = "888d0c3c6db53c0fdab160d2ed5e12ba745383d3e85813f2ea0f2b1475ab553f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3485,7 +3527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "unicode-linebreak", - "unicode-width 0.2.1", + "unicode-width 0.2.0", ] [[package]] @@ -3514,7 +3556,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3525,16 +3567,17 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", + "once_cell", ] [[package]] @@ -3579,9 +3622,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", @@ -3625,16 +3668,16 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "toml" -version = "0.8.23" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.8.0", "serde", "serde_spanned", "toml_datetime", @@ -3643,20 +3686,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.8.0", "serde", "serde_spanned", "toml_datetime", @@ -3666,9 +3709,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" [[package]] name = "tracing" @@ -3695,20 +3738,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -3762,6 +3805,20 @@ dependencies = [ "turso_core", ] +[[package]] +name = "turso-sync" +version = "0.1.3" +dependencies = [ + "ctor", + "tempfile", + "thiserror 2.0.12", + "tokio", + "tracing", + "tracing-subscriber", + "turso", + "turso_core", +] + [[package]] name = "turso_cli" version = "0.1.3" @@ -3799,15 +3856,15 @@ name = "turso_core" version = "0.1.3" dependencies = [ "antithesis_sdk", - "bitflags 2.9.1", + "bitflags 2.9.0", "built", "cfg_block", "chrono", "criterion", "crossbeam-skiplist", - "env_logger 0.11.8", + "env_logger 0.11.7", "fallible-iterator", - "getrandom 0.2.16", + "getrandom 0.2.15", "hex", "io-uring", "julian_day_converter", @@ -3830,7 +3887,7 @@ dependencies = [ "regex-syntax 0.8.5", "rstest", "rusqlite", - "rustix 1.0.8", + "rustix 1.0.7", "ryu", "serde", "sorted-vec", @@ -3860,7 +3917,7 @@ name = "turso_ext" version = "0.1.3" dependencies = [ "chrono", - "getrandom 0.3.3", + "getrandom 0.3.2", "turso_macros", ] @@ -3868,7 +3925,7 @@ dependencies = [ name = "turso_ext_tests" version = "0.1.3" dependencies = [ - "env_logger 0.11.8", + "env_logger 0.11.7", "lazy_static", "log", "mimalloc", @@ -3881,7 +3938,7 @@ version = "0.1.3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3899,11 +3956,11 @@ dependencies = [ name = "turso_sqlite3_parser" version = "0.1.3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", "cc", - "env_logger 0.11.8", + "env_logger 0.11.7", "fallible-iterator", - "indexmap 2.10.0", + "indexmap 2.8.0", "log", "memchr", "miette", @@ -3970,9 +4027,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unindent" @@ -4003,6 +4060,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -4021,7 +4084,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.2", "js-sys", "wasm-bindgen", ] @@ -4053,7 +4116,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4095,9 +4158,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" @@ -4130,7 +4193,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -4165,7 +4228,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4222,62 +4285,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "windows-targets 0.52.6", ] [[package]] name = "windows-link" -version = "0.1.3" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-sys" @@ -4315,15 +4334,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.3", -] - [[package]] name = "windows-targets" version = "0.42.2" @@ -4363,30 +4373,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4405,12 +4398,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4429,12 +4416,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4453,24 +4434,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4489,12 +4458,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4513,12 +4476,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4537,12 +4494,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4561,17 +4512,11 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b" dependencies = [ "memchr", ] @@ -4582,14 +4527,20 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.0", ] [[package]] -name = "writeable" -version = "0.6.1" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yaml-rust" @@ -4602,9 +4553,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -4614,23 +4565,43 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "synstructure", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + [[package]] name = "zerocopy" version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "zerocopy-derive", + "zerocopy-derive 0.8.26", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -4641,7 +4612,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4661,26 +4632,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "synstructure", ] -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - [[package]] name = "zerovec" -version = "0.11.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ "yoke", "zerofrom", @@ -4689,11 +4649,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] diff --git a/Cargo.toml b/Cargo.toml index 22fed39ed..a562f1e87 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ members = [ "testing/sqlite_test_ext", "tests", "vendored/sqlite3-parser/sqlparser_bench", + "packages/turso-sync", ] exclude = ["perf/latency/limbo"] @@ -37,6 +38,7 @@ license = "MIT" repository = "https://github.com/tursodatabase/turso" [workspace.dependencies] +turso = { path = "bindings/rust", version = "0.1.3" } limbo_completion = { path = "extensions/completion", version = "0.1.3" } turso_core = { path = "core", version = "0.1.3" } limbo_crypto = { path = "extensions/crypto", version = "0.1.3" } diff --git a/bindings/rust/src/value.rs b/bindings/rust/src/value.rs index 567476513..824d8d19e 100644 --- a/bindings/rust/src/value.rs +++ b/bindings/rust/src/value.rs @@ -110,6 +110,18 @@ impl Value { } } +impl From for Value { + fn from(val: turso_core::Value) -> Self { + match val { + turso_core::Value::Null => Value::Null, + turso_core::Value::Integer(n) => Value::Integer(n), + turso_core::Value::Float(n) => Value::Real(n), + turso_core::Value::Text(t) => Value::Text(t.into()), + turso_core::Value::Blob(items) => Value::Blob(items), + } + } +} + impl From for turso_core::Value { fn from(val: Value) -> Self { match val { diff --git a/core/types.rs b/core/types.rs index 113e0ce09..9a679f35e 100644 --- a/core/types.rs +++ b/core/types.rs @@ -176,6 +176,12 @@ impl From for Text { } } +impl From for String { + fn from(value: Text) -> Self { + String::from_utf8(value.value).unwrap() + } +} + impl Display for TextRef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.as_str()) @@ -956,6 +962,12 @@ impl ImmutableRecord { } } + pub fn from_bin_record(payload: Vec) -> Self { + Self { + payload: Value::Blob(payload), + } + } + // TODO: inline the complete record parsing code here. // Its probably more efficient. pub fn get_values(&self) -> Vec { @@ -2436,6 +2448,22 @@ impl RawSlice { } } +#[derive(Debug)] +pub enum DatabaseChangeType { + Delete, + Update { bin_record: Vec }, + Insert { bin_record: Vec }, +} + +#[derive(Debug)] +pub struct DatabaseChange { + pub change_id: i64, + pub change_time: u64, + pub change: DatabaseChangeType, + pub table_name: String, + pub id: i64, +} + #[derive(Debug)] pub struct WalInsertInfo { pub page_no: usize, diff --git a/packages/turso-sync/Cargo.toml b/packages/turso-sync/Cargo.toml new file mode 100644 index 000000000..ef5ef40fa --- /dev/null +++ b/packages/turso-sync/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "turso-sync" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +turso_core = { workspace = true } +turso = { workspace = true } +thiserror = "2.0.12" +tracing = "0.1.41" + +[dev-dependencies] +ctor = "0.4.2" +tempfile = "3.20.0" +tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } +tokio = { version = "1.46.1", features = ["macros", "rt-multi-thread"] } diff --git a/packages/turso-sync/README.md b/packages/turso-sync/README.md new file mode 100644 index 000000000..b1c06b641 --- /dev/null +++ b/packages/turso-sync/README.md @@ -0,0 +1,20 @@ +# Turso sync package + +turso-sync package extends turso-db embedded database with sync capabilities + +> [!NOTE] +> This package is experimental and, therefore, subject to change at any time. + +## Installation + +```bash +cargo add turso-sync +``` + +## Examples + +Check out the `examples/` directory for complete usage examples. + +## License + +MIT diff --git a/packages/turso-sync/examples/example_tape.rs b/packages/turso-sync/examples/example_tape.rs new file mode 100644 index 000000000..12e9de5ea --- /dev/null +++ b/packages/turso-sync/examples/example_tape.rs @@ -0,0 +1,77 @@ +use std::io::{self, Write}; + +use turso::Builder; +use turso_sync::{ + database_tape::{DatabaseChangesIteratorMode, DatabaseChangesIteratorOpts, DatabaseTape}, + types::DatabaseTapeOperation, +}; + +#[tokio::main] +async fn main() { + let db = Builder::new_local("local.db").build().await.unwrap(); + let db = DatabaseTape::new(db); + + let conn = db.connect().await.unwrap(); + + loop { + print!("> "); + io::stdout().flush().unwrap(); + + let mut input = String::new(); + let bytes_read = io::stdin().read_line(&mut input).unwrap(); + + if bytes_read == 0 { + break; + } + + let trimmed = input.trim(); + if trimmed == ".exit" || trimmed == ".quit" { + break; + } + if trimmed.starts_with(".undo ") || trimmed.starts_with(".redo ") { + let first_change_id = Some(trimmed[".undo ".len()..].parse().unwrap()); + let mode = match &trimmed[0..(".undo".len())] { + ".undo" => DatabaseChangesIteratorMode::Revert, + ".redo" => DatabaseChangesIteratorMode::Apply, + _ => unreachable!(), + }; + let mut iterator = db + .iterate_changes(DatabaseChangesIteratorOpts { + first_change_id, + mode, + ..Default::default() + }) + .await + .unwrap(); + let mut session = db.start_tape_session().await.unwrap(); + if let Some(change) = iterator.next().await.unwrap() { + session.replay(change).await.unwrap(); + session.replay(DatabaseTapeOperation::Commit).await.unwrap(); + } + continue; + } + let mut stmt = conn.prepare(&input).await.unwrap(); + let mut rows = stmt.query(()).await.unwrap(); + while let Some(row) = rows.next().await.unwrap() { + let mut values = vec![]; + for i in 0..row.column_count() { + let value = row.get_value(i).unwrap(); + match value { + turso::Value::Null => values.push("NULL".to_string()), + turso::Value::Integer(x) => values.push(format!("{x}",)), + turso::Value::Real(x) => values.push(format!("{x}")), + turso::Value::Text(x) => values.push(format!("'{x}'")), + turso::Value::Blob(x) => values.push(format!( + "x'{}'", + x.iter() + .map(|x| format!("{x:02x}")) + .collect::>() + .join(""), + )), + } + } + println!("{}", &values.join(" ")); + io::stdout().flush().unwrap(); + } + } +} diff --git a/packages/turso-sync/src/database_tape.rs b/packages/turso-sync/src/database_tape.rs new file mode 100644 index 000000000..4610930dd --- /dev/null +++ b/packages/turso-sync/src/database_tape.rs @@ -0,0 +1,478 @@ +use std::{ + collections::{HashMap, VecDeque}, + sync::Arc, +}; + +use crate::{ + types::{ + DatabaseChange, DatabaseTapeOperation, DatabaseTapeRowChange, DatabaseTapeRowChangeType, + }, + Result, +}; + +/// Simple wrapper over [turso::Database] which extends its intereface with few methods +/// to collect changes made to the database and apply/revert arbitrary changes to the database +pub struct DatabaseTape { + inner: turso::Database, + cdc_table: Arc, + pragma_query: String, +} + +const DEFAULT_CDC_TABLE_NAME: &str = "turso_cdc"; +const DEFAULT_CDC_MODE: &str = "full"; +const DEFAULT_CHANGES_BATCH_SIZE: usize = 100; +const CDC_PRAGMA_NAME: &str = "unstable_capture_data_changes_conn"; + +#[derive(Debug)] +pub struct DatabaseTapeOpts { + pub cdc_table: Option, + pub cdc_mode: Option, +} + +impl DatabaseTape { + pub fn new(database: turso::Database) -> Self { + let opts = DatabaseTapeOpts { + cdc_table: None, + cdc_mode: None, + }; + Self::new_with_opts(database, opts) + } + pub fn new_with_opts(database: turso::Database, opts: DatabaseTapeOpts) -> Self { + tracing::debug!("create local sync database with options {:?}", opts); + let cdc_table = opts.cdc_table.unwrap_or(DEFAULT_CDC_TABLE_NAME.to_string()); + let cdc_mode = opts.cdc_mode.unwrap_or(DEFAULT_CDC_MODE.to_string()); + let pragma_query = format!("PRAGMA {CDC_PRAGMA_NAME}('{cdc_mode},{cdc_table}')"); + Self { + inner: database, + cdc_table: Arc::new(cdc_table.to_string()), + pragma_query, + } + } + pub async fn connect(&self) -> Result { + let connection = self.inner.connect()?; + tracing::debug!("set '{CDC_PRAGMA_NAME}' for new connection"); + connection.execute(&self.pragma_query, ()).await?; + Ok(connection) + } + /// Builds an iterator which emits [DatabaseTapeOperation] by extracting data from CDC table + pub async fn iterate_changes( + &self, + opts: DatabaseChangesIteratorOpts, + ) -> Result { + tracing::debug!("opening changes iterator with options {:?}", opts); + let conn = self.connect().await?; + let query = opts.mode.query(&self.cdc_table, opts.batch_size); + let query_stmt = conn.prepare(&query).await?; + Ok(DatabaseChangesIterator { + first_change_id: opts.first_change_id, + batch: VecDeque::with_capacity(opts.batch_size), + query_stmt, + txn_boundary_returned: false, + mode: opts.mode, + }) + } + /// Start replay session which can apply [DatabaseTapeOperation] from [Self::iterate_changes] + pub async fn start_tape_session(&self) -> Result { + tracing::debug!("opening replay session"); + Ok(DatabaseReplaySession { + conn: self.connect().await?, + cached_delete_stmt: HashMap::new(), + cached_insert_stmt: HashMap::new(), + in_txn: false, + }) + } +} + +#[derive(Debug)] +pub enum DatabaseChangesIteratorMode { + Apply, + Revert, +} + +impl DatabaseChangesIteratorMode { + pub fn query(&self, table_name: &str, limit: usize) -> String { + let (operation, order) = match self { + DatabaseChangesIteratorMode::Apply => (">=", "ASC"), + DatabaseChangesIteratorMode::Revert => ("<=", "DESC"), + }; + format!( + "SELECT * FROM {table_name} WHERE change_id {operation} ? ORDER BY change_id {order} LIMIT {limit}", + ) + } + pub fn first_id(&self) -> i64 { + match self { + DatabaseChangesIteratorMode::Apply => -1, + DatabaseChangesIteratorMode::Revert => i64::MAX, + } + } + pub fn next_id(&self, id: i64) -> i64 { + match self { + DatabaseChangesIteratorMode::Apply => id + 1, + DatabaseChangesIteratorMode::Revert => id - 1, + } + } +} + +#[derive(Debug)] +pub struct DatabaseChangesIteratorOpts { + pub first_change_id: Option, + pub batch_size: usize, + pub mode: DatabaseChangesIteratorMode, +} + +impl Default for DatabaseChangesIteratorOpts { + fn default() -> Self { + Self { + first_change_id: None, + batch_size: DEFAULT_CHANGES_BATCH_SIZE, + mode: DatabaseChangesIteratorMode::Apply, + } + } +} + +pub struct DatabaseChangesIterator { + query_stmt: turso::Statement, + first_change_id: Option, + batch: VecDeque, + txn_boundary_returned: bool, + mode: DatabaseChangesIteratorMode, +} + +impl DatabaseChangesIterator { + pub async fn next(&mut self) -> Result> { + if self.batch.is_empty() { + self.refill().await?; + } + // todo(sivukhin): iterator must be more clever about transaction boundaries - but for that we need to extend CDC table + // for now, if iterator reach the end of CDC table - we are sure that this is a transaction boundary + if let Some(change) = self.batch.pop_front() { + self.txn_boundary_returned = false; + Ok(Some(DatabaseTapeOperation::RowChange(change))) + } else if !self.txn_boundary_returned { + self.txn_boundary_returned = true; + Ok(Some(DatabaseTapeOperation::Commit)) + } else { + Ok(None) + } + } + async fn refill(&mut self) -> Result<()> { + let change_id_filter = self.first_change_id.unwrap_or(self.mode.first_id()); + self.query_stmt.reset(); + + let mut rows = self.query_stmt.query((change_id_filter,)).await?; + while let Some(row) = rows.next().await? { + let database_change: DatabaseChange = row.try_into()?; + let tape_change = match self.mode { + DatabaseChangesIteratorMode::Apply => database_change.into_apply()?, + DatabaseChangesIteratorMode::Revert => database_change.into_revert()?, + }; + self.batch.push_back(tape_change); + } + let batch_len = self.batch.len(); + if batch_len > 0 { + self.first_change_id = Some(self.mode.next_id(self.batch[batch_len - 1].change_id)); + } + Ok(()) + } +} + +pub struct DatabaseReplaySession { + conn: turso::Connection, + cached_delete_stmt: HashMap, + cached_insert_stmt: HashMap<(String, usize), turso::Statement>, + in_txn: bool, +} + +impl DatabaseReplaySession { + pub async fn replay(&mut self, operation: DatabaseTapeOperation) -> Result<()> { + match operation { + DatabaseTapeOperation::Commit => { + tracing::trace!("replay: commit replayed changes after transaction boundary"); + if self.in_txn { + self.conn.execute("COMMIT", ()).await?; + self.in_txn = false; + } + } + DatabaseTapeOperation::RowChange(change) => { + if !self.in_txn { + tracing::trace!("replay: start txn for replaying changes"); + self.conn.execute("BEGIN", ()).await?; + self.in_txn = true; + } + tracing::trace!("replay: change={:?}", change); + let table_name = &change.table_name; + match change.change { + DatabaseTapeRowChangeType::Delete => { + self.replay_delete(table_name, change.id).await? + } + DatabaseTapeRowChangeType::Update { bin_record } => { + self.replay_delete(table_name, change.id).await?; + let values = parse_bin_record(bin_record)?; + self.replay_insert(table_name, change.id, values).await?; + } + DatabaseTapeRowChangeType::Insert { bin_record } => { + let values = parse_bin_record(bin_record)?; + self.replay_insert(table_name, change.id, values).await?; + } + } + } + } + Ok(()) + } + async fn replay_delete(&mut self, table_name: &str, id: i64) -> Result<()> { + let stmt = self.cached_delete_stmt(table_name).await?; + stmt.execute((id,)).await?; + Ok(()) + } + async fn replay_insert( + &mut self, + table_name: &str, + id: i64, + mut values: Vec, + ) -> Result<()> { + let columns = values.len(); + let stmt = self.cached_insert_stmt(table_name, columns).await?; + + values.push(turso::Value::Integer(id)); + let params = turso::params::Params::Positional(values); + + stmt.execute(params).await?; + Ok(()) + } + async fn cached_delete_stmt(&mut self, table_name: &str) -> Result<&mut turso::Statement> { + if !self.cached_delete_stmt.contains_key(table_name) { + tracing::trace!("prepare delete statement for replay: table={}", table_name); + let query = format!("DELETE FROM {table_name} WHERE rowid = ?"); + let stmt = self.conn.prepare(&query).await?; + self.cached_delete_stmt.insert(table_name.to_string(), stmt); + } + tracing::trace!( + "ready to use prepared delete statement for replay: table={}", + table_name + ); + Ok(self.cached_delete_stmt.get_mut(table_name).unwrap()) + } + async fn cached_insert_stmt( + &mut self, + table_name: &str, + columns: usize, + ) -> Result<&mut turso::Statement> { + let key = (table_name.to_string(), columns); + if !self.cached_insert_stmt.contains_key(&key) { + tracing::trace!( + "prepare insert statement for replay: table={}, columns={}", + table_name, + columns + ); + let mut table_info = self + .conn + .query( + &format!("SELECT name FROM pragma_table_info('{table_name}')"), + (), + ) + .await?; + + let mut column_names = Vec::with_capacity(columns + 1); + while let Some(table_info_row) = table_info.next().await? { + let value = table_info_row.get_value(0)?; + column_names.push(value.as_text().expect("must be text").to_string()); + } + column_names.push("rowid".to_string()); + + let placeholders = ["?"].repeat(columns + 1).join(","); + let column_names = column_names.join(", "); + let query = format!("INSERT INTO {table_name}({column_names}) VALUES ({placeholders})"); + let stmt = self.conn.prepare(&query).await?; + self.cached_insert_stmt.insert(key.clone(), stmt); + } + tracing::trace!( + "ready to use prepared insert statement for replay: table={}, columns={}", + table_name, + columns + ); + Ok(self.cached_insert_stmt.get_mut(&key).unwrap()) + } +} + +fn parse_bin_record(bin_record: Vec) -> Result> { + let record = turso_core::types::ImmutableRecord::from_bin_record(bin_record); + let mut cursor = turso_core::types::RecordCursor::new(); + let columns = cursor.count(&record); + let mut values = Vec::with_capacity(columns); + for i in 0..columns { + let value = cursor.get_value(&record, i)?; + values.push(value.to_owned().into()); + } + Ok(values) +} + +#[cfg(test)] +mod tests { + use tempfile::NamedTempFile; + + use crate::database_tape::DatabaseTape; + + async fn fetch_rows(conn: &turso::Connection, query: &str) -> Vec> { + let mut rows = vec![]; + let mut iterator = conn.query(query, ()).await.unwrap(); + while let Some(row) = iterator.next().await.unwrap() { + let mut row_values = vec![]; + for i in 0..row.column_count() { + row_values.push(row.get_value(i).unwrap()); + } + rows.push(row_values); + } + rows + } + + #[tokio::test] + async fn test_database_cdc() { + let temp_file1 = NamedTempFile::new().unwrap(); + let db_path1 = temp_file1.path().to_str().unwrap(); + + let temp_file2 = NamedTempFile::new().unwrap(); + let db_path2 = temp_file2.path().to_str().unwrap(); + + let db1 = turso::Builder::new_local(db_path1).build().await.unwrap(); + let db1 = DatabaseTape::new(db1); + let conn1 = db1.connect().await.unwrap(); + + let db2 = turso::Builder::new_local(db_path2).build().await.unwrap(); + let db2 = DatabaseTape::new(db2); + let conn2 = db2.connect().await.unwrap(); + + conn1 + .execute("CREATE TABLE a(x INTEGER PRIMARY KEY, y);", ()) + .await + .unwrap(); + conn1 + .execute("CREATE TABLE b(x INTEGER PRIMARY KEY, y, z);", ()) + .await + .unwrap(); + conn2 + .execute("CREATE TABLE a(x INTEGER PRIMARY KEY, y);", ()) + .await + .unwrap(); + conn2 + .execute("CREATE TABLE b(x INTEGER PRIMARY KEY, y, z);", ()) + .await + .unwrap(); + + conn1 + .execute("INSERT INTO a VALUES (1, 'hello'), (2, 'turso')", ()) + .await + .unwrap(); + + conn1 + .execute( + "INSERT INTO b VALUES (3, 'bye', 0.1), (4, 'limbo', 0.2)", + (), + ) + .await + .unwrap(); + + let mut iterator = db1.iterate_changes(Default::default()).await.unwrap(); + { + let mut replay = db2.start_tape_session().await.unwrap(); + while let Some(change) = iterator.next().await.unwrap() { + replay.replay(change).await.unwrap(); + } + } + assert_eq!( + fetch_rows(&conn2, "SELECT * FROM a").await, + vec![ + vec![ + turso::Value::Integer(1), + turso::Value::Text("hello".to_string()) + ], + vec![ + turso::Value::Integer(2), + turso::Value::Text("turso".to_string()) + ], + ] + ); + assert_eq!( + fetch_rows(&conn2, "SELECT * FROM b").await, + vec![ + vec![ + turso::Value::Integer(3), + turso::Value::Text("bye".to_string()), + turso::Value::Real(0.1) + ], + vec![ + turso::Value::Integer(4), + turso::Value::Text("limbo".to_string()), + turso::Value::Real(0.2) + ], + ] + ); + + conn1 + .execute("DELETE FROM b WHERE y = 'limbo'", ()) + .await + .unwrap(); + + { + let mut replay = db2.start_tape_session().await.unwrap(); + while let Some(change) = iterator.next().await.unwrap() { + replay.replay(change).await.unwrap(); + } + } + + assert_eq!( + fetch_rows(&conn2, "SELECT * FROM a").await, + vec![ + vec![ + turso::Value::Integer(1), + turso::Value::Text("hello".to_string()) + ], + vec![ + turso::Value::Integer(2), + turso::Value::Text("turso".to_string()) + ], + ] + ); + assert_eq!( + fetch_rows(&conn2, "SELECT * FROM b").await, + vec![vec![ + turso::Value::Integer(3), + turso::Value::Text("bye".to_string()), + turso::Value::Real(0.1) + ],] + ); + + conn1 + .execute("UPDATE b SET y = x'deadbeef' WHERE x = 3", ()) + .await + .unwrap(); + + { + let mut replay = db2.start_tape_session().await.unwrap(); + while let Some(change) = iterator.next().await.unwrap() { + replay.replay(change).await.unwrap(); + } + } + + assert_eq!( + fetch_rows(&conn2, "SELECT * FROM a").await, + vec![ + vec![ + turso::Value::Integer(1), + turso::Value::Text("hello".to_string()) + ], + vec![ + turso::Value::Integer(2), + turso::Value::Text("turso".to_string()) + ], + ] + ); + assert_eq!( + fetch_rows(&conn2, "SELECT * FROM b").await, + vec![vec![ + turso::Value::Integer(3), + turso::Value::Blob(vec![0xde, 0xad, 0xbe, 0xef]), + turso::Value::Real(0.1) + ]] + ); + } +} diff --git a/packages/turso-sync/src/errors.rs b/packages/turso-sync/src/errors.rs new file mode 100644 index 000000000..dc9191e46 --- /dev/null +++ b/packages/turso-sync/src/errors.rs @@ -0,0 +1,19 @@ +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("database error: {0}")] + TursoError(turso::Error), + #[error("database tape error: {0}")] + DatabaseTapeError(String), +} + +impl From for Error { + fn from(value: turso::Error) -> Self { + Self::TursoError(value) + } +} + +impl From for Error { + fn from(value: turso_core::LimboError) -> Self { + Self::TursoError(value.into()) + } +} diff --git a/packages/turso-sync/src/lib.rs b/packages/turso-sync/src/lib.rs new file mode 100644 index 000000000..b280e1d4d --- /dev/null +++ b/packages/turso-sync/src/lib.rs @@ -0,0 +1,17 @@ +pub mod database_tape; +pub mod errors; +pub mod types; + +pub type Result = std::result::Result; + +#[cfg(test)] +mod tests { + use tracing_subscriber::EnvFilter; + + #[ctor::ctor] + fn init() { + tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .init(); + } +} diff --git a/packages/turso-sync/src/types.rs b/packages/turso-sync/src/types.rs new file mode 100644 index 000000000..473733f74 --- /dev/null +++ b/packages/turso-sync/src/types.rs @@ -0,0 +1,210 @@ +use crate::{errors::Error, Result}; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum DatabaseChangeType { + Delete, + Update, + Insert, +} + +/// [DatabaseChange] struct represents data from CDC table as-i +/// (see `turso_cdc_table_columns` definition in turso-core) +#[derive(Clone)] +pub struct DatabaseChange { + /// Monotonically incrementing change number + pub change_id: i64, + /// Unix timestamp of the change (not guaranteed to be strictly monotonic as host clocks can drift) + pub change_time: u64, + /// Type of the change + pub change_type: DatabaseChangeType, + /// Table of the change + pub table_name: String, + /// Rowid of changed row + pub id: i64, + /// Binary record of the row before the change, if CDC pragma set to either 'before' or 'full' + pub before: Option>, + /// Binary record of the row after the change, if CDC pragma set to either 'after' or 'full' + pub after: Option>, +} + +impl DatabaseChange { + /// Converts [DatabaseChange] into the operation which effect will be the application of the change + pub fn into_apply(self) -> Result { + let tape_change = match self.change_type { + DatabaseChangeType::Delete => DatabaseTapeRowChangeType::Delete, + DatabaseChangeType::Update => DatabaseTapeRowChangeType::Update { + bin_record: self.after.ok_or_else(|| { + Error::DatabaseTapeError( + "cdc_mode must be set to either 'full' or 'after'".to_string(), + ) + })?, + }, + DatabaseChangeType::Insert => DatabaseTapeRowChangeType::Insert { + bin_record: self.after.ok_or_else(|| { + Error::DatabaseTapeError( + "cdc_mode must be set to either 'full' or 'after'".to_string(), + ) + })?, + }, + }; + Ok(DatabaseTapeRowChange { + change_id: self.change_id, + change_time: self.change_time, + change: tape_change, + table_name: self.table_name, + id: self.id, + }) + } + /// Converts [DatabaseChange] into the operation which effect will be the revert of the change + pub fn into_revert(self) -> Result { + let tape_change = match self.change_type { + DatabaseChangeType::Delete => DatabaseTapeRowChangeType::Insert { + bin_record: self.before.ok_or_else(|| { + Error::DatabaseTapeError( + "cdc_mode must be set to either 'full' or 'before'".to_string(), + ) + })?, + }, + DatabaseChangeType::Update => DatabaseTapeRowChangeType::Update { + bin_record: self.before.ok_or_else(|| { + Error::DatabaseTapeError( + "cdc_mode must be set to either 'full' or 'before'".to_string(), + ) + })?, + }, + DatabaseChangeType::Insert => DatabaseTapeRowChangeType::Delete, + }; + Ok(DatabaseTapeRowChange { + change_id: self.change_id, + change_time: self.change_time, + change: tape_change, + table_name: self.table_name, + id: self.id, + }) + } +} + +impl std::fmt::Debug for DatabaseChange { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DatabaseChange") + .field("change_id", &self.change_id) + .field("change_time", &self.change_time) + .field("change_type", &self.change_type) + .field("table_name", &self.table_name) + .field("id", &self.id) + .field("before.len()", &self.before.as_ref().map(|x| x.len())) + .field("after.len()", &self.after.as_ref().map(|x| x.len())) + .finish() + } +} + +impl TryFrom for DatabaseChange { + type Error = Error; + + fn try_from(row: turso::Row) -> Result { + let change_id = get_value_i64(&row, 0)?; + let change_time = get_value_i64(&row, 1)? as u64; + let change_type = get_value_i64(&row, 2)?; + let table_name = get_value_text(&row, 3)?; + let id = get_value_i64(&row, 4)?; + let before = get_value_blob_or_null(&row, 5)?; + let after = get_value_blob_or_null(&row, 6)?; + + let change_type = match change_type { + -1 => DatabaseChangeType::Delete, + 0 => DatabaseChangeType::Update, + 1 => DatabaseChangeType::Insert, + v => { + return Err(Error::DatabaseTapeError(format!( + "unexpected change type: expected -1|0|1, got '{v:?}'" + ))) + } + }; + Ok(Self { + change_id, + change_time, + change_type, + table_name, + id, + before, + after, + }) + } +} + +pub enum DatabaseTapeRowChangeType { + Delete, + Update { bin_record: Vec }, + Insert { bin_record: Vec }, +} + +/// [DatabaseTapeOperation] extends [DatabaseTapeRowChange] by adding information about transaction boundary +/// +/// This helps [crate::database_tape::DatabaseTapeSession] to properly maintain transaction state and COMMIT or ROLLBACK changes in appropriate time +/// by consuming events from [crate::database_tape::DatabaseChangesIterator] +#[derive(Debug)] +pub enum DatabaseTapeOperation { + RowChange(DatabaseTapeRowChange), + Commit, +} + +/// [DatabaseTapeRowChange] is the specific operation over single row which can be performed on database +#[derive(Debug)] +pub struct DatabaseTapeRowChange { + pub change_id: i64, + pub change_time: u64, + pub change: DatabaseTapeRowChangeType, + pub table_name: String, + pub id: i64, +} + +impl std::fmt::Debug for DatabaseTapeRowChangeType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Delete => write!(f, "Delete"), + Self::Update { bin_record } => f + .debug_struct("Update") + .field("bin_record.len()", &bin_record.len()) + .finish(), + Self::Insert { bin_record } => f + .debug_struct("Insert") + .field("bin_record.len()", &bin_record.len()) + .finish(), + } + } +} + +fn get_value(row: &turso::Row, index: usize) -> Result { + row.get_value(index).map_err(Error::TursoError) +} + +fn get_value_i64(row: &turso::Row, index: usize) -> Result { + let v = get_value(row, index)?; + match v { + turso::Value::Integer(v) => Ok(v), + v => Err(Error::DatabaseTapeError(format!( + "column {index} type mismatch: expected integer, got '{v:?}'" + ))), + } +} + +fn get_value_text(row: &turso::Row, index: usize) -> Result { + let v = get_value(row, index)?; + match v { + turso::Value::Text(x) => Ok(x), + v => Err(Error::DatabaseTapeError(format!( + "column {index} type mismatch: expected string, got '{v:?}'" + ))), + } +} + +fn get_value_blob_or_null(row: &turso::Row, index: usize) -> Result>> { + let v = get_value(row, index)?; + match v { + turso::Value::Null => Ok(None), + turso::Value::Blob(x) => Ok(Some(x)), + v => Err(Error::DatabaseTapeError(format!( + "column {index} type mismatch: expected blob, got '{v:?}'" + ))), + } +}