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;