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
//! Multi-logical registration of a shared [`DatabaseBackend`] on a [`DatabaseRouter`].
//!
//! Hosts often connect one backend instance and register it under several logical names.
//! Router keys are `"{engine_id}:{logical_name}"` where `engine_id` comes from
//! [`DatabaseBackend::engine_id`]. Examples:
//!
//! | engine_id | logical_name | router key |
//! |-----------|--------------|------------|
//! | `sqlite` | `default` | `sqlite:default` |
//! | `sqlite` | `billing` | `sqlite:billing` |
//! | `hybrid_indra_sql` | `default` | `hybrid_indra_sql:default` |
//! | `hybrid_indra_sql` | `jobs` | `hybrid_indra_sql:jobs` |
//!
//! Empty `logical_names` / empty `groups` is a no-op (the router is left unchanged).
use BTreeSet;
use Arc;
use crateDatabaseBackend;
use crateDatabaseRouter;
use craterouter_key;
/// Options for multi-logical backend registration.
/// Register one shared backend under each logical name.
///
/// Keys use [`router_key`] with `backend.engine_id()`. All names share the same
/// [`Arc`]. Passing an empty `logical_names` slice is a no-op.
///
/// # Examples
///
/// ```
/// use std::sync::Arc;
/// use valence_backend_mem::InMemoryBackend;
/// use valence_core::{
/// register_backend_logical_names, router_key, DatabaseBackend, DatabaseRouter,
/// RegisterBackendLogicalNamesOptions,
/// };
///
/// let backend: Arc<dyn DatabaseBackend> = Arc::new(InMemoryBackend::new());
/// let engine_id = backend.engine_id().to_owned();
/// let mut router = DatabaseRouter::new();
/// register_backend_logical_names(
/// &mut router,
/// backend,
/// &["default", "billing"],
/// RegisterBackendLogicalNamesOptions::default(),
/// );
/// assert!(router.resolve(&router_key("default", &engine_id)).is_ok());
/// assert!(router.resolve(&router_key("billing", &engine_id)).is_ok());
/// ```
/// Register `backend` under every distinct logical name in `groups` (deduplicated).
///
/// Flattened names are collected into a set so duplicate logical names across
/// slices register once. Empty `groups` (or only empty inner slices) is a no-op.
///
/// # Examples
///
/// ```
/// use std::sync::Arc;
/// use valence_backend_mem::InMemoryBackend;
/// use valence_core::{
/// register_backend_logical_names_slices, router_key, DatabaseBackend, DatabaseRouter,
/// RegisterBackendLogicalNamesOptions,
/// };
///
/// let backend: Arc<dyn DatabaseBackend> = Arc::new(InMemoryBackend::new());
/// let engine_id = backend.engine_id().to_owned();
/// let mut router = DatabaseRouter::new();
/// register_backend_logical_names_slices(
/// &mut router,
/// backend,
/// &[&["default"], &["billing"], &["jobs"]],
/// RegisterBackendLogicalNamesOptions::default(),
/// );
/// assert!(router.resolve(&router_key("jobs", &engine_id)).is_ok());
/// ```