use chrono::{DateTime, TimeZone, Utc};
use odpi::{enums, externs, flags, opaque};
use std::os::raw::{c_char, c_int, c_void};
use std::ptr;
use util::ODPIStr;
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIAppContext {
pub namespace_name: *const c_char,
pub namespace_name_length: u32,
pub name: *const c_char,
pub name_length: u32,
pub value: *const c_char,
pub value_length: u32,
}
impl Default for ODPIAppContext {
fn default() -> Self {
Self {
namespace_name: ptr::null(),
namespace_name_length: 0,
name: ptr::null(),
name_length: 0,
value: ptr::null(),
value_length: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIBytes {
pub ptr: *mut ::std::os::raw::c_char,
pub length: u32,
pub encoding: *const ::std::os::raw::c_char,
}
impl From<ODPIBytes> for String {
fn from(odpi_bytes: ODPIBytes) -> Self {
let res_s = ODPIStr::new(odpi_bytes.ptr, odpi_bytes.length);
res_s.into()
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPICommonCreateParams {
pub create_mode: flags::ODPICreateMode,
pub encoding: *const c_char,
pub nchar_encoding: *const c_char,
pub edition: *const c_char,
pub edition_length: u32,
pub driver_name: *const c_char,
pub driver_name_length: u32,
}
impl Default for ODPICommonCreateParams {
fn default() -> Self {
Self {
create_mode: flags::DPI_MODE_CREATE_DEFAULT,
encoding: ptr::null(),
nchar_encoding: ptr::null(),
edition: ptr::null(),
edition_length: 0,
driver_name: ptr::null(),
driver_name_length: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIConnCreateParams {
pub auth_mode: flags::ODPIAuthMode,
pub connection_class: *const c_char,
pub connection_class_length: u32,
pub purity: enums::ODPIPurity,
pub new_password: *const c_char,
pub new_password_length: u32,
pub app_context: *mut ODPIAppContext,
pub num_app_context: u32,
pub external_auth: c_int,
pub external_handle: *mut c_void,
pub pool: *mut opaque::ODPIPool,
pub tag: *const c_char,
pub tag_length: u32,
pub match_any_tag: c_int,
pub out_tag: *const c_char,
pub out_tag_length: u32,
pub out_tag_found: c_int,
pub sharding_key_columns: *mut ODPIShardingKeyColumn,
pub num_sharding_key_columns: u8,
pub super_sharding_key_columns: *mut ODPIShardingKeyColumn,
pub num_super_sharding_key_columns: u8,
}
impl Default for ODPIConnCreateParams {
fn default() -> Self {
Self {
auth_mode: flags::DPI_MODE_AUTH_DEFAULT,
connection_class: ptr::null(),
connection_class_length: 0,
purity: enums::ODPIPurity::DefaultPurity,
new_password: ptr::null(),
new_password_length: 0,
app_context: ptr::null_mut(),
num_app_context: 0,
external_auth: 0,
external_handle: ptr::null_mut(),
pool: ptr::null_mut(),
tag: ptr::null(),
tag_length: 0,
match_any_tag: 0,
out_tag: ptr::null(),
out_tag_length: 0,
out_tag_found: 0,
sharding_key_columns: ptr::null_mut(),
num_sharding_key_columns: 0,
super_sharding_key_columns: ptr::null_mut(),
num_super_sharding_key_columns: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct ODPIData {
pub is_null: ::std::os::raw::c_int,
pub value: ODPIDataBuffer,
}
impl Default for ODPIData {
fn default() -> Self {
Self {
is_null: 1,
value: ODPIDataBuffer { as_boolean: 0 },
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIDataTypeInfo {
pub oracle_type_num: enums::ODPIOracleTypeNum,
pub default_native_type_num: enums::ODPINativeTypeNum,
pub oci_type_code: u16,
pub db_size_in_bytes: u32,
pub client_size_in_bytes: u32,
pub size_in_chars: u32,
pub precision: i16,
pub scale: i8,
pub fs_precision: u8,
pub object_type: *mut opaque::ODPIObjectType,
}
impl Default for ODPIDataTypeInfo {
fn default() -> Self {
Self {
oracle_type_num: enums::ODPIOracleTypeNum::Max,
default_native_type_num: enums::ODPINativeTypeNum::Invalid,
oci_type_code: 0,
db_size_in_bytes: 0,
client_size_in_bytes: 0,
size_in_chars: 0,
precision: 0,
scale: 0,
fs_precision: 0,
object_type: ptr::null_mut(),
}
}
}
#[repr(C)]
#[derive(Clone, Copy)]
#[cfg_attr(rustfmt, rustfmt_skip)]
pub union ODPIDataBuffer {
pub as_boolean: ::std::os::raw::c_int,
pub as_int_64: i64,
pub as_uint_64: u64,
pub as_float: f32,
pub as_double: f64,
pub as_bytes: ODPIBytes,
pub as_timestamp: ODPITimestamp,
pub as_interval_ds: ODPIIntervalDS,
pub as_interval_ym: ODPIIntervalYM,
pub as_lob: *mut opaque::ODPILob,
pub as_object: *mut opaque::ODPIObject,
pub as_stmt: *mut opaque::ODPIStmt,
pub as_rowid: *mut opaque::ODPIRowid,
_bindgen_union_align: [u64; 3_usize],
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct ODPIEncodingInfo {
pub encoding: *const ::std::os::raw::c_char,
pub max_bytes_per_character: i32,
pub nchar_encoding: *const ::std::os::raw::c_char,
pub nchar_max_bytes_per_character: i32,
}
impl Default for ODPIEncodingInfo {
fn default() -> Self {
Self {
encoding: ptr::null(),
max_bytes_per_character: 0,
nchar_encoding: ptr::null(),
nchar_max_bytes_per_character: 0,
}
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct ODPIErrorInfo {
pub code: i32,
pub offset: u16,
pub message: *const c_char,
pub message_length: u32,
pub encoding: *const c_char,
pub fn_name: *const c_char,
pub action: *const c_char,
pub sql_state: *const c_char,
pub is_recoverable: c_int,
}
impl Default for ODPIErrorInfo {
fn default() -> Self {
Self {
code: 0,
offset: 0,
message: ptr::null(),
message_length: 0,
encoding: ptr::null(),
fn_name: ptr::null(),
action: ptr::null(),
sql_state: ptr::null(),
is_recoverable: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIIntervalDS {
pub days: i32,
pub hours: i32,
pub minutes: i32,
pub seconds: i32,
pub fseconds: i32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIIntervalYM {
pub years: i32,
pub months: i32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIObjectAttrInfo {
pub name: *const ::std::os::raw::c_char,
pub name_length: u32,
pub type_info: ODPIDataTypeInfo,
}
impl Default for ODPIObjectAttrInfo {
fn default() -> Self {
Self {
name: ptr::null(),
name_length: 0,
type_info: Default::default(),
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIObjectTypeInfo {
pub schema: *const ::std::os::raw::c_char,
pub schema_length: u32,
pub name: *const ::std::os::raw::c_char,
pub name_length: u32,
pub is_collection: ::std::os::raw::c_int,
pub element_type_info: ODPIDataTypeInfo,
pub num_attributes: u16,
}
impl Default for ODPIObjectTypeInfo {
fn default() -> Self {
Self {
schema: ptr::null(),
schema_length: 0,
name: ptr::null(),
name_length: 0,
is_collection: 0,
element_type_info: Default::default(),
num_attributes: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIPoolCreateParams {
pub min_sessions: u32,
pub max_sessions: u32,
pub session_increment: u32,
pub ping_interval: c_int,
pub ping_timeout: c_int,
pub homogeneous: c_int,
pub external_auth: c_int,
pub get_mode: enums::ODPIPoolGetMode,
pub out_pool_name: *const c_char,
pub out_pool_name_length: u32,
}
impl Default for ODPIPoolCreateParams {
fn default() -> Self {
Self {
min_sessions: 0,
max_sessions: 1,
session_increment: 0,
ping_interval: 60,
ping_timeout: 5000,
homogeneous: 0,
external_auth: 0,
get_mode: enums::ODPIPoolGetMode::NoWait,
out_pool_name: ptr::null(),
out_pool_name_length: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIQueryInfo {
pub name: *const ::std::os::raw::c_char,
pub name_length: u32,
pub type_info: ODPIDataTypeInfo,
pub null_ok: ::std::os::raw::c_int,
}
impl Default for ODPIQueryInfo {
fn default() -> Self {
Self {
name: ptr::null(),
name_length: 0,
type_info: Default::default(),
null_ok: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct ODPIShardingKeyColumn {
pub oracle_type_num: enums::ODPIOracleTypeNum,
pub native_type_num: enums::ODPINativeTypeNum,
pub value: ODPIDataBuffer,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIStmtInfo {
pub is_query: ::std::os::raw::c_int,
pub is_plsql: ::std::os::raw::c_int,
pub is_ddl: ::std::os::raw::c_int,
pub is_dml: ::std::os::raw::c_int,
pub statement_type: enums::ODPIStatementType,
pub is_returning: ::std::os::raw::c_int,
}
impl Default for ODPIStmtInfo {
fn default() -> Self {
Self {
is_query: 0,
is_plsql: 0,
is_ddl: 0,
is_dml: 0,
statement_type: enums::ODPIStatementType::Unknown,
is_returning: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPISubscrCreateParams {
pub subscr_namespace: enums::ODPISubscrNamespace,
pub protocol: enums::ODPISubscrProtocol,
pub qos: flags::ODPISubscrQOS,
pub operations: flags::ODPIOpCode,
pub port_number: u32,
pub timeout: u32,
pub name: *const c_char,
pub name_length: u32,
pub callback: externs::ODPISubscrCallback,
pub callback_context: *mut c_void,
pub recipient_name: *const c_char,
pub recipient_name_length: u32,
pub grouping_class: u8,
pub grouping_value: u32,
pub grouping_type: u8,
}
impl Default for ODPISubscrCreateParams {
fn default() -> Self {
Self {
subscr_namespace: enums::ODPISubscrNamespace::DbChange,
protocol: enums::ODPISubscrProtocol::Callback,
qos: flags::DPI_SUBSCR_QOS_NONE,
operations: flags::DPI_OPCODE_ALL_OPS,
port_number: 0,
timeout: 0,
name: ptr::null(),
name_length: 0,
callback: None,
callback_context: ptr::null_mut(),
recipient_name: ptr::null(),
recipient_name_length: 0,
grouping_class: 0,
grouping_value: 0,
grouping_type: 0,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPISubscrMessage {
pub event_type: enums::ODPIEventType,
pub db_name: *const c_char,
pub db_name_length: u32,
pub tables: *mut ODPISubscrMessageTable,
pub num_tables: u32,
pub queries: *mut ODPISubscrMessageQuery,
pub num_queries: u32,
pub error_info: *mut ODPIErrorInfo,
pub tx_id: *const c_void,
pub tx_id_length: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPISubscrMessageQuery {
pub id: u64,
pub operation: flags::ODPIOpCode,
pub tables: *mut ODPISubscrMessageTable,
pub num_tables: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPISubscrMessageRow {
pub operation: flags::ODPIOpCode,
pub rowid: *const c_char,
pub rowid_length: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPISubscrMessageTable {
pub operation: flags::ODPIOpCode,
pub name: *const c_char,
pub name_length: u32,
pub rows: *mut ODPISubscrMessageRow,
pub num_rows: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct ODPITimestamp {
pub year: i16,
pub month: u8,
pub day: u8,
pub hour: u8,
pub minute: u8,
pub second: u8,
pub fsecond: u32,
pub tz_hour_offset: i8,
pub tz_minute_offset: i8,
}
impl From<ODPITimestamp> for DateTime<Utc> {
fn from(timestamp: ODPITimestamp) -> Self {
let year = i32::from(timestamp.year);
let month = u32::from(timestamp.month);
let day = u32::from(timestamp.day);
let hour = u32::from(timestamp.hour);
let minute = u32::from(timestamp.minute);
let second = u32::from(timestamp.second);
let fs = timestamp.fsecond * 1000;
if year == -10_100 && month == 0 && day == 0 {
Utc::now()
} else {
Utc.ymd(year, month, day)
.and_hms_micro(hour, minute, second, fs)
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct ODPIVersionInfo {
pub version_num: c_int,
pub release_num: c_int,
pub update_num: c_int,
pub port_release_num: c_int,
pub port_update_num: c_int,
pub full_version_num: u32,
}
impl Default for ODPIVersionInfo {
fn default() -> Self {
Self {
version_num: 0,
release_num: 0,
update_num: 0,
port_release_num: 0,
port_update_num: 0,
full_version_num: 0,
}
}
}