#![allow(unsafe_code)]
use crate::dd::ffi;
use crate::sys::{DdIndex, DdIndexElement};
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(missing_docs)] pub enum IndexType {
Primary,
Unique,
Multiple,
FullText,
Spatial,
Unknown,
}
impl IndexType {
#[must_use]
pub const fn from_raw(raw: i32) -> Self {
match raw {
1 => Self::Primary,
2 => Self::Unique,
3 => Self::Multiple,
4 => Self::FullText,
5 => Self::Spatial,
_ => Self::Unknown,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(missing_docs)] pub enum IndexElementOrder {
Undefined,
Ascending,
Descending,
Unknown,
}
impl IndexElementOrder {
#[must_use]
pub const fn from_raw(raw: i32) -> Self {
match raw {
1 => Self::Undefined,
2 => Self::Ascending,
3 => Self::Descending,
_ => Self::Unknown,
}
}
}
impl DdIndex {
#[must_use]
pub fn name(&self) -> String {
let p: *const DdIndex = self;
ffi::read_name(|buf, cap| unsafe { ffi::mysql__DdIndex__name(p, buf, cap) })
}
#[must_use]
pub fn index_type(&self) -> IndexType {
let p: *const DdIndex = self;
let raw = unsafe { ffi::mysql__DdIndex__type(p) };
IndexType::from_raw(raw)
}
#[must_use]
pub fn is_hidden(&self) -> bool {
let p: *const DdIndex = self;
unsafe { ffi::mysql__DdIndex__is_hidden(p) }
}
#[must_use]
pub fn element_count(&self) -> usize {
let p: *const DdIndex = self;
unsafe { ffi::mysql__DdIndex__element_count(p) }
}
#[must_use]
pub fn element_at(&self, i: usize) -> Option<&DdIndexElement> {
let p: *const DdIndex = self;
let raw = unsafe { ffi::mysql__DdIndex__element_at(p, i) };
unsafe { raw.as_ref() }
}
}
impl DdIndexElement {
#[must_use]
pub fn column_ordinal(&self) -> u32 {
let p: *const DdIndexElement = self;
unsafe { ffi::mysql__DdIndexElement__column_ordinal(p) }
}
#[must_use]
pub fn length(&self) -> u32 {
let p: *const DdIndexElement = self;
unsafe { ffi::mysql__DdIndexElement__length(p) }
}
#[must_use]
pub fn order(&self) -> IndexElementOrder {
let p: *const DdIndexElement = self;
let raw = unsafe { ffi::mysql__DdIndexElement__order(p) };
IndexElementOrder::from_raw(raw)
}
#[must_use]
pub fn is_hidden(&self) -> bool {
let p: *const DdIndexElement = self;
unsafe { ffi::mysql__DdIndexElement__is_hidden(p) }
}
}
#[cfg(test)]
mod tests {
use super::{IndexElementOrder, IndexType};
#[test]
fn index_type_from_raw_maps_known_variants() {
assert_eq!(IndexType::from_raw(1), IndexType::Primary);
assert_eq!(IndexType::from_raw(2), IndexType::Unique);
assert_eq!(IndexType::from_raw(3), IndexType::Multiple);
assert_eq!(IndexType::from_raw(4), IndexType::FullText);
assert_eq!(IndexType::from_raw(5), IndexType::Spatial);
}
#[test]
fn index_type_from_raw_returns_unknown_for_out_of_range() {
assert_eq!(IndexType::from_raw(0), IndexType::Unknown);
assert_eq!(IndexType::from_raw(99), IndexType::Unknown);
}
#[test]
fn order_from_raw_maps_known_variants() {
assert_eq!(IndexElementOrder::from_raw(1), IndexElementOrder::Undefined);
assert_eq!(IndexElementOrder::from_raw(2), IndexElementOrder::Ascending);
assert_eq!(
IndexElementOrder::from_raw(3),
IndexElementOrder::Descending
);
assert_eq!(IndexElementOrder::from_raw(4), IndexElementOrder::Unknown);
}
}