2022-12-30 08:23:19 +00:00
//! This library provides a low-level database library implementation, a remote client
//! and a query language definition, for [SurrealDB](https://surrealdb.com), the ultimate cloud database for
2022-08-28 12:18:12 +00:00
//! tomorrow's applications. SurrealDB is a scalable, distributed, collaborative, document-graph
//! database for the realtime web.
2022-05-03 23:38:16 +00:00
//!
2022-08-28 12:18:12 +00:00
//! This library can be used to start an embedded in-memory datastore, an embedded datastore
//! persisted to disk, a browser-based embedded datastore backed by IndexedDB, or for connecting
//! to a distributed [TiKV](https://tikv.org) key-value store.
2022-12-30 08:23:19 +00:00
//!
//! It also enables simple and advanced querying of a remote SurrealDB server from
//! server-side or client-side code. All connections to SurrealDB are made over WebSockets by default,
//! and automatically reconnect when the connection is terminated.
//!
//! # Examples
//!
//! ```no_run
//! use serde::{Serialize, Deserialize};
//! use serde_json::json;
//! use std::borrow::Cow;
//! use surrealdb::{Result, Surreal};
//! use surrealdb::sql;
//! use surrealdb::opt::auth::Root;
2023-01-07 08:32:18 +00:00
//! use surrealdb::engine::remote::ws::Ws;
2022-12-30 08:23:19 +00:00
//!
//! #[derive(Serialize, Deserialize)]
//! struct Name {
//! first: Cow<'static, str>,
//! last: Cow<'static, str>,
//! }
//!
//! #[derive(Serialize, Deserialize)]
//! struct Person {
//! title: Cow<'static, str>,
//! name: Name,
//! marketing: bool,
//! }
//!
//! #[tokio::main]
//! async fn main() -> Result<()> {
//! let db = Surreal::new::<Ws>("localhost:8000").await?;
//!
//! // Signin as a namespace, database, or root user
//! db.signin(Root {
//! username: "root",
//! password: "root",
//! }).await?;
//!
//! // Select a specific namespace / database
//! db.use_ns("namespace").use_db("database").await?;
//!
//! // Create a new person with a random ID
2023-04-28 11:20:57 +00:00
//! let created: Vec<Person> = db.create("person")
2022-12-30 08:23:19 +00:00
//! .content(Person {
//! title: "Founder & CEO".into(),
//! name: Name {
//! first: "Tobie".into(),
//! last: "Morgan Hitchcock".into(),
//! },
//! marketing: true,
//! })
//! .await?;
//!
//! // Create a new person with a specific ID
2023-04-28 11:20:57 +00:00
//! let created: Option<Person> = db.create(("person", "jaime"))
2022-12-30 08:23:19 +00:00
//! .content(Person {
//! title: "Founder & COO".into(),
//! name: Name {
//! first: "Jaime".into(),
//! last: "Morgan Hitchcock".into(),
//! },
//! marketing: false,
//! })
//! .await?;
//!
//! // Update a person record with a specific ID
2023-04-28 11:20:57 +00:00
//! let updated: Option<Person> = db.update(("person", "jaime"))
2022-12-30 08:23:19 +00:00
//! .merge(json!({"marketing": true}))
//! .await?;
//!
//! // Select all people records
//! let people: Vec<Person> = db.select("person").await?;
//!
//! // Perform a custom advanced query
2023-02-09 10:28:06 +00:00
//! let sql = r#"
2022-12-30 08:23:19 +00:00
//! SELECT marketing, count()
//! FROM type::table($table)
//! GROUP BY marketing
2023-02-09 10:28:06 +00:00
//! "#;
2022-12-30 08:23:19 +00:00
//!
//! let groups = db.query(sql)
//! .bind(("table", "person"))
//! .await?;
//!
//! Ok(())
//! }
//! ```
2022-05-03 23:38:16 +00:00
2022-12-07 19:30:29 +00:00
#![ doc(html_favicon_url = " https://surrealdb.s3.amazonaws.com/favicon.png " ) ]
#![ doc(html_logo_url = " https://surrealdb.s3.amazonaws.com/icon.png " ) ]
2022-12-30 08:23:19 +00:00
#![ cfg_attr(docsrs, feature(doc_cfg)) ]
#![ cfg_attr(test, deny(warnings)) ]
2022-12-07 19:30:29 +00:00
2022-02-22 14:16:50 +00:00
#[ macro_use ]
2023-07-03 20:23:52 +00:00
extern crate tracing ;
2022-02-22 14:16:50 +00:00
#[ macro_use ]
mod mac ;
2022-12-30 08:23:19 +00:00
mod api ;
2023-07-10 08:34:33 +00:00
mod cf ;
2022-02-22 14:16:50 +00:00
mod ctx ;
mod doc ;
2022-09-21 01:27:28 +00:00
mod exe ;
2022-02-22 14:16:50 +00:00
mod fnc ;
2023-06-27 23:42:29 +00:00
mod vs ;
2022-02-22 14:16:50 +00:00
2022-12-30 08:23:19 +00:00
pub mod sql ;
2023-06-09 13:45:07 +00:00
#[ doc(hidden) ]
pub mod cnf ;
2022-12-30 08:23:19 +00:00
#[ doc(hidden) ]
pub mod dbs ;
#[ doc(hidden) ]
2022-12-07 19:30:29 +00:00
pub mod env ;
2022-12-30 08:23:19 +00:00
#[ doc(hidden) ]
pub mod err ;
2023-06-09 13:45:07 +00:00
#[ doc(hidden) ]
pub mod iam ;
2022-12-30 08:23:19 +00:00
#[ doc(hidden) ]
2023-08-18 08:00:06 +00:00
pub mod idg ;
#[ doc(hidden) ]
2023-05-29 11:46:41 +00:00
pub mod idx ;
#[ doc(hidden) ]
2023-07-10 08:24:47 +00:00
pub mod key ;
#[ doc(hidden) ]
2022-12-30 08:23:19 +00:00
pub mod kvs ;
2023-11-18 13:56:13 +00:00
#[ doc(hidden) ]
pub mod syn ;
2022-12-07 19:30:29 +00:00
2022-12-30 08:23:19 +00:00
#[ doc(inline) ]
2023-01-07 08:32:18 +00:00
pub use api ::engine ;
2022-12-30 08:23:19 +00:00
#[ doc(inline) ]
pub use api ::method ;
#[ doc(inline) ]
pub use api ::opt ;
#[ doc(inline) ]
pub use api ::Connect ;
#[ doc(inline) ]
pub use api ::Connection ;
#[ doc(inline) ]
pub use api ::Response ;
#[ doc(inline) ]
pub use api ::Result ;
#[ doc(inline) ]
pub use api ::Surreal ;
2022-02-22 14:16:50 +00:00
2022-12-30 08:23:19 +00:00
#[ doc(hidden) ]
/// Channels for receiving a SurrealQL database export
2022-05-15 19:38:46 +00:00
pub mod channel {
2023-11-20 19:08:07 +00:00
pub use channel ::bounded ;
pub use channel ::unbounded ;
2022-05-15 19:38:46 +00:00
pub use channel ::Receiver ;
pub use channel ::Sender ;
}
2022-12-07 19:30:29 +00:00
2022-12-30 08:23:19 +00:00
/// Different error types for embedded and remote databases
pub mod error {
pub use crate ::api ::err ::Error as Api ;
pub use crate ::err ::Error as Db ;
}
2023-11-13 17:19:47 +00:00
/// The action performed on a record
///
/// This is used in live query notifications.
#[ derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash) ]
#[ non_exhaustive ]
pub enum Action {
Create ,
Update ,
Delete ,
}
impl From < dbs ::Action > for Action {
fn from ( action : dbs ::Action ) -> Self {
match action {
dbs ::Action ::Create = > Self ::Create ,
dbs ::Action ::Update = > Self ::Update ,
dbs ::Action ::Delete = > Self ::Delete ,
}
}
}
/// A live query notification
///
/// Live queries return a stream of notifications. The notification contains an `action` that triggered the change in the database record and `data` itself.
/// For deletions the data is the record before it was deleted. For everything else, it's the newly created record or updated record depending on whether
/// the action is create or update.
#[ derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash) ]
#[ non_exhaustive ]
pub struct Notification < R > {
pub action : Action ,
pub data : R ,
}
2022-12-30 08:23:19 +00:00
/// An error originating from the SurrealDB client library
2023-05-22 20:02:48 +00:00
#[ derive(Debug, thiserror::Error, serde::Serialize) ]
2022-12-30 08:23:19 +00:00
pub enum Error {
/// An error with an embedded storage engine
2023-01-08 14:51:36 +00:00
#[ error( " {0} " ) ]
2022-12-30 08:23:19 +00:00
Db ( #[ from ] crate ::error ::Db ) ,
/// An error with a remote database instance
2023-01-08 14:51:36 +00:00
#[ error( " {0} " ) ]
2022-12-30 08:23:19 +00:00
Api ( #[ from ] crate ::error ::Api ) ,
}