Rust-rocksdb: `cf_handle` рдХреЛ рд▓реЙрдХ-рдлреНрд░реА рдмрдирд╛рдПрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдорд╛рд░реНрдЪ 2019  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-rocksdb/rust-rocksdb

cf_handle рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд░реАрдб-рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рд╣реЙрдЯ-рдкрд╛рде рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдРрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо create_cf рдФрд░ drop_cf рдФрд░ рдЖрдВрддрд░рд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ DB рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдХреЙрд▓рд░ рдХреЛ рдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд╛рд▓реЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ DB рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдБ рдпрд╣реА рд╣реИред рд╣рдо рдЗрд╕реЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

рд╕рднреА 12 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕ рддрд░рд╣?

use std::collections::HashMap;

#[derive(Debug)]
struct ColumnFamily(i32);

struct DB {
    cfs:HashMap<i32,ColumnFamily>,
}

impl DB {
    fn new()->DB{
        let mut cfs = HashMap::new();
        cfs.insert(1,ColumnFamily(1));
        cfs.insert(2,ColumnFamily(2));
        DB{
            cfs
        }
    }
    fn get(&self,key:i32)->&ColumnFamily{
        self.cfs.get(&key).unwrap()
    }
    fn drop_key(&mut self,key:i32){
        self.cfs.remove(&key);
    }
}

fn main() {
    let mut f = DB::new();
    let a = f.get(1);
    println!("{:?}",a);
    f.drop_key(1);
    let c = f.get(2);
    println!("{:?}",c);
}

FWIW, paritech рдХреЗ рдХрд╛рдВрдЯреЗ рдореЗрдВ cf_handle рд╣реИ Copy , рдЬреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ (OTOH рдХреЛрдИ рддрд░реНрдХ рджреЗрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ), рд▓реЗрдХрд┐рди рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред

@hjiayz рд╣рд╛рдБ,

рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА (рдпрд╛рдиреА рдХреЙрд▓рдо рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЛ рдмрдирд╛рддреЗ/рдЫреЛрдбрд╝рддреЗ рд╕рдордп &mut self ) рддреЛ рдореБрдЭреЗ ColumnFamily рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрдИрдВред рдпрд╣ PhantomData рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рджреЗрддрд╛ рд╣реИ:

#[test]
fn property_cf_test() {
    let n = DBPath::new("_rust_rocksdb_property_cf_test");
    {
        let opts = Options::default();
        let mut db = DB::open_default(&n).unwrap(); // Notice the `mut`
        let cf = db.create_cf("cf1", &opts).unwrap();
        let value = db.property_value_cf(cf, "rocksdb.stats").unwrap().unwrap();

        assert!(value.contains("Stats"));
    }
}

рдЬрдм db рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд┐ рд▓реЗрддрд╛ рд╣реИ рдмрдирд╛рдиреЗ рддреНрд░реБрдЯрд┐ рд╣реЛ &self рдЬреИрд╕реЗ, db.property_value_cf() рдФрд░ рдПрдХ рдореЗрдВ рдЧреБрдЬрд░ ColumnFamily (рдЬреЛ рднрдВрдбрд╛рд░ рдПрдХ &mut рдореЗрдВ db рдлрд╝реАрд▓реНрдб):

error[E0502]: cannot borrow `db` as immutable because it is also borrowed as mutable
  --> tests/test_property.rs:39:21
   |
38 |         let cf = db.create_cf("cf1", &opts).unwrap();
   |                  -- mutable borrow occurs here
39 |         let value = db.property_value_cf(cf, "rocksdb.stats").unwrap().unwrap();
   |                     ^^                   -- mutable borrow later used here
   |                     |
   |                     immutable borrow occurs here

рдореИрдВ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рдХрд▓реНрдк ColumnFamily рдХреЛ create_cf рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ cf_handle() рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд▓рд╛рдиреЗ рджреЗрдВред

#[test]
fn property_cf_test() {
    let n = DBPath::new("_rust_rocksdb_property_cf_test");
    {
        let opts = Options::default();
        let mut db = DB::open_default(&n).unwrap();
        db.create_cf("cf1", &opts).unwrap();
        let cf = db.cf_handle("cf1").unwrap(); // Get the CF
        let value = db.property_value_cf(cf, "rocksdb.stats").unwrap().unwrap();

        assert!(value.contains("Stats"));
    }
}

рдХреНрдпрд╛ create_cf() рдХреЛ Result<(), Error> рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛?

@dvdplm рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ ColumnFamily рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдПрдХ рджреБрдГрд╕реНрд╡рдкреНрди рдмрди рдЧрдпрд╛ рд╣реИред рдореИрдВ рдПрдХ рдРрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рднрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓рдо рдкрд░рд┐рд╡рд╛рд░ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рднреА рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрднрд╡рддрдГ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд╣рдо cf_handle рд╕реЗ рддрд╛рд▓реЗ рдХреИрд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдпрд╣ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧреАред

@iSynaptic рд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ColumnFamily рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реМрдЯрд╛рдирд╛ рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рд╣реИред

рд╢рд╛рдпрдж #298 рдХрд╛ тАЛтАЛрд╡рд┐рд▓рдп рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

314

рдХреНрдпрд╛ рдЗрд╕реЗ #314 рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рд╣рд╛рдБ рдпрд╣реА рд╣реИред рд╣рдо рдЗрд╕реЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

@aleksuss рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? :)

@bkchr рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХрд░реЗрдВрдЧреЗред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

spacejam picture spacejam  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

iSynaptic picture iSynaptic  ┬╖  31рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cetra3 picture cetra3  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

f41gh7 picture f41gh7  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

freehere107 picture freehere107  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ