mysql_handler/dd/
index.rs1#![allow(unsafe_code)]
27
28use crate::dd::ffi;
29use crate::sys::{DdIndex, DdIndexElement};
30
31#[non_exhaustive]
33#[derive(Debug, Clone, Copy, PartialEq, Eq)]
34#[allow(missing_docs)] pub enum IndexType {
36 Primary,
37 Unique,
38 Multiple,
39 FullText,
40 Spatial,
41 Unknown,
43}
44
45impl IndexType {
46 #[must_use]
48 pub const fn from_raw(raw: i32) -> Self {
49 match raw {
50 1 => Self::Primary,
51 2 => Self::Unique,
52 3 => Self::Multiple,
53 4 => Self::FullText,
54 5 => Self::Spatial,
55 _ => Self::Unknown,
56 }
57 }
58}
59
60#[non_exhaustive]
63#[derive(Debug, Clone, Copy, PartialEq, Eq)]
64#[allow(missing_docs)] pub enum IndexElementOrder {
66 Undefined,
67 Ascending,
68 Descending,
69 Unknown,
71}
72
73impl IndexElementOrder {
74 #[must_use]
76 pub const fn from_raw(raw: i32) -> Self {
77 match raw {
78 1 => Self::Undefined,
79 2 => Self::Ascending,
80 3 => Self::Descending,
81 _ => Self::Unknown,
82 }
83 }
84}
85
86impl DdIndex {
87 #[must_use]
90 pub fn name(&self) -> String {
91 let p: *const DdIndex = self;
92 ffi::read_name(|buf, cap| unsafe { ffi::mysql__DdIndex__name(p, buf, cap) })
94 }
95
96 #[must_use]
98 pub fn index_type(&self) -> IndexType {
99 let p: *const DdIndex = self;
100 let raw = unsafe { ffi::mysql__DdIndex__type(p) };
102 IndexType::from_raw(raw)
103 }
104
105 #[must_use]
107 pub fn is_hidden(&self) -> bool {
108 let p: *const DdIndex = self;
109 unsafe { ffi::mysql__DdIndex__is_hidden(p) }
111 }
112
113 #[must_use]
115 pub fn element_count(&self) -> usize {
116 let p: *const DdIndex = self;
117 unsafe { ffi::mysql__DdIndex__element_count(p) }
119 }
120
121 #[must_use]
123 pub fn element_at(&self, i: usize) -> Option<&DdIndexElement> {
124 let p: *const DdIndex = self;
125 let raw = unsafe { ffi::mysql__DdIndex__element_at(p, i) };
128 unsafe { raw.as_ref() }
131 }
132}
133
134impl DdIndexElement {
135 #[must_use]
137 pub fn column_ordinal(&self) -> u32 {
138 let p: *const DdIndexElement = self;
139 unsafe { ffi::mysql__DdIndexElement__column_ordinal(p) }
141 }
142
143 #[must_use]
145 pub fn length(&self) -> u32 {
146 let p: *const DdIndexElement = self;
147 unsafe { ffi::mysql__DdIndexElement__length(p) }
149 }
150
151 #[must_use]
153 pub fn order(&self) -> IndexElementOrder {
154 let p: *const DdIndexElement = self;
155 let raw = unsafe { ffi::mysql__DdIndexElement__order(p) };
157 IndexElementOrder::from_raw(raw)
158 }
159
160 #[must_use]
162 pub fn is_hidden(&self) -> bool {
163 let p: *const DdIndexElement = self;
164 unsafe { ffi::mysql__DdIndexElement__is_hidden(p) }
166 }
167}
168
169#[cfg(test)]
170mod tests {
171 use super::{IndexElementOrder, IndexType};
172
173 #[test]
174 fn index_type_from_raw_maps_known_variants() {
175 assert_eq!(IndexType::from_raw(1), IndexType::Primary);
176 assert_eq!(IndexType::from_raw(2), IndexType::Unique);
177 assert_eq!(IndexType::from_raw(3), IndexType::Multiple);
178 assert_eq!(IndexType::from_raw(4), IndexType::FullText);
179 assert_eq!(IndexType::from_raw(5), IndexType::Spatial);
180 }
181
182 #[test]
183 fn index_type_from_raw_returns_unknown_for_out_of_range() {
184 assert_eq!(IndexType::from_raw(0), IndexType::Unknown);
185 assert_eq!(IndexType::from_raw(99), IndexType::Unknown);
186 }
187
188 #[test]
189 fn order_from_raw_maps_known_variants() {
190 assert_eq!(IndexElementOrder::from_raw(1), IndexElementOrder::Undefined);
191 assert_eq!(IndexElementOrder::from_raw(2), IndexElementOrder::Ascending);
192 assert_eq!(
193 IndexElementOrder::from_raw(3),
194 IndexElementOrder::Descending
195 );
196 assert_eq!(IndexElementOrder::from_raw(4), IndexElementOrder::Unknown);
197 }
198}