pub struct Store { /* private fields */ }Expand description
A store, storing a set of layers and database labels pointing to these layers.
Implementations§
Source§impl Store
impl Store
Sourcepub fn new<Labels: 'static + LabelStore, Layers: 'static + LayerStore>(
label_store: Labels,
layer_store: Layers,
) -> Store
pub fn new<Labels: 'static + LabelStore, Layers: 'static + LayerStore>( label_store: Labels, layer_store: Layers, ) -> Store
Create a new store from the given label and layer store.
Sourcepub async fn create(&self, label: &str) -> Result<NamedGraph>
pub async fn create(&self, label: &str) -> Result<NamedGraph>
Create a new database with the given name.
If the database already exists, this will return an error.
Examples found in repository?
7async fn main() {
8 let args: Vec<String> = env::args().collect();
9 if args.len() != 3 {
10 println!("usage: {} <path> <graph_name>", args[0]);
11 } else {
12 // open a store at the given path. the directory has to exist.
13 let store = open_directory_store(&args[1]);
14
15 // then create a graph. if the graph already exists, this will error.
16 store.create(&args[2]).await.unwrap();
17 }
18}Sourcepub async fn open(&self, label: &str) -> Result<Option<NamedGraph>>
pub async fn open(&self, label: &str) -> Result<Option<NamedGraph>>
Open an existing database with the given name, or None if it does not exist.
Examples found in repository?
8async fn print_graph(store_path: &str, graph: &str) -> io::Result<()> {
9 let store = open_directory_store(store_path);
10 let graph = store
11 .open(graph)
12 .await?
13 .expect(&format!("expected graph {} to exist", graph));
14
15 match graph.head().await? {
16 Some(layer) => {
17 for id_triple in layer.triples() {
18 // triples are retrieved in their id form. For printing,
19 // we need the string form. The conversion happens here.
20 let triple = layer
21 .id_triple_to_string(&id_triple)
22 .expect("expected id triple to be mapable to string");
23
24 println!(
25 "{}, {}, {} {:?}",
26 triple.subject,
27 triple.predicate,
28 match triple.object {
29 ObjectType::Node(_) => "node",
30 ObjectType::Value(_) => "value",
31 },
32 match triple.object {
33 ObjectType::Node(n) => String::make_entry(&n),
34 ObjectType::Value(v) => v,
35 }
36 );
37 }
38 }
39 None => {}
40 }
41
42 Ok(())
43}More examples
54async fn process_commands(store_path: &str, graph: &str) -> io::Result<()> {
55 let store = open_directory_store(store_path);
56 let graph = store
57 .open(graph)
58 .await?
59 .expect(&format!("expected graph {} to exist", graph));
60
61 // There are two types of builders. One creates a new base layer,
62 // which has no parent. The other creates a child layer, which has
63 // another layer as its parent.
64 let builder = match graph.head().await? {
65 Some(layer) => layer.open_write().await?,
66 None => store.create_base_layer().await?,
67 };
68 let mut stdin = io::BufReader::new(io::stdin()).lines();
69
70 while let Some(line) = stdin.next_line().await? {
71 let segment = line.trim();
72 if segment.len() == 0 {
73 continue;
74 }
75
76 let command = parse_command(segment).await?;
77
78 // add all the input data into the builder.
79 // The builder keeps an in-memory list of added and removed
80 // triples. If the same triple is added and removed on the
81 // same builder, it is a no-op. This is even the case when it
82 // is then later re-added on the same builder.
83 //
84 // Since no io is happening, adding triples to the builder is
85 // not a future.
86 match command {
87 Command::Add(triple) => builder.add_value_triple(triple)?,
88 Command::Remove(triple) => builder.remove_value_triple(triple)?,
89 }
90 }
91
92 // When commit is called, the builder writes its data to
93 // persistent storage.
94 let layer = builder.commit().await?;
95
96 // While a layer exists now, it's not yet attached to anything,
97 // and is therefore unusable unless you know the exact identifier
98 // of the layer itself. To make this the graph data, we have to
99 // set the grap head to this layer.
100 graph.set_head(&layer).await?;
101
102 println!(
103 "Added: {}, removed: {}",
104 layer.triple_layer_addition_count().await?,
105 layer.triple_layer_removal_count().await?
106 );
107
108 Ok(())
109}Sourcepub async fn delete(&self, label: &str) -> Result<bool>
pub async fn delete(&self, label: &str) -> Result<bool>
Delete an existing database with the given name. Returns true if this database was deleted and false otherwise.
Sourcepub async fn labels(&self) -> Result<Vec<String>>
pub async fn labels(&self) -> Result<Vec<String>>
Return list of names of all existing databases.
Sourcepub async fn get_layer_from_id(
&self,
layer: [u32; 5],
) -> Result<Option<StoreLayer>>
pub async fn get_layer_from_id( &self, layer: [u32; 5], ) -> Result<Option<StoreLayer>>
Retrieve a layer with the given name from the layer store this Store was initialized with.
Sourcepub async fn create_base_layer(&self) -> Result<StoreLayerBuilder>
pub async fn create_base_layer(&self) -> Result<StoreLayerBuilder>
Create a base layer builder, unattached to any database label.
After having committed it, use set_head on a NamedGraph to attach it.
Examples found in repository?
54async fn process_commands(store_path: &str, graph: &str) -> io::Result<()> {
55 let store = open_directory_store(store_path);
56 let graph = store
57 .open(graph)
58 .await?
59 .expect(&format!("expected graph {} to exist", graph));
60
61 // There are two types of builders. One creates a new base layer,
62 // which has no parent. The other creates a child layer, which has
63 // another layer as its parent.
64 let builder = match graph.head().await? {
65 Some(layer) => layer.open_write().await?,
66 None => store.create_base_layer().await?,
67 };
68 let mut stdin = io::BufReader::new(io::stdin()).lines();
69
70 while let Some(line) = stdin.next_line().await? {
71 let segment = line.trim();
72 if segment.len() == 0 {
73 continue;
74 }
75
76 let command = parse_command(segment).await?;
77
78 // add all the input data into the builder.
79 // The builder keeps an in-memory list of added and removed
80 // triples. If the same triple is added and removed on the
81 // same builder, it is a no-op. This is even the case when it
82 // is then later re-added on the same builder.
83 //
84 // Since no io is happening, adding triples to the builder is
85 // not a future.
86 match command {
87 Command::Add(triple) => builder.add_value_triple(triple)?,
88 Command::Remove(triple) => builder.remove_value_triple(triple)?,
89 }
90 }
91
92 // When commit is called, the builder writes its data to
93 // persistent storage.
94 let layer = builder.commit().await?;
95
96 // While a layer exists now, it's not yet attached to anything,
97 // and is therefore unusable unless you know the exact identifier
98 // of the layer itself. To make this the graph data, we have to
99 // set the grap head to this layer.
100 graph.set_head(&layer).await?;
101
102 println!(
103 "Added: {}, removed: {}",
104 layer.triple_layer_addition_count().await?,
105 layer.triple_layer_removal_count().await?
106 );
107
108 Ok(())
109}pub async fn merge_base_layers( &self, layers: &[[u32; 5]], temp_dir: &Path, ) -> Result<[u32; 5]>
Sourcepub async fn export_layers(
&self,
layer_ids: Box<dyn Iterator<Item = [u32; 5]> + Send>,
) -> Result<Vec<u8>>
pub async fn export_layers( &self, layer_ids: Box<dyn Iterator<Item = [u32; 5]> + Send>, ) -> Result<Vec<u8>>
Export the given layers by creating a pack, a Vecimport_layers on a different store.
Sourcepub async fn import_layers<'a>(
&'a self,
pack: &'a [u8],
layer_ids: Box<dyn Iterator<Item = [u32; 5]> + Send>,
) -> Result<()>
pub async fn import_layers<'a>( &'a self, pack: &'a [u8], layer_ids: Box<dyn Iterator<Item = [u32; 5]> + Send>, ) -> Result<()>
Import the specified layers from the given pack, a byte slice that was previously generated with export_layers, on another store, and possibly even another machine).
After this operation, the specified layers will be retrievable from this store, provided they existed in the pack. specified layers that are not in the pack are silently ignored.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for Store
impl !UnwindSafe for Store
impl Freeze for Store
impl Send for Store
impl Sync for Store
impl Unpin for Store
impl UnsafeUnpin for Store
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Source§impl<T> StrictAs for T
impl<T> StrictAs for T
Source§fn strict_as<Dst>(self) -> Dstwhere
T: StrictCast<Dst>,
fn strict_as<Dst>(self) -> Dstwhere
T: StrictCast<Dst>,
Source§impl<Src, Dst> StrictCastFrom<Src> for Dstwhere
Src: StrictCast<Dst>,
impl<Src, Dst> StrictCastFrom<Src> for Dstwhere
Src: StrictCast<Dst>,
Source§fn strict_cast_from(src: Src) -> Dst
fn strict_cast_from(src: Src) -> Dst
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.