Skip to content

iterator: don't erase the lifetime by using 'static #226

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions scylla-rust-wrapper/src/future.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ impl CassFuture {
state: Mutex::new(Default::default()),
wait_for_value: Condvar::new(),
});
let cass_fut_clone = cass_fut.clone();
let cass_fut_clone = Arc::clone(&cass_fut);
let join_handle = RUNTIME.spawn(async move {
let r = fut.await;
let maybe_cb = {
Expand Down Expand Up @@ -360,7 +360,7 @@ pub unsafe extern "C" fn cass_future_get_result(
ArcFFI::as_ref(future_raw)
.with_waited_result(|r: &mut CassFutureResult| -> Option<Arc<CassResult>> {
match r.as_ref().ok()? {
CassResultValue::QueryResult(qr) => Some(qr.clone()),
CassResultValue::QueryResult(qr) => Some(Arc::clone(qr)),
_ => None,
}
})
Expand All @@ -374,7 +374,7 @@ pub unsafe extern "C" fn cass_future_get_error_result(
ArcFFI::as_ref(future_raw)
.with_waited_result(|r: &mut CassFutureResult| -> Option<Arc<CassErrorResult>> {
match r.as_ref().ok()? {
CassResultValue::QueryError(qr) => Some(qr.clone()),
CassResultValue::QueryError(qr) => Some(Arc::clone(qr)),
_ => None,
}
})
Expand All @@ -388,7 +388,7 @@ pub unsafe extern "C" fn cass_future_get_prepared(
ArcFFI::as_ref(future_raw)
.with_waited_result(|r: &mut CassFutureResult| -> Option<Arc<CassPrepared>> {
match r.as_ref().ok()? {
CassResultValue::Prepared(p) => Some(p.clone()),
CassResultValue::Prepared(p) => Some(Arc::clone(p)),
_ => None,
}
})
Expand Down
116 changes: 62 additions & 54 deletions scylla-rust-wrapper/src/query_result.rs
Original file line number Diff line number Diff line change
Expand Up @@ -277,73 +277,73 @@ fn get_column_value(column: CqlValue, column_type: &Arc<CassDataType>) -> Value
}
}

pub struct CassResultIterator {
result: Arc<CassResult>,
pub struct CassResultIterator<'result> {
result: &'result CassResult,
position: Option<usize>,
}

pub struct CassRowIterator {
row: &'static CassRow,
pub struct CassRowIterator<'result> {
row: &'result CassRow,
position: Option<usize>,
}

pub struct CassCollectionIterator {
value: &'static CassValue,
pub struct CassCollectionIterator<'result> {
value: &'result CassValue,
count: u64,
position: Option<usize>,
}

pub struct CassMapIterator {
value: &'static CassValue,
pub struct CassMapIterator<'result> {
value: &'result CassValue,
count: u64,
position: Option<usize>,
}

pub struct CassUdtIterator {
value: &'static CassValue,
pub struct CassUdtIterator<'result> {
value: &'result CassValue,
count: u64,
position: Option<usize>,
}

pub struct CassSchemaMetaIterator {
value: &'static CassSchemaMeta,
pub struct CassSchemaMetaIterator<'schema> {
value: &'schema CassSchemaMeta,
count: usize,
position: Option<usize>,
}

pub struct CassKeyspaceMetaIterator {
value: &'static CassKeyspaceMeta,
pub struct CassKeyspaceMetaIterator<'schema> {
value: &'schema CassKeyspaceMeta,
count: usize,
position: Option<usize>,
}

pub struct CassTableMetaIterator {
value: &'static CassTableMeta,
pub struct CassTableMetaIterator<'schema> {
value: &'schema CassTableMeta,
count: usize,
position: Option<usize>,
}

pub struct CassViewMetaIterator {
value: &'static CassMaterializedViewMeta,
pub struct CassViewMetaIterator<'schema> {
value: &'schema CassMaterializedViewMeta,
count: usize,
position: Option<usize>,
}

pub enum CassIterator {
CassResultIterator(CassResultIterator),
CassRowIterator(CassRowIterator),
CassCollectionIterator(CassCollectionIterator),
CassMapIterator(CassMapIterator),
CassUdtIterator(CassUdtIterator),
CassSchemaMetaIterator(CassSchemaMetaIterator),
CassKeyspaceMetaTableIterator(CassKeyspaceMetaIterator),
CassKeyspaceMetaUserTypeIterator(CassKeyspaceMetaIterator),
CassKeyspaceMetaViewIterator(CassKeyspaceMetaIterator),
CassTableMetaIterator(CassTableMetaIterator),
CassViewMetaIterator(CassViewMetaIterator),
pub enum CassIterator<'result_or_schema> {
CassResultIterator(CassResultIterator<'result_or_schema>),
CassRowIterator(CassRowIterator<'result_or_schema>),
CassCollectionIterator(CassCollectionIterator<'result_or_schema>),
CassMapIterator(CassMapIterator<'result_or_schema>),
CassUdtIterator(CassUdtIterator<'result_or_schema>),
CassSchemaMetaIterator(CassSchemaMetaIterator<'result_or_schema>),
CassKeyspaceMetaTableIterator(CassKeyspaceMetaIterator<'result_or_schema>),
CassKeyspaceMetaUserTypeIterator(CassKeyspaceMetaIterator<'result_or_schema>),
CassKeyspaceMetaViewIterator(CassKeyspaceMetaIterator<'result_or_schema>),
CassTableMetaIterator(CassTableMetaIterator<'result_or_schema>),
CassViewMetaIterator(CassViewMetaIterator<'result_or_schema>),
}

impl BoxFFI for CassIterator {}
impl BoxFFI for CassIterator<'_> {}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_free(iterator: *mut CassIterator) {
Expand Down Expand Up @@ -823,8 +823,10 @@ pub unsafe extern "C" fn cass_iterator_get_materialized_view_meta(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_from_result(result: *const CassResult) -> *mut CassIterator {
let result_from_raw = ArcFFI::cloned_from_ptr(result);
pub unsafe extern "C" fn cass_iterator_from_result<'result>(
result: *const CassResult,
) -> *mut CassIterator<'result> {
let result_from_raw = ArcFFI::as_ref(result);

let iterator = CassResultIterator {
result: result_from_raw,
Expand All @@ -835,7 +837,9 @@ pub unsafe extern "C" fn cass_iterator_from_result(result: *const CassResult) ->
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_from_row(row: *const CassRow) -> *mut CassIterator {
pub unsafe extern "C" fn cass_iterator_from_row<'result>(
row: *const CassRow,
) -> *mut CassIterator<'result> {
let row_from_raw = RefFFI::as_ref(row);

let iterator = CassRowIterator {
Expand All @@ -847,9 +851,9 @@ pub unsafe extern "C" fn cass_iterator_from_row(row: *const CassRow) -> *mut Cas
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_from_collection(
pub unsafe extern "C" fn cass_iterator_from_collection<'result>(
value: *const CassValue,
) -> *mut CassIterator {
) -> *mut CassIterator<'result> {
let is_collection = cass_value_is_collection(value) != 0;

if value.is_null() || !is_collection {
Expand All @@ -873,7 +877,9 @@ pub unsafe extern "C" fn cass_iterator_from_collection(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_from_tuple(value: *const CassValue) -> *mut CassIterator {
pub unsafe extern "C" fn cass_iterator_from_tuple<'result>(
value: *const CassValue,
) -> *mut CassIterator<'result> {
let tuple = RefFFI::as_ref(value);

if let Some(Value::CollectionValue(Collection::Tuple(val))) = &tuple.value {
Expand All @@ -891,7 +897,9 @@ pub unsafe extern "C" fn cass_iterator_from_tuple(value: *const CassValue) -> *m
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_from_map(value: *const CassValue) -> *mut CassIterator {
pub unsafe extern "C" fn cass_iterator_from_map<'result>(
value: *const CassValue,
) -> *mut CassIterator<'result> {
let map = RefFFI::as_ref(value);

if let Some(Value::CollectionValue(Collection::Map(val))) = &map.value {
Expand All @@ -909,9 +917,9 @@ pub unsafe extern "C" fn cass_iterator_from_map(value: *const CassValue) -> *mut
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_fields_from_user_type(
pub unsafe extern "C" fn cass_iterator_fields_from_user_type<'result>(
value: *const CassValue,
) -> *mut CassIterator {
) -> *mut CassIterator<'result> {
let udt = RefFFI::as_ref(value);

if let Some(Value::CollectionValue(Collection::UserDefinedType { fields, .. })) = &udt.value {
Expand All @@ -929,9 +937,9 @@ pub unsafe extern "C" fn cass_iterator_fields_from_user_type(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_keyspaces_from_schema_meta(
pub unsafe extern "C" fn cass_iterator_keyspaces_from_schema_meta<'schema>(
schema_meta: *const CassSchemaMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = BoxFFI::as_ref(schema_meta);

let iterator = CassSchemaMetaIterator {
Expand All @@ -944,9 +952,9 @@ pub unsafe extern "C" fn cass_iterator_keyspaces_from_schema_meta(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_tables_from_keyspace_meta(
pub unsafe extern "C" fn cass_iterator_tables_from_keyspace_meta<'schema>(
keyspace_meta: *const CassKeyspaceMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = RefFFI::as_ref(keyspace_meta);

let iterator = CassKeyspaceMetaIterator {
Expand All @@ -961,9 +969,9 @@ pub unsafe extern "C" fn cass_iterator_tables_from_keyspace_meta(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_materialized_views_from_keyspace_meta(
pub unsafe extern "C" fn cass_iterator_materialized_views_from_keyspace_meta<'schema>(
keyspace_meta: *const CassKeyspaceMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = RefFFI::as_ref(keyspace_meta);

let iterator = CassKeyspaceMetaIterator {
Expand All @@ -978,9 +986,9 @@ pub unsafe extern "C" fn cass_iterator_materialized_views_from_keyspace_meta(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_user_types_from_keyspace_meta(
pub unsafe extern "C" fn cass_iterator_user_types_from_keyspace_meta<'schema>(
keyspace_meta: *const CassKeyspaceMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = RefFFI::as_ref(keyspace_meta);

let iterator = CassKeyspaceMetaIterator {
Expand All @@ -995,9 +1003,9 @@ pub unsafe extern "C" fn cass_iterator_user_types_from_keyspace_meta(
}

#[no_mangle]
pub unsafe extern "C" fn cass_iterator_columns_from_table_meta(
pub unsafe extern "C" fn cass_iterator_columns_from_table_meta<'schema>(
table_meta: *const CassTableMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = RefFFI::as_ref(table_meta);

let iterator = CassTableMetaIterator {
Expand All @@ -1009,9 +1017,9 @@ pub unsafe extern "C" fn cass_iterator_columns_from_table_meta(
BoxFFI::into_ptr(Box::new(CassIterator::CassTableMetaIterator(iterator)))
}

pub unsafe extern "C" fn cass_iterator_materialized_views_from_table_meta(
pub unsafe extern "C" fn cass_iterator_materialized_views_from_table_meta<'schema>(
table_meta: *const CassTableMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = RefFFI::as_ref(table_meta);

let iterator = CassTableMetaIterator {
Expand All @@ -1023,9 +1031,9 @@ pub unsafe extern "C" fn cass_iterator_materialized_views_from_table_meta(
BoxFFI::into_ptr(Box::new(CassIterator::CassTableMetaIterator(iterator)))
}

pub unsafe extern "C" fn cass_iterator_columns_from_materialized_view_meta(
pub unsafe extern "C" fn cass_iterator_columns_from_materialized_view_meta<'schema>(
view_meta: *const CassMaterializedViewMeta,
) -> *mut CassIterator {
) -> *mut CassIterator<'schema> {
let metadata = RefFFI::as_ref(view_meta);

let iterator = CassViewMetaIterator {
Expand Down