1
- use crate :: argconv:: { ArcFFI , BoxFFI } ;
1
+ use crate :: argconv:: {
2
+ ArcFFI , BoxFFI , CMut , CassBorrowedExclusivePtr , CassBorrowedSharedPtr , CassOwnedExclusivePtr ,
3
+ FromBox , FFI ,
4
+ } ;
2
5
use crate :: cass_error:: CassError ;
3
6
use crate :: cass_types:: CassConsistency ;
4
7
use crate :: cass_types:: { make_batch_type, CassBatchType } ;
@@ -19,7 +22,9 @@ pub struct CassBatch {
19
22
pub ( crate ) exec_profile : Option < PerStatementExecProfile > ,
20
23
}
21
24
22
- impl BoxFFI for CassBatch { }
25
+ impl FFI for CassBatch {
26
+ type Origin = FromBox ;
27
+ }
23
28
24
29
#[ derive( Clone ) ]
25
30
pub struct CassBatchState {
@@ -28,7 +33,9 @@ pub struct CassBatchState {
28
33
}
29
34
30
35
#[ no_mangle]
31
- pub unsafe extern "C" fn cass_batch_new ( type_ : CassBatchType ) -> * mut CassBatch {
36
+ pub unsafe extern "C" fn cass_batch_new (
37
+ type_ : CassBatchType ,
38
+ ) -> CassOwnedExclusivePtr < CassBatch , CMut > {
32
39
if let Some ( batch_type) = make_batch_type ( type_) {
33
40
BoxFFI :: into_ptr ( Box :: new ( CassBatch {
34
41
state : Arc :: new ( CassBatchState {
@@ -39,21 +46,21 @@ pub unsafe extern "C" fn cass_batch_new(type_: CassBatchType) -> *mut CassBatch
39
46
exec_profile : None ,
40
47
} ) )
41
48
} else {
42
- std :: ptr :: null_mut ( )
49
+ BoxFFI :: null_mut ( )
43
50
}
44
51
}
45
52
46
53
#[ no_mangle]
47
- pub unsafe extern "C" fn cass_batch_free ( batch : * mut CassBatch ) {
54
+ pub unsafe extern "C" fn cass_batch_free ( batch : CassOwnedExclusivePtr < CassBatch , CMut > ) {
48
55
BoxFFI :: free ( batch) ;
49
56
}
50
57
51
58
#[ no_mangle]
52
59
pub unsafe extern "C" fn cass_batch_set_consistency (
53
- batch : * mut CassBatch ,
60
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
54
61
consistency : CassConsistency ,
55
62
) -> CassError {
56
- let batch = BoxFFI :: as_mut_ref ( batch) ;
63
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
57
64
let consistency = match consistency. try_into ( ) . ok ( ) {
58
65
Some ( c) => c,
59
66
None => return CassError :: CASS_ERROR_LIB_BAD_PARAMS ,
@@ -67,10 +74,10 @@ pub unsafe extern "C" fn cass_batch_set_consistency(
67
74
68
75
#[ no_mangle]
69
76
pub unsafe extern "C" fn cass_batch_set_serial_consistency (
70
- batch : * mut CassBatch ,
77
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
71
78
serial_consistency : CassConsistency ,
72
79
) -> CassError {
73
- let batch = BoxFFI :: as_mut_ref ( batch) ;
80
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
74
81
let serial_consistency = match serial_consistency. try_into ( ) . ok ( ) {
75
82
Some ( c) => c,
76
83
None => return CassError :: CASS_ERROR_LIB_BAD_PARAMS ,
@@ -84,13 +91,13 @@ pub unsafe extern "C" fn cass_batch_set_serial_consistency(
84
91
85
92
#[ no_mangle]
86
93
pub unsafe extern "C" fn cass_batch_set_retry_policy (
87
- batch : * mut CassBatch ,
88
- retry_policy : * const CassRetryPolicy ,
94
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
95
+ retry_policy : CassBorrowedSharedPtr < CassRetryPolicy , CMut > ,
89
96
) -> CassError {
90
- let batch = BoxFFI :: as_mut_ref ( batch) ;
97
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
91
98
92
99
let maybe_arced_retry_policy: Option < Arc < dyn scylla:: policies:: retry:: RetryPolicy > > =
93
- ArcFFI :: as_maybe_ref ( retry_policy) . map ( |policy| match policy {
100
+ ArcFFI :: as_ref ( retry_policy) . map ( |policy| match policy {
94
101
CassRetryPolicy :: DefaultRetryPolicy ( default) => {
95
102
default. clone ( ) as Arc < dyn scylla:: policies:: retry:: RetryPolicy >
96
103
}
@@ -107,10 +114,10 @@ pub unsafe extern "C" fn cass_batch_set_retry_policy(
107
114
108
115
#[ no_mangle]
109
116
pub unsafe extern "C" fn cass_batch_set_timestamp (
110
- batch : * mut CassBatch ,
117
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
111
118
timestamp : cass_int64_t ,
112
119
) -> CassError {
113
- let batch = BoxFFI :: as_mut_ref ( batch) ;
120
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
114
121
115
122
Arc :: make_mut ( & mut batch. state )
116
123
. batch
@@ -121,21 +128,21 @@ pub unsafe extern "C" fn cass_batch_set_timestamp(
121
128
122
129
#[ no_mangle]
123
130
pub unsafe extern "C" fn cass_batch_set_request_timeout (
124
- batch : * mut CassBatch ,
131
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
125
132
timeout_ms : cass_uint64_t ,
126
133
) -> CassError {
127
- let batch = BoxFFI :: as_mut_ref ( batch) ;
134
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
128
135
batch. batch_request_timeout_ms = Some ( timeout_ms) ;
129
136
130
137
CassError :: CASS_OK
131
138
}
132
139
133
140
#[ no_mangle]
134
141
pub unsafe extern "C" fn cass_batch_set_is_idempotent (
135
- batch : * mut CassBatch ,
142
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
136
143
is_idempotent : cass_bool_t ,
137
144
) -> CassError {
138
- let batch = BoxFFI :: as_mut_ref ( batch) ;
145
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
139
146
Arc :: make_mut ( & mut batch. state )
140
147
. batch
141
148
. set_is_idempotent ( is_idempotent != 0 ) ;
@@ -145,10 +152,10 @@ pub unsafe extern "C" fn cass_batch_set_is_idempotent(
145
152
146
153
#[ no_mangle]
147
154
pub unsafe extern "C" fn cass_batch_set_tracing (
148
- batch : * mut CassBatch ,
155
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
149
156
enabled : cass_bool_t ,
150
157
) -> CassError {
151
- let batch = BoxFFI :: as_mut_ref ( batch) ;
158
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
152
159
Arc :: make_mut ( & mut batch. state )
153
160
. batch
154
161
. set_tracing ( enabled != 0 ) ;
@@ -158,12 +165,12 @@ pub unsafe extern "C" fn cass_batch_set_tracing(
158
165
159
166
#[ no_mangle]
160
167
pub unsafe extern "C" fn cass_batch_add_statement (
161
- batch : * mut CassBatch ,
162
- statement : * const CassStatement ,
168
+ batch : CassBorrowedExclusivePtr < CassBatch , CMut > ,
169
+ statement : CassBorrowedSharedPtr < CassStatement , CMut > ,
163
170
) -> CassError {
164
- let batch = BoxFFI :: as_mut_ref ( batch) ;
171
+ let batch = BoxFFI :: as_mut_ref ( batch) . unwrap ( ) ;
165
172
let state = Arc :: make_mut ( & mut batch. state ) ;
166
- let statement = BoxFFI :: as_ref ( statement) ;
173
+ let statement = BoxFFI :: as_ref ( statement) . unwrap ( ) ;
167
174
168
175
match & statement. statement {
169
176
BoundStatement :: Simple ( q) => {
0 commit comments