native_db_32bit/
snapshot.rs

1use crate::db_type::Result;
2use crate::{Database, DatabaseBuilder};
3use redb::ReadableTable;
4use std::path::Path;
5
6impl Database<'_> {
7    pub fn snapshot<'a>(&self, builder: &'a DatabaseBuilder, path: &Path) -> Result<Database<'a>> {
8        // TODO: builder must have well defined models
9        let new_db = builder.create(path)?;
10        let r = self.instance.begin_read()?;
11        let w = new_db.instance.begin_write()?;
12        {
13            // Copy primary tables
14            for (_, primary_table_definition) in &self.primary_table_definitions {
15                let table = r.open_table(primary_table_definition.redb)?;
16                let mut new_table = w.open_table(primary_table_definition.redb)?;
17                for result in table.iter()? {
18                    let (key, value) = result?;
19                    new_table.insert(key.value(), value.value())?;
20                }
21
22                // Copy secondary tables
23                for (_, secondary_table_definition) in &primary_table_definition.secondary_tables {
24                    let table = r.open_table(secondary_table_definition.redb)?;
25                    let mut new_table = w.open_table(secondary_table_definition.redb)?;
26                    for result in table.iter()? {
27                        let (key, value) = result?;
28                        new_table.insert(key.value(), value.value())?;
29                    }
30                }
31            }
32        }
33        w.commit()?;
34        Ok(new_db)
35    }
36}