@@ -32,7 +32,7 @@ pub unsafe extern "C" fn lance_open_dataset(path: *const c_char) -> *mut c_void
3232 match CStr :: from_ptr ( path) . to_str ( ) {
3333 Ok ( s) => s,
3434 Err ( err) => {
35- set_last_error ( ErrorCode :: Utf8 , err . to_string ( ) ) ;
35+ set_last_error ( ErrorCode :: Utf8 , format ! ( "utf8 decode: {err}" ) ) ;
3636 return ptr:: null_mut ( ) ;
3737 }
3838 }
@@ -41,11 +41,14 @@ pub unsafe extern "C" fn lance_open_dataset(path: *const c_char) -> *mut c_void
4141 let dataset = match runtime:: block_on ( Dataset :: open ( path_str) ) {
4242 Ok ( Ok ( ds) ) => Arc :: new ( ds) ,
4343 Ok ( Err ( err) ) => {
44- set_last_error ( ErrorCode :: DatasetOpen , err. to_string ( ) ) ;
44+ set_last_error (
45+ ErrorCode :: DatasetOpen ,
46+ format ! ( "dataset open '{path_str}': {err}" ) ,
47+ ) ;
4548 return ptr:: null_mut ( ) ;
4649 }
4750 Err ( err) => {
48- set_last_error ( ErrorCode :: Runtime , err . to_string ( ) ) ;
51+ set_last_error ( ErrorCode :: Runtime , format ! ( "runtime: {err}" ) ) ;
4952 return ptr:: null_mut ( ) ;
5053 }
5154 } ;
@@ -107,7 +110,7 @@ pub unsafe extern "C" fn lance_schema_to_arrow(
107110 let ffi_schema = match FFI_ArrowSchema :: try_from ( & data_type) {
108111 Ok ( schema) => schema,
109112 Err ( err) => {
110- set_last_error ( ErrorCode :: SchemaExport , err . to_string ( ) ) ;
113+ set_last_error ( ErrorCode :: SchemaExport , format ! ( "schema export: {err}" ) ) ;
111114 return -1 ;
112115 }
113116 } ;
@@ -134,7 +137,7 @@ pub unsafe extern "C" fn lance_create_stream(dataset: *mut c_void) -> *mut c_voi
134137 Box :: into_raw ( Box :: new ( stream) ) as * mut c_void
135138 }
136139 Err ( err) => {
137- set_last_error ( ErrorCode :: StreamCreate , err . to_string ( ) ) ;
140+ set_last_error ( ErrorCode :: StreamCreate , format ! ( "stream create: {err}" ) ) ;
138141 ptr:: null_mut ( )
139142 }
140143 }
@@ -193,15 +196,18 @@ pub unsafe extern "C" fn lance_create_fragment_stream(
193196 let fragment_id_usize = match usize:: try_from ( fragment_id) {
194197 Ok ( v) => v,
195198 Err ( err) => {
196- set_last_error ( ErrorCode :: InvalidArgument , err . to_string ( ) ) ;
199+ set_last_error ( ErrorCode :: InvalidArgument , format ! ( "invalid fragment id: {err}" ) ) ;
197200 return ptr:: null_mut ( ) ;
198201 }
199202 } ;
200203
201204 let fragment = match handle. dataset . get_fragment ( fragment_id_usize) {
202205 Some ( f) => f,
203206 None => {
204- set_last_error ( ErrorCode :: FragmentScan , "fragment not found" ) ;
207+ set_last_error (
208+ ErrorCode :: FragmentScan ,
209+ format ! ( "fragment not found: {fragment_id}" ) ,
210+ ) ;
205211 return ptr:: null_mut ( ) ;
206212 }
207213 } ;
@@ -219,14 +225,14 @@ pub unsafe extern "C" fn lance_create_fragment_stream(
219225 let col_name = match unsafe { CStr :: from_ptr ( col_ptr) } . to_str ( ) {
220226 Ok ( v) => v,
221227 Err ( err) => {
222- set_last_error ( ErrorCode :: Utf8 , err . to_string ( ) ) ;
228+ set_last_error ( ErrorCode :: Utf8 , format ! ( "utf8 decode: {err}" ) ) ;
223229 return ptr:: null_mut ( ) ;
224230 }
225231 } ;
226232 projection. push ( col_name. to_string ( ) ) ;
227233 }
228234 if let Err ( err) = scan. project ( & projection) {
229- set_last_error ( ErrorCode :: FragmentScan , err . to_string ( ) ) ;
235+ set_last_error ( ErrorCode :: FragmentScan , format ! ( "fragment scan project: {err}" ) ) ;
230236 return ptr:: null_mut ( ) ;
231237 }
232238 }
@@ -235,13 +241,13 @@ pub unsafe extern "C" fn lance_create_fragment_stream(
235241 let filter = match unsafe { CStr :: from_ptr ( filter_sql) } . to_str ( ) {
236242 Ok ( v) => v,
237243 Err ( err) => {
238- set_last_error ( ErrorCode :: Utf8 , err . to_string ( ) ) ;
244+ set_last_error ( ErrorCode :: Utf8 , format ! ( "utf8 decode: {err}" ) ) ;
239245 return ptr:: null_mut ( ) ;
240246 }
241247 } ;
242248 if !filter. is_empty ( ) {
243249 if let Err ( err) = scan. filter ( filter) {
244- set_last_error ( ErrorCode :: FragmentScan , err . to_string ( ) ) ;
250+ set_last_error ( ErrorCode :: FragmentScan , format ! ( "fragment scan filter: {err}" ) ) ;
245251 return ptr:: null_mut ( ) ;
246252 }
247253 }
@@ -255,33 +261,48 @@ pub unsafe extern "C" fn lance_create_fragment_stream(
255261 Box :: into_raw ( Box :: new ( stream) ) as * mut c_void
256262 }
257263 Err ( err) => {
258- set_last_error ( ErrorCode :: StreamCreate , err . to_string ( ) ) ;
264+ set_last_error ( ErrorCode :: StreamCreate , format ! ( "stream create: {err}" ) ) ;
259265 ptr:: null_mut ( )
260266 }
261267 }
262268}
263269
264270#[ no_mangle]
265- pub unsafe extern "C" fn lance_stream_next ( stream : * mut c_void ) -> * mut c_void {
271+ pub unsafe extern "C" fn lance_stream_next (
272+ stream : * mut c_void ,
273+ out_batch : * mut * mut c_void ,
274+ ) -> i32 {
275+ if out_batch. is_null ( ) {
276+ set_last_error ( ErrorCode :: InvalidArgument , "out_batch is null" ) ;
277+ return -1 ;
278+ }
279+ unsafe {
280+ ptr:: write_unaligned ( out_batch, ptr:: null_mut ( ) ) ;
281+ }
282+
266283 if stream. is_null ( ) {
267284 set_last_error ( ErrorCode :: InvalidArgument , "stream is null" ) ;
268- return ptr :: null_mut ( ) ;
285+ return - 1 ;
269286 }
270287
271288 let stream = unsafe { & mut * ( stream as * mut LanceStream ) } ;
272289
273290 match stream. next ( ) {
274291 Ok ( Some ( batch) ) => {
275292 clear_last_error ( ) ;
276- Box :: into_raw ( Box :: new ( batch) ) as * mut c_void
293+ let batch_ptr = Box :: into_raw ( Box :: new ( batch) ) as * mut c_void ;
294+ unsafe {
295+ ptr:: write_unaligned ( out_batch, batch_ptr) ;
296+ }
297+ 0
277298 }
278299 Ok ( None ) => {
279300 clear_last_error ( ) ;
280- ptr :: null_mut ( )
301+ 1
281302 }
282303 Err ( err) => {
283- set_last_error ( ErrorCode :: StreamNext , err . to_string ( ) ) ;
284- ptr :: null_mut ( )
304+ set_last_error ( ErrorCode :: StreamNext , format ! ( "stream next: {err}" ) ) ;
305+ - 1
285306 }
286307 }
287308}
@@ -336,7 +357,7 @@ pub unsafe extern "C" fn lance_batch_to_arrow(
336357 let schema = match FFI_ArrowSchema :: try_from ( data. data_type ( ) ) {
337358 Ok ( schema) => schema,
338359 Err ( err) => {
339- set_last_error ( ErrorCode :: BatchExport , err . to_string ( ) ) ;
360+ set_last_error ( ErrorCode :: BatchExport , format ! ( "batch export: {err}" ) ) ;
340361 return -1 ;
341362 }
342363 } ;
0 commit comments