aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
Diffstat (limited to 'base')
-rw-r--r--base/src/database.rs30
1 files changed, 26 insertions, 4 deletions
diff --git a/base/src/database.rs b/base/src/database.rs
index f1e023c..c0699f0 100644
--- a/base/src/database.rs
+++ b/base/src/database.rs
@@ -15,6 +15,7 @@ use std::{
fs::create_dir_all,
path::Path,
sync::{Arc, RwLock},
+ time::SystemTime,
};
use tantivy::{
collector::{Count, TopDocs},
@@ -35,6 +36,7 @@ const T_NODE_CHILDREN: TableDefinition<([u8; 32], [u8; 32]), ()> =
const T_NODE_EXTERNAL_ID: TableDefinition<(&str, &str), [u8; 32]> =
TableDefinition::new("node_external_id");
const T_IMPORT_FILE_MTIME: TableDefinition<&[u8], u64> = TableDefinition::new("import_file_mtime");
+const T_NODE_MTIME: TableDefinition<[u8; 32], u64> = TableDefinition::new("node_mtime");
#[derive(Clone)]
pub struct Database {
@@ -61,6 +63,7 @@ impl Database {
txn.open_table(T_USER)?;
txn.open_table(T_USER_NODE)?;
txn.open_table(T_NODE)?;
+ txn.open_table(T_NODE_MTIME)?;
txn.open_table(T_NODE_CHILDREN)?;
txn.open_table(T_NODE_EXTERNAL_ID)?;
txn.open_table(T_IMPORT_FILE_MTIME)?;
@@ -101,19 +104,32 @@ impl Database {
.map(|r| r.map(|r| NodeID(r.0.value().1)))
.collect::<Result<Vec<_>, StorageError>>()?)
}
+ pub fn get_nodes_modified_since(&self, since: u64) -> Result<Vec<NodeID>> {
+ let txn = self.inner.begin_read()?;
+ let t_node_mtime = txn.open_table(T_NODE_MTIME)?;
+ Ok(t_node_mtime
+ .iter()?
+ .flat_map(|r| r.map(|r| (NodeID(r.0.value()), r.1.value())))
+ .filter(|(_, mtime)| *mtime >= since)
+ .map(|(id, _)| id)
+ .collect())
+ }
pub fn clear_nodes(&self) -> Result<()> {
let mut txn = self.inner.begin_write()?;
let mut t_node = txn.open_table(T_NODE)?;
+ let mut t_node_mtime = txn.open_table(T_NODE_MTIME)?;
let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?;
let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?;
let mut t_import_file_mtime = txn.open_table(T_IMPORT_FILE_MTIME)?;
t_node.retain(|_, _| false)?;
+ t_node_mtime.retain(|_, _| false)?;
t_node_children.retain(|_, _| false)?;
t_node_external_id.retain(|_, _| false)?;
t_import_file_mtime.retain(|_, _| false)?;
drop((
t_node,
+ t_node_mtime,
t_node_children,
t_node_external_id,
t_import_file_mtime,
@@ -138,11 +154,16 @@ impl Database {
id: NodeID,
update: impl FnOnce(&mut Node) -> Result<()>,
) -> Result<()> {
+ let time = SystemTime::now()
+ .duration_since(SystemTime::UNIX_EPOCH)
+ .unwrap()
+ .as_secs();
let mut txn = self.inner.begin_write()?;
- let mut t_nodes = txn.open_table(T_NODE)?;
+ let mut t_node = txn.open_table(T_NODE)?;
+ let mut t_node_mtime = txn.open_table(T_NODE_MTIME)?;
let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?;
let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?;
- let mut node = t_nodes.get(id.0)?.map(|v| v.value().0).unwrap_or_default();
+ let mut node = t_node.get(id.0)?.map(|v| v.value().0).unwrap_or_default();
update(&mut node)?;
for parent in &node.parents {
t_node_children.insert((parent.0, id.0), ())?;
@@ -150,8 +171,9 @@ impl Database {
for (pl, eid) in &node.external_ids {
t_node_external_id.insert((pl.as_str(), eid.as_str()), id.0)?;
}
- t_nodes.insert(&id.0, Ser(node))?;
- drop((t_nodes, t_node_children, t_node_external_id));
+ t_node.insert(&id.0, Ser(node))?;
+ t_node_mtime.insert(&id.0, time)?;
+ drop((t_node, t_node_mtime, t_node_children, t_node_external_id));
txn.set_durability(Durability::Eventual);
txn.commit()?;
Ok(())