From 1e8dfd60e476b2d80cd8854cba7ef891d8806563 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Thu, 8 Aug 2024 16:39:10 -0600 Subject: [PATCH] Add file reader, rudimentary mtbl_dump --- Cargo.lock | 33 +++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/bin/mtbl_dump.rs | 9 ++++++++- src/reader/mod.rs | 12 ++++++++++-- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c366fea..b80f6ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,6 +93,16 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -110,6 +120,7 @@ dependencies = [ "flate2", "integer-encoding", "lz4", + "memmap", "snap", "zstd", ] @@ -141,6 +152,28 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "zstd" version = "0.13.2" diff --git a/Cargo.toml b/Cargo.toml index 0a56bd6..b00b921 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ crc32c = "0.6.8" flate2 = "1.0.31" integer-encoding = "4.0.2" lz4 = "1.26.0" +memmap = "0.7.0" snap = "1.1.1" zstd = "0.13.2" diff --git a/src/bin/mtbl_dump.rs b/src/bin/mtbl_dump.rs index e7a11a9..2e92c10 100644 --- a/src/bin/mtbl_dump.rs +++ b/src/bin/mtbl_dump.rs @@ -1,3 +1,10 @@ +use mtbl::prelude::*; +use std::env; + fn main() { - println!("Hello, world!"); + let fname = env::args().nth(1).expect("Usage: mtbl_dump "); + let reader = mtbl::reader::from_file(fname); + for e in reader.iter() { + println!("{:?}: {:?}", *e.key, *e.value); + } } diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 255eb1c..6eb739f 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -1,10 +1,12 @@ use crate::metadata::Metadata; use crate::source::{DefaultSource, IterSource}; -use crate::Entry; -use crate::Iter; +use crate::{Entry, Iter}; use integer_encoding::VarInt; pub(crate) mod block; +use memmap::{Mmap, MmapOptions}; +use std::fs::File; use std::io::{Cursor, Seek, SeekFrom}; +use std::path::Path; use std::sync::Arc; // interface for a range @@ -78,6 +80,12 @@ impl> Clone for Reader { } } +pub fn from_file(fname: impl AsRef) -> Reader { + let f = File::open(fname).expect("open file"); + let mmap = unsafe { MmapOptions::new().map(&f).expect("mmap") }; + Reader::new(mmap) +} + impl> Reader { pub fn new(d: D) -> Self { let mut cur = Cursor::new(&d.as_ref()[d.as_ref().len() - 512..]); -- 2.50.1