use super::cursor_types::{CursorConcurrency, CursorScrollOption, CursorStatus};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CursorOpenResponse {
pub cursor_id: i32,
pub negotiated_scroll: CursorScrollOption,
pub negotiated_concurrency: CursorConcurrency,
pub row_count: i32,
pub status: CursorStatus,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CursorPrepExecResponse {
pub prepared_handle: i32,
pub cursor: CursorOpenResponse,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CursorPrepareResponse {
pub prepared_handle: i32,
pub negotiated_scroll: CursorScrollOption,
pub negotiated_concurrency: CursorConcurrency,
pub status: CursorStatus,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cursor_open_response_construction() {
let resp = CursorOpenResponse {
cursor_id: 42,
negotiated_scroll: CursorScrollOption::FORWARD_ONLY,
negotiated_concurrency: CursorConcurrency::READONLY,
row_count: 100,
status: CursorStatus::Succeeded,
};
assert_eq!(resp.cursor_id, 42);
assert_eq!(resp.negotiated_scroll, CursorScrollOption::FORWARD_ONLY);
assert_eq!(resp.negotiated_concurrency, CursorConcurrency::READONLY);
assert_eq!(resp.row_count, 100);
}
#[test]
fn cursor_open_response_negotiated_downgrade() {
let resp = CursorOpenResponse {
cursor_id: 7,
negotiated_scroll: CursorScrollOption::KEYSET_DRIVEN,
negotiated_concurrency: CursorConcurrency::READONLY,
row_count: 0,
status: CursorStatus::Succeeded,
};
assert_ne!(resp.negotiated_scroll, CursorScrollOption::DYNAMIC);
assert_eq!(resp.negotiated_scroll, CursorScrollOption::KEYSET_DRIVEN);
}
#[test]
fn cursor_open_response_clone_and_eq() {
let resp = CursorOpenResponse {
cursor_id: 1,
negotiated_scroll: CursorScrollOption::STATIC,
negotiated_concurrency: CursorConcurrency::OPTCC,
row_count: 50,
status: CursorStatus::Succeeded,
};
let cloned = resp.clone();
assert_eq!(resp, cloned);
}
#[test]
fn cursor_prepexec_response_construction() {
let resp = CursorPrepExecResponse {
prepared_handle: 99,
cursor: CursorOpenResponse {
cursor_id: 10,
negotiated_scroll: CursorScrollOption::KEYSET_DRIVEN,
negotiated_concurrency: CursorConcurrency::OPTCC,
row_count: 200,
status: CursorStatus::Succeeded,
},
};
assert_eq!(resp.prepared_handle, 99);
assert_eq!(resp.cursor.cursor_id, 10);
assert_eq!(
resp.cursor.negotiated_scroll,
CursorScrollOption::KEYSET_DRIVEN
);
assert_eq!(resp.cursor.row_count, 200);
}
#[test]
fn cursor_prepexec_response_clone_and_eq() {
let resp = CursorPrepExecResponse {
prepared_handle: 5,
cursor: CursorOpenResponse {
cursor_id: 3,
negotiated_scroll: CursorScrollOption::DYNAMIC,
negotiated_concurrency: CursorConcurrency::LOCKCC,
row_count: 0,
status: CursorStatus::Succeeded,
},
};
let cloned = resp.clone();
assert_eq!(resp, cloned);
}
#[test]
fn cursor_prepare_response_construction() {
let resp = CursorPrepareResponse {
prepared_handle: 77,
negotiated_scroll: CursorScrollOption::FORWARD_ONLY | CursorScrollOption::AUTO_CLOSE,
negotiated_concurrency: CursorConcurrency::READONLY,
status: CursorStatus::Succeeded,
};
assert_eq!(resp.prepared_handle, 77);
assert!(
resp.negotiated_scroll
.contains(CursorScrollOption::FORWARD_ONLY)
);
assert!(
resp.negotiated_scroll
.contains(CursorScrollOption::AUTO_CLOSE)
);
assert_eq!(resp.negotiated_concurrency, CursorConcurrency::READONLY);
}
#[test]
fn cursor_prepare_response_clone_and_eq() {
let resp = CursorPrepareResponse {
prepared_handle: 12,
negotiated_scroll: CursorScrollOption::STATIC,
negotiated_concurrency: CursorConcurrency::OPTCCVAL,
status: CursorStatus::Succeeded,
};
let cloned = resp.clone();
assert_eq!(resp, cloned);
}
}