Rust-rocksdb: WriteBatch ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2021๋…„ 01์›” 07์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-rocksdb/rust-rocksdb

์•ˆ๋…•ํ•˜์„ธ์š”, rockdb ์ธ์Šคํ„ด์Šค ๊ฐ„์˜ ๋ณต์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ์ด์ œ rust-rocksdb๋Š” ๋งˆ์ง€๋ง‰ ๊ธฐ๋Šฅ์ธ writebatch ์ง๋ ฌํ™”๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“  API๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ฅผ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”์ดํŠธ์—์„œ WriteBatch๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐ”์ดํŠธ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ๋‚ด ์†”๋ฃจ์…˜์œผ๋กœ PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

impl WriteBatch {
    /// Tries to serialize writebatch as raw bytes vector with null values
    /// Its useful for sending write batches over network.
    pub fn try_into_raw(&self) -> Result<Vec<u8>, Error> {
        let data;
        unsafe {
            let mut repsize1: size_t = 0;
            let rep: *const i8 = ffi::rocksdb_writebatch_data(self.inner, &mut repsize1);
            let cs = slice_from_raw_parts(rep as *const u8, repsize1);
            data = cs.as_ref().ok_or_else(|| {
                Error::new("writeBatch reference is Null".to_string())
            })?.to_vec();
        }
        Ok(data)
    }

    /// creates writeBatch from raw input
    pub fn from_raw(data: &[u8]) -> Self {
        let u8slice = unsafe {
            &*(data as *const _ as *const [i8])
        };
        WriteBatch {
            inner: unsafe { ffi::rocksdb_writebatch_create_from(u8slice.as_ptr(), data.len() as size_t) }
        }
    }
}

writeBatch์˜ ์›์‹œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ๋ณธ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

๋Šฆ์€ ๋‹ต๋ณ€ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์†”์งํžˆ ์ง€๊ธˆ์€ RocksDB์™€ ๊ด€๋ จ๋œ ์ผ์— ๋œ ๊ด€์—ฌํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ท€ํ•˜์˜ ์ƒํ™ฉ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค API๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

impl WriteBatch {
    /// Tries to serialize writebatch as raw bytes vector with null values
    /// Its useful for sending write batches over network.
    pub fn try_into_raw(&self) -> Result<Vec<u8>, Error> {
        let data;
        unsafe {
            let mut repsize1: size_t = 0;
            let rep: *const i8 = ffi::rocksdb_writebatch_data(self.inner, &mut repsize1);
            let cs = slice_from_raw_parts(rep as *const u8, repsize1);
            data = cs.as_ref().ok_or_else(|| {
                Error::new("writeBatch reference is Null".to_string())
            })?.to_vec();
        }
        Ok(data)
    }

    /// creates writeBatch from raw input
    pub fn from_raw(data: &[u8]) -> Self {
        let u8slice = unsafe {
            &*(data as *const _ as *const [i8])
        };
        WriteBatch {
            inner: unsafe { ffi::rocksdb_writebatch_create_from(u8slice.as_ptr(), data.len() as size_t) }
        }
    }
}

writeBatch์˜ ์›์‹œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ณด์กฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ๋ณธ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ API๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ™•์‹ ํ•˜๋Š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰