1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#![recursion_limit="128"]
#[macro_use] extern crate error_chain;
extern crate indexmap;
extern crate itertools;
#[macro_use] extern crate lazy_static;
#[macro_use] extern crate log;
extern crate num;
extern crate petgraph;
extern crate rusqlite;
extern crate tabwriter;
extern crate time;
#[macro_use] extern crate edn;
#[macro_use] extern crate mentat_core;
extern crate mentat_sql;
use std::iter::repeat;
use itertools::Itertools;
pub use errors::{Error, ErrorKind, ResultExt, Result};
mod add_retract_alter_set;
pub mod cache;
pub mod db;
mod bootstrap;
pub mod debug;
pub mod entids;
pub mod errors;
pub mod internal_types;
mod metadata;
mod schema;
pub mod tx_observer;
mod watcher;
mod tx;
mod tx_checking;
pub mod types;
mod upsert_resolution;
pub use bootstrap::{
TX0,
USER0,
};
pub use schema::{
AttributeBuilder,
AttributeValidation,
};
pub use bootstrap::{
CORE_SCHEMA_VERSION,
};
use edn::symbols;
pub use entids::{
DB_SCHEMA_CORE,
};
pub use db::{
TypedSQLValue,
new_connection,
};
#[cfg(feature = "sqlcipher")]
pub use db::{
new_connection_with_key,
change_encryption_key,
};
pub use watcher::{
TransactWatcher,
};
pub use tx::{
transact,
transact_terms,
};
pub use tx_observer::{
InProgressObserverTransactWatcher,
TxObservationService,
TxObserver,
};
pub use types::{
AttributeSet,
DB,
PartitionMap,
TransactableValue,
TxReport,
};
pub fn to_namespaced_keyword(s: &str) -> Result<symbols::Keyword> {
let splits = [':', '/'];
let mut i = s.split(&splits[..]);
let nsk = match (i.next(), i.next(), i.next(), i.next()) {
(Some(""), Some(namespace), Some(name), None) => Some(symbols::Keyword::namespaced(namespace, name)),
_ => None,
};
nsk.ok_or(ErrorKind::NotYetImplemented(format!("InvalidKeyword: {}", s)).into())
}
pub fn repeat_values(values_per_tuple: usize, tuples: usize) -> String {
assert!(values_per_tuple >= 1);
assert!(tuples >= 1);
let inner = format!("({})", repeat("?").take(values_per_tuple).join(", "));
let values: String = repeat(inner).take(tuples).join(", ");
values
}