scylla/lib.rs
1//! Async Rust driver for the [Scylla](https://scylladb.com) database written in Rust.
2//! Although optimized for Scylla, the driver is also compatible with [Apache Cassandra®](https://cassandra.apache.org/).
3//!
4//! # Documentation book
5//! The best source to learn about this driver is the [documentation book](https://rust-driver.docs.scylladb.com/).\
6//! This page contains mainly API documentation
7//!
8//! # Other documentation
9//! * [Documentation book](https://rust-driver.docs.scylladb.com/)
10//! * [Examples](https://github.com/scylladb/scylla-rust-driver/tree/main/examples)
11//! * [Scylla documentation](https://docs.scylladb.com)
12//! * [Cassandra® documentation](https://cassandra.apache.org/doc/latest/)
13//!
14//! # Driver overview
15//! ### Connecting
16//! All driver activity revolves around the [Session](crate::client::session::Session)\
17//! `Session` is created by specifying a few known nodes and connecting to them:
18//!
19//! ```rust,no_run
20//! use scylla::client::session::Session;
21//! use scylla::client::session_builder::SessionBuilder;
22//! use std::error::Error;
23//!
24//! #[tokio::main]
25//! async fn main() -> Result<(), Box<dyn Error>> {
26//! let session: Session = SessionBuilder::new()
27//! .known_node("127.0.0.1:9042")
28//! .known_node("1.2.3.4:9876")
29//! .build()
30//! .await?;
31//!
32//! Ok(())
33//! }
34//! ```
35//! `Session` is usually created using the [SessionBuilder](crate::client::session_builder::SessionBuilder).\
36//! All configuration options for a `Session` can be specified while building.
37//!
38//! ### Making queries
39//! After successfully connecting to the cluster we can make queries.\
40//! The driver supports multiple query types:
41//! * [Simple](crate::client::session::Session::query_unpaged)
42//! * [Simple paged](crate::client::session::Session::query_iter)
43//! * [Prepared](crate::client::session::Session::execute_unpaged) (need to be [prepared](crate::client::session::Session::prepare) before use)
44//! * [Prepared paged](crate::client::session::Session::execute_iter)
45//! * [Batch](crate::client::session::Session::batch)
46//!
47//! To specify options for a single query create the query object and configure it:
48//! * For simple: [`Statement`](crate::statement::unprepared::Statement)
49//! * For prepared: [`PreparedStatement`](crate::statement::prepared::PreparedStatement)
50//! * For batch: [`Batch`](crate::statement::batch::Batch)
51//!
52//! The easiest way to specify bound values in a query is using a tuple:
53//! ```rust
54//! # use scylla::client::session::Session;
55//! # use std::error::Error;
56//! # async fn check_only_compiles(session: &Session) -> Result<(), Box<dyn Error>> {
57//! // Insert an int and text into the table
58//! session
59//! .query_unpaged(
60//! "INSERT INTO ks.tab (a, b) VALUES(?, ?)",
61//! (2_i32, "some text")
62//! )
63//! .await?;
64//! # Ok(())
65//! # }
66//! ```
67//! But the driver will accept anything implementing the trait [SerializeRow].
68//!
69//! ### Receiving results
70//! The easiest way to read rows returned by a query is to cast each row to a tuple of values:
71//!
72//! ```rust
73//! # use scylla::client::session::Session;
74//! # use std::error::Error;
75//! # async fn check_only_compiles(session: &Session) -> Result<(), Box<dyn Error>> {
76//!
77//! // Read rows containing an int and text
78//! // Keep in mind that all results come in one response (no paging is done!),
79//! // so the memory footprint and latency may be huge!
80//! // To prevent that, use `Session::query_iter` or `Session::query_single_page`.
81//! let query_rows = session
82//! .query_unpaged("SELECT a, b FROM ks.tab", &[])
83//! .await?
84//! .into_rows_result()?;
85//!
86//! for row in query_rows.rows()? {
87//! // Parse row as int and text \
88//! let (int_val, text_val): (i32, &str) = row?;
89//! }
90//! # Ok(())
91//! # }
92//! ```
93//! See the [book](https://rust-driver.docs.scylladb.com/stable/statements/result.html) for more receiving methods
94
95#![cfg_attr(docsrs, feature(doc_auto_cfg))]
96
97#[doc(hidden)]
98pub mod _macro_internal {
99 pub use scylla_cql::_macro_internal::*;
100}
101
102pub use scylla_cql::{DeserializeRow, DeserializeValue, SerializeRow, SerializeValue};
103
104pub mod value {
105 // Every `pub` item is re-exported here, apart from `deser_cql_value`.
106 pub use scylla_cql::value::{
107 Counter, CqlDate, CqlDecimal, CqlDecimalBorrowed, CqlDuration, CqlTime, CqlTimestamp,
108 CqlTimeuuid, CqlValue, CqlVarint, CqlVarintBorrowed, MaybeUnset, Row, Unset, ValueOverflow,
109 };
110}
111
112pub mod frame {
113 pub use scylla_cql::frame::{frame_errors, Authenticator, Compression};
114 pub(crate) use scylla_cql::frame::{
115 parse_response_body_extensions, protocol_features, read_response_frame, request,
116 server_event_type, FrameParams, SerializedRequest,
117 };
118
119 pub mod types {
120 pub use scylla_cql::frame::types::{Consistency, SerialConsistency};
121 }
122
123 pub mod response {
124 pub(crate) use scylla_cql::frame::response::*;
125
126 pub mod result {
127 #[cfg(cpp_rust_unstable)]
128 pub use scylla_cql::frame::response::result::DeserializedMetadataAndRawRows;
129
130 pub(crate) use scylla_cql::frame::response::result::*;
131 pub use scylla_cql::frame::response::result::{
132 CollectionType, ColumnSpec, ColumnType, NativeType, PartitionKeyIndex, TableSpec,
133 UserDefinedType,
134 };
135 }
136 }
137}
138
139/// Serializing bound values of a query to be sent to the DB.
140// Note: When editing comment on submodules here edit corresponding comments
141// on scylla-cql modules too.
142pub mod serialize {
143 pub use scylla_cql::serialize::SerializationError;
144 /// Contains the [BatchValues][batch::BatchValues] and [BatchValuesIterator][batch::BatchValuesIterator] trait and their
145 /// implementations.
146 pub mod batch {
147 // Main types
148 pub use scylla_cql::serialize::batch::{
149 BatchValues, BatchValuesFromIterator, BatchValuesIterator,
150 BatchValuesIteratorFromIterator, TupleValuesIter,
151 };
152 }
153
154 /// Contains the [SerializeRow][row::SerializeRow] trait and its implementations.
155 pub mod row {
156 // Main types
157 pub use scylla_cql::serialize::row::{RowSerializationContext, SerializeRow};
158
159 // Errors
160 pub use scylla_cql::serialize::row::{
161 BuiltinSerializationError, BuiltinSerializationErrorKind, BuiltinTypeCheckError,
162 BuiltinTypeCheckErrorKind,
163 };
164 }
165
166 /// Contains the [SerializeValue][value::SerializeValue] trait and its implementations.
167 pub mod value {
168 // Main types
169 pub use scylla_cql::serialize::value::SerializeValue;
170
171 // Errors
172 pub use scylla_cql::serialize::value::{
173 BuiltinSerializationError, BuiltinSerializationErrorKind, BuiltinTypeCheckError,
174 BuiltinTypeCheckErrorKind, MapSerializationErrorKind, MapTypeCheckErrorKind,
175 SetOrListSerializationErrorKind, SetOrListTypeCheckErrorKind,
176 TupleSerializationErrorKind, TupleTypeCheckErrorKind, UdtSerializationErrorKind,
177 UdtTypeCheckErrorKind,
178 };
179 }
180
181 /// Contains types and traits used for safe serialization of values for a CQL statement.
182 pub mod writers {
183 pub use scylla_cql::serialize::writers::{
184 CellOverflowError, CellValueBuilder, CellWriter, RowWriter, WrittenCellProof,
185 };
186 }
187}
188
189/// Deserializing DB response containing CQL query results.
190pub mod deserialize {
191 pub use scylla_cql::deserialize::{DeserializationError, FrameSlice, TypeCheckError};
192
193 /// Deserializing the whole query result contents.
194 pub mod result {
195 pub use scylla_cql::deserialize::result::TypedRowIterator;
196 }
197
198 /// Deserializing a row of the query result.
199 pub mod row {
200 pub use scylla_cql::deserialize::row::{
201 BuiltinDeserializationError, BuiltinDeserializationErrorKind, BuiltinTypeCheckError,
202 BuiltinTypeCheckErrorKind, ColumnIterator, DeserializeRow, RawColumn,
203 };
204 }
205
206 /// Deserializing a single CQL value from a column of the query result row.
207 pub mod value {
208 pub use scylla_cql::deserialize::value::{
209 BuiltinDeserializationError, BuiltinDeserializationErrorKind, BuiltinTypeCheckError,
210 BuiltinTypeCheckErrorKind, DeserializeValue, Emptiable, ListlikeIterator,
211 MapDeserializationErrorKind, MapIterator, MapTypeCheckErrorKind, MaybeEmpty,
212 SetOrListDeserializationErrorKind, SetOrListTypeCheckErrorKind,
213 TupleDeserializationErrorKind, TupleTypeCheckErrorKind, UdtIterator,
214 UdtTypeCheckErrorKind,
215 };
216 }
217
218 // Shorthands for better readability.
219 pub(crate) trait DeserializeOwnedRow:
220 for<'frame, 'metadata> row::DeserializeRow<'frame, 'metadata>
221 {
222 }
223 impl<T> DeserializeOwnedRow for T where
224 T: for<'frame, 'metadata> row::DeserializeRow<'frame, 'metadata>
225 {
226 }
227}
228
229pub mod authentication;
230pub mod client;
231#[cfg(feature = "unstable-cloud")]
232pub mod cloud;
233
234pub mod cluster;
235pub mod errors;
236mod network;
237pub mod observability;
238pub mod policies;
239pub mod response;
240pub mod routing;
241pub mod statement;
242
243pub(crate) mod utils;
244
245#[cfg(test)]
246pub(crate) use utils::test_utils;
247
248#[cfg(feature = "unstable-testing")]
249#[doc(hidden)]
250pub mod internal_testing {
251 use scylla_cql::serialize::row::SerializedValues;
252
253 use crate::routing::partitioner::PartitionerName;
254 use crate::routing::Token;
255 use crate::statement::prepared::TokenCalculationError;
256
257 pub fn calculate_token_for_partition_key(
258 serialized_partition_key_values: &SerializedValues,
259 partitioner: &PartitionerName,
260 ) -> Result<Token, TokenCalculationError> {
261 crate::routing::partitioner::calculate_token_for_partition_key(
262 serialized_partition_key_values,
263 partitioner,
264 )
265 }
266}