QWIYNMI5SOTLRPYE4O3AG7R75JXM2TB3ZADU646PG6ACPBGSYUYAC LV34DUJYQNSHJSNFALRRS3FFQWUU57HIJU26TTKNXDFWD6UWD4QAC VJL7SCH2DKVXDXXWSNAECPPTDAH62PTJRZWNYZU25C4IMFUI5OJAC SCXMBF3YX34HIMX3IZNRMBLCXY2FSBRNCP6MXJH4UEBXUML45I5AC LLBKJA6YL3R5GWU5E2WRKACD3CVME2LCTVWBOAZF6IFEBZJHQFCQC HL3VKIZF574C3RLSDQPL275KYXGXMIFZABFP5PWC5RVW3BDGDX7QC UDJN7TUNWHRCQPKM2KNGYAB5DNQGXNQW6PZ662MH7G3PT5FEQYUAC CX2FTBQUYK4BPKDW3LNX4VS7O2EALLEY4VI7PSOZRAEJ5J4B664QC ADZQB6NYJ2TUVXPIEWOZT7D7C7TU2MRB6PXFKZCR2TBLPWUCR6XQC XQHABMC2FOMH7SZIYVYAR5MNH2DK2AOUCX2RJKZM3PDG2H5JIXYQC 3VI4Z7VZBYSMPFDVKJO3BQME7SESRPLTTARIGC5WDFJNXKY6LS5AC LXKZODXJKDAKPLZJN22UNPYSJ5VOFIVZVXRXTTZZ2LJTCBGITYWQC DFRNZLQ6APMFQUPOPG5BS4RYUBZI32UZVP7T4EKJ7VDGOB3KORCQC QSTVUSKXAEHSKFB4RKSLGWVK6TGRPT64ORQFAL7E3SVO4GMCVDWQC CVS6BHXRJF4LZAMYB7B233DYSR57NUHFU45GDUKZLJO5HIPH22KAC STOFOQI47HS22EDKDFUFF4Z5NNZ6MXJFXETEZSITTOD7OYTETB2AC TDCDBT6XVI5N654HPVJW2IEYCK2PFCMAV52V24NHVBYY5GDMR7YQC DH54ZJMWE66C6MBAFM4BEWBNRUPUHKP7N7OR6WZG76F5TCJ2F5DQC YV63XF6Z3S3GJKCOXPOLFRR7E5JH3QX6PIWXDMFFDTOOUXGOBWNQC FMLTNQ4EYXA54OGII5AX2G2I7YFDVNMTOM7GDDTCKBTWGZPABH2AC 7GQGVFEANEFOA2S5BVH5SVFLJKSJ3TLYWAEJGIX2TPASFHXGS4JAC Q3UD2OLQNCBH7AQOH4M3R75KER5GLG2SAB2O2UDAMMBRUEKQMCXAC ALKSQF2FA5VUUUU3IMCDOWRB5PL4AXINZUA5I27SGNKQPD6Z7J3QC 6O65JNAFH6E2BNDDKBKPRMBRY6KZF2PLA3FCR2JBXRO6WH2UJDDQC MMQCFCIE6XK64R3QDV3ZSPAD3POWLKHZ2ZPUJP326FDLZROSYOCQC AHAXT26RD6V64L2ZSWNW3HKEJ4RV26ISL4PYFP3IGC4EVJM5U3IAC DO2Y5TY5JQISUHCVNPI2FXO7WWZVJQ3LGPWF4DNADMGZRIO6PT2QC SXEYMYF7P4RZMZ46WPL4IZUTSQ2ATBWYZX7QNVMS3SGOYXYOHAGQC IBPVOKM5MXTGB2P7LCD75MISAYUNDPEKQAUEVCXJJWLWCX2TJZBAC 4HTHYIA3GLMUBUMAI7CQMZA4KE47EUXOP24XLUEYFRMOG57CJLMAC C3L2TLQWREYOM3YHL37L7PS74YGLHBEDQRSCVMYIU6HKBEPNN2SAC LZOGKBJXRQJKXHYNNENJFGNLP5SHIXGSV6HDB7UVOP7FSA5EUNCQC FBXYP7QM7SG6P2JDJVQPPCRKJE3GVYXNQ5GVV4GRDUNG6Q4ZRDJQC IQ4FCHPZYGTZHCQHUIRCMUI5LCHIDSJCM2AZXGRJARWLCPPLXZOQC 4OJWMSOWWNT5N4W4FDMKBZB5UARCLGV3SRZVKGR4EFAYFUMUHM7AC UMF6N7CZA4CTSPKQFZSZXA3VRHWQAKEA5GUNIEAAVRWC7FUSSKAAC 4KJ45IJLTIE35KQZUSFMFS67RNENG4P2FZMKMULJLGGYMKJUVRSQC KWD6K4F73WZGP7GZLKZHXF7364QNCVNFWEYCCLFPQINMLPZBTWAQC QL6K2ZM35B3NIXEMMCJWUSFXOBQHAGXRDMO7ID5DCKTJH4QJVY7QC LJFJEX43HDS33O5HCRXH7AR3GTQZDHNWHEQBOERDNPNXR3B3XZ3QC IKZBGTGQ7GJMRPYJPLL66DMND6J2JBP6I23U4GGCB5CMDG4FUHLAC VWJ2JL63I5OYZ2HS3N4EKM5TW7HRAF5U3OAHDQIVZINIO73IAE7AC MQ6ERQ43MWASF2OSG65FHKWHCWT35BJVFJWKHAFPVCTLICCTJWUAC 6ARU5AQ7GNBGDDRDOSPINGDO6V6RMF3UIJ2EKVJQREZ7DWQF2OXQC RVAH6PXA7H7NUDTF7Q52I7EXGXVJVMGI2LTNN6L3MVEDEMAXVH4AC ZFSIT55UO5CEMMNAARCEXHK5INIXZUSPTT4OQUVGBO67EAGR6PVQC 3QXUJMZDPH2EDJY6UXIRA5ZQK3GRS2R422S7CKN56I36O4POAQXQC 3CFU4DQNHPPJC2B63RSVAVGHTQZT3RT5CCHHYC4ZM6DQ4GVQULSQC 6YMDOZIB5LVYLFIDGN2WNT5JTHEAMS4TFPVDEZ3OWXWOKJOC5QDAC BC3QS46ORO56YB2LO3PRU74ITVOYFFKL3GGIBPV4M2DPH6NYJMEAC DX2FO4HZDTTBU436YRPQW3MIIVFB3ZFSZ3SI5GYLTIWCIGRTQ6DAC N3X5YP7PV2XVQKRRWSRCGJG34HZPLV4BGBLZGJG55KGIB7ORJ77QC C267PHOH3QJBSBEWQB3J7PPOOXIUKM3DIIZIPLHPU4D5OXRCGLZAC YN63NUZO4LVJ7XPMURDULTXBVJKW5MVCTZ24R7Z52QMHO3HPDUVQC RMDMAYRXYBU5OQXV5HSF6LFD4NBMKRNH5EPIVW3K5HAV6D56IG6QC FGIVSUFHH7DN65DYQHDGGDDCHHIB5Z7KKQWI4I3WMERE3BY6IMRQC TVVW53HZGYPODAXEQ4BFZNSPBOFG6JEDVOKIYIDZMWFAMOBKOR2QC ZBNKSYA6PW4DSPC3NCRUZLVHW2GNXMCSDSAGEIKHGHDGGZRBH7ZQC I24UEJQLCH2SOXA4UHIYWTRDCHSOPU7AFTRUOTX7HZIAV4AZKYEQC 5OGOE4VWS5AIG4U2UYLLIGA3HY6UB7SNQOSESHNXBLET3VQXFBZAC QDP3R3BG6HNETNP4ZZM2IGB6WRJKF5ZKE5SWZYMLK47ZDWFSLRFAC A3RM526Y7LUXNYW4TL56YKQ5GVOK2R5D7JJVTSQ6TT5MEXIR6YAAC IIV3EL2XYI2X7HZWKXEXQFAE3R3KC2Q7SGOT3Q332HSENMYVF32QC 5MRZLKBHOFFUAJELWL34XILG2XVWPUEHOFPDXBK5ASCO6H26MBFAC D66CRGCNWIZ7NDFKPPICWJHNEIIEM7T4IIUELH3T4NHRUADQXIUQC WP4ACVG5X5RRNIWFARSGLUN4RCPX4IMQA7NFZWV6MKQ6WXAH3Y5QC GHO6DWPILBBTL6CVZKERJBTFL3EY6ZT4YM4E5R4S6YPGVFKFHCVAC FXEDPLRI7PXLDXV634ZA6D5Q3ZWG3ESTKJTMRPJ4MAHI7PKU3M6AC RM225IDQR36MNBMN7OT2R562M4FUD6L34RY7A3WDBBETZIIDKZ5AC CCLLB7OIFNFYJZTG3UCI7536TOCWSCSXR67VELSB466R24WLJSDAC 7ZFRYVVQQGJYG3POPWJWL3CDW37YDXZYZQC3OSWFHWEUSEMYQ4EQC ZXTHL45OYLOICXTXXEQ6AMNSLMQFZ6BFUJWMO6LZOSDK7ERROC5AC TZ42DX3BML5C3O5Z6OBVNBCHSIIHT6AOJPD6ICOLOP4LPYFXQN2QC L5JW24DB46ZJDJBOMFULVJRMUBF67LG2NP2GWLLBVYC524CYV5LQC TKEVOH7HXON7SOBGXTUDHAHO2U2GPTQRNESP6ERKUQAS526OZIRAC G6YXRFH24OGXYVO4535WCNQMMWOLDH6JYXFDBCL2HQZSOFD25Z5AC VSOT2QH5OFG6XX6P7TXZF62IDA2FL7PSEPA2YJCAEFQNJTD5MMLAC NGCTMCDPB45UDEXX3RMMQ4JXPILETG7EEFNKMLGP4SJJK52XPLOAC RRCSHAYZ6RLWVPNYHF2F5FSRL2KKJNPQUQRIJYLJGB23BZQQ7JLQC BZSC7VMYSFRXDHDDAMCDR6X67FN5VWIBOSE76BQLX7OCVOJFUA3AC 7S4YD633DZUPKQNVB5KZBB2XK6FWI6NI2MLPB2P3NJFH443S4QCQC AF5AKUTO7AUAWFO5JS4W5BC5IG2F4EB4MGKYC5Q2CWJCVB65ZRYQC I3OVP3NHSMB2YLU4EPU5BFH7KB54PMQ4WDATGINIJKRIHMSVFUSQC YXAVFTPP2PQAYMKGQH7QNKFVGKDI2UHVWB7SIDA4QEYSBP75ZGUQC YRBOKAWJVS24QTCEMYIUWTEE6HE7BM5OBF5U5MPYFTYW4ZYV2THQC Z5RPHAV3O3HLVHEN7MIZDMACMYGG37SX2YWHOWVGJ4YLFDZFGPGQC VO5OQW4W2656DIYYRNZ3PO7TQ4JOKQ3GVWE5ALUTYVMX3WMXJOYQC 5FI6SBEZ6RERERUAIWQJVAY66BEZ7YQOYOUNK2DPOLRGS2X326RAC UN2M77YUIQZMPH5CQARPUUK2Q66RHN5J6BIIQQFEJ35DSFSKFFPQC OXZVZDQZEVP7NV3HS6HK5QA7RUD35ODVQ3LL7PWJHTS7DEFM3XTAC X7OHUPL5VYT6ECER2KNGRNFLRX7SBZOM5QWSQ4PBO2UPIE7XM6MAC 43SISRQ4CLKXN5YVFAGWUU3OJBT2TX6QXWWER33ONLEITSCFCUBAC U2CGP7OPHQZNAAPWCRSFVZQWXFRVCB2NC3APRA7ACQJZBIVBE6IQC T7YIRFWDA75AC2JSWVVAIDK6J5ICOGYHTGZNGLTJU6SIGXKUGCLQC VAPBIG46QVLGCASUE2QLISQ6657CZRAMNEG2PRK7FKEKAYM7FS3QC TNN56XYKX4QRHA4FWCF5F3JVG52FIAC76EEYYANDKEE4IAWQKPEQC SGXOEWHUET7RVS5HANSYE7QRQAG56NIKTC56MLPZ5XBCXODEWUXQC EJ7TFFOWLM5EXYX57NJZZX3NLPBLLMRX7CGJYC75DJZ5LYXOQPJAC struct CopyTxn {}impl ::sanakirja::AllocPage for CopyTxn {/// Allocate a single page.unsafe fn alloc_page(&mut self) -> Result<::sanakirja::MutPage, Self::Error> {unimplemented!()}/// Allocate a single page.unsafe fn alloc_page_no_dirty(&mut self) -> Result<::sanakirja::MutPage, Self::Error> {unimplemented!()}/// Allocate many contiguous pages, return the first oneunsafe fn alloc_contiguous(&mut self, _: u64) -> Result<::sanakirja::MutPage, Self::Error> {unimplemented!()}/// Increment the reference count for page `off`.fn incr_rc(&mut self, _: u64) -> Result<usize, Self::Error> {unimplemented!()}unsafe fn decr_rc(&mut self, _: u64) -> Result<usize, Self::Error> {unimplemented!()}unsafe fn decr_rc_owned(&mut self, _: u64) -> Result<usize, Self::Error> {unimplemented!()}}impl ::sanakirja::LoadPage for CopyTxn {type Error = std::convert::Infallible;unsafe fn load_page(&self, _: u64) -> Result<::sanakirja::CowPage, Self::Error> {unimplemented!()}}
use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(db.graph);Ok(::sanakirja::btree::get(self, &gr, key, value)?.map(|(_, v)| v))
unsafe {use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(db.graph);Ok(::sanakirja::btree::get(self, &gr, key, value)?.map(|(_, v)| v))}
use crate::pristine::sanakirja::UDb;let gr: UDb<ChangeId, SerializedHash> = UDb::from_page(self.header.offsets.external);Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))
unsafe {use crate::pristine::sanakirja::UDb;let gr: UDb<ChangeId, SerializedHash> = UDb::from_page(self.header.offsets.external);Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))}
use crate::pristine::sanakirja::UDb;let gr: UDb<SerializedHash, ChangeId> = UDb::from_page(self.header.offsets.internal);Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))
unsafe {use crate::pristine::sanakirja::UDb;let gr: UDb<SerializedHash, ChangeId> = UDb::from_page(self.header.offsets.internal);Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))}
let edge = SerializedEdge::new(min_flag, dest.change, dest.pos, ChangeId::ROOT);use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(g.graph);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &gr)?;cursor.set(self, &key, Some(&edge))?;Ok(Self::Adj {cursor,key,min_flag,max_flag,})
unsafe {let edge = SerializedEdge::new(min_flag, dest.change, dest.pos, ChangeId::ROOT);use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(g.graph);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &gr)?;cursor.set(self, &key, Some(&edge))?;Ok(Self::Adj {cursor,key,min_flag,max_flag,})}
use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);Ok(crate::pristine::sanakirja::find_block(self, &gr, p)?)
unsafe {use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);Ok(crate::pristine::sanakirja::find_block(self, &gr, p)?)}
use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);Ok(crate::pristine::sanakirja::find_block_end(self, &gr, p)?)
unsafe {use crate::pristine::sanakirja::Db;let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);Ok(crate::pristine::sanakirja::find_block_end(self, &gr, p)?)}
use crate::pristine::sanakirja::Db;let db: Db<ChangeId, L64> = Db::from_page(*channel);match ::sanakirja::btree::get(self, &db, c, None) {Ok(Some((k, x))) if k == c => Ok(Some(x)),Ok(x) => {debug!("get_changeset = {:?}", x);Ok(None)
unsafe {use crate::pristine::sanakirja::Db;let db: Db<ChangeId, L64> = Db::from_page(*channel);match ::sanakirja::btree::get(self, &db, c, None) {Ok(Some((k, x))) if k == c => Ok(Some(x)),Ok(x) => {debug!("get_changeset = {:?}", x);Ok(None)}Err(e) => {error!("{:?}", e);Err(TxnErr(SanakirjaError::PristineCorrupt).into())}
use crate::pristine::sanakirja::UDb;let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*revchanges);match ::sanakirja::btree::get(self, &db, c, None) {Ok(Some((k, x))) if k == c => Ok(Some(x)),Ok(_) => Ok(None),Err(e) => {error!("{:?}", e);Err(TxnErr(SanakirjaError::PristineCorrupt).into())
unsafe {use crate::pristine::sanakirja::UDb;let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*revchanges);match ::sanakirja::btree::get(self, &db, c, None) {Ok(Some((k, x))) if k == c => Ok(Some(x)),Ok(_) => Ok(None),Err(e) => {error!("{:?}", e);Err(TxnErr(SanakirjaError::PristineCorrupt).into())}
use crate::pristine::sanakirja::Db;let db: Db<ChangeId, L64> = Db::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(k) = pos {cursor.set(self, &k, None)?;
unsafe {use crate::pristine::sanakirja::Db;let db: Db<ChangeId, L64> = Db::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(k) = pos {cursor.set(self, &k, None)?;}Ok(Cursor {cursor,txn: self,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})
use crate::pristine::sanakirja::UDb;let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(&*txn, &db)?;if let Some(k) = pos {cursor.set(&*txn, &k, None)?;
unsafe {use crate::pristine::sanakirja::UDb;let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(&*txn, &db)?;if let Some(k) = pos {cursor.set(&*txn, &k, None)?;}Ok(Cursor {cursor,txn,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})
use crate::pristine::sanakirja::UDb;let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(ref pos) = pos {cursor.set(self, pos, None)?;} else {cursor.set_last(self)?;};Ok(RevCursor {cursor,txn: self,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})
unsafe {use crate::pristine::sanakirja::UDb;let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(ref pos) = pos {cursor.set(self, pos, None)?;} else {cursor.set_last(self)?;};Ok(RevCursor {cursor,txn: self,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})}
use crate::pristine::sanakirja::UDb;let db: UDb<SerializedMerkle, L64> = UDb::from_page(*channel);match ::sanakirja::btree::get(self, &db, m, None)? {Some((k, v)) if k == m => Ok(Some(*v)),_ => Ok(None),
unsafe {use crate::pristine::sanakirja::UDb;let db: UDb<SerializedMerkle, L64> = UDb::from_page(*channel);match ::sanakirja::btree::get(self, &db, m, None)? {Some((k, v)) if k == m => Ok(Some(*v)),_ => Ok(None),}
use crate::pristine::sanakirja::Db;let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*tags);let t: L64 = t.into();match ::sanakirja::btree::get(self, &db, &t, None)? {Some((k, _)) => Ok(k == &t),_ => Ok(false),
unsafe {use crate::pristine::sanakirja::Db;let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*tags);let t: L64 = t.into();match ::sanakirja::btree::get(self, &db, &t, None)? {Some((k, _)) => Ok(k == &t),_ => Ok(false),}
use crate::pristine::sanakirja::Db;let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(k) = k {cursor.set(self, &k, None)?;
unsafe {use crate::pristine::sanakirja::Db;let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(k) = k {cursor.set(self, &k, None)?;}Ok(Cursor {cursor,txn: self,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})
use crate::pristine::sanakirja::Db;let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(from) = from {cursor.set(self, &from.into(), None)?;} else {cursor.set_last(self)?;};Ok(RevCursor {cursor,txn: self,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})
unsafe {use crate::pristine::sanakirja::Db;let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;if let Some(from) = from {cursor.set(self, &from.into(), None)?;} else {cursor.set_last(self)?;};Ok(RevCursor {cursor,txn: self,k: std::marker::PhantomData,v: std::marker::PhantomData,t: std::marker::PhantomData,})}
let mut txn = ::sanakirja::Env::mut_txn_begin(self.env.clone()).unwrap();if let Some(version) = txn.root(Root::Version as usize) {if L64(version) != VERSION {return Err(SanakirjaError::Version.into());
unsafe {let mut txn = ::sanakirja::Env::mut_txn_begin(self.env.clone()).unwrap();if let Some(version) = txn.root(Root::Version as usize) {if version != VERSION {return Err(SanakirjaError::Version.into());}} else {txn.set_root(Root::Version as usize, VERSION);
} else {txn.set_root(Root::Version as usize, VERSION.0);
Ok(MutTxn {channels: if let Some(db) = txn.root_db(Root::Channels as usize) {db} else {btree::create_db_(&mut txn)?},external: if let Some(db) = txn.root_db(Root::External as usize) {db} else {btree::create_db_(&mut txn)?},internal: if let Some(db) = txn.root_db(Root::Internal as usize) {db} else {btree::create_db_(&mut txn)?},inodes: if let Some(db) = txn.root_db(Root::Inodes as usize) {db} else {btree::create_db_(&mut txn)?},revinodes: if let Some(db) = txn.root_db(Root::RevInodes as usize) {db} else {btree::create_db_(&mut txn)?},tree: if let Some(db) = txn.root_db(Root::Tree as usize) {db} else {btree::create_db_(&mut txn)?},revtree: if let Some(db) = txn.root_db(Root::RevTree as usize) {db} else {btree::create_db_(&mut txn)?},revdep: if let Some(db) = txn.root_db(Root::RevDep as usize) {db} else {btree::create_db_(&mut txn)?},dep: if let Some(db) = txn.root_db(Root::Dep as usize) {db} else {btree::create_db_(&mut txn)?},touched_files: if let Some(db) = txn.root_db(Root::TouchedFiles as usize) {db} else {btree::create_db_(&mut txn)?},rev_touched_files: if let Some(db) = txn.root_db(Root::RevTouchedFiles as usize) {db} else {btree::create_db_(&mut txn)?},partials: if let Some(db) = txn.root_db(Root::Partials as usize) {db} else {btree::create_db_(&mut txn)?},remotes: if let Some(db) = txn.root_db(Root::Remotes as usize) {db} else {btree::create_db_(&mut txn)?},open_channels: Mutex::new(HashMap::default()),open_remotes: Mutex::new(HashMap::default()),txn,counter: 0,cur_channel: None,})
Ok(MutTxn {channels: if let Some(db) = txn.root_db(Root::Channels as usize) {db} else {btree::create_db_(&mut txn)?},external: if let Some(db) = txn.root_db(Root::External as usize) {db} else {btree::create_db_(&mut txn)?},internal: if let Some(db) = txn.root_db(Root::Internal as usize) {db} else {btree::create_db_(&mut txn)?},inodes: if let Some(db) = txn.root_db(Root::Inodes as usize) {db} else {btree::create_db_(&mut txn)?},revinodes: if let Some(db) = txn.root_db(Root::RevInodes as usize) {db} else {btree::create_db_(&mut txn)?},tree: if let Some(db) = txn.root_db(Root::Tree as usize) {db} else {btree::create_db_(&mut txn)?},revtree: if let Some(db) = txn.root_db(Root::RevTree as usize) {db} else {btree::create_db_(&mut txn)?},revdep: if let Some(db) = txn.root_db(Root::RevDep as usize) {db} else {btree::create_db_(&mut txn)?},dep: if let Some(db) = txn.root_db(Root::Dep as usize) {db} else {btree::create_db_(&mut txn)?},touched_files: if let Some(db) = txn.root_db(Root::TouchedFiles as usize) {db} else {btree::create_db_(&mut txn)?},rev_touched_files: if let Some(db) = txn.root_db(Root::RevTouchedFiles as usize) {db} else {btree::create_db_(&mut txn)?},partials: if let Some(db) = txn.root_db(Root::Partials as usize) {db} else {btree::create_db_(&mut txn)?},remotes: if let Some(db) = txn.root_db(Root::Remotes as usize) {db} else {btree::create_db_(&mut txn)?},open_channels: Mutex::new(HashMap::default()),open_remotes: Mutex::new(HashMap::default()),txn,counter: 0,cur_channel: None,})
use ::sanakirja::debug::Check;debug!("check: internal 0x{:x}", self.internal.db);self.internal.add_refs(&self.txn, refs).unwrap();debug!("check: external 0x{:x}", self.external.db);self.external.add_refs(&self.txn, refs).unwrap();debug!("check: inodes 0x{:x}", self.inodes.db);self.inodes.add_refs(&self.txn, refs).unwrap();debug!("check: revinodes 0x{:x}", self.revinodes.db);self.revinodes.add_refs(&self.txn, refs).unwrap();debug!("check: tree 0x{:x}", self.tree.db);self.tree.add_refs(&self.txn, refs).unwrap();debug!("check: revtree 0x{:x}", self.revtree.db);self.revtree.add_refs(&self.txn, refs).unwrap();debug!("check: revdep 0x{:x}", self.revdep.db);self.revdep.add_refs(&self.txn, refs).unwrap();debug!("check: dep 0x{:x}", self.dep.db);self.dep.add_refs(&self.txn, refs).unwrap();debug!("check: touched_files 0x{:x}", self.touched_files.db);self.touched_files.add_refs(&self.txn, refs).unwrap();debug!("check: rev_touched_files 0x{:x}", self.rev_touched_files.db);self.rev_touched_files.add_refs(&self.txn, refs).unwrap();debug!("check: partials 0x{:x}", self.partials.db);self.partials.add_refs(&self.txn, refs).unwrap();debug!("check: channels 0x{:x}", self.channels.db);self.channels.add_refs(&self.txn, refs).unwrap();for x in btree::iter(&self.txn, &self.channels, None).unwrap() {let (name, tup) = x.unwrap();debug!("check: channel name: {:?}", name.as_str());let graph: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(tup.graph.into());let changes: Db<ChangeId, L64> = Db::from_page(tup.changes.into());let revchanges: UDb<L64, Pair<ChangeId, SerializedMerkle>> =UDb::from_page(tup.revchanges.into());let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());let tags: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> =Db::from_page(tup.tags.into());debug!("check: graph 0x{:x}", graph.db);graph.add_refs(&self.txn, refs).unwrap();debug!("check: changes 0x{:x}", changes.db);changes.add_refs(&self.txn, refs).unwrap();debug!("check: revchanges 0x{:x}", revchanges.db);revchanges.add_refs(&self.txn, refs).unwrap();debug!("check: states 0x{:x}", states.db);states.add_refs(&self.txn, refs).unwrap();debug!("check: tags 0x{:x}", tags.db);tags.add_refs(&self.txn, refs).unwrap();}debug!("check: remotes 0x{:x}", self.remotes.db);self.remotes.add_refs(&self.txn, refs).unwrap();for x in btree::iter(&self.txn, &self.remotes, None).unwrap() {let (name, tup) = x.unwrap();debug!("check: remote name: {:?}", name);let remote: UDb<L64, Pair<SerializedHash, SerializedMerkle>> =UDb::from_page(tup.remote.into());
unsafe {use ::sanakirja::debug::Check;debug!("check: internal 0x{:x}", self.internal.db);self.internal.add_refs(&self.txn, refs).unwrap();debug!("check: external 0x{:x}", self.external.db);self.external.add_refs(&self.txn, refs).unwrap();debug!("check: inodes 0x{:x}", self.inodes.db);self.inodes.add_refs(&self.txn, refs).unwrap();debug!("check: revinodes 0x{:x}", self.revinodes.db);self.revinodes.add_refs(&self.txn, refs).unwrap();debug!("check: tree 0x{:x}", self.tree.db);self.tree.add_refs(&self.txn, refs).unwrap();debug!("check: revtree 0x{:x}", self.revtree.db);self.revtree.add_refs(&self.txn, refs).unwrap();debug!("check: revdep 0x{:x}", self.revdep.db);self.revdep.add_refs(&self.txn, refs).unwrap();debug!("check: dep 0x{:x}", self.dep.db);self.dep.add_refs(&self.txn, refs).unwrap();debug!("check: touched_files 0x{:x}", self.touched_files.db);self.touched_files.add_refs(&self.txn, refs).unwrap();debug!("check: rev_touched_files 0x{:x}", self.rev_touched_files.db);self.rev_touched_files.add_refs(&self.txn, refs).unwrap();debug!("check: partials 0x{:x}", self.partials.db);self.partials.add_refs(&self.txn, refs).unwrap();debug!("check: channels 0x{:x}", self.channels.db);self.channels.add_refs(&self.txn, refs).unwrap();for x in btree::iter(&self.txn, &self.channels, None).unwrap() {let (name, tup) = x.unwrap();debug!("check: channel name: {:?}", name.as_str());let graph: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(tup.graph.into());let changes: Db<ChangeId, L64> = Db::from_page(tup.changes.into());let revchanges: UDb<L64, Pair<ChangeId, SerializedMerkle>> =UDb::from_page(tup.revchanges.into());let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());let tags: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> =Db::from_page(tup.tags.into());debug!("check: graph 0x{:x}", graph.db);graph.add_refs(&self.txn, refs).unwrap();debug!("check: changes 0x{:x}", changes.db);changes.add_refs(&self.txn, refs).unwrap();debug!("check: revchanges 0x{:x}", revchanges.db);revchanges.add_refs(&self.txn, refs).unwrap();debug!("check: states 0x{:x}", states.db);states.add_refs(&self.txn, refs).unwrap();debug!("check: tags 0x{:x}", tags.db);tags.add_refs(&self.txn, refs).unwrap();}debug!("check: remotes 0x{:x}", self.remotes.db);self.remotes.add_refs(&self.txn, refs).unwrap();for x in btree::iter(&self.txn, &self.remotes, None).unwrap() {let (name, tup) = x.unwrap();debug!("check: remote name: {:?}", name);let remote: UDb<L64, Pair<SerializedHash, SerializedMerkle>> =UDb::from_page(tup.remote.into());
let rev: UDb<SerializedHash, L64> = UDb::from_page(tup.rev.into());let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());let tags: UDb<L64, Pair<SerializedMerkle, SerializedMerkle>> =UDb::from_page(tup.tags.into());debug!("check: remote 0x{:x}", remote.db);remote.add_refs(&self.txn, refs).unwrap();debug!("check: rev 0x{:x}", rev.db);rev.add_refs(&self.txn, refs).unwrap();debug!("check: states 0x{:x}", states.db);states.add_refs(&self.txn, refs).unwrap();debug!("check: tags 0x{:x}", tags.db);tags.add_refs(&self.txn, refs).unwrap();
let rev: UDb<SerializedHash, L64> = UDb::from_page(tup.rev.into());let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());let tags: UDb<L64, Pair<SerializedMerkle, SerializedMerkle>> =UDb::from_page(tup.tags.into());debug!("check: remote 0x{:x}", remote.db);remote.add_refs(&self.txn, refs).unwrap();debug!("check: rev 0x{:x}", rev.db);rev.add_refs(&self.txn, refs).unwrap();debug!("check: states 0x{:x}", states.db);states.add_refs(&self.txn, refs).unwrap();debug!("check: tags 0x{:x}", tags.db);tags.add_refs(&self.txn, refs).unwrap();}::sanakirja::debug::add_free_refs(&self.txn, refs).unwrap();::sanakirja::debug::check_free(&self.txn, &refs);
let name = name.to_owned();match self.open_remotes.lock().entry(name.clone()) {Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {Some((name_, remote)) if name == *name_ => {debug!("load_remote: {:?} {:?}", name_, remote);let r = Remote {remote: UDb::from_page(remote.remote.into()),rev: UDb::from_page(remote.rev.into()),states: UDb::from_page(remote.states.into()),id_rev: remote.id_rev.into(),tags: Db::from_page(remote.tags.into()),path: remote.path.to_owned(),};for x in btree::iter(&self.txn, &r.remote, None).unwrap() {debug!("remote -> {:?}", x);}for x in btree::iter(&self.txn, &r.rev, None).unwrap() {debug!("rev -> {:?}", x);}for x in btree::iter(&self.txn, &r.states, None).unwrap() {debug!("states -> {:?}", x);}
unsafe {let name = name.to_owned();match self.open_remotes.lock().entry(name.clone()) {Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {Some((name_, remote)) if name == *name_ => {debug!("load_remote: {:?} {:?}", name_, remote);let r = Remote {remote: UDb::from_page(remote.remote.into()),rev: UDb::from_page(remote.rev.into()),states: UDb::from_page(remote.states.into()),id_rev: remote.id_rev.into(),tags: Db::from_page(remote.tags.into()),path: remote.path.to_owned(),};for x in btree::iter(&self.txn, &r.remote, None).unwrap() {debug!("remote -> {:?}", x);}for x in btree::iter(&self.txn, &r.rev, None).unwrap() {debug!("rev -> {:?}", x);}for x in btree::iter(&self.txn, &r.states, None).unwrap() {debug!("states -> {:?}", x);}
let r = RemoteRef {db: Arc::new(Mutex::new(r)),id: name,};Ok(Some(v.insert(r).clone()))}_ => return Ok(None),},Entry::Occupied(occ) => Ok(Some(occ.get().clone())),
_ => return Ok(None),},Entry::Occupied(occ) => Ok(Some(occ.get().clone())),}
let name = name.to_owned();match self.open_remotes.lock().entry(name.clone()) {Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {Some((name_, remote)) if *name_ == name => {let r = RemoteRef {db: Arc::new(Mutex::new(Remote {remote: UDb::from_page(remote.remote.into()),rev: UDb::from_page(remote.rev.into()),states: UDb::from_page(remote.states.into()),id_rev: remote.id_rev.into(),tags: Db::from_page(remote.tags.into()),path: remote.path.to_owned(),})),id: name,};v.insert(r);}_ => return Ok(None),},Entry::Occupied(_) => {}
unsafe {let name = name.to_owned();match self.open_remotes.lock().entry(name.clone()) {Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {Some((name_, remote)) if *name_ == name => {let r = RemoteRef {db: Arc::new(Mutex::new(Remote {remote: UDb::from_page(remote.remote.into()),rev: UDb::from_page(remote.rev.into()),states: UDb::from_page(remote.states.into()),id_rev: remote.id_rev.into(),tags: Db::from_page(remote.tags.into()),path: remote.path.to_owned(),})),id: name,};v.insert(r);}_ => return Ok(None),},Entry::Occupied(_) => {}}Ok(self.open_remotes.lock().get(&name).cloned())
let name = crate::small_string::SmallString::from_str(name);let mut commit = None;let result = match self.open_channels.lock().entry(name.clone()) {Entry::Vacant(v) => {let r = match btree::get(&self.txn, &self.channels, &name, None)? {Some((name_, b)) if name_ == name.as_ref() => ChannelRef {r: Arc::new(RwLock::new(Channel {graph: Db::from_page(b.graph.into()),changes: Db::from_page(b.changes.into()),revchanges: UDb::from_page(b.revchanges.into()),states: UDb::from_page(b.states.into()),tags: Db::from_page(b.tags.into()),apply_counter: b.apply_counter.into(),last_modified: b.last_modified.into(),id: b.id,name: name.clone(),})),},_ => {let br = ChannelRef {
unsafe {let name = crate::small_string::SmallString::from_str(name);let mut commit = None;let result = match self.open_channels.lock().entry(name.clone()) {Entry::Vacant(v) => {let r = match btree::get(&self.txn, &self.channels, &name, None)? {Some((name_, b)) if name_ == name.as_ref() => ChannelRef {
graph: btree::create_db_(&mut self.txn)?,changes: btree::create_db_(&mut self.txn)?,revchanges: btree::create_db_(&mut self.txn)?,states: btree::create_db_(&mut self.txn)?,tags: btree::create_db_(&mut self.txn)?,id: {let mut rng = rand::thread_rng();use rand::Rng;let mut x = RemoteId([0; 16]);for x in x.0.iter_mut() {*x = rng.gen()}x},apply_counter: 0,last_modified: 0,
graph: Db::from_page(b.graph.into()),changes: Db::from_page(b.changes.into()),revchanges: UDb::from_page(b.revchanges.into()),states: UDb::from_page(b.states.into()),tags: Db::from_page(b.tags.into()),apply_counter: b.apply_counter.into(),last_modified: b.last_modified.into(),id: b.id,
};commit = Some(br.clone());br}};v.insert(r).clone()
},_ => {let br = ChannelRef {r: Arc::new(RwLock::new(Channel {graph: btree::create_db_(&mut self.txn)?,changes: btree::create_db_(&mut self.txn)?,revchanges: btree::create_db_(&mut self.txn)?,states: btree::create_db_(&mut self.txn)?,tags: btree::create_db_(&mut self.txn)?,id: {let mut rng = rand::thread_rng();use rand::Rng;let mut x = RemoteId([0; 16]);for x in x.0.iter_mut() {*x = rng.gen()}x},apply_counter: 0,last_modified: 0,name: name.clone(),})),};commit = Some(br.clone());br}};v.insert(r).clone()}Entry::Occupied(occ) => occ.get().clone(),};if let Some(commit) = commit {self.put_channel(commit)?;
debug!(target: "drop_channel", "drop channel {:?}", name0);let name = SmallString::from_str(name0);let channel = if let Some(channel) = self.open_channels.lock().remove(&name) {let channel = Arc::try_unwrap(channel.r).map_err(|_| SanakirjaError::ChannelRc {c: name0.to_string(),})?.into_inner();Some((channel.graph,channel.changes,channel.revchanges,channel.states,channel.tags,))} else if let Some((name_, chan)) = btree::get(&self.txn, &self.channels, &name, None)? {if name_ == name.as_ref() {
unsafe {debug!(target: "drop_channel", "drop channel {:?}", name0);let name = SmallString::from_str(name0);let channel = if let Some(channel) = self.open_channels.lock().remove(&name) {let channel = Arc::try_unwrap(channel.r).map_err(|_| SanakirjaError::ChannelRc {c: name0.to_string(),})?.into_inner();
Db::from_page(chan.graph.into()),Db::from_page(chan.changes.into()),UDb::from_page(chan.revchanges.into()),UDb::from_page(chan.states.into()),Db::from_page(chan.tags.into()),
channel.graph,channel.changes,channel.revchanges,channel.states,channel.tags,
} else if let Some((name_, chan)) = btree::get(&self.txn, &self.channels, &name, None)?{if name_ == name.as_ref() {Some((Db::from_page(chan.graph.into()),Db::from_page(chan.changes.into()),UDb::from_page(chan.revchanges.into()),UDb::from_page(chan.states.into()),Db::from_page(chan.tags.into()),))} else {None}
}} else {None};btree::del(&mut self.txn, &mut self.channels, &name, None)?;if let Some((a, b, c, d, e)) = channel {let mut unused_changes = Vec::new();'outer: for x in btree::rev_iter(&self.txn, &c, None)? {let (_, p) = x?;let chan = chan.read();assert_ne!(chan.name.as_str(), name0);if self.channel_has_state(&chan.states, &p.b).map_err(|e| e.0)?.is_some(){// This other channel is in the same state as// our dropped channel is, so all subsequent// patches are in use.break 'outer;
};btree::del(&mut self.txn, &mut self.channels, &name, None)?;if let Some((a, b, c, d, e)) = channel {let mut unused_changes = Vec::new();'outer: for x in btree::rev_iter(&self.txn, &c, None)? {let (_, p) = x?;debug!(target: "drop_channel", "testing unused change: {:?}", p);for chan in self.channels("").map_err(|e| e.0)? {debug!(target: "drop_channel", "channel: {:?}", name);let chan = chan.read();assert_ne!(chan.name.as_str(), name0);if self.channel_has_state(&chan.states, &p.b).map_err(|e| e.0)?.is_some(){// This other channel is in the same state as// our dropped channel is, so all subsequent// patches are in use.break 'outer;}if self.get_changeset(&chan.changes, &p.a).map_err(|e| e.0)?.is_some(){// This channel has a patch, move on.continue 'outer;}
if self.get_changeset(&chan.changes, &p.a).map_err(|e| e.0)?.is_some(){// This channel has a patch, move on.continue 'outer;
debug!(target: "drop_channel", "actually unused: {:?}", p);unused_changes.push(p.a);}let mut deps = Vec::new();for ch in unused_changes.iter() {for x in btree::iter(&self.txn, &self.dep, Some((ch, None)))? {let (k, v) = x?;if k > ch {break;}deps.push((*k, *v));
}debug!(target: "drop_channel", "actually unused: {:?}", p);unused_changes.push(p.a);}let mut deps = Vec::new();for ch in unused_changes.iter() {for x in btree::iter(&self.txn, &self.dep, Some((ch, None)))? {let (k, v) = x?;if k > ch {break;
for (k, v) in deps.drain(..) {debug!(target: "drop_channel", "deleting from revdep: {:?} {:?}", k, v);btree::del(&mut self.txn, &mut self.dep, &k, Some(&v))?;btree::del(&mut self.txn, &mut self.revdep, &v, Some(&k))?;
for (k, v) in deps.drain(..) {debug!(target: "drop_channel", "deleting from revdep: {:?} {:?}", k, v);btree::del(&mut self.txn, &mut self.dep, &k, Some(&v))?;btree::del(&mut self.txn, &mut self.revdep, &v, Some(&k))?;}
btree::drop(&mut self.txn, a)?;btree::drop(&mut self.txn, b)?;btree::drop(&mut self.txn, c)?;btree::drop(&mut self.txn, d)?;btree::drop(&mut self.txn, e)?;Ok(true)} else {Ok(false)
btree::drop(&mut self.txn, a)?;btree::drop(&mut self.txn, b)?;btree::drop(&mut self.txn, c)?;btree::drop(&mut self.txn, d)?;btree::drop(&mut self.txn, e)?;Ok(true)} else {Ok(false)
let mut commit = None;match self.open_remotes.lock().entry(id) {Entry::Vacant(v) => {let r = match btree::get(&self.txn, &self.remotes, &id, None)? {Some((name_, remote)) if *name_ == id => RemoteRef {db: Arc::new(Mutex::new(Remote {remote: UDb::from_page(remote.remote.into()),rev: UDb::from_page(remote.rev.into()),states: UDb::from_page(remote.states.into()),id_rev: remote.id_rev.into(),tags: Db::from_page(remote.tags.into()),path: SmallString::from_str(path),})),id,},_ => {let br = RemoteRef {
unsafe {let mut commit = None;match self.open_remotes.lock().entry(id) {Entry::Vacant(v) => {let r = match btree::get(&self.txn, &self.remotes, &id, None)? {Some((name_, remote)) if *name_ == id => RemoteRef {
remote: btree::create_db_(&mut self.txn)?,rev: btree::create_db_(&mut self.txn)?,states: btree::create_db_(&mut self.txn)?,id_rev: 0u64.into(),tags: btree::create_db(&mut self.txn)?,
remote: UDb::from_page(remote.remote.into()),rev: UDb::from_page(remote.rev.into()),states: UDb::from_page(remote.states.into()),id_rev: remote.id_rev.into(),tags: Db::from_page(remote.tags.into()),
};commit = Some(br.clone());br}};v.insert(r);
},_ => {let br = RemoteRef {db: Arc::new(Mutex::new(Remote {remote: btree::create_db_(&mut self.txn)?,rev: btree::create_db_(&mut self.txn)?,states: btree::create_db_(&mut self.txn)?,id_rev: 0u64.into(),tags: btree::create_db(&mut self.txn)?,path: SmallString::from_str(path),})),id,};commit = Some(br.clone());br}};v.insert(r);}Entry::Occupied(_) => {}
.set_root(Root::RevInodes as usize, self.revinodes.db);self.txn.set_root(Root::Internal as usize, self.internal.db);self.txn.set_root(Root::External as usize, self.external.db);self.txn.set_root(Root::RevDep as usize, self.revdep.db);self.txn.set_root(Root::Channels as usize, self.channels.db);self.txn.set_root(Root::Remotes as usize, self.remotes.db);
.set_root(Root::Tree as usize, u64::from(self.tree.db).into());self.txn.set_root(Root::RevTree as usize, u64::from(self.revtree.db).into());self.txn.set_root(Root::Inodes as usize, u64::from(self.inodes.db).into());self.txn.set_root(Root::RevInodes as usize, self.revinodes.db.into());self.txn.set_root(Root::Internal as usize, self.internal.db.into());self.txn.set_root(Root::External as usize, self.external.db.into());self.txn.set_root(Root::RevDep as usize, self.revdep.db.into());self.txn.set_root(Root::Channels as usize, self.channels.db.into());
.set_root(Root::TouchedFiles as usize, self.touched_files.db.into());self.txn.set_root(Root::Dep as usize, self.dep.db.into());self.txn.set_root(Root::RevTouchedFiles as usize,self.rev_touched_files.db.into(),);self.txn.set_root(Root::Partials as usize, self.partials.db.into());
let name = SmallString::from_str(name);match btree::get(&self.txn, &self.channels, &name, None)? {Some((name_, c)) if name.as_ref() == name_ => {debug!("load_const_channel = {:?} {:?}", name_, c);Ok(Some(Channel {graph: Db::from_page(c.graph.into()),changes: Db::from_page(c.changes.into()),revchanges: UDb::from_page(c.revchanges.into()),states: UDb::from_page(c.states.into()),tags: Db::from_page(c.tags.into()),apply_counter: c.apply_counter.into(),last_modified: c.last_modified.into(),id: c.id,name,}))
unsafe {let name = SmallString::from_str(name);match btree::get(&self.txn, &self.channels, &name, None)? {Some((name_, c)) if name.as_ref() == name_ => {debug!("load_const_channel = {:?} {:?}", name_, c);Ok(Some(Channel {graph: Db::from_page(c.graph.into()),changes: Db::from_page(c.changes.into()),revchanges: UDb::from_page(c.revchanges.into()),states: UDb::from_page(c.states.into()),tags: Db::from_page(c.tags.into()),apply_counter: c.apply_counter.into(),last_modified: c.last_modified.into(),id: c.id,name,}))}_ => Ok(None),
graph: channel.graph.db.into(),changes: channel.changes.db.into(),revchanges: channel.revchanges.db.into(),states: channel.states.db.into(),tags: channel.tags.db.into(),
graph: u64::from(channel.graph.db).into(),changes: u64::from(channel.changes.db).into(),revchanges: u64::from(channel.revchanges.db).into(),states: u64::from(channel.states.db).into(),tags: u64::from(channel.tags.db).into(),
.set_root(Root::RevTouchedFiles as usize, self.rev_touched_files.db);self.txn.set_root(Root::Partials as usize, self.partials.db);debug!(target: "drop_channel", "testing unused change: {:?}", p);for chan in self.channels("").map_err(|e| e.0)? {debug!(target: "drop_channel", "channel: {:?}", name);
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]pub struct L64(pub u64);impl From<usize> for L64 {fn from(u: usize) -> Self {L64((u as u64).to_le())}}impl From<u64> for L64 {fn from(u: u64) -> Self {L64(u.to_le())}}impl From<L64> for u64 {fn from(u: L64) -> Self {u64::from_le(u.0)}}impl From<L64> for usize {fn from(u: L64) -> Self {u64::from_le(u.0) as usize}}impl L64 {pub fn as_u64(&self) -> u64 {u64::from_le(self.0)}pub fn as_usize(&self) -> usize {u64::from_le(self.0) as usize}}impl std::fmt::Display for L64 {fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {self.0.fmt(fmt)}}impl Ord for L64 {fn cmp(&self, x: &Self) -> std::cmp::Ordering {u64::from_le(self.0).cmp(&u64::from_le(x.0))}}impl PartialOrd for L64 {fn partial_cmp(&self, x: &Self) -> Option<std::cmp::Ordering> {Some(u64::from_le(self.0).cmp(&u64::from_le(x.0)))}}
impl std::ops::Add<L64> for L64 {type Output = Self;fn add(self, x: L64) -> L64 {L64((u64::from_le(self.0) + u64::from_le(x.0)).to_le())}}impl std::ops::Add<usize> for L64 {type Output = Self;fn add(self, x: usize) -> L64 {L64((u64::from_le(self.0) + x as u64).to_le())}}impl std::ops::SubAssign<usize> for L64 {fn sub_assign(&mut self, x: usize) {self.0 = ((u64::from_le(self.0)) - x as u64).to_le()}}impl L64 {pub fn from_slice_le(s: &[u8]) -> Self {let mut u = 0u64;assert!(s.len() >= 8);unsafe { std::ptr::copy_nonoverlapping(s.as_ptr(), &mut u as *mut u64 as *mut u8, 8) }L64(u)}pub fn to_slice_le(&self, s: &mut [u8]) {assert!(s.len() >= 8);unsafe {std::ptr::copy_nonoverlapping(&self.0 as *const u64 as *const u8, s.as_mut_ptr(), 8)}}}
let (mut deps, extra) =dependencies(txn, &channel.read(), change.hashed.changes.iter())?;
let (mut deps, extra) = dependencies(txn, &channel.read(), change.hashed.changes.iter())?;
if has_missing_context_nondeleted(txn,channel,change_id,e,).map_err(LocalApplyError::from_missing)?
if has_missing_context_nondeleted(txn, channel, change_id, e).map_err(LocalApplyError::from_missing)?