Skip to content

Commit f80ae3b

Browse files
authored
Merge pull request #226 from muzarski/iterator-litetimes
iterator: don't erase the lifetime by using 'static
2 parents 8c859b0 + 0a00d39 commit f80ae3b

File tree

2 files changed

+66
-58
lines changed

2 files changed

+66
-58
lines changed

scylla-rust-wrapper/src/future.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl CassFuture {
8686
state: Mutex::new(Default::default()),
8787
wait_for_value: Condvar::new(),
8888
});
89-
let cass_fut_clone = cass_fut.clone();
89+
let cass_fut_clone = Arc::clone(&cass_fut);
9090
let join_handle = RUNTIME.spawn(async move {
9191
let r = fut.await;
9292
let maybe_cb = {
@@ -358,7 +358,7 @@ pub unsafe extern "C" fn cass_future_get_result(future_raw: *mut CassFuture) ->
358358
ArcFFI::as_ref(future_raw)
359359
.with_waited_result(|r: &mut CassFutureResult| -> Option<Arc<CassResult>> {
360360
match r.as_ref().ok()? {
361-
CassResultValue::QueryResult(qr) => Some(qr.clone()),
361+
CassResultValue::QueryResult(qr) => Some(Arc::clone(qr)),
362362
_ => None,
363363
}
364364
})
@@ -372,7 +372,7 @@ pub unsafe extern "C" fn cass_future_get_error_result(
372372
ArcFFI::as_ref(future_raw)
373373
.with_waited_result(|r: &mut CassFutureResult| -> Option<Arc<CassErrorResult>> {
374374
match r.as_ref().ok()? {
375-
CassResultValue::QueryError(qr) => Some(qr.clone()),
375+
CassResultValue::QueryError(qr) => Some(Arc::clone(qr)),
376376
_ => None,
377377
}
378378
})
@@ -386,7 +386,7 @@ pub unsafe extern "C" fn cass_future_get_prepared(
386386
ArcFFI::as_ref(future_raw)
387387
.with_waited_result(|r: &mut CassFutureResult| -> Option<Arc<CassPrepared>> {
388388
match r.as_ref().ok()? {
389-
CassResultValue::Prepared(p) => Some(p.clone()),
389+
CassResultValue::Prepared(p) => Some(Arc::clone(p)),
390390
_ => None,
391391
}
392392
})

scylla-rust-wrapper/src/query_result.rs

Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -277,73 +277,73 @@ fn get_column_value(column: CqlValue, column_type: &Arc<CassDataType>) -> Value
277277
}
278278
}
279279

280-
pub struct CassResultIterator {
281-
result: Arc<CassResult>,
280+
pub struct CassResultIterator<'result> {
281+
result: &'result CassResult,
282282
position: Option<usize>,
283283
}
284284

285-
pub struct CassRowIterator {
286-
row: &'static CassRow,
285+
pub struct CassRowIterator<'result> {
286+
row: &'result CassRow,
287287
position: Option<usize>,
288288
}
289289

290-
pub struct CassCollectionIterator {
291-
value: &'static CassValue,
290+
pub struct CassCollectionIterator<'result> {
291+
value: &'result CassValue,
292292
count: u64,
293293
position: Option<usize>,
294294
}
295295

296-
pub struct CassMapIterator {
297-
value: &'static CassValue,
296+
pub struct CassMapIterator<'result> {
297+
value: &'result CassValue,
298298
count: u64,
299299
position: Option<usize>,
300300
}
301301

302-
pub struct CassUdtIterator {
303-
value: &'static CassValue,
302+
pub struct CassUdtIterator<'result> {
303+
value: &'result CassValue,
304304
count: u64,
305305
position: Option<usize>,
306306
}
307307

308-
pub struct CassSchemaMetaIterator {
309-
value: &'static CassSchemaMeta,
308+
pub struct CassSchemaMetaIterator<'schema> {
309+
value: &'schema CassSchemaMeta,
310310
count: usize,
311311
position: Option<usize>,
312312
}
313313

314-
pub struct CassKeyspaceMetaIterator {
315-
value: &'static CassKeyspaceMeta,
314+
pub struct CassKeyspaceMetaIterator<'schema> {
315+
value: &'schema CassKeyspaceMeta,
316316
count: usize,
317317
position: Option<usize>,
318318
}
319319

320-
pub struct CassTableMetaIterator {
321-
value: &'static CassTableMeta,
320+
pub struct CassTableMetaIterator<'schema> {
321+
value: &'schema CassTableMeta,
322322
count: usize,
323323
position: Option<usize>,
324324
}
325325

326-
pub struct CassViewMetaIterator {
327-
value: &'static CassMaterializedViewMeta,
326+
pub struct CassViewMetaIterator<'schema> {
327+
value: &'schema CassMaterializedViewMeta,
328328
count: usize,
329329
position: Option<usize>,
330330
}
331331

332-
pub enum CassIterator {
333-
CassResultIterator(CassResultIterator),
334-
CassRowIterator(CassRowIterator),
335-
CassCollectionIterator(CassCollectionIterator),
336-
CassMapIterator(CassMapIterator),
337-
CassUdtIterator(CassUdtIterator),
338-
CassSchemaMetaIterator(CassSchemaMetaIterator),
339-
CassKeyspaceMetaTableIterator(CassKeyspaceMetaIterator),
340-
CassKeyspaceMetaUserTypeIterator(CassKeyspaceMetaIterator),
341-
CassKeyspaceMetaViewIterator(CassKeyspaceMetaIterator),
342-
CassTableMetaIterator(CassTableMetaIterator),
343-
CassViewMetaIterator(CassViewMetaIterator),
332+
pub enum CassIterator<'result_or_schema> {
333+
CassResultIterator(CassResultIterator<'result_or_schema>),
334+
CassRowIterator(CassRowIterator<'result_or_schema>),
335+
CassCollectionIterator(CassCollectionIterator<'result_or_schema>),
336+
CassMapIterator(CassMapIterator<'result_or_schema>),
337+
CassUdtIterator(CassUdtIterator<'result_or_schema>),
338+
CassSchemaMetaIterator(CassSchemaMetaIterator<'result_or_schema>),
339+
CassKeyspaceMetaTableIterator(CassKeyspaceMetaIterator<'result_or_schema>),
340+
CassKeyspaceMetaUserTypeIterator(CassKeyspaceMetaIterator<'result_or_schema>),
341+
CassKeyspaceMetaViewIterator(CassKeyspaceMetaIterator<'result_or_schema>),
342+
CassTableMetaIterator(CassTableMetaIterator<'result_or_schema>),
343+
CassViewMetaIterator(CassViewMetaIterator<'result_or_schema>),
344344
}
345345

346-
impl BoxFFI for CassIterator {}
346+
impl BoxFFI for CassIterator<'_> {}
347347

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

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

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

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

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

849853
#[no_mangle]
850-
pub unsafe extern "C" fn cass_iterator_from_collection(
854+
pub unsafe extern "C" fn cass_iterator_from_collection<'result>(
851855
value: *const CassValue,
852-
) -> *mut CassIterator {
856+
) -> *mut CassIterator<'result> {
853857
let is_collection = cass_value_is_collection(value) != 0;
854858

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

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

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

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

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

911919
#[no_mangle]
912-
pub unsafe extern "C" fn cass_iterator_fields_from_user_type(
920+
pub unsafe extern "C" fn cass_iterator_fields_from_user_type<'result>(
913921
value: *const CassValue,
914-
) -> *mut CassIterator {
922+
) -> *mut CassIterator<'result> {
915923
let udt = RefFFI::as_ref(value);
916924

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

931939
#[no_mangle]
932-
pub unsafe extern "C" fn cass_iterator_keyspaces_from_schema_meta(
940+
pub unsafe extern "C" fn cass_iterator_keyspaces_from_schema_meta<'schema>(
933941
schema_meta: *const CassSchemaMeta,
934-
) -> *mut CassIterator {
942+
) -> *mut CassIterator<'schema> {
935943
let metadata = BoxFFI::as_ref(schema_meta);
936944

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

946954
#[no_mangle]
947-
pub unsafe extern "C" fn cass_iterator_tables_from_keyspace_meta(
955+
pub unsafe extern "C" fn cass_iterator_tables_from_keyspace_meta<'schema>(
948956
keyspace_meta: *const CassKeyspaceMeta,
949-
) -> *mut CassIterator {
957+
) -> *mut CassIterator<'schema> {
950958
let metadata = RefFFI::as_ref(keyspace_meta);
951959

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

963971
#[no_mangle]
964-
pub unsafe extern "C" fn cass_iterator_materialized_views_from_keyspace_meta(
972+
pub unsafe extern "C" fn cass_iterator_materialized_views_from_keyspace_meta<'schema>(
965973
keyspace_meta: *const CassKeyspaceMeta,
966-
) -> *mut CassIterator {
974+
) -> *mut CassIterator<'schema> {
967975
let metadata = RefFFI::as_ref(keyspace_meta);
968976

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

980988
#[no_mangle]
981-
pub unsafe extern "C" fn cass_iterator_user_types_from_keyspace_meta(
989+
pub unsafe extern "C" fn cass_iterator_user_types_from_keyspace_meta<'schema>(
982990
keyspace_meta: *const CassKeyspaceMeta,
983-
) -> *mut CassIterator {
991+
) -> *mut CassIterator<'schema> {
984992
let metadata = RefFFI::as_ref(keyspace_meta);
985993

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

9971005
#[no_mangle]
998-
pub unsafe extern "C" fn cass_iterator_columns_from_table_meta(
1006+
pub unsafe extern "C" fn cass_iterator_columns_from_table_meta<'schema>(
9991007
table_meta: *const CassTableMeta,
1000-
) -> *mut CassIterator {
1008+
) -> *mut CassIterator<'schema> {
10011009
let metadata = RefFFI::as_ref(table_meta);
10021010

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

1012-
pub unsafe extern "C" fn cass_iterator_materialized_views_from_table_meta(
1020+
pub unsafe extern "C" fn cass_iterator_materialized_views_from_table_meta<'schema>(
10131021
table_meta: *const CassTableMeta,
1014-
) -> *mut CassIterator {
1022+
) -> *mut CassIterator<'schema> {
10151023
let metadata = RefFFI::as_ref(table_meta);
10161024

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

1026-
pub unsafe extern "C" fn cass_iterator_columns_from_materialized_view_meta(
1034+
pub unsafe extern "C" fn cass_iterator_columns_from_materialized_view_meta<'schema>(
10271035
view_meta: *const CassMaterializedViewMeta,
1028-
) -> *mut CassIterator {
1036+
) -> *mut CassIterator<'schema> {
10291037
let metadata = RefFFI::as_ref(view_meta);
10301038

10311039
let iterator = CassViewMetaIterator {

0 commit comments

Comments
 (0)