What is Ditto?
Ditto is a cross-platform, peer-to-peer database that allows apps to sync with and without internet connectivity.
Install Ditto into your application, then use the APIs to read and write data into its storage system, and it will then automatically sync any changes to other devices.
Unlike other synchronization solutions, Ditto is designed for "peer-to-peer" scenarios where it can directly communicate with other devices even without an Internet connection.
Additionally, Ditto automatically manages the complexity of using multiple network transports, like Bluetooth, P2P Wi-Fi, and Local Area Network, to find and connect to other devices and then synchronize any changes.
Ditto Platform Docs
Visit https://ditto.com/link/docs to learn about the full Ditto platform, including multi-language SDKs, the Ditto Cloud offering, and more.
Rust developers should be sure to check out these essential topics:
- Ditto Edge Sync Platform Basics
- Mesh Networking 101
- Data-Handling Essentials
- Ditto Query Language (DQL)
Development Quickstart
Ditto offers a "development" authentication mode that lets you start playing and developing with Ditto without any authentication hassle.
Online Development Quickstart (Fastest)
# // To actually run this doctest, insert valid values into the constants below and
# // then remove the `no_run` annotation.
# use TempRoot;
use *;
use get_development_provider;
const YOUR_SERVER_URL: &str = "replace with your server URL";
const YOUR_DB_ID: &str = "replace with your database ID";
const YOUR_DEVELOPMENT_AUTH_TOKEN: &str = "replace with your authentication token";
async
Offline Development Quickstart (Requires Offline License Token)
- Contact Ditto support to obtain an offline license token.
# use TempRoot;
use *;
const YOUR_DB_ID: &str = "replace with your database ID";
const YOUR_OFFLINE_LICENSE_TOKEN: &str = "";
async
Write data using Ditto Query Language (DQL)
The preferred method to write data to Ditto is by using DQL.
To do this, we'll first access the Ditto Store, then
execute a DQL insert statement.
use *;
use ;
async
// To call:
async
#
#
# async
- See the DQL INSERT documentation for more info on DQL inserts
- See
QueryResultandQueryResultItemto learn about the returned values - Tip: Make sure you have
serdeadded to yourCargo.tomlwith thederivefeature - Tip: Make sure you have
serde_jsonadded to yourCargo.toml
# Cargo.toml
[]
= { = "1.0.204", = ["derive"] }
= "1.0.120"
Read data using DQL
use *;
use ;
async
// To call:
async
#
# async
- See the DQL SELECT documentation for more info on DQL selects
Please note: this crate uses sane defaults that should "just work". These notes should not be required to get started with Ditto, instead they're meant for people interested in more advanced use-cases such as dynamically linking or pre-downloading the companion C-library artifact.
Ditto's core functionality is released and packaged as a C library, which is
then imported into Rust via the dittolive-ditto-sys crate.
Downloading the companion binary artifact
This crate will, at build time, download the appropriate binary artifact from
https://software.ditto.live/rust/Ditto/<version>/<target>/release/[lib]dittoffi.{a,so,dylib,dll,lib}
- For example: https://software.ditto.live/rust/Ditto/5.0.0/aarch64-apple-darwin/release/libdittoffi.dylib
If you wish to avoid this, you will have to do it yourself:
-
Download the proper binary artifact;
-
Instruct
::dittolive-ditto-sys'build.rsscript to use it by setting theDITTOFFI_SEARCH_PATHenvironment variable appropriately (using an absolute path is recommended).
More precisely, the library search resolution order is as follows:
$DITTOFFI_SEARCH_PATH(if set)- The current working directory (
$PWD) - Best effort will be made to search
$CARGO_TARGET_DIRand$CARGO_TARGET_DIR/deps, this is imprecise as it must be derived from$OUT_DIR. $OUT_DIR(e.g.${CARGO_TARGET_DIR}/<profile>/build/dittolive-ditto-sys-.../out)- When using dynamic linking, host built-in defaults (e.g.
/usr/lib,/lib,/usr/local/lib,$HOME/lib) controlled by (system) linker setup.
If the library artifact is not found at any of these locations, the build script
will attempt its own download into the $OUT_DIR (and use that path).
Linking
C linkage is typically accompanied with some idiosyncrasies, such as symbol conflicts, or path resolution errors.
The first question you should answer is whether you want your application to use static or dynamic linking to access the Ditto library.
Statically linking libdittoffi (default, recommended)
This happens whenever the LIBDITTO_STATIC is explicitly set to 1, or unset.
If you have a special path to the libdittoffi.a/dittoffi.lib file (on Unix
and Windows, respectively), then you can use the DITTOFFI_SEARCH_PATH env var
to point to its location (using an absolute path), at linkage time (during
cargo build exclusively).
Dynamically linking (advanced)
You can opt into this behavior by setting the LIBDITTO_STATIC=0 environment
variable. When opting into this, you will have to handle library path
resolution to the libdittoffi.so/libdittoffi.dylib/dittoffi.dll file (on
Linux, macOS, and Windows, respectively).
That is, whilst the DITTOFFI_SEARCH_PATH is still important to help the
cargo build / linkage step resolve the dynamic library, the actual usage of
this file happens at runtime, when the (Rust) binary using ::dittolive_ditto
is executed.
It is thus advisable to install the C dynamic library artifact under one of the
system folders, such as /usr/lib or whatnot on Unix.
Otherwise, you would have to either:
-
meddle with link-time flags to set OS-specific loader metadata in the binary, such as the
R{,UN}PATH/install_path, paying special attention to the choice of absolute paths, binary-relative paths (such as$ORIGIN/...on Linux), or even working-directory-relative paths, or -
use env vars directives for the system dynamic loader, such as
DYLD_FALLBACK_LIBRARY_PATHon macOS, orLD_LIBRARY_PATHon Linux.
(For the technically-savvy, on macOS, the install_path of our .dylib
artifact is set to $rpath/libdittoffi.dylib).