tracker/auto/
sparql_cursor.rs1#![allow(deprecated)]
6
7use crate::{ffi, SparqlConnection, SparqlValueType};
8use glib::{
9 prelude::*,
10 signal::{connect_raw, SignalHandlerId},
11 translate::*,
12};
13use std::{boxed::Box as Box_, pin::Pin};
14
15glib::wrapper! {
16 #[doc(alias = "TrackerSparqlCursor")]
17 pub struct SparqlCursor(Object<ffi::TrackerSparqlCursor, ffi::TrackerSparqlCursorClass>);
18
19 match fn {
20 type_ => || ffi::tracker_sparql_cursor_get_type(),
21 }
22}
23
24impl SparqlCursor {
25 #[doc(alias = "tracker_sparql_cursor_close")]
26 pub fn close(&self) {
27 unsafe {
28 ffi::tracker_sparql_cursor_close(self.to_glib_none().0);
29 }
30 }
31
32 #[doc(alias = "tracker_sparql_cursor_get_boolean")]
33 #[doc(alias = "get_boolean")]
34 pub fn is_boolean(&self, column: i32) -> bool {
35 unsafe {
36 from_glib(ffi::tracker_sparql_cursor_get_boolean(
37 self.to_glib_none().0,
38 column,
39 ))
40 }
41 }
42
43 #[doc(alias = "tracker_sparql_cursor_get_connection")]
44 #[doc(alias = "get_connection")]
45 pub fn connection(&self) -> Option<SparqlConnection> {
46 unsafe {
47 from_glib_none(ffi::tracker_sparql_cursor_get_connection(
48 self.to_glib_none().0,
49 ))
50 }
51 }
52
53 #[cfg(feature = "v3_2")]
54 #[cfg_attr(docsrs, doc(cfg(feature = "v3_2")))]
55 #[doc(alias = "tracker_sparql_cursor_get_datetime")]
56 #[doc(alias = "get_datetime")]
57 pub fn datetime(&self, column: i32) -> Option<glib::DateTime> {
58 unsafe {
59 from_glib_full(ffi::tracker_sparql_cursor_get_datetime(
60 self.to_glib_none().0,
61 column,
62 ))
63 }
64 }
65
66 #[doc(alias = "tracker_sparql_cursor_get_double")]
67 #[doc(alias = "get_double")]
68 pub fn double(&self, column: i32) -> f64 {
69 unsafe { ffi::tracker_sparql_cursor_get_double(self.to_glib_none().0, column) }
70 }
71
72 #[doc(alias = "tracker_sparql_cursor_get_integer")]
73 #[doc(alias = "get_integer")]
74 pub fn integer(&self, column: i32) -> i64 {
75 unsafe { ffi::tracker_sparql_cursor_get_integer(self.to_glib_none().0, column) }
76 }
77
78 #[doc(alias = "tracker_sparql_cursor_get_n_columns")]
79 #[doc(alias = "get_n_columns")]
80 #[doc(alias = "n-columns")]
81 pub fn n_columns(&self) -> i32 {
82 unsafe { ffi::tracker_sparql_cursor_get_n_columns(self.to_glib_none().0) }
83 }
84
85 #[doc(alias = "tracker_sparql_cursor_get_value_type")]
86 #[doc(alias = "get_value_type")]
87 pub fn value_type(&self, column: i32) -> SparqlValueType {
88 unsafe {
89 from_glib(ffi::tracker_sparql_cursor_get_value_type(
90 self.to_glib_none().0,
91 column,
92 ))
93 }
94 }
95
96 #[doc(alias = "tracker_sparql_cursor_get_variable_name")]
97 #[doc(alias = "get_variable_name")]
98 pub fn variable_name(&self, column: i32) -> Option<glib::GString> {
99 unsafe {
100 from_glib_none(ffi::tracker_sparql_cursor_get_variable_name(
101 self.to_glib_none().0,
102 column,
103 ))
104 }
105 }
106
107 #[doc(alias = "tracker_sparql_cursor_is_bound")]
108 pub fn is_bound(&self, column: i32) -> bool {
109 unsafe {
110 from_glib(ffi::tracker_sparql_cursor_is_bound(
111 self.to_glib_none().0,
112 column,
113 ))
114 }
115 }
116
117 #[doc(alias = "tracker_sparql_cursor_next")]
118 pub fn next(
119 &self,
120 cancellable: Option<&impl IsA<gio::Cancellable>>,
121 ) -> Result<bool, glib::Error> {
122 unsafe {
123 let mut error = std::ptr::null_mut();
124 let ret = ffi::tracker_sparql_cursor_next(
125 self.to_glib_none().0,
126 cancellable.map(|p| p.as_ref()).to_glib_none().0,
127 &mut error,
128 );
129 if error.is_null() {
130 Ok(from_glib(ret))
131 } else {
132 Err(from_glib_full(error))
133 }
134 }
135 }
136
137 #[doc(alias = "tracker_sparql_cursor_next_async")]
138 pub fn next_async<P: FnOnce(Result<bool, glib::Error>) + 'static>(
139 &self,
140 cancellable: Option<&impl IsA<gio::Cancellable>>,
141 callback: P,
142 ) {
143 let main_context = glib::MainContext::ref_thread_default();
144 let is_main_context_owner = main_context.is_owner();
145 let has_acquired_main_context = (!is_main_context_owner)
146 .then(|| main_context.acquire().ok())
147 .flatten();
148 assert!(
149 is_main_context_owner || has_acquired_main_context.is_some(),
150 "Async operations only allowed if the thread is owning the MainContext"
151 );
152
153 let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
154 Box_::new(glib::thread_guard::ThreadGuard::new(callback));
155 unsafe extern "C" fn next_async_trampoline<
156 P: FnOnce(Result<bool, glib::Error>) + 'static,
157 >(
158 _source_object: *mut glib::gobject_ffi::GObject,
159 res: *mut gio::ffi::GAsyncResult,
160 user_data: glib::ffi::gpointer,
161 ) {
162 unsafe {
163 let mut error = std::ptr::null_mut();
164 let ret = ffi::tracker_sparql_cursor_next_finish(
165 _source_object as *mut _,
166 res,
167 &mut error,
168 );
169 let result = if error.is_null() {
170 Ok(from_glib(ret))
171 } else {
172 Err(from_glib_full(error))
173 };
174 let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
175 Box_::from_raw(user_data as *mut _);
176 let callback: P = callback.into_inner();
177 callback(result);
178 }
179 }
180 let callback = next_async_trampoline::<P>;
181 unsafe {
182 ffi::tracker_sparql_cursor_next_async(
183 self.to_glib_none().0,
184 cancellable.map(|p| p.as_ref()).to_glib_none().0,
185 Some(callback),
186 Box_::into_raw(user_data) as *mut _,
187 );
188 }
189 }
190
191 pub fn next_future(
192 &self,
193 ) -> Pin<Box_<dyn std::future::Future<Output = Result<bool, glib::Error>> + 'static>> {
194 Box_::pin(gio::GioFuture::new(self, move |obj, cancellable, send| {
195 obj.next_async(Some(cancellable), move |res| {
196 send.resolve(res);
197 });
198 }))
199 }
200
201 #[cfg_attr(feature = "v3_5", deprecated = "Since 3.5")]
202 #[allow(deprecated)]
203 #[doc(alias = "tracker_sparql_cursor_rewind")]
204 pub fn rewind(&self) {
205 unsafe {
206 ffi::tracker_sparql_cursor_rewind(self.to_glib_none().0);
207 }
208 }
209
210 #[doc(alias = "n-columns")]
211 pub fn connect_n_columns_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
212 unsafe extern "C" fn notify_n_columns_trampoline<F: Fn(&SparqlCursor) + 'static>(
213 this: *mut ffi::TrackerSparqlCursor,
214 _param_spec: glib::ffi::gpointer,
215 f: glib::ffi::gpointer,
216 ) {
217 unsafe {
218 let f: &F = &*(f as *const F);
219 f(&from_glib_borrow(this))
220 }
221 }
222 unsafe {
223 let f: Box_<F> = Box_::new(f);
224 connect_raw(
225 self.as_ptr() as *mut _,
226 c"notify::n-columns".as_ptr(),
227 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
228 notify_n_columns_trampoline::<F> as *const (),
229 )),
230 Box_::into_raw(f),
231 )
232 }
233 }
234}