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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */
#![cfg_attr(docsrs, deny(broken_intra_doc_links))]
#![cfg_attr(docsrs, feature(doc_cfg))]

//! PoloDB is an embedded JSON-based database.
//!
//! PoloDB is a library written in Rust that implements a lightweight MongoDB.
//! PoloDB has no dependency(except for libc), so it can be easily run on most platform(thanks for Rust Language).
//! The data of PoloDB is stored in a file. The file format is stable, cross-platform, and backwards compaitible.
//! The API of PoloDB is very similar to MongoDB. It's very easy to learn and use.
//!
//! [Tutorials](https://www.polodb.org/docs)
//!
//! # Usage
//!
//! The [`Database`] structure provides all the API to get access to the DB file.
//!
//! ## Open a local file
//!
//! ```rust
//! use polodb_core::Database;
//! # let db_path = polodb_core::test_utils::mk_db_path("doc-test-polo-file");
//! let db = Database::open_file(db_path).unwrap();
//! ```
//!
//! ## Open a memory database
//!
//! ```rust
//! use polodb_core::Database;
//!
//! let db = Database::open_memory().unwrap();
//! ```
//!
//! # Example
//!
//!  ```rust
//! use polodb_core::Database;
//! use serde::{Serialize, Deserialize};
//!
//! #[derive(Debug, Serialize, Deserialize)]
//! struct Book {
//!     title: String,
//!     author: String,
//! }
//!
//! # let db_path = polodb_core::test_utils::mk_db_path("doc-test-polo-lib");
//! let db = Database::open_file(db_path).unwrap();
//! let collection = db.collection("books");
//! collection.insert_one(Book {
//!     title: "The Three-Body Problem".to_string(),
//!     author: "Liu Cixin".to_string(),
//! }).unwrap();
//! ```
//!
//! ## Inserting documents into a collection
//!
//! ```rust
//! use polodb_core::Database;
//! use polodb_core::bson::{Document, doc};
//!
//! let db = Database::open_memory().unwrap();
//! let collection = db.collection::<Document>("books");
//!
//! let docs = vec![
//!     doc! { "title": "1984", "author": "George Orwell" },
//!     doc! { "title": "Animal Farm", "author": "George Orwell" },
//!     doc! { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
//! ];
//! collection.insert_many(docs).unwrap();
//! ```
//!
//! ## Finding documents in a collection
//!
//! ```rust
//! use polodb_core::Database;
//! use polodb_core::bson::{Document, doc};
//! use serde::{Deserialize, Serialize};
//!
//! #[derive(Debug, Serialize, Deserialize)]
//! struct Book {
//!    title: String,
//!    author: String,
//! }
//!
//! let db = Database::open_memory().unwrap();
//! let collection = db.collection::<Book>("books");
//!
//! let docs = vec![
//!     Book { title: "1984".to_string(), author: "George Orwell".to_string() },
//!     Book { title: "Animal Farm".to_string(), author: "George Orwell".to_string() },
//!     Book { title: "The Great Gatsby".to_string(), author: "F. Scott Fitzgerald".to_string() },
//! ];
//! collection.insert_many(docs).unwrap();
//!
//! let books = collection.find(None).unwrap();
//! for book in books {
//!     println!("name: {:?}", book);
//! }
//! ```
//!
//! # Session
//!
//! A [`ClientSession`] represents a logical session used for ordering sequential
//! operations.
//!
//! You an manually start a transaction by [`ClientSession::start_transaction`] method.
//! If you don't start it manually, a transaction will be automatically started
//! in your every operation.
//!
//! ## Example
//!
//! ```rust
//! use polodb_core::Database;
//! use polodb_core::bson::{Document, doc};
//!
//! # let db_path = polodb_core::test_utils::mk_db_path("doc-test-polo-db");
//! let db = Database::open_file(db_path).unwrap();
//!
//! let mut session = db.start_session().unwrap();
//! session.start_transaction(None).unwrap();
//!
//! let collection = db.collection::<Document>("books");
//!
//! let docs = vec![
//!     doc! { "title": "1984", "author": "George Orwell" },
//!     doc! { "title": "Animal Farm", "author": "George Orwell" },
//!     doc! { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
//! ];
//! collection.insert_many_with_session(docs, &mut session).unwrap();
//!
//! session.commit_transaction().unwrap();
//! ```

extern crate core;

mod page;
mod vm;
mod errors;
mod cursor;
mod session;

mod db;
mod meta_doc_helper;
mod config;
mod macros;
mod transaction;
pub mod lsm;
pub mod results;
pub mod commands;

#[cfg(not(target_arch = "wasm32"))]
pub mod test_utils;
mod metrics;
mod utils;
mod index;
mod coll;

pub use db::{Database, DatabaseServer, Result};
pub use coll::Collection;
pub use config::{Config, ConfigBuilder};
pub use transaction::TransactionType;
pub use db::client_cursor::{ClientCursor, ClientSessionCursor};
pub use errors::Error;
pub use session::ClientSession;
pub use metrics::Metrics;
pub use lsm::LsmKv;
pub use index::{IndexModel, IndexOptions};

pub extern crate bson;