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
//! # GlueSQL
//!
//! `gluesql` is a SQL database library written in Rust.  
//! It provides a parser ([sqlparser-rs](https://github.com/sqlparser-rs/sqlparser-rs)), execution layer,
//! and optional storages ([`sled`](https://github.com/spacejam/sled) or `memory`) packaged into a single library.  
//! Developers can choose to use GlueSQL to build their own SQL database,
//! or as an embedded SQL database using the default storage engine.
//!
//! ## Examples
//!
//! ```
//! #![cfg(feature = "gluesql_sled_storage")]
//! use gluesql::prelude::*;
//!
//! let storage = SledStorage::new("data/doc-db").unwrap();
//! let mut glue = Glue::new(storage);
//!     
//! let sqls = vec![
//!     "DROP TABLE IF EXISTS Glue;",
//!     "CREATE TABLE Glue (id INTEGER);",
//!     "INSERT INTO Glue VALUES (100);",
//!     "INSERT INTO Glue VALUES (200);",
//!     "SELECT * FROM Glue WHERE id > 100;",
//! ];
//!
//! for sql in sqls {
//!     let output = glue.execute(sql).unwrap();
//!     println!("{:?}", output)
//! }
//! ```
//!
//! ## Custom Storage
//! To get started, all you need to implement for `gluesql` is implementing three traits
//! (two for functions, one for running tests).  
//! There are also optional traits.
//! Whether to implement it or not is all up to you.
//!
//! ### Store traits
//! * [Store](core/store/trait.Store.html)
//! * [StoreMut](core/store/trait.StoreMut.html)
//!
//! ### Optional Store traits
//! * [AlterTable](core/store/trait.AlterTable.html)
//! * [Index](core/store/trait.Index.html)
//! * [IndexMut](core/store/trait.IndexMut.html)
//! * [Transaction](core/store/trait.Transaction.html)
//! * [Metadata](core/store/trait.Metadata.html)
//!
//! ### Trait to run integration tests
//! * [Tester](test_suite/trait.Tester.html)
//!
//! ## Tests
//! `gluesql` provides integration tests as a module.  
//! Developers who wants to make their own custom storages can import and run those tests.  
//! `/tests/` might look quite empty, but actual test cases exist in `test-suite` workspace.
//!
//! Example code to see,
//! * [tests/memory_storage.rs](https://github.com/gluesql/gluesql/blob/main/storages/memory-storage/tests/memory_storage.rs)
//! * [tests/sled_storage.rs](https://github.com/gluesql/gluesql/blob/main/storages/sled-storage/tests/sled_storage.rs)
//!
//! After you implement `Tester` trait, the only thing you need to do is calling `generate_tests!` macro.

pub mod core {
    pub use gluesql_core::*;
}

#[cfg(feature = "gluesql_memory_storage")]
pub mod memory_storage {
    pub use gluesql_memory_storage::*;
}

#[cfg(feature = "gluesql_sled_storage")]
pub mod sled_storage {
    pub use gluesql_sled_storage::*;
}

#[cfg(feature = "gluesql-test-suite")]
pub mod test_suite {
    pub use gluesql_test_suite::*;
}

pub mod prelude {
    pub use gluesql_core::prelude::*;
    #[cfg(feature = "gluesql_memory_storage")]
    pub use gluesql_memory_storage::MemoryStorage;
    #[cfg(feature = "gluesql_sled_storage")]
    pub use gluesql_sled_storage::SledStorage;
}